diff options
author | Ross Burton <ross.burton@intel.com> | 2019-03-21 12:44:09 +0000 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2019-03-24 17:00:52 +0000 |
commit | d956c45baf65f8b28d732ed4dd3ca4b40e36ee66 (patch) | |
tree | dd4b81cb650f16f59380a530a05809648082ee04 | |
parent | 06606fd9e0c1000c7479f2899eb6e5c48fa5b2cd (diff) | |
download | poky-d956c45baf65f8b28d732ed4dd3ca4b40e36ee66.tar.gz |
meson: support multiple cross configuration files
For historical reasons Meson supports only a single cross configuration file but
multiple native configuration files. Add support for multiple cross files, so
that recipes such as glib can use the toolchain cross file and extend it with a
recipe-specific cross file containing values needed to build.
(From OE-Core rev: 3d97cddeec8635988e414e6854d850cea20bcb36)
Signed-off-by: Ross Burton <ross.burton@intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
-rw-r--r-- | meta/recipes-devtools/meson/meson.inc | 3 | ||||
-rw-r--r-- | meta/recipes-devtools/meson/meson/cross-libdir.patch | 18 | ||||
-rw-r--r-- | meta/recipes-devtools/meson/meson/many-cross.patch | 207 |
3 files changed, 215 insertions, 13 deletions
diff --git a/meta/recipes-devtools/meson/meson.inc b/meta/recipes-devtools/meson/meson.inc index ca448b00a0..2d18f72c0c 100644 --- a/meta/recipes-devtools/meson/meson.inc +++ b/meta/recipes-devtools/meson/meson.inc | |||
@@ -11,10 +11,11 @@ SRC_URI = "https://github.com/mesonbuild/meson/releases/download/${PV}/meson-${P | |||
11 | file://0003-native_bindir.patch \ | 11 | file://0003-native_bindir.patch \ |
12 | file://0001-python-module-do-not-manipulate-the-environment-when.patch \ | 12 | file://0001-python-module-do-not-manipulate-the-environment-when.patch \ |
13 | file://disable-rpath-handling.patch \ | 13 | file://disable-rpath-handling.patch \ |
14 | file://cross-libdir.patch \ | ||
15 | file://0001-modules-windows-split-WINDRES-env-variable.patch \ | 14 | file://0001-modules-windows-split-WINDRES-env-variable.patch \ |
16 | file://0002-environment.py-detect-windows-also-if-the-system-str.patch \ | 15 | file://0002-environment.py-detect-windows-also-if-the-system-str.patch \ |
17 | file://cross-prop-default.patch \ | 16 | file://cross-prop-default.patch \ |
17 | file://many-cross.patch \ | ||
18 | file://cross-libdir.patch \ | ||
18 | " | 19 | " |
19 | SRC_URI[sha256sum] = "ef9f14326ec1e30d3ba1a26df0f92826ede5a79255ad723af78a2691c37109fd" | 20 | SRC_URI[sha256sum] = "ef9f14326ec1e30d3ba1a26df0f92826ede5a79255ad723af78a2691c37109fd" |
20 | SRC_URI[md5sum] = "0267b0871266056184c484792572c682" | 21 | SRC_URI[md5sum] = "0267b0871266056184c484792572c682" |
diff --git a/meta/recipes-devtools/meson/meson/cross-libdir.patch b/meta/recipes-devtools/meson/meson/cross-libdir.patch index 2bd4fb3f9e..7395fdbdaa 100644 --- a/meta/recipes-devtools/meson/meson/cross-libdir.patch +++ b/meta/recipes-devtools/meson/meson/cross-libdir.patch | |||
@@ -7,17 +7,11 @@ Date: Thu, 27 Dec 2018 23:43:35 +0200 | |||
7 | Subject: [PATCH] Default libdir is "lib" when cross compiling. Closes #2535. | 7 | Subject: [PATCH] Default libdir is "lib" when cross compiling. Closes #2535. |
8 | 8 | ||
9 | --- | 9 | --- |
10 | docs/markdown/snippets/crosslib.md | 7 +++++++ | ||
11 | mesonbuild/coredata.py | 8 ++++++++ | ||
12 | run_unittests.py | 13 +++++++++++++ | ||
13 | 3 files changed, 28 insertions(+) | ||
14 | create mode 100644 docs/markdown/snippets/crosslib.md | ||
15 | |||
16 | diff --git a/mesonbuild/coredata.py b/mesonbuild/coredata.py | 10 | diff --git a/mesonbuild/coredata.py b/mesonbuild/coredata.py |
17 | index d70c23038c..4e2f3e008c 100644 | 11 | index ff810683..9ee23a69 100644 |
18 | --- a/mesonbuild/coredata.py | 12 | --- a/mesonbuild/coredata.py |
19 | +++ b/mesonbuild/coredata.py | 13 | +++ b/mesonbuild/coredata.py |
20 | @@ -299,6 +299,7 @@ def __init__(self, options): | 14 | @@ -298,6 +298,7 @@ class CoreData: |
21 | # Only to print a warning if it changes between Meson invocations. | 15 | # Only to print a warning if it changes between Meson invocations. |
22 | self.pkgconf_envvar = os.environ.get('PKG_CONFIG_PATH', '') | 16 | self.pkgconf_envvar = os.environ.get('PKG_CONFIG_PATH', '') |
23 | self.config_files = self.__load_config_files(options.native_file) | 17 | self.config_files = self.__load_config_files(options.native_file) |
@@ -25,15 +19,15 @@ index d70c23038c..4e2f3e008c 100644 | |||
25 | 19 | ||
26 | @staticmethod | 20 | @staticmethod |
27 | def __load_config_files(filenames): | 21 | def __load_config_files(filenames): |
28 | @@ -348,6 +349,13 @@ def __load_cross_file(filename): | 22 | @@ -309,6 +310,13 @@ class CoreData: |
29 | 23 | for f in filenames] | |
30 | raise MesonException('Cannot find specified cross file: ' + filename) | 24 | return filenames |
31 | 25 | ||
32 | + def libdir_cross_fixup(self): | 26 | + def libdir_cross_fixup(self): |
33 | + # By default set libdir to "lib" when cross compiling since | 27 | + # By default set libdir to "lib" when cross compiling since |
34 | + # getting the "system default" is always wrong on multiarch | 28 | + # getting the "system default" is always wrong on multiarch |
35 | + # platforms as it gets a value like lib/x86_64-linux-gnu. | 29 | + # platforms as it gets a value like lib/x86_64-linux-gnu. |
36 | + if self.cross_file is not None: | 30 | + if self.cross_files: |
37 | + self.builtins['libdir'].value = 'lib' | 31 | + self.builtins['libdir'].value = 'lib' |
38 | + | 32 | + |
39 | def sanitize_prefix(self, prefix): | 33 | def sanitize_prefix(self, prefix): |
diff --git a/meta/recipes-devtools/meson/meson/many-cross.patch b/meta/recipes-devtools/meson/meson/many-cross.patch new file mode 100644 index 0000000000..d04c28b8a3 --- /dev/null +++ b/meta/recipes-devtools/meson/meson/many-cross.patch | |||
@@ -0,0 +1,207 @@ | |||
1 | mesonbuild: allow multiple --cross-file options | ||
2 | |||
3 | Just like --native-file, allow multiple --cross-file options. This is mostly | ||
4 | unifying the logic between cross_files and config_files. | ||
5 | |||
6 | Upstream-Status: Backport [will be in 0.50.1] | ||
7 | Signed-off-by: Ross Burton <ross.burton@intel.com> | ||
8 | |||
9 | diff --git a/mesonbuild/backend/backends.py b/mesonbuild/backend/backends.py | ||
10 | index 40402513..4b9bcb59 100644 | ||
11 | --- a/mesonbuild/backend/backends.py | ||
12 | +++ b/mesonbuild/backend/backends.py | ||
13 | @@ -726,8 +726,7 @@ class Backend: | ||
14 | deps = [os.path.join(self.build_to_src, df) | ||
15 | for df in self.interpreter.get_build_def_files()] | ||
16 | if self.environment.is_cross_build(): | ||
17 | - deps.append(os.path.join(self.build_to_src, | ||
18 | - self.environment.coredata.cross_file)) | ||
19 | + deps.extend(self.environment.coredata.cross_files) | ||
20 | deps.append('meson-private/coredata.dat') | ||
21 | if os.path.exists(os.path.join(self.environment.get_source_dir(), 'meson_options.txt')): | ||
22 | deps.append(os.path.join(self.build_to_src, 'meson_options.txt')) | ||
23 | diff --git a/mesonbuild/coredata.py b/mesonbuild/coredata.py | ||
24 | index c3f5a745..ff810683 100644 | ||
25 | --- a/mesonbuild/coredata.py | ||
26 | +++ b/mesonbuild/coredata.py | ||
27 | @@ -201,8 +201,8 @@ class UserFeatureOption(UserComboOption): | ||
28 | return self.value == 'auto' | ||
29 | |||
30 | |||
31 | -def load_configs(filenames): | ||
32 | - """Load native files.""" | ||
33 | +def load_configs(filenames, subdir): | ||
34 | + """Load configuration files from a named subdirectory.""" | ||
35 | def gen(): | ||
36 | for f in filenames: | ||
37 | f = os.path.expanduser(os.path.expandvars(f)) | ||
38 | @@ -215,7 +215,7 @@ def load_configs(filenames): | ||
39 | os.environ.get('XDG_DATA_HOME', os.path.expanduser('~/.local/share')), | ||
40 | ] + os.environ.get('XDG_DATA_DIRS', '/usr/local/share:/usr/share').split(':') | ||
41 | for path in paths: | ||
42 | - path_to_try = os.path.join(path, 'meson', 'native', f) | ||
43 | + path_to_try = os.path.join(path, 'meson', subdir, f) | ||
44 | if os.path.isfile(path_to_try): | ||
45 | yield path_to_try | ||
46 | break | ||
47 | @@ -291,7 +291,7 @@ class CoreData: | ||
48 | self.compiler_options = {} | ||
49 | self.base_options = {} | ||
50 | self.external_preprocess_args = {} # CPPFLAGS only | ||
51 | - self.cross_file = self.__load_cross_file(options.cross_file) | ||
52 | + self.cross_files = self.__load_config_files(options.cross_file) | ||
53 | self.compilers = OrderedDict() | ||
54 | self.cross_compilers = OrderedDict() | ||
55 | self.deps = OrderedDict() | ||
56 | @@ -301,52 +301,14 @@ class CoreData: | ||
57 | |||
58 | @staticmethod | ||
59 | def __load_config_files(filenames): | ||
60 | + # Need to try and make the passed filenames absolute because when the | ||
61 | + # files are parsed later we'll have chdir()d. | ||
62 | if not filenames: | ||
63 | return [] | ||
64 | filenames = [os.path.abspath(os.path.expanduser(os.path.expanduser(f))) | ||
65 | for f in filenames] | ||
66 | return filenames | ||
67 | |||
68 | - @staticmethod | ||
69 | - def __load_cross_file(filename): | ||
70 | - """Try to load the cross file. | ||
71 | - | ||
72 | - If the filename is None return None. If the filename is an absolute | ||
73 | - (after resolving variables and ~), return that absolute path. Next, | ||
74 | - check if the file is relative to the current source dir. If the path | ||
75 | - still isn't resolved do the following: | ||
76 | - Windows: | ||
77 | - - Error | ||
78 | - *: | ||
79 | - - $XDG_DATA_HOME/meson/cross (or ~/.local/share/meson/cross if | ||
80 | - undefined) | ||
81 | - - $XDG_DATA_DIRS/meson/cross (or | ||
82 | - /usr/local/share/meson/cross:/usr/share/meson/cross if undefined) | ||
83 | - - Error | ||
84 | - | ||
85 | - Non-Windows follows the Linux path and will honor XDG_* if set. This | ||
86 | - simplifies the implementation somewhat. | ||
87 | - """ | ||
88 | - if filename is None: | ||
89 | - return None | ||
90 | - filename = os.path.expanduser(os.path.expandvars(filename)) | ||
91 | - if os.path.isabs(filename): | ||
92 | - return filename | ||
93 | - path_to_try = os.path.abspath(filename) | ||
94 | - if os.path.isfile(path_to_try): | ||
95 | - return path_to_try | ||
96 | - if sys.platform != 'win32': | ||
97 | - paths = [ | ||
98 | - os.environ.get('XDG_DATA_HOME', os.path.expanduser('~/.local/share')), | ||
99 | - ] + os.environ.get('XDG_DATA_DIRS', '/usr/local/share:/usr/share').split(':') | ||
100 | - for path in paths: | ||
101 | - path_to_try = os.path.join(path, 'meson', 'cross', filename) | ||
102 | - if os.path.isfile(path_to_try): | ||
103 | - return path_to_try | ||
104 | - raise MesonException('Cannot find specified cross file: ' + filename) | ||
105 | - | ||
106 | - raise MesonException('Cannot find specified cross file: ' + filename) | ||
107 | - | ||
108 | def sanitize_prefix(self, prefix): | ||
109 | if not os.path.isabs(prefix): | ||
110 | raise MesonException('prefix value {!r} must be an absolute path' | ||
111 | @@ -558,8 +520,8 @@ def read_cmd_line_file(build_dir, options): | ||
112 | options.cmd_line_options = d | ||
113 | |||
114 | properties = config['properties'] | ||
115 | - if options.cross_file is None: | ||
116 | - options.cross_file = properties.get('cross_file', None) | ||
117 | + if not options.cross_file: | ||
118 | + options.cross_file = ast.literal_eval(properties.get('cross_file', '[]')) | ||
119 | if not options.native_file: | ||
120 | # This will be a string in the form: "['first', 'second', ...]", use | ||
121 | # literal_eval to get it into the list of strings. | ||
122 | @@ -570,7 +532,7 @@ def write_cmd_line_file(build_dir, options): | ||
123 | config = CmdLineFileParser() | ||
124 | |||
125 | properties = {} | ||
126 | - if options.cross_file is not None: | ||
127 | + if options.cross_file: | ||
128 | properties['cross_file'] = options.cross_file | ||
129 | if options.native_file: | ||
130 | properties['native_file'] = options.native_file | ||
131 | diff --git a/mesonbuild/environment.py b/mesonbuild/environment.py | ||
132 | index 6d86daf9..406ab8b8 100644 | ||
133 | --- a/mesonbuild/environment.py | ||
134 | +++ b/mesonbuild/environment.py | ||
135 | @@ -355,8 +355,8 @@ class Environment: | ||
136 | self.machines = MachineInfos() | ||
137 | # Will be fully initialized later using compilers later. | ||
138 | self.machines.detect_build() | ||
139 | - if self.coredata.cross_file: | ||
140 | - self.cross_info = CrossBuildInfo(self.coredata.cross_file) | ||
141 | + if self.coredata.cross_files: | ||
142 | + self.cross_info = CrossBuildInfo(self.coredata.cross_files) | ||
143 | if 'exe_wrapper' in self.cross_info.config['binaries']: | ||
144 | from .dependencies import ExternalProgram | ||
145 | self.exe_wrapper = ExternalProgram.from_bin_list( | ||
146 | @@ -373,7 +373,7 @@ class Environment: | ||
147 | |||
148 | if self.coredata.config_files: | ||
149 | self.config_info = coredata.ConfigData( | ||
150 | - coredata.load_configs(self.coredata.config_files)) | ||
151 | + coredata.load_configs(self.coredata.config_files, 'native')) | ||
152 | else: | ||
153 | self.config_info = coredata.ConfigData() | ||
154 | |||
155 | @@ -1113,13 +1113,8 @@ class CrossBuildInfo: | ||
156 | def ok_type(self, i): | ||
157 | return isinstance(i, (str, int, bool)) | ||
158 | |||
159 | - def parse_datafile(self, filename): | ||
160 | - config = configparser.ConfigParser() | ||
161 | - try: | ||
162 | - with open(filename, 'r') as f: | ||
163 | - config.read_file(f, filename) | ||
164 | - except FileNotFoundError: | ||
165 | - raise EnvironmentException('File not found: %s.' % filename) | ||
166 | + def parse_datafile(self, filenames): | ||
167 | + config = coredata.load_configs(filenames, 'cross') | ||
168 | # This is a bit hackish at the moment. | ||
169 | for s in config.sections(): | ||
170 | self.config[s] = {} | ||
171 | diff --git a/mesonbuild/msetup.py b/mesonbuild/msetup.py | ||
172 | index 56a0e9a7..f0a1ae19 100644 | ||
173 | --- a/mesonbuild/msetup.py | ||
174 | +++ b/mesonbuild/msetup.py | ||
175 | @@ -27,7 +27,9 @@ from .mesonlib import MesonException | ||
176 | |||
177 | def add_arguments(parser): | ||
178 | coredata.register_builtin_arguments(parser) | ||
179 | - parser.add_argument('--cross-file', default=None, | ||
180 | + parser.add_argument('--cross-file', | ||
181 | + default=[], | ||
182 | + action='append', | ||
183 | help='File describing cross compilation environment.') | ||
184 | parser.add_argument('--native-file', | ||
185 | default=[], | ||
186 | diff --git a/run_unittests.py b/run_unittests.py | ||
187 | index e6874b25..1d247291 100755 | ||
188 | --- a/run_unittests.py | ||
189 | +++ b/run_unittests.py | ||
190 | @@ -529,7 +529,7 @@ class InternalTests(unittest.TestCase): | ||
191 | config.write(configfile) | ||
192 | configfile.flush() | ||
193 | configfile.close() | ||
194 | - detected_value = mesonbuild.environment.CrossBuildInfo(configfile.name).need_exe_wrapper() | ||
195 | + detected_value = mesonbuild.environment.CrossBuildInfo((configfile.name,)).need_exe_wrapper() | ||
196 | os.unlink(configfilename) | ||
197 | |||
198 | desired_value = not detected_value | ||
199 | @@ -541,7 +541,7 @@ class InternalTests(unittest.TestCase): | ||
200 | configfilename = configfile.name | ||
201 | config.write(configfile) | ||
202 | configfile.close() | ||
203 | - forced_value = mesonbuild.environment.CrossBuildInfo(configfile.name).need_exe_wrapper() | ||
204 | + forced_value = mesonbuild.environment.CrossBuildInfo((configfile.name,)).need_exe_wrapper() | ||
205 | os.unlink(configfilename) | ||
206 | |||
207 | self.assertEqual(forced_value, desired_value) | ||