from mkosi.distributions import Distribution
from mkosi.installer import clean_package_manager_metadata, package_manager_scripts
from mkosi.kmod import gen_required_kernel_modules, process_kernel_modules
-from mkosi.log import ARG_DEBUG, complete_step, die, log_step
+from mkosi.log import ARG_DEBUG, complete_step, die, log_notice, log_step
from mkosi.manifest import Manifest
from mkosi.mounts import mount, mount_overlay, mount_passwd, mount_usr
from mkosi.pager import page
os.utime(p, (mtime, mtime), follow_symlinks=False)
+@contextlib.contextmanager
+def setup_workspace(args: MkosiArgs, config: MkosiConfig) -> Iterator[Path]:
+ with contextlib.ExitStack() as stack:
+ workspace = Path(tempfile.mkdtemp(dir=config.workspace_dir_or_default(), prefix="mkosi-workspace"))
+ stack.callback(lambda: rmtree(workspace))
+
+ with scopedenv({"TMPDIR" : os.fspath(workspace)}):
+ try:
+ yield Path(workspace)
+ except BaseException:
+ if args.debug_workspace:
+ stack.pop_all()
+ log_notice(f"Workspace: {workspace}")
+ workspace.chmod(0o755)
+
+
def build_image(args: MkosiArgs, config: MkosiConfig) -> None:
manifest = Manifest(config) if config.manifest_format else None
- workspace = tempfile.TemporaryDirectory(dir=config.workspace_dir_or_default(), prefix=".mkosi-tmp")
- with workspace, scopedenv({"TMPDIR" : workspace.name}):
- state = MkosiState(args, config, Path(workspace.name))
+ with setup_workspace(args, config) as workspace:
+ state = MkosiState(args, config, workspace)
install_package_manager_trees(state)
with mount_base_trees(state):
directory: Optional[Path]
debug: bool
debug_shell: bool
+ debug_workspace: bool
pager: bool
genkey_valid_days: str
genkey_common_name: str
action="store_true",
default=False,
)
+ parser.add_argument(
+ "--debug-workspace",
+ help="When an error occurs, the workspace directory will not be deleted",
+ action="store_true",
+ default=False,
+ )
parser.add_argument(
"--no-pager",
action="store_false",
Manifest Formats: {maniformats}
Output: {bold(config.output_with_compression)}
Compression: {config.compress_output}
- Output Directory: {none_to_default(config.output_dir)}
- Workspace Directory: {none_to_default(config.workspace_dir)}
+ Output Directory: {config.output_dir_or_cwd()}
+ Workspace Directory: {config.workspace_dir_or_default()}
Cache Directory: {none_to_none(config.cache_dir)}
Build Directory: {none_to_none(config.build_dir)}
Image ID: {config.image_id}
],
"Debug": false,
"DebugShell": false,
+ "DebugWorkspace": false,
"Directory": {f'"{os.fspath(path)}"' if path is not None else 'null'},
"DocFormat": "auto",
"Force": 9001,
cmdline = ["foo", "bar"],
debug = False,
debug_shell = False,
+ debug_workspace = False,
directory = Path(path) if path is not None else None,
doc_format = DocFormat.auto,
force = 9001,