summaryrefslogtreecommitdiff
path: root/mesonbuild
diff options
context:
space:
mode:
authorXavier Claessens <xavier.claessens@collabora.com>2023-07-04 13:08:18 -0400
committerJussi Pakkanen <jpakkane@gmail.com>2023-07-10 17:48:07 +0300
commit08972c1277a84d5003209fd13ab888e1f9bdb43d (patch)
treed2258c83561c41e43362a7d56066a0ce1a5b0a5a /mesonbuild
parent4166bf1eb2874b78658f27606efb3d6b3d27d11a (diff)
downloadmeson-08972c1277a84d5003209fd13ab888e1f9bdb43d.tar.gz
backends: Always take options from target
This fixes cases where override_options is not being used. Fixes: #11923
Diffstat (limited to 'mesonbuild')
-rw-r--r--mesonbuild/backend/backends.py6
-rw-r--r--mesonbuild/backend/ninjabackend.py21
-rw-r--r--mesonbuild/backend/vs2010backend.py32
-rw-r--r--mesonbuild/backend/xcodebackend.py3
4 files changed, 32 insertions, 30 deletions
diff --git a/mesonbuild/backend/backends.py b/mesonbuild/backend/backends.py
index f0e2b086f..73741a441 100644
--- a/mesonbuild/backend/backends.py
+++ b/mesonbuild/backend/backends.py
@@ -945,6 +945,12 @@ class Backend:
mesonlib.replace_if_different(pch_file, pch_file_tmp)
return pch_rel_to_build
+ def target_uses_pch(self, target: build.BuildTarget) -> bool:
+ try:
+ return T.cast('bool', target.get_option(OptionKey('b_pch')))
+ except KeyError:
+ return False
+
@staticmethod
def escape_extra_args(args: T.List[str]) -> T.List[str]:
# all backslashes in defines are doubly-escaped
diff --git a/mesonbuild/backend/ninjabackend.py b/mesonbuild/backend/ninjabackend.py
index 108aa7295..e47349929 100644
--- a/mesonbuild/backend/ninjabackend.py
+++ b/mesonbuild/backend/ninjabackend.py
@@ -970,7 +970,7 @@ class NinjaBackend(backends.Backend):
if s.split('.')[-1] in compilers.lang_suffixes['d']:
d_generated_deps.append(o)
- use_pch = self.environment.coredata.options.get(OptionKey('b_pch'))
+ use_pch = self.target_uses_pch(target)
if use_pch and target.has_pch():
pch_objects = self.generate_pch(target, header_deps=header_deps)
else:
@@ -1068,7 +1068,7 @@ class NinjaBackend(backends.Backend):
cpp = target.compilers['cpp']
if cpp.get_id() != 'msvc':
return False
- cppversion = self.environment.coredata.options[OptionKey('std', machine=target.for_machine, lang='cpp')].value
+ cppversion = target.get_option(OptionKey('std', machine=target.for_machine, lang='cpp'))
if cppversion not in ('latest', 'c++latest', 'vc++latest'):
return False
if not mesonlib.current_vs_supports_modules():
@@ -1662,7 +1662,7 @@ class NinjaBackend(backends.Backend):
valac_outputs.append(vala_c_file)
args = self.generate_basic_compiler_args(target, valac)
- args += valac.get_colorout_args(self.environment.coredata.options.get(OptionKey('b_colorout')).value)
+ args += valac.get_colorout_args(target.get_option(OptionKey('b_colorout')))
# Tell Valac to output everything in our private directory. Sadly this
# means it will also preserve the directory components of Vala sources
# found inside the build tree (generated sources).
@@ -1984,8 +1984,8 @@ class NinjaBackend(backends.Backend):
crt_link_args: T.List[str] = []
try:
- buildtype = self.environment.coredata.options[OptionKey('buildtype')].value
- crt = self.environment.coredata.options[OptionKey('b_vscrt')].value
+ buildtype = target.get_option(OptionKey('buildtype'))
+ crt = target.get_option(OptionKey('b_vscrt'))
is_debug = buildtype == 'debug'
if crt == 'from_buildtype':
@@ -2943,7 +2943,7 @@ https://gcc.gnu.org/bugzilla/show_bug.cgi?id=47485'''))
def generate_common_compile_args_per_src_type(self, target: build.BuildTarget) -> dict[str, list[str]]:
src_type_to_args = {}
- use_pch = self.environment.coredata.options.get(OptionKey('b_pch'))
+ use_pch = self.target_uses_pch(target)
for src_type_str in target.compilers.keys():
compiler = target.compilers[src_type_str]
@@ -2984,7 +2984,7 @@ https://gcc.gnu.org/bugzilla/show_bug.cgi?id=47485'''))
# Include PCH header as first thing as it must be the first one or it will be
# ignored by gcc https://gcc.gnu.org/bugzilla/show_bug.cgi?id=100462
- use_pch = self.environment.coredata.options.get(OptionKey('b_pch')) and is_generated != 'pch'
+ use_pch = self.target_uses_pch(target) and is_generated != 'pch'
if use_pch and 'mw' not in compiler.id:
commands += self.get_pch_include_args(compiler, target)
@@ -3023,7 +3023,7 @@ https://gcc.gnu.org/bugzilla/show_bug.cgi?id=47485'''))
commands += self.get_compile_debugfile_args(compiler, target, rel_obj)
# PCH handling
- if self.environment.coredata.options.get(OptionKey('b_pch')):
+ if self.target_uses_pch(target):
pchlist = target.get_pch(compiler.language)
else:
pchlist = []
@@ -3245,8 +3245,7 @@ https://gcc.gnu.org/bugzilla/show_bug.cgi?id=47485'''))
commands += linker.get_pie_link_args()
elif isinstance(target, build.SharedLibrary):
if isinstance(target, build.SharedModule):
- options = self.environment.coredata.options
- commands += linker.get_std_shared_module_link_args(options)
+ commands += linker.get_std_shared_module_link_args(target.get_options())
else:
commands += linker.get_std_shared_lib_link_args()
# All shared libraries are PIC
@@ -3528,7 +3527,7 @@ https://gcc.gnu.org/bugzilla/show_bug.cgi?id=47485'''))
#
# We shouldn't check whether we are making a static library, because
# in the LTO case we do use a real compiler here.
- commands += linker.get_option_link_args(self.environment.coredata.options)
+ commands += linker.get_option_link_args(target.get_options())
dep_targets = []
dep_targets.extend(self.guess_external_link_dependencies(linker, target, commands, internal))
diff --git a/mesonbuild/backend/vs2010backend.py b/mesonbuild/backend/vs2010backend.py
index 1962fc2ef..340c1a547 100644
--- a/mesonbuild/backend/vs2010backend.py
+++ b/mesonbuild/backend/vs2010backend.py
@@ -1059,8 +1059,7 @@ class Vs2010Backend(backends.Backend):
# Compile args added from the env or cross file: CFLAGS/CXXFLAGS, etc. We want these
# to override all the defaults, but not the per-target compile args.
for l in file_args.keys():
- opts = self.environment.coredata.options[OptionKey('args', machine=target.for_machine, lang=l)]
- file_args[l] += opts.value
+ file_args[l] += target.get_option(OptionKey('args', machine=target.for_machine, lang=l))
for args in file_args.values():
# This is where Visual Studio will insert target_args, target_defines,
# etc, which are added later from external deps (see below).
@@ -1355,29 +1354,29 @@ class Vs2010Backend(backends.Backend):
if True in ((dep.name == 'openmp') for dep in target.get_external_deps()):
ET.SubElement(clconf, 'OpenMPSupport').text = 'true'
# CRT type; debug or release
- vscrt_type = self.environment.coredata.options[OptionKey('b_vscrt')]
- if vscrt_type.value == 'from_buildtype':
+ vscrt_type = target.get_option(OptionKey('b_vscrt'))
+ if vscrt_type == 'from_buildtype':
if self.buildtype == 'debug':
ET.SubElement(type_config, 'UseDebugLibraries').text = 'true'
ET.SubElement(clconf, 'RuntimeLibrary').text = 'MultiThreadedDebugDLL'
else:
ET.SubElement(type_config, 'UseDebugLibraries').text = 'false'
ET.SubElement(clconf, 'RuntimeLibrary').text = 'MultiThreadedDLL'
- elif vscrt_type.value == 'static_from_buildtype':
+ elif vscrt_type == 'static_from_buildtype':
if self.buildtype == 'debug':
ET.SubElement(type_config, 'UseDebugLibraries').text = 'true'
ET.SubElement(clconf, 'RuntimeLibrary').text = 'MultiThreadedDebug'
else:
ET.SubElement(type_config, 'UseDebugLibraries').text = 'false'
ET.SubElement(clconf, 'RuntimeLibrary').text = 'MultiThreaded'
- elif vscrt_type.value == 'mdd':
+ elif vscrt_type == 'mdd':
ET.SubElement(type_config, 'UseDebugLibraries').text = 'true'
ET.SubElement(clconf, 'RuntimeLibrary').text = 'MultiThreadedDebugDLL'
- elif vscrt_type.value == 'mt':
+ elif vscrt_type == 'mt':
# FIXME, wrong
ET.SubElement(type_config, 'UseDebugLibraries').text = 'false'
ET.SubElement(clconf, 'RuntimeLibrary').text = 'MultiThreaded'
- elif vscrt_type.value == 'mtd':
+ elif vscrt_type == 'mtd':
# FIXME, wrong
ET.SubElement(type_config, 'UseDebugLibraries').text = 'true'
ET.SubElement(clconf, 'RuntimeLibrary').text = 'MultiThreadedDebug'
@@ -1406,12 +1405,12 @@ class Vs2010Backend(backends.Backend):
# Exception handling has to be set in the xml in addition to the "AdditionalOptions" because otherwise
# cl will give warning D9025: overriding '/Ehs' with cpp_eh value
if 'cpp' in target.compilers:
- eh = self.environment.coredata.options[OptionKey('eh', machine=target.for_machine, lang='cpp')]
- if eh.value == 'a':
+ eh = target.get_option(OptionKey('eh', machine=target.for_machine, lang='cpp'))
+ if eh == 'a':
ET.SubElement(clconf, 'ExceptionHandling').text = 'Async'
- elif eh.value == 's':
+ elif eh == 's':
ET.SubElement(clconf, 'ExceptionHandling').text = 'SyncCThrow'
- elif eh.value == 'none':
+ elif eh == 'none':
ET.SubElement(clconf, 'ExceptionHandling').text = 'false'
else: # 'sc' or 'default'
ET.SubElement(clconf, 'ExceptionHandling').text = 'Sync'
@@ -1470,8 +1469,7 @@ class Vs2010Backend(backends.Backend):
ET.SubElement(link, 'GenerateDebugInformation').text = 'false'
if not isinstance(target, build.StaticLibrary):
if isinstance(target, build.SharedModule):
- options = self.environment.coredata.options
- extra_link_args += compiler.get_std_shared_module_link_args(options)
+ extra_link_args += compiler.get_std_shared_module_link_args(target.get_options())
# Add link args added using add_project_link_arguments()
extra_link_args += self.build.get_project_link_args(compiler, target.subproject, target.for_machine)
# Add link args added using add_global_link_arguments()
@@ -1504,7 +1502,7 @@ class Vs2010Backend(backends.Backend):
# to be after all internal and external libraries so that unresolved
# symbols from those can be found here. This is needed when the
# *_winlibs that we want to link to are static mingw64 libraries.
- extra_link_args += compiler.get_option_link_args(self.environment.coredata.options)
+ extra_link_args += compiler.get_option_link_args(target.get_options())
(additional_libpaths, additional_links, extra_link_args) = self.split_link_args(extra_link_args.to_native())
# Add more libraries to be linked if needed
@@ -1605,7 +1603,7 @@ class Vs2010Backend(backends.Backend):
# /nologo
ET.SubElement(link, 'SuppressStartupBanner').text = 'true'
# /release
- if not self.environment.coredata.get_option(OptionKey('debug')):
+ if not target.get_option(OptionKey('debug')):
ET.SubElement(link, 'SetChecksum').text = 'true'
# Visual studio doesn't simply allow the src files of a project to be added with the 'Condition=...' attribute,
@@ -1732,7 +1730,7 @@ class Vs2010Backend(backends.Backend):
return False
pch_sources = {}
- if self.environment.coredata.options.get(OptionKey('b_pch')):
+ if self.target_uses_pch(target):
for lang in ['c', 'cpp']:
pch = target.get_pch(lang)
if not pch:
diff --git a/mesonbuild/backend/xcodebackend.py b/mesonbuild/backend/xcodebackend.py
index c24074b70..bc4ba0bc2 100644
--- a/mesonbuild/backend/xcodebackend.py
+++ b/mesonbuild/backend/xcodebackend.py
@@ -1495,8 +1495,7 @@ class XCodeBackend(backends.Backend):
else:
raise RuntimeError(o)
if isinstance(target, build.SharedModule):
- options = self.environment.coredata.options
- ldargs += linker.get_std_shared_module_link_args(options)
+ ldargs += linker.get_std_shared_module_link_args(target.get_options())
elif isinstance(target, build.SharedLibrary):
ldargs += linker.get_std_shared_lib_link_args()
ldstr = ' '.join(ldargs)