diff options
author | Dylan Baker <dylan@pnwbakers.com> | 2017-11-14 15:08:35 -0800 |
---|---|---|
committer | Jussi Pakkanen <jpakkane@gmail.com> | 2017-11-30 22:34:27 +0200 |
commit | 6f25e93b524ec827a55c13632c9ff23a20d8d3c2 (patch) | |
tree | 5ac3f4638928f8201a8641efaeb8a3263c9ced7d /mesonbuild | |
parent | ecba22965d438e94a260c6c5d00a034a8d144904 (diff) | |
download | meson-6f25e93b524ec827a55c13632c9ff23a20d8d3c2.zip meson-6f25e93b524ec827a55c13632c9ff23a20d8d3c2.tar.gz meson-6f25e93b524ec827a55c13632c9ff23a20d8d3c2.tar.bz2 |
cross: Implement support for loading cross files from system paths
One thing that makes cross compiling with meson a pain is the need for
cross files. The problem is not with cross files themselves (they're
actually rather brilliant in that they allow for a much greater deal of
flexibility than autotools hardcoded paths approach) but that each user
needs to reimplement them themselves, when for most people what they
really want is a cross file that could be provided by their distro, all
they really want is the correct toolchain.
This patch is the first stop to making it easier for distros to ship
their own cross files (and for users to put their's somewhere safe so
they don't get `git clean`ed. It allows the cross files (on Linux and
*BSD) to be stored in home and system paths (~/.config/meson/cross,
/usr/share/meson/cross, and /usr/local/share/meson/cross), and to be
loaded by simply by specificying --cross-file.
With this patch meson will check the locations its always checked first,
(is cross file absolute, or is it relative to $PWD), then will check
~/.config/meson/cross, /usr/local/share/meson/cross,
/usr/share/meson/cross, (or $XDG_CONFIG_PATH and $XDG_DATA_DIRS) for the
files, raising an exception if it cannot find the specified cross file.
Fixes #2283
Diffstat (limited to 'mesonbuild')
-rw-r--r-- | mesonbuild/coredata.py | 46 |
1 files changed, 42 insertions, 4 deletions
diff --git a/mesonbuild/coredata.py b/mesonbuild/coredata.py index 401211a..68b1abf 100644 --- a/mesonbuild/coredata.py +++ b/mesonbuild/coredata.py @@ -14,6 +14,7 @@ # limitations under the License. import pickle, os, uuid +import sys from pathlib import PurePath from collections import OrderedDict from .mesonlib import MesonException, commonpath @@ -172,10 +173,7 @@ class CoreData: self.external_preprocess_args = {} # CPPFLAGS only self.external_args = {} # CPPFLAGS + CFLAGS self.external_link_args = {} # CFLAGS + LDFLAGS (with MSVC: only LDFLAGS) - if options.cross_file is not None: - self.cross_file = os.path.join(os.getcwd(), options.cross_file) - else: - self.cross_file = None + self.cross_file = self.__load_cross_file(options.cross_file) self.wrap_mode = options.wrap_mode self.compilers = OrderedDict() self.cross_compilers = OrderedDict() @@ -184,6 +182,46 @@ class CoreData: # Only to print a warning if it changes between Meson invocations. self.pkgconf_envvar = os.environ.get('PKG_CONFIG_PATH', '') + @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: + Linux + BSD: + - $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 + *: + - Error + BSD follows the Linux path and will honor XDG_* if set. This simplifies + the implementation somewhat, especially since most BSD users wont set + those environment variables. + """ + 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.exists(path_to_try): + return path_to_try + if sys.platform == 'linux' or 'bsd' in sys.platform.lower(): + 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.exists(path_to_try): + return path_to_try + raise MesonException('Cannot find specified cross file: ' + filename) + + raise MesonException('Cannot find specified cross file: ' + filename) + def sanitize_prefix(self, prefix): if not os.path.isabs(prefix): raise MesonException('prefix value {!r} must be an absolute path' |