*(["--compress-output", str(state.config.compress_output)] if state.config.compress_output else []),
"--with-network", str(state.config.with_network),
"--cache-only", str(state.config.cache_only),
- "--output-dir", str(state.config.output_dir),
- "--workspace-dir", str(state.config.workspace_dir),
+ *(["--output-dir", str(state.config.output_dir)] if state.config.output_dir else []),
+ *(["--workspace-dir", str(state.config.workspace_dir)] if state.config.workspace_dir else []),
"--cache-dir", str(state.cache_dir.parent),
*(["--local-mirror", str(state.config.local_mirror)] if state.config.local_mirror else []),
"--incremental", str(state.config.incremental),
unlink_output(args, config)
build_image(args, config, state.name, state.uid, state.gid)
- symlink.symlink_to(config.output_dir / config.output)
+ symlink.symlink_to(config.output_dir_or_cwd() / config.output)
return symlink
prefix = config.output if args.force > 2 else config.output_with_version
with complete_step("Removing output files…"):
- if config.output_dir.exists():
- for p in config.output_dir.iterdir():
+ if config.output_dir_or_cwd().exists():
+ for p in config.output_dir_or_cwd().iterdir():
if p.name.startswith(prefix):
rmtree(p)
config.output_signature if config.sign else None,
config.output_nspawn_settings if config.nspawn_settings is not None else None,
):
- if f and (config.output_dir / f).exists():
+ if f and (config.output_dir_or_cwd() / f).exists():
die(f"Output path {f} exists already. (Consider invocation with --force.)")
f.rename(state.staging / name)
for f in state.staging.iterdir():
- move_tree(state.config, f, state.config.output_dir)
+ move_tree(state.config, f, state.config.output_dir_or_cwd())
def normalize_mtime(root: Path, mtime: Optional[int], directory: Optional[Path] = None) -> None:
def build_image(args: MkosiArgs, config: MkosiConfig, name: str, uid: int, gid: int) -> None:
manifest = Manifest(config) if config.manifest_format else None
- workspace = tempfile.TemporaryDirectory(dir=config.workspace_dir, prefix=".mkosi-tmp")
+ workspace = tempfile.TemporaryDirectory(dir=config.workspace_dir_or_cwd(), prefix=".mkosi-tmp")
with workspace, scopedenv({"TMPDIR" : workspace.name}):
state = MkosiState(args, config, Path(workspace.name), name, uid, gid)
finalize_staging(state)
- output_base = state.config.output_dir / state.config.output
+ output_base = state.config.output_dir_or_cwd() / state.config.output
if not output_base.exists() or output_base.is_symlink():
output_base.unlink(missing_ok=True)
output_base.symlink_to(state.config.output_with_compression)
- print_output_size(config.output_dir / config.output)
+ print_output_size(config.output_dir_or_cwd() / config.output)
def setfacl(root: Path, uid: int, allow: bool) -> None:
stack.enter_context(acl_maybe_toggle(config, p, uid, always=True))
if config.output_format == OutputFormat.directory:
- stack.enter_context(acl_maybe_toggle(config, config.output_dir / config.output, uid, always=True))
+ stack.enter_context(acl_maybe_toggle(config, config.output_dir_or_cwd() / config.output, uid, always=True))
yield
yield
return
- with acl_maybe_toggle(config, config.output_dir / config.output, uid, always=False):
+ with acl_maybe_toggle(config, config.output_dir_or_cwd() / config.output, uid, always=False):
yield
with contextlib.ExitStack() as stack:
if config.ephemeral:
- fname = stack.enter_context(copy_ephemeral(config, config.output_dir / config.output))
+ fname = stack.enter_context(copy_ephemeral(config, config.output_dir_or_cwd() / config.output))
else:
- fname = config.output_dir / config.output
+ fname = config.output_dir_or_cwd() / config.output
if config.output_format == OutputFormat.disk and args.verb == Verb.boot:
run(["systemd-repart",
port = 8081
- if config.output_dir is not None:
- os.chdir(config.output_dir)
+ os.chdir(config.output_dir_or_cwd())
with http.server.HTTPServer(("", port), http.server.SimpleHTTPRequestHandler) as httpd:
logging.info(f"Serving HTTP on port {port}: http://localhost:{port}/")
def needs_build(args: MkosiArgs, config: MkosiConfig) -> bool:
return (
args.verb.needs_build() and
- (args.force > 0 or not (config.output_dir / config.output_with_compression).exists())
+ (args.force > 0 or not (config.output_dir_or_cwd() / config.output_with_compression).exists())
)
*(["--mirror", p.mirror] if p.mirror and p.distribution == distribution else []),
"--repository-key-check", str(p.repository_key_check),
"--cache-only", str(p.cache_only),
- "--output-dir", str(p.output_dir),
- "--workspace-dir", str(p.workspace_dir),
+ *(["--output-dir", str(p.output_dir)] if p.output_dir else []),
+ *(["--workspace-dir", str(p.workspace_dir)] if p.workspace_dir else []),
*(["--cache-dir", str(p.cache_dir.parent)] if p.cache_dir else []),
"--incremental", str(p.incremental),
"--acl", str(p.acl),
if config not in new:
new.append(config)
- new.append(dataclasses.replace(p, tools_tree=config.output_dir / config.output))
+ new.append(dataclasses.replace(p, tools_tree=config.output_dir_or_cwd() / config.output))
return new
build_image(args, config, name, uid, gid)
# Make sure all build outputs that are not directories are owned by the user running mkosi.
- for p in config.output_dir.iterdir():
+ for p in config.output_dir_or_cwd().iterdir():
if not p.is_dir():
os.chown(p, uid, gid, follow_symlinks=False)
if config.qemu_cdrom and config.output_format == OutputFormat.disk:
# CD-ROM devices have sector size 2048 so we transform the disk image into one with sector size 2048.
- src = (config.output_dir / config.output).resolve()
+ src = (config.output_dir_or_cwd() / config.output).resolve()
fname = src.parent / f"{src.name}-{uuid.uuid4().hex}"
run(["systemd-repart",
"--definitions", "",
fname])
stack.callback(lambda: fname.unlink())
elif config.ephemeral:
- fname = stack.enter_context(copy_ephemeral(config, config.output_dir / config.output))
+ fname = stack.enter_context(copy_ephemeral(config, config.output_dir_or_cwd() / config.output))
else:
- fname = config.output_dir / config.output
+ fname = config.output_dir_or_cwd() / config.output
if config.output_format == OutputFormat.disk and config.runtime_size:
run(["systemd-repart",
config.output_format in (OutputFormat.cpio, OutputFormat.uki, OutputFormat.directory)
):
if config.output_format == OutputFormat.uki:
- kernel = fname if firmware == QemuFirmware.uefi else config.output_dir / config.output_split_kernel
+ kernel = fname if firmware == QemuFirmware.uefi else config.output_dir_or_cwd() / config.output_split_kernel
elif config.qemu_kernel:
kernel = config.qemu_kernel
elif "-kernel" not in args.cmdline:
if firmware == QemuFirmware.uefi:
- kernel = config.output_dir / config.output_split_uki
+ kernel = config.output_dir_or_cwd() / config.output_split_uki
else:
- kernel = config.output_dir / config.output_split_kernel
+ kernel = config.output_dir_or_cwd() / config.output_split_kernel
if not kernel.exists():
die(
f"Kernel or UKI not found at {kernel}, please install a kernel in the image "
elif (
firmware == QemuFirmware.linux and
config.output_format in (OutputFormat.uki, OutputFormat.directory, OutputFormat.disk) and
- (config.output_dir / config.output_split_initrd).exists()
+ (config.output_dir_or_cwd() / config.output_split_initrd).exists()
):
- cmdline += ["-initrd", config.output_dir / config.output_split_initrd]
+ cmdline += ["-initrd", config.output_dir_or_cwd() / config.output_split_initrd]
if config.output_format == OutputFormat.disk:
cmdline += ["-drive", f"if=none,id=mkosi,file={fname},format=raw",