diff options
author | Jussi Pakkanen <jpakkane@gmail.com> | 2019-02-12 20:04:23 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-02-12 20:04:23 +0200 |
commit | 82e4cb7731e59237746e480f9611700f1d4fda76 (patch) | |
tree | 24e8133c742258833badd29a03188cb72bb0e044 /mesonbuild | |
parent | ccdac894eedebfb49a90f87a3752cbcfeb28083e (diff) | |
parent | 0eccce799f5643dda7a65f3e841cd54785f03ec5 (diff) | |
download | meson-82e4cb7731e59237746e480f9611700f1d4fda76.zip meson-82e4cb7731e59237746e480f9611700f1d4fda76.tar.gz meson-82e4cb7731e59237746e480f9611700f1d4fda76.tar.bz2 |
Merge pull request #4743 from dcbaker/native-file-extended
Extend native files to store install path information
Diffstat (limited to 'mesonbuild')
-rw-r--r-- | mesonbuild/ast/introspection.py | 2 | ||||
-rw-r--r-- | mesonbuild/coredata.py | 12 | ||||
-rw-r--r-- | mesonbuild/environment.py | 73 | ||||
-rw-r--r-- | mesonbuild/interpreter.py | 4 | ||||
-rw-r--r-- | mesonbuild/mconf.py | 3 | ||||
-rw-r--r-- | mesonbuild/mesonlib.py | 10 |
6 files changed, 82 insertions, 22 deletions
diff --git a/mesonbuild/ast/introspection.py b/mesonbuild/ast/introspection.py index 5d0ec5a..4a03e98 100644 --- a/mesonbuild/ast/introspection.py +++ b/mesonbuild/ast/introspection.py @@ -86,7 +86,7 @@ class IntrospectionInterpreter(AstInterpreter): self.project_default_options = mesonlib.stringlistify(def_opts) self.project_default_options = cdata.create_options_dict(self.project_default_options) self.default_options.update(self.project_default_options) - self.coredata.set_default_options(self.default_options, self.subproject, self.environment.cmd_line_options) + self.coredata.set_default_options(self.default_options, self.subproject, self.environment) if not self.is_subproject() and 'subproject_dir' in kwargs: spdirname = kwargs['subproject_dir'] diff --git a/mesonbuild/coredata.py b/mesonbuild/coredata.py index 3ce272e..139dd6e 100644 --- a/mesonbuild/coredata.py +++ b/mesonbuild/coredata.py @@ -525,7 +525,13 @@ class CoreData: sub = 'In subproject {}: '.format(subproject) if subproject else '' mlog.warning('{}Unknown options: "{}"'.format(sub, unknown_options)) - def set_default_options(self, default_options, subproject, cmd_line_options): + def set_default_options(self, default_options, subproject, env): + # Set defaults first from conf files (cross or native), then + # override them as nec as necessary. + for k, v in env.paths.host: + if v is not None: + env.cmd_line_options.setdefault(k, v) + # Set default options as if they were passed to the command line. # Subprojects can only define default for user options. from . import optinterpreter @@ -534,7 +540,7 @@ class CoreData: if optinterpreter.is_invalid_name(k): continue k = subproject + ':' + k - cmd_line_options.setdefault(k, v) + env.cmd_line_options.setdefault(k, v) # Create a subset of cmd_line_options, keeping only options for this # subproject. Also take builtin options if it's the main project. @@ -542,7 +548,7 @@ class CoreData: # languages and setting the backend (builtin options must be set first # to know which backend we'll use). options = {} - for k, v in cmd_line_options.items(): + for k, v in env.cmd_line_options.items(): if subproject: if not k.startswith(subproject + ':'): continue diff --git a/mesonbuild/environment.py b/mesonbuild/environment.py index b23509a..b2cc657 100644 --- a/mesonbuild/environment.py +++ b/mesonbuild/environment.py @@ -12,7 +12,8 @@ # See the License for the specific language governing permissions and # limitations under the License. -import configparser, os, platform, re, sys, shlex, shutil, subprocess, typing +import configparser, os, platform, re, sys, shlex, shutil, subprocess +import typing from . import coredata from .linkers import ArLinker, ArmarLinker, VisualStudioLinker, DLinker, CcrxLinker @@ -371,6 +372,7 @@ class Environment: # Similar to coredata.compilers and build.compilers, but lower level in # that there is no meta data, only names/paths. self.binaries = PerMachineDefaultable() + # Just uses hard-coded defaults and environment variables. Might be # overwritten by a native file. self.binaries.build = BinaryTable({}) @@ -378,10 +380,16 @@ class Environment: # Misc other properties about each machine. self.properties = PerMachine(Properties(), Properties(), Properties()) + # Store paths for native and cross build files. There is no target + # machine information here because nothing is installed for the target + # architecture, just the build and host architectures + self.paths = PerMachineDefaultable() + if self.coredata.config_files is not None: config = MesonConfigFile.from_config_parser( coredata.load_configs(self.coredata.config_files)) 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) @@ -391,9 +399,11 @@ class Environment: self.machines.host = MachineInfo.from_literal(config['host_machine']) if 'target_machine' in config: self.machines.target = MachineInfo.from_literal(config['target_machine']) + self.paths.host = Directories(**config.get('paths', {})) self.machines.default_missing() self.binaries.default_missing() + self.paths.default_missing() exe_wrapper = self.binaries.host.lookup_entry('exe_wrapper') if exe_wrapper is not None: @@ -1172,46 +1182,46 @@ class Environment: def get_exe_suffix(self): return self.exe_suffix - def get_import_lib_dir(self): + def get_import_lib_dir(self) -> str: "Install dir for the import library (library used for linking)" return self.get_libdir() - def get_shared_module_dir(self): + def get_shared_module_dir(self) -> str: "Install dir for shared modules that are loaded at runtime" return self.get_libdir() - def get_shared_lib_dir(self): + def get_shared_lib_dir(self) -> str: "Install dir for the shared library" if self.win_libdir_layout: return self.get_bindir() return self.get_libdir() - def get_static_lib_dir(self): + def get_static_lib_dir(self) -> str: "Install dir for the static library" return self.get_libdir() def get_object_suffix(self): return self.object_suffix - def get_prefix(self): + def get_prefix(self) -> str: return self.coredata.get_builtin_option('prefix') - def get_libdir(self): + def get_libdir(self) -> str: return self.coredata.get_builtin_option('libdir') - def get_libexecdir(self): + def get_libexecdir(self) -> str: return self.coredata.get_builtin_option('libexecdir') - def get_bindir(self): + def get_bindir(self) -> str: return self.coredata.get_builtin_option('bindir') - def get_includedir(self): + def get_includedir(self) -> str: return self.coredata.get_builtin_option('includedir') - def get_mandir(self): + def get_mandir(self) -> str: return self.coredata.get_builtin_option('mandir') - def get_datadir(self): + def get_datadir(self) -> str: return self.coredata.get_builtin_option('datadir') def get_compiler_system_dirs(self): @@ -1581,3 +1591,42 @@ This is probably wrong, it should always point to the native compiler.''' % evar if command is not None: command = shlex.split(command) return command + +class Directories: + + """Data class that holds information about directories for native and cross + builds. + """ + + def __init__(self, bindir: typing.Optional[str] = None, datadir: typing.Optional[str] = None, + includedir: typing.Optional[str] = None, infodir: typing.Optional[str] = None, + libdir: typing.Optional[str] = None, libexecdir: typing.Optional[str] = None, + localedir: typing.Optional[str] = None, localstatedir: typing.Optional[str] = None, + mandir: typing.Optional[str] = None, prefix: typing.Optional[str] = None, + sbindir: typing.Optional[str] = None, sharedstatedir: typing.Optional[str] = None, + sysconfdir: typing.Optional[str] = None): + self.bindir = bindir + self.datadir = datadir + self.includedir = includedir + self.infodir = infodir + self.libdir = libdir + self.libexecdir = libexecdir + self.localedir = localedir + self.localstatedir = localstatedir + self.mandir = mandir + self.prefix = prefix + self.sbindir = sbindir + self.sharedstatedir = sharedstatedir + self.sysconfdir = sysconfdir + + def __contains__(self, key: str) -> str: + return hasattr(self, key) + + def __getitem__(self, key: str) -> str: + return getattr(self, key) + + def __setitem__(self, key: str, value: typing.Optional[str]) -> None: + setattr(self, key, value) + + def __iter__(self) -> typing.Iterator[typing.Tuple[str, str]]: + return iter(self.__dict__.items()) diff --git a/mesonbuild/interpreter.py b/mesonbuild/interpreter.py index 2eb0720..c03bae1 100644 --- a/mesonbuild/interpreter.py +++ b/mesonbuild/interpreter.py @@ -2458,8 +2458,6 @@ external dependencies (including libraries) must go to "dependencies".''') return self.subprojects[dirname] def get_option_internal(self, optname): - # Some base options are not defined in some environments, return the - # default value from compilers.base_options in that case. for d in chain( [self.coredata.base_options, compilers.base_options, self.coredata.builtins], self.coredata.get_all_compiler_options()): @@ -2576,7 +2574,7 @@ external dependencies (including libraries) must go to "dependencies".''') default_options.update(self.default_project_options) else: default_options = {} - self.coredata.set_default_options(default_options, self.subproject, self.environment.cmd_line_options) + self.coredata.set_default_options(default_options, self.subproject, self.environment) self.set_backend() if not self.is_subproject(): diff --git a/mesonbuild/mconf.py b/mesonbuild/mconf.py index fbb528c..18bb37b 100644 --- a/mesonbuild/mconf.py +++ b/mesonbuild/mconf.py @@ -122,8 +122,7 @@ class Conf: if not options: print(' No {}\n'.format(title.lower())) arr = [] - for k in sorted(options): - o = options[k] + for k, o in sorted(options.items()): d = o.description v = o.printable_value() c = o.choices diff --git a/mesonbuild/mesonlib.py b/mesonbuild/mesonlib.py index 540fcdc..9a55c26 100644 --- a/mesonbuild/mesonlib.py +++ b/mesonbuild/mesonlib.py @@ -308,7 +308,15 @@ class OrderedEnum(Enum): return self.value < other.value return NotImplemented -MachineChoice = OrderedEnum('MachineChoice', ['BUILD', 'HOST', 'TARGET']) +class MachineChoice(OrderedEnum): + + """Enum class representing one of the three possible values for binaries, + the build, host, and target machines. + """ + + BUILD = 0 + HOST = 1 + TARGET = 2 class PerMachine: def __init__(self, build, host, target): |