Skip to content

Commit

Permalink
Allowing enabling dependencies via defaults
Browse files Browse the repository at this point in the history
  • Loading branch information
ktf committed Jan 28, 2025
1 parent 1091f6f commit 0cd7f2b
Show file tree
Hide file tree
Showing 3 changed files with 36 additions and 13 deletions.
18 changes: 13 additions & 5 deletions alibuild_helpers/utilities.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand Down Expand Up @@ -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":
Expand Down
5 changes: 4 additions & 1 deletion docs/docs/reference.md
Original file line number Diff line number Diff line change
Expand Up @@ -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 `:<regexp>` 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=<regex>`.

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:

Expand Down
26 changes: 19 additions & 7 deletions tests/test_utilities.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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 = {
Expand Down

0 comments on commit 0cd7f2b

Please sign in to comment.