summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbst-marge-bot <marge-bot@buildstream.build>2020-05-28 09:33:56 +0000
committerbst-marge-bot <marge-bot@buildstream.build>2020-05-28 09:33:56 +0000
commitc690319f6f2407891ae37abc0732a93d8cf58519 (patch)
treefc1009e59d6abc16bd080817e1978eca1acd0bc8
parent2b409a2b7c9cbd46d723f0e4f8588bbe6cbfce87 (diff)
parent0e6bef6c9d6c53840a9eb2bc5baedd007c8014fe (diff)
downloadbuildstream-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.py31
-rw-r--r--src/buildstream/sandbox/_config.py27
-rw-r--r--tests/integration/project/elements/sandbox/build-arch.bst12
-rw-r--r--tests/integration/project/project.conf1
-rw-r--r--tests/integration/sandbox.py12
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