diff options
author | bst-marge-bot <marge-bot@buildstream.build> | 2020-05-28 09:33:56 +0000 |
---|---|---|
committer | bst-marge-bot <marge-bot@buildstream.build> | 2020-05-28 09:33:56 +0000 |
commit | c690319f6f2407891ae37abc0732a93d8cf58519 (patch) | |
tree | fc1009e59d6abc16bd080817e1978eca1acd0bc8 | |
parent | 2b409a2b7c9cbd46d723f0e4f8588bbe6cbfce87 (diff) | |
parent | 0e6bef6c9d6c53840a9eb2bc5baedd007c8014fe (diff) | |
download | buildstream-c690319f6f2407891ae37abc0732a93d8cf58519.tar.gz |
Merge branch 'juerg/expandsandbox' into 'master'
element.py: Expand variables in sandbox config
Closes #1303
See merge request BuildStream/buildstream!1938
-rw-r--r-- | src/buildstream/element.py | 31 | ||||
-rw-r--r-- | src/buildstream/sandbox/_config.py | 27 | ||||
-rw-r--r-- | tests/integration/project/elements/sandbox/build-arch.bst | 12 | ||||
-rw-r--r-- | tests/integration/project/project.conf | 1 | ||||
-rw-r--r-- | tests/integration/sandbox.py | 12 |
5 files changed, 52 insertions, 31 deletions
diff --git a/src/buildstream/element.py b/src/buildstream/element.py index bd702b112..18e42c722 100644 --- a/src/buildstream/element.py +++ b/src/buildstream/element.py @@ -96,7 +96,6 @@ from .utils import FileListResult, BST_ARBITRARY_TIMESTAMP from . import utils from . import _cachekey from . import _site -from ._platform import Platform from .node import Node from .plugin import Plugin from .sandbox import SandboxFlags, SandboxCommandError @@ -315,7 +314,9 @@ class Element(Plugin): self.__remote_execution_specs = project.remote_execution_specs # Extract Sandbox config - self.__sandbox_config = self.__extract_sandbox_config(context, project, meta) + sandbox_config = self.__extract_sandbox_config(project, meta) + self.__variables.expand(sandbox_config) + self.__sandbox_config = SandboxConfig(sandbox_config, context.platform) def __lt__(self, other): return self.name < other.name @@ -2702,17 +2703,12 @@ class Element(Plugin): # Sandbox-specific configuration data, to be passed to the sandbox's constructor. # @classmethod - def __extract_sandbox_config(cls, context, project, meta): + def __extract_sandbox_config(cls, project, meta): if meta.is_junction: sandbox_config = Node.from_dict({}) else: sandbox_config = project._sandbox.clone() - # Get the platform to ask for host architecture - platform = context.platform - host_arch = platform.get_host_arch() - host_os = platform.get_host_os() - # The default config is already composited with the project overrides sandbox_defaults = cls.__defaults.get_mapping("sandbox", default={}) sandbox_defaults = sandbox_defaults.clone() @@ -2721,24 +2717,7 @@ class Element(Plugin): meta.sandbox._composite(sandbox_config) sandbox_config._assert_fully_composited() - # Sandbox config, unlike others, has fixed members so we should validate them - sandbox_config.validate_keys(["build-uid", "build-gid", "build-os", "build-arch"]) - - build_os = sandbox_config.get_str("build-os", default=None) - if build_os: - build_os = build_os.lower() - else: - build_os = host_os - - build_arch = sandbox_config.get_str("build-arch", default=None) - if build_arch: - build_arch = Platform.canonicalize_arch(build_arch) - else: - build_arch = host_arch - - return SandboxConfig( - sandbox_config.get_int("build-uid", None), sandbox_config.get_int("build-gid", None), build_os, build_arch, - ) + return sandbox_config # This makes a special exception for the split rules, which # elements may extend but whos defaults are defined in the project. diff --git a/src/buildstream/sandbox/_config.py b/src/buildstream/sandbox/_config.py index 7a71e7d50..114274190 100644 --- a/src/buildstream/sandbox/_config.py +++ b/src/buildstream/sandbox/_config.py @@ -17,17 +17,34 @@ # Authors: # Jim MacArthur <jim.macarthur@codethink.co.uk> +from .._platform import Platform + # SandboxConfig # # A container for sandbox configuration data. We want the internals # of this to be opaque, hence putting it in its own private file. class SandboxConfig: - def __init__(self, build_uid, build_gid, build_os=None, build_arch=None): - self.build_uid = build_uid - self.build_gid = build_gid - self.build_os = build_os - self.build_arch = build_arch + def __init__(self, sandbox_config, platform): + host_arch = platform.get_host_arch() + host_os = platform.get_host_os() + + sandbox_config.validate_keys(["build-uid", "build-gid", "build-os", "build-arch"]) + + build_os = sandbox_config.get_str("build-os", default=None) + if build_os: + self.build_os = build_os.lower() + else: + self.build_os = host_os + + build_arch = sandbox_config.get_str("build-arch", default=None) + if build_arch: + self.build_arch = Platform.canonicalize_arch(build_arch) + else: + self.build_arch = host_arch + + self.build_uid = sandbox_config.get_int("build-uid", None) + self.build_gid = sandbox_config.get_int("build-gid", None) # get_unique_key(): # diff --git a/tests/integration/project/elements/sandbox/build-arch.bst b/tests/integration/project/elements/sandbox/build-arch.bst new file mode 100644 index 000000000..d03f36792 --- /dev/null +++ b/tests/integration/project/elements/sandbox/build-arch.bst @@ -0,0 +1,12 @@ +kind: manual + +depends: + - filename: base.bst + type: build + +sandbox: + build-arch: '%{build_arch}' + +config: + build-commands: + - true diff --git a/tests/integration/project/project.conf b/tests/integration/project/project.conf index d30996041..2d3da467b 100644 --- a/tests/integration/project/project.conf +++ b/tests/integration/project/project.conf @@ -13,6 +13,7 @@ options: arch: type: arch description: Current architecture + variable: build_arch values: - x86-64 - aarch64 diff --git a/tests/integration/sandbox.py b/tests/integration/sandbox.py index da0073377..cfa177e5e 100644 --- a/tests/integration/sandbox.py +++ b/tests/integration/sandbox.py @@ -39,3 +39,15 @@ def test_sandbox_shm(cli, datafiles): result = cli.run(project=project, args=["build", element_name]) assert result.exit_code == 0 + + +# Test that variable expansion works in build-arch sandbox config. +# Regression test for https://gitlab.com/BuildStream/buildstream/-/issues/1303 +@pytest.mark.skipif(not HAVE_SANDBOX, reason="Only available with a functioning sandbox") +@pytest.mark.datafiles(DATA_DIR) +def test_build_arch(cli, datafiles): + project = str(datafiles) + element_name = "sandbox/build-arch.bst" + + result = cli.run(project=project, args=["build", element_name]) + assert result.exit_code == 0 |