diff --git a/alibuild_helpers/utilities.py b/alibuild_helpers/utilities.py index a78c175e..2cfb4e1c 100644 --- a/alibuild_helpers/utilities.py +++ b/alibuild_helpers/utilities.py @@ -261,16 +261,24 @@ def detectArch(): except: return doDetectArch(hasOsRelease, osReleaseLines, ["unknown", "", ""], "", "") -def filterByArchitecture(arch, requires): +def filterByArchitectureDefaults(arch, defaults, requires): for r in requires: require, matcher = ":" in r and r.split(":", 1) or (r, ".*") + if matcher.startswith("defaults="): + wanted = matcher[len("defaults="):] + if re.match(wanted, defaults): + yield require if re.match(matcher, arch): yield require -def disabledByArchitecture(arch, requires): +def disabledByArchitectureDefaults(arch, defaults, requires): for r in requires: require, matcher = ":" in r and r.split(":", 1) or (r, ".*") - if not re.match(matcher, arch): + if matcher.startswith("defaults="): + wanted = matcher[len("defaults="):] + if not re.match(wanted, defaults): + yield require + elif not re.match(matcher, arch): yield require def readDefaults(configDir, defaults, error, architecture): @@ -543,10 +551,10 @@ def getPackageList(packages, specs, configDir, preferSystem, noSystem, validDefaults = None # no valid default works for all current packages # For the moment we treat build_requires just as requires. - fn = lambda what: disabledByArchitecture(architecture, spec.get(what, [])) + fn = lambda what: disabledByArchitectureDefaults(architecture, defaults, spec.get(what, [])) spec["disabled"] += [x for x in fn("requires")] spec["disabled"] += [x for x in fn("build_requires")] - fn = lambda what: filterByArchitecture(architecture, spec.get(what, [])) + fn = lambda what: filterByArchitectureDefaults(architecture, defaults, spec.get(what, [])) spec["requires"] = [x for x in fn("requires") if not x in disable] spec["build_requires"] = [x for x in fn("build_requires") if not x in disable] if spec["package"] != "defaults-release": diff --git a/docs/docs/reference.md b/docs/docs/reference.md index a341be80..3ad39a61 100644 --- a/docs/docs/reference.md +++ b/docs/docs/reference.md @@ -130,7 +130,10 @@ The following entries are optional in the header: The specified dependencies will be built before building the given package. You can specify platform-specific dependencies by appending `:` to - the dependency name. Such a regular expression will be matched against the + the dependency name. Similarly, you can specify build default specific dependencies + by appending `:defaults=`. + + Such a regular expression will be matched against the architecture provided via `--architecture`, and if it does not match, the requirement will not be included. For instance: diff --git a/tests/test_utilities.py b/tests/test_utilities.py index 3fc2beef..1667b3e7 100644 --- a/tests/test_utilities.py +++ b/tests/test_utilities.py @@ -5,7 +5,7 @@ # Assuming you are using the mock library to ... mock things from unittest.mock import patch -from alibuild_helpers.utilities import doDetectArch, filterByArchitecture +from alibuild_helpers.utilities import doDetectArch, filterByArchitectureDefaults, disabledByArchitectureDefaults from alibuild_helpers.utilities import Hasher from alibuild_helpers.utilities import asList from alibuild_helpers.utilities import prunePaths @@ -175,12 +175,24 @@ def test_asList(self): self.assertEqual(asList(None), [None]) def test_filterByArchitecture(self): - self.assertEqual(["AliRoot"], list(filterByArchitecture("osx_x86-64", ["AliRoot"]))) - self.assertEqual([], list(filterByArchitecture("osx_x86-64", ["AliRoot:(?!osx)"]))) - self.assertEqual(["GCC"], list(filterByArchitecture("osx_x86-64", ["AliRoot:(?!osx)", "GCC"]))) - self.assertEqual(["AliRoot", "GCC"], list(filterByArchitecture("osx_x86-64", ["AliRoot:(?!slc6)", "GCC"]))) - self.assertEqual(["GCC"], list(filterByArchitecture("osx_x86-64", ["AliRoot:slc6", "GCC:osx"]))) - self.assertEqual([], list(filterByArchitecture("osx_x86-64", []))) + self.assertEqual(["AliRoot"], list(filterByArchitectureDefaults("osx_x86-64", "ali", ["AliRoot"]))) + self.assertEqual([], list(filterByArchitectureDefaults("osx_x86-64", "ali", ["AliRoot:(?!osx)"]))) + self.assertEqual(["GCC"], list(filterByArchitectureDefaults("osx_x86-64", "ali", ["AliRoot:(?!osx)", "GCC"]))) + self.assertEqual(["AliRoot", "GCC"], list(filterByArchitectureDefaults("osx_x86-64", "ali", ["AliRoot:(?!slc6)", "GCC"]))) + self.assertEqual(["GCC"], list(filterByArchitectureDefaults("osx_x86-64", "ali", ["AliRoot:slc6", "GCC:osx"]))) + self.assertEqual([], list(filterByArchitectureDefaults("osx_x86-64", "ali", []))) + self.assertEqual(["GCC"], list(filterByArchitectureDefaults("osx_x86-64", "ali", ["AliRoot:slc6", "GCC:defaults=ali"]))) + self.assertEqual([], list(filterByArchitectureDefaults("osx_x86-64", "o2", ["AliRoot:slc6", "GCC:defaults=ali"]))) + + def test_disabledByArchitecture(self): + self.assertEqual([], list(disabledByArchitectureDefaults("osx_x86-64", "ali", ["AliRoot"]))) + self.assertEqual(["AliRoot"], list(disabledByArchitectureDefaults("osx_x86-64", "ali", ["AliRoot:(?!osx)"]))) + self.assertEqual(["AliRoot"], list(disabledByArchitectureDefaults("osx_x86-64", "ali", ["AliRoot:(?!osx)", "GCC"]))) + self.assertEqual([], list(disabledByArchitectureDefaults("osx_x86-64", "ali", ["AliRoot:(?!slc6)", "GCC"]))) + self.assertEqual(["AliRoot"], list(disabledByArchitectureDefaults("osx_x86-64", "ali", ["AliRoot:slc6", "GCC:osx"]))) + self.assertEqual([], list(disabledByArchitectureDefaults("osx_x86-64", "ali", []))) + self.assertEqual(["AliRoot"], list(disabledByArchitectureDefaults("osx_x86-64", "ali", ["AliRoot:slc6", "GCC:defaults=ali"]))) + self.assertEqual(["AliRoot", "GCC"], list(disabledByArchitectureDefaults("osx_x86-64", "o2", ["AliRoot:slc6", "GCC:defaults=ali"]))) def test_prunePaths(self): fake_env = {