From: Daan De Meyer Date: Fri, 13 Feb 2026 16:01:44 +0000 (+0100) Subject: Add Incremental=relaxed X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a97c50044ce19d72e5119cd11af6993c3944ab65;p=thirdparty%2Fmkosi.git Add Incremental=relaxed In systemd, we have some test subimages that we want to build once and keep intact instead of constantly rebuilding them. Let's add Incremental=relaxed which will only remove the outputs from those images if -ff is used and not a regular -f. --- diff --git a/mkosi/__init__.py b/mkosi/__init__.py index 146db0a75..f92ec1b5e 100644 --- a/mkosi/__init__.py +++ b/mkosi/__init__.py @@ -4745,7 +4745,10 @@ def run_clean(args: Args, config: Config) -> None: remove_image_cache = args.force > 0 remove_package_cache = args.force > 1 else: - remove_outputs = args.force > 0 or (config.is_incremental() and not have_cache(config)) + # Rely on the fact that True is 1 and False is 0 in numeric contexts. + remove_outputs = args.force > (config.incremental == Incremental.relaxed) or ( + config.is_incremental() and not have_cache(config) + ) remove_build_cache = args.force > 1 or args.wipe_build_dir remove_image_cache = args.force > 1 or not have_cache(config) remove_package_cache = args.force > 2 @@ -5254,12 +5257,16 @@ def run_verb(args: Args, tools: Config | None, images: Sequence[Config], *, reso ikd = imd = None for config in images: - # If the output format is "none" or we're rebuilding and there are no build scripts, there's - # nothing to do so exit early. - if ( - config.output_format == OutputFormat.none - or (args.rerun_build_scripts and (config.output_dir_or_cwd() / config.output).exists()) - ) and not config.build_scripts: + # If the output format is "none" and there are no build scripts, there's nothing to do so + # exit early. + if config.output_format == OutputFormat.none and not config.build_scripts: + continue + + # If the image already exists and we're not rerunning build scripts, there's nothing to do so + # exit early. + if (config.output_dir_or_cwd() / config.output).exists() and ( + not args.rerun_build_scripts or not config.build_scripts + ): continue check_tools(config, Verb.build) diff --git a/mkosi/config.py b/mkosi/config.py index 3101cecbb..94ed5a965 100644 --- a/mkosi/config.py +++ b/mkosi/config.py @@ -400,6 +400,7 @@ class Incremental(StrEnum): yes = enum.auto() no = enum.auto() strict = enum.auto() + relaxed = enum.auto() def __bool__(self) -> bool: return self != Incremental.no @@ -3818,7 +3819,7 @@ SETTINGS: list[ConfigSetting[Any]] = [ parse=config_make_enum_parser_with_boolean(Incremental, yes=Incremental.yes, no=Incremental.no), default=Incremental.no, help="Make use of and generate intermediary cache images", - scope=SettingScope.universal, + scope=SettingScope.inherit, choices=Incremental.values(), ), ConfigSetting( diff --git a/mkosi/resources/man/mkosi.1.md b/mkosi/resources/man/mkosi.1.md index bf518811e..86fe39aa3 100644 --- a/mkosi/resources/man/mkosi.1.md +++ b/mkosi/resources/man/mkosi.1.md @@ -1553,6 +1553,9 @@ boolean argument: either `1`, `yes`, or `true` to enable, or `0`, `no`, If set to `strict`, the build fails if previously built cached image does not exist. + If set to `relaxed`, images are only rebuilt when `-ff` is specified or + if the cached imaged is out of date. + `CacheOnly=`, `--cache-only=` : Takes one of `auto`, `metadata`, `always` or `never`. Defaults to `auto`. If `always`, the package manager is instructed not to contact