aboutsummaryrefslogtreecommitdiff
path: root/mesonbuild
diff options
context:
space:
mode:
authorJussi Pakkanen <jpakkane@gmail.com>2019-02-12 20:04:23 +0200
committerGitHub <noreply@github.com>2019-02-12 20:04:23 +0200
commit82e4cb7731e59237746e480f9611700f1d4fda76 (patch)
tree24e8133c742258833badd29a03188cb72bb0e044 /mesonbuild
parentccdac894eedebfb49a90f87a3752cbcfeb28083e (diff)
parent0eccce799f5643dda7a65f3e841cd54785f03ec5 (diff)
downloadmeson-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.py2
-rw-r--r--mesonbuild/coredata.py12
-rw-r--r--mesonbuild/environment.py73
-rw-r--r--mesonbuild/interpreter.py4
-rw-r--r--mesonbuild/mconf.py3
-rw-r--r--mesonbuild/mesonlib.py10
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):