diff --git a/test/test_build.py b/test/test_build.py index 162117c..ffc9ff4 100644 --- a/test/test_build.py +++ b/test/test_build.py @@ -1046,6 +1046,19 @@ def test_kselftest_merge_runs_right_after_config_and_before_default(self, linux) names = [t.name for t in build.targets] assert names == ["config", "kselftest-merge", "default", "kernel"] + def test_nonfatal_continues_on_failure(self, linux, mocker): + b = Build(tree=linux, targets=["config"]) + target = mocker.MagicMock() + target.name = "kselftest" + target.nonfatal = True + target.dependencies = [] + target.preconditions = [] + target.commands = [Command(["false"]), Command(["true"])] + mocker.patch.object(b, "run_cmd", side_effect=[False, True]) + mocker.patch.object(b, "check_artifacts", return_value=True) + result = b.build(target) + assert result.passed + class TestHeaders: def test_basics(self, linux): diff --git a/test/test_target.py b/test/test_target.py index e5c538f..7c72979 100644 --- a/test/test_target.py +++ b/test/test_target.py @@ -213,6 +213,18 @@ def test_no_exclude_for_gcc(self, build): kselftest = Kselftest("kselftest", build) assert not getattr(kselftest, "exclude_build_makevars", set()) + def test_kselftest_is_nonfatal(self, build): + kselftest = Kselftest("kselftest", build) + assert kselftest.nonfatal + + def test_kselftest_bpf_is_nonfatal(self, build): + kselftest_bpf = Kselftest("kselftest-bpf", build) + assert kselftest_bpf.nonfatal + + def test_config_is_not_nonfatal(self, build): + config = Target("config", build) + assert not config.nonfatal + def test_kdir_set_to_build_dir(self, build): build.toolchain.name = "gcc-14" kselftest = Kselftest("kselftest", build) diff --git a/tuxmake/build.py b/tuxmake/build.py index 052f636..2efde72 100644 --- a/tuxmake/build.py +++ b/tuxmake/build.py @@ -599,8 +599,11 @@ def build(self, target): interactive=cmd.interactive, exclude_build_makevars=exclude_keys, ): - fail = True - break + if target.nonfatal: + self.log("W: command failed, continuing (nonfatal target)") + else: + fail = True + break if not fail and not self.check_artifacts(target): fail = True diff --git a/tuxmake/target.py b/tuxmake/target.py index 3f59239..f36a9bd 100644 --- a/tuxmake/target.py +++ b/tuxmake/target.py @@ -80,6 +80,7 @@ def __init_config__(self): self.runs_after = self.config["target"].get("runs_after", "").split() self.preconditions = self.__split_cmds__("target", "preconditions") self.commands = self.__split_cmds__("target", "commands") + self.nonfatal = self.config["target"].get("nonfatal", "").lower() == "true" self.kconfig_add = self.__split_kconfigs__() try: artifacts = dict(self.config["artifacts"]) diff --git a/tuxmake/target/kselftest-bpf.ini b/tuxmake/target/kselftest-bpf.ini index 18f999a..cc8dd85 100644 --- a/tuxmake/target/kselftest-bpf.ini +++ b/tuxmake/target/kselftest-bpf.ini @@ -5,7 +5,9 @@ description = "Kernel BPF selftest (kselftest)" # config options are needed to run all BPF tests but not currently included # by the kselftest-merge target. dependencies = kernel headers -commands = {make} -C tools/testing/selftests/ install +nonfatal = true +commands = {make} -C tools/testing/selftests/ all + && {make} -o all -C tools/testing/selftests/ install && {tar_caf} {build_dir}/kselftest-bpf.tar{z_ext} -C {build_dir}/kselftest_bpf_install . [makevars] diff --git a/tuxmake/target/kselftest.ini b/tuxmake/target/kselftest.ini index 34cff01..7db259f 100644 --- a/tuxmake/target/kselftest.ini +++ b/tuxmake/target/kselftest.ini @@ -2,7 +2,9 @@ description = "Kernel selftest (kselftest)" dependencies = config runs_after = kselftest-merge -commands = {make} -C tools/testing/selftests install +nonfatal = true +commands = {make} -C tools/testing/selftests all + && {make} -o all -C tools/testing/selftests install && {tar_caf} {build_dir}/kselftest.tar{z_ext} -C {build_dir}/kselftest_install . [makevars]