| From 07ae4f949b8402cff178dd12c210d9a726ffe2da Mon Sep 17 00:00:00 2001 |
| From: Ross Burton <ross.burton@intel.com> |
| Date: Mon, 18 Mar 2019 17:27:57 +0000 |
| Subject: [PATCH] mesonbuild: allow multiple --cross-file options |
| |
| Just like --native-file, allow multiple --cross-file options. This is mostly |
| unifying the logic between cross_files and config_files. |
| |
| Upstream-Status: Backport [will be in 0.50.1] |
| Signed-off-by: Ross Burton <ross.burton@intel.com> |
| |
| --- |
| .../markdown/snippets/multiple-cross-files.md | 3 ++ |
| mesonbuild/backend/backends.py | 3 +- |
| mesonbuild/coredata.py | 52 +++---------------- |
| mesonbuild/environment.py | 5 +- |
| mesonbuild/msetup.py | 4 +- |
| mesonbuild/munstable_coredata.py | 5 +- |
| 6 files changed, 20 insertions(+), 52 deletions(-) |
| create mode 100644 docs/markdown/snippets/multiple-cross-files.md |
| |
| diff --git a/docs/markdown/snippets/multiple-cross-files.md b/docs/markdown/snippets/multiple-cross-files.md |
| new file mode 100644 |
| index 0000000..de229be |
| --- /dev/null |
| +++ b/docs/markdown/snippets/multiple-cross-files.md |
| @@ -0,0 +1,3 @@ |
| +## Multipe cross files can be specified |
| + |
| +`--cross-file` can be passed multiple times, with the configuration files overlaying the same way as `--native-file`. |
| diff --git a/mesonbuild/backend/backends.py b/mesonbuild/backend/backends.py |
| index 4d35d22..5b270d3 100644 |
| --- a/mesonbuild/backend/backends.py |
| +++ b/mesonbuild/backend/backends.py |
| @@ -788,8 +788,7 @@ class Backend: |
| deps = [os.path.join(self.build_to_src, df) |
| for df in self.interpreter.get_build_def_files()] |
| if self.environment.is_cross_build(): |
| - deps.append(os.path.join(self.build_to_src, |
| - self.environment.coredata.cross_file)) |
| + deps.extend(self.environment.coredata.cross_files) |
| deps.append('meson-private/coredata.dat') |
| if os.path.exists(os.path.join(self.environment.get_source_dir(), 'meson_options.txt')): |
| deps.append(os.path.join(self.build_to_src, 'meson_options.txt')) |
| diff --git a/mesonbuild/coredata.py b/mesonbuild/coredata.py |
| index 066ad30..d80e9a0 100644 |
| --- a/mesonbuild/coredata.py |
| +++ b/mesonbuild/coredata.py |
| @@ -265,7 +265,7 @@ class CoreData: |
| self.compiler_options = PerMachine({}, {}, {}) |
| self.base_options = {} |
| self.external_preprocess_args = PerMachine({}, {}, {}) # CPPFLAGS only |
| - self.cross_file = self.__load_cross_file(options.cross_file) |
| + self.cross_files = self.__load_config_files(options.cross_file) |
| self.compilers = OrderedDict() |
| self.cross_compilers = OrderedDict() |
| self.deps = OrderedDict() |
| @@ -276,57 +276,19 @@ class CoreData: |
| |
| @staticmethod |
| def __load_config_files(filenames): |
| + # Need to try and make the passed filenames absolute because when the |
| + # files are parsed later we'll have chdir()d. |
| if not filenames: |
| return [] |
| filenames = [os.path.abspath(os.path.expanduser(os.path.expanduser(f))) |
| for f in filenames] |
| return filenames |
| |
| - @staticmethod |
| - def __load_cross_file(filename): |
| - """Try to load the cross file. |
| - |
| - If the filename is None return None. If the filename is an absolute |
| - (after resolving variables and ~), return that absolute path. Next, |
| - check if the file is relative to the current source dir. If the path |
| - still isn't resolved do the following: |
| - Windows: |
| - - Error |
| - *: |
| - - $XDG_DATA_HOME/meson/cross (or ~/.local/share/meson/cross if |
| - undefined) |
| - - $XDG_DATA_DIRS/meson/cross (or |
| - /usr/local/share/meson/cross:/usr/share/meson/cross if undefined) |
| - - Error |
| - |
| - Non-Windows follows the Linux path and will honor XDG_* if set. This |
| - simplifies the implementation somewhat. |
| - """ |
| - if filename is None: |
| - return None |
| - filename = os.path.expanduser(os.path.expandvars(filename)) |
| - if os.path.isabs(filename): |
| - return filename |
| - path_to_try = os.path.abspath(filename) |
| - if os.path.isfile(path_to_try): |
| - return path_to_try |
| - if sys.platform != 'win32': |
| - paths = [ |
| - os.environ.get('XDG_DATA_HOME', os.path.expanduser('~/.local/share')), |
| - ] + os.environ.get('XDG_DATA_DIRS', '/usr/local/share:/usr/share').split(':') |
| - for path in paths: |
| - path_to_try = os.path.join(path, 'meson', 'cross', filename) |
| - if os.path.isfile(path_to_try): |
| - return path_to_try |
| - raise MesonException('Cannot find specified cross file: ' + filename) |
| - |
| - raise MesonException('Cannot find specified cross file: ' + filename) |
| - |
| def libdir_cross_fixup(self): |
| # By default set libdir to "lib" when cross compiling since |
| # getting the "system default" is always wrong on multiarch |
| # platforms as it gets a value like lib/x86_64-linux-gnu. |
| - if self.cross_file is not None: |
| + if self.cross_files: |
| self.builtins['libdir'].value = 'lib' |
| |
| def sanitize_prefix(self, prefix): |
| @@ -642,8 +604,8 @@ def read_cmd_line_file(build_dir, options): |
| options.cmd_line_options = d |
| |
| properties = config['properties'] |
| - if options.cross_file is None: |
| - options.cross_file = properties.get('cross_file', None) |
| + if not options.cross_file: |
| + options.cross_file = ast.literal_eval(properties.get('cross_file', '[]')) |
| if not options.native_file: |
| # This will be a string in the form: "['first', 'second', ...]", use |
| # literal_eval to get it into the list of strings. |
| @@ -654,7 +616,7 @@ def write_cmd_line_file(build_dir, options): |
| config = CmdLineFileParser() |
| |
| properties = {} |
| - if options.cross_file is not None: |
| + if options.cross_file: |
| properties['cross_file'] = options.cross_file |
| if options.native_file: |
| properties['native_file'] = options.native_file |
| diff --git a/mesonbuild/environment.py b/mesonbuild/environment.py |
| index c25ef33..4c1c5ac 100644 |
| --- a/mesonbuild/environment.py |
| +++ b/mesonbuild/environment.py |
| @@ -394,8 +394,9 @@ class Environment: |
| self.binaries.build = BinaryTable(config.get('binaries', {})) |
| self.paths.build = Directories(**config.get('paths', {})) |
| |
| - if self.coredata.cross_file is not None: |
| - config = MesonConfigFile.parse_datafile(self.coredata.cross_file) |
| + if self.coredata.cross_files: |
| + config = MesonConfigFile.from_config_parser( |
| + coredata.load_configs(self.coredata.cross_files, 'cross')) |
| self.properties.host = Properties(config.get('properties', {}), False) |
| self.binaries.host = BinaryTable(config.get('binaries', {}), False) |
| if 'host_machine' in config: |
| diff --git a/mesonbuild/msetup.py b/mesonbuild/msetup.py |
| index 023afdb..6e8ca83 100644 |
| --- a/mesonbuild/msetup.py |
| +++ b/mesonbuild/msetup.py |
| @@ -29,7 +29,9 @@ from .mesonlib import MesonException |
| |
| def add_arguments(parser): |
| coredata.register_builtin_arguments(parser) |
| - parser.add_argument('--cross-file', default=None, |
| + parser.add_argument('--cross-file', |
| + default=[], |
| + action='append', |
| help='File describing cross compilation environment.') |
| parser.add_argument('--native-file', |
| default=[], |
| diff --git a/mesonbuild/munstable_coredata.py b/mesonbuild/munstable_coredata.py |
| index 78f3f34..913f942 100644 |
| --- a/mesonbuild/munstable_coredata.py |
| +++ b/mesonbuild/munstable_coredata.py |
| @@ -81,8 +81,9 @@ def run(options): |
| print('Last seen PKGCONFIG enviroment variable value: ' + v) |
| elif k == 'version': |
| print('Meson version: ' + v) |
| - elif k == 'cross_file': |
| - print('Cross File: ' + (v or 'None')) |
| + elif k == 'cross_files': |
| + if v: |
| + print('Cross File: ' + ' '.join(v)) |
| elif k == 'config_files': |
| if v: |
| print('Native File: ' + ' '.join(v)) |