summaryrefslogtreecommitdiffstats
path: root/meta/recipes-devtools/meson/meson/0007-mesonbuild-allow-multiple-cross-file-options.patch
blob: 6c2949c0e8bd04a1a4b7cd5b1114c329c4a1c1cf (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
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))