aboutsummaryrefslogtreecommitdiff
path: root/mesonbuild/backend
diff options
context:
space:
mode:
Diffstat (limited to 'mesonbuild/backend')
-rw-r--r--mesonbuild/backend/backends.py12
-rw-r--r--mesonbuild/backend/ninjabackend.py88
-rw-r--r--mesonbuild/backend/vs2010backend.py10
-rw-r--r--mesonbuild/backend/xcodebackend.py12
4 files changed, 65 insertions, 57 deletions
diff --git a/mesonbuild/backend/backends.py b/mesonbuild/backend/backends.py
index c84bb75..86d20f7 100644
--- a/mesonbuild/backend/backends.py
+++ b/mesonbuild/backend/backends.py
@@ -30,8 +30,8 @@ from .. import dependencies
from .. import mesonlib
from .. import mlog
from ..mesonlib import (
- File, MachineChoice, MesonException, OrderedSet, OptionOverrideProxy,
- classify_unity_sources, unholder
+ File, Language, MachineChoice, MesonException, OrderedSet,
+ OptionOverrideProxy, classify_unity_sources, unholder,
)
if T.TYPE_CHECKING:
@@ -704,7 +704,7 @@ class Backend:
if not dep.found():
continue
- if compiler.language == 'vala':
+ if compiler.language == Language.VALA:
if isinstance(dep, dependencies.PkgConfigDependency):
if dep.name == 'glib-2.0' and dep.version_reqs is not None:
for req in dep.version_reqs:
@@ -713,7 +713,7 @@ class Backend:
break
commands += ['--pkg', dep.name]
elif isinstance(dep, dependencies.ExternalLibrary):
- commands += dep.get_link_args('vala')
+ commands += dep.get_link_args(Language.VALA)
else:
commands += compiler.get_dependency_compile_args(dep)
# Qt needs -fPIC for executables
@@ -723,7 +723,7 @@ class Backend:
# For 'automagic' deps: Boost and GTest. Also dependency('threads').
# pkg-config puts the thread flags itself via `Cflags:`
# Fortran requires extra include directives.
- if compiler.language == 'fortran':
+ if compiler.language == Language.FORTRAN:
for lt in target.link_targets:
priv_dir = self.get_target_private_dir(lt)
commands += compiler.get_include_args(priv_dir, False)
@@ -737,7 +737,7 @@ class Backend:
arg = self.get_target_filename_for_linking(d)
if not arg:
continue
- if compiler.get_language() == 'd':
+ if compiler.get_language() == Language.D:
arg = '-Wl,' + arg
else:
arg = compiler.get_linker_lib_prefix() + arg
diff --git a/mesonbuild/backend/ninjabackend.py b/mesonbuild/backend/ninjabackend.py
index 32fb8db..968ad7c 100644
--- a/mesonbuild/backend/ninjabackend.py
+++ b/mesonbuild/backend/ninjabackend.py
@@ -40,7 +40,7 @@ from ..compilers import (
)
from ..linkers import ArLinker, VisualStudioLinker
from ..mesonlib import (
- File, LibType, MachineChoice, MesonException, OrderedSet, PerMachine,
+ File, LibType, Language, MachineChoice, MesonException, OrderedSet, PerMachine,
ProgressBar, quote_arg, unholder,
)
from ..mesonlib import get_compiler_for_source, has_path_sep
@@ -565,7 +565,7 @@ int dummy;
for src in genlist.get_outputs():
if self.environment.is_header(src):
header_deps.append(self.get_target_generated_dir(target, genlist, src))
- if 'vala' in target.compilers and not isinstance(target, build.Executable):
+ if Language.VALA in target.compilers and not isinstance(target, build.Executable):
vala_header = File.from_built_file(self.get_target_dir(target), target.vala_header)
header_deps.append(vala_header)
# Recurse and find generated headers
@@ -603,7 +603,7 @@ int dummy;
# Languages that can mix with C or C++ but don't support unity builds yet
# because the syntax we use for unity builds is specific to C/++/ObjC/++.
# Assembly files cannot be unitified and neither can LLVM IR files
- langs_cant_unity = ('d', 'fortran')
+ langs_cant_unity = (Language.D, Language.FORTRAN)
def get_target_source_can_unity(self, target, source):
if isinstance(source, File):
@@ -649,7 +649,7 @@ int dummy;
parameters = comp.compute_parameters_with_absolute_paths(parameters, self.build_dir)
# The new entry
src_block = {
- 'language': lang,
+ 'language': lang.get_lower_case_name(),
'compiler': comp.get_exelist(),
'parameters': parameters,
'sources': [],
@@ -693,10 +693,10 @@ int dummy;
if self.is_rust_target(target):
self.generate_rust_target(target)
return
- if 'cs' in target.compilers:
+ if Language.CS in target.compilers:
self.generate_cs_target(target)
return
- if 'swift' in target.compilers:
+ if Language.SWIFT in target.compilers:
self.generate_swift_target(target)
return
@@ -711,7 +711,7 @@ int dummy;
# path to source relative to build root and the generating target/list
# vala_generated_sources:
# Array of sources generated by valac that have to be compiled
- if 'vala' in target.compilers:
+ if Language.VALA in target.compilers:
# Sources consumed by valac are filtered out. These only contain
# C/C++ sources, objects, generated libs, and unknown sources now.
target_sources, generated_sources, \
@@ -809,10 +809,10 @@ int dummy;
# after `header_deps` (above) is fully generated
vala_generated_source_files.append(raw_src)
for src in vala_generated_source_files:
- # Passing 'vala' here signifies that we want the compile
+ # Passing Language.VALA here signifies that we want the compile
# arguments to be specialized for C code generated by
# valac. For instance, no warnings should be emitted.
- obj_list.append(self.generate_single_compile(target, src, 'vala', [], header_deps))
+ obj_list.append(self.generate_single_compile(target, src, Language.VALA, [], header_deps))
# Generate compile targets for all the pre-existing sources for this target
for src in target_sources.values():
@@ -1126,7 +1126,7 @@ int dummy;
outname_rel = os.path.join(self.get_target_dir(target), fname)
src_list = target.get_sources()
class_list = []
- compiler = target.compilers['java']
+ compiler = target.compilers[Language.JAVA]
c = 'c'
m = 'm'
e = ''
@@ -1201,10 +1201,10 @@ int dummy;
fname = target.get_filename()
outname_rel = os.path.join(self.get_target_dir(target), fname)
src_list = target.get_sources()
- compiler = target.compilers['cs']
+ compiler = target.compilers[Language.CS]
rel_srcs = [os.path.normpath(s.rel_to_builddir(self.build_to_src)) for s in src_list]
deps = []
- commands = compiler.compiler_args(target.extra_args.get('cs', []))
+ commands = compiler.compiler_args(target.extra_args.get(Language.CS, []))
commands += compiler.get_buildtype_args(buildtype)
commands += compiler.get_optimization_args(self.get_option_for_target('optimization', target))
commands += compiler.get_debug_args(self.get_option_for_target('debug', target))
@@ -1238,7 +1238,7 @@ int dummy;
commands += self.build.get_project_args(compiler, target.subproject, target.for_machine)
commands += self.build.get_global_args(compiler, target.for_machine)
- elem = NinjaBuildElement(self.all_outputs, outputs, self.get_compiler_rule_name('cs', target.for_machine), rel_srcs + generated_rel_srcs)
+ elem = NinjaBuildElement(self.all_outputs, outputs, self.get_compiler_rule_name(Language.CS, target.for_machine), rel_srcs + generated_rel_srcs)
elem.add_dep(deps)
elem.add_item('ARGS', commands)
self.add_build(elem)
@@ -1366,7 +1366,7 @@ int dummy;
msg = 'Vala library {!r} has no Vala or Genie source files.'
raise InvalidArguments(msg.format(target.name))
- valac = target.compilers['vala']
+ valac = target.compilers[Language.VALA]
c_out_dir = self.get_target_private_dir(target)
# C files generated by valac
vala_c_src = []
@@ -1458,7 +1458,7 @@ int dummy;
args += ['--gresources=' + gres_xml]
extra_args = []
- for a in target.extra_args.get('vala', []):
+ for a in target.extra_args.get(Language.VALA, []):
if isinstance(a, File):
relname = a.rel_to_builddir(self.build_to_src)
extra_dep_files.append(relname)
@@ -1478,7 +1478,7 @@ int dummy;
return other_src[0], other_src[1], vala_c_src
def generate_rust_target(self, target):
- rustc = target.compilers['rust']
+ rustc = target.compilers[Language.RUST]
# Rust compiler takes only the main file as input and
# figures out what other files are needed via import
# statements and magic.
@@ -1520,7 +1520,7 @@ int dummy;
args += self.build.get_project_args(rustc, target.subproject, target.for_machine)
depfile = os.path.join(target.subdir, target.name + '.d')
args += ['--emit', 'dep-info={}'.format(depfile), '--emit', 'link']
- args += target.get_extra_args('rust')
+ args += target.get_extra_args(Language.RUST)
args += ['-o', os.path.join(target.subdir, target.get_filename())]
orderdeps = [os.path.join(t.subdir, t.get_filename()) for t in target.link_targets]
linkdirs = OrderedDict()
@@ -1567,7 +1567,7 @@ int dummy;
# installations
for rpath_arg in rpath_args:
args += ['-C', 'link-arg=' + rpath_arg + ':' + os.path.join(rustc.get_sysroot(), 'lib')]
- compiler_name = self.get_compiler_rule_name('rust', target.for_machine)
+ compiler_name = self.get_compiler_rule_name(Language.RUST, target.for_machine)
element = NinjaBuildElement(self.all_outputs, target_name, compiler_name, main_rust_file)
if len(orderdeps) > 0:
element.add_orderdep(orderdeps)
@@ -1585,11 +1585,11 @@ int dummy;
@classmethod
def get_compiler_rule_name(cls, lang: str, for_machine: MachineChoice) -> str:
- return '{}_COMPILER{}'.format(lang, cls.get_rule_suffix(for_machine))
+ return '{}_COMPILER{}'.format(lang.get_lower_case_name(), cls.get_rule_suffix(for_machine))
@classmethod
def get_pch_rule_name(cls, lang: str, for_machine: MachineChoice) -> str:
- return '{}_PCH{}'.format(lang, cls.get_rule_suffix(for_machine))
+ return '{}_PCH{}'.format(lang.get_lower_case_name(), cls.get_rule_suffix(for_machine))
@classmethod
def compiler_to_rule_name(cls, compiler: Compiler) -> str:
@@ -1644,7 +1644,7 @@ int dummy;
def generate_swift_target(self, target):
module_name = self.target_swift_modulename(target)
- swiftc = target.compilers['swift']
+ swiftc = target.compilers[Language.SWIFT]
abssrc = []
relsrc = []
abs_headers = []
@@ -1708,7 +1708,7 @@ int dummy;
objects.append(oname)
rel_objects.append(os.path.join(self.get_target_private_dir(target), oname))
- rulename = self.get_compiler_rule_name('swift', target.for_machine)
+ rulename = self.get_compiler_rule_name(Language.SWIFT, target.for_machine)
# Swiftc does not seem to be able to emit objects and module files in one go.
elem = NinjaBuildElement(self.all_outputs, rel_objects, rulename, abssrc)
@@ -1718,7 +1718,7 @@ int dummy;
elem.add_item('RUNDIR', rundir)
self.add_build(elem)
elem = NinjaBuildElement(self.all_outputs, out_module_name,
- self.get_compiler_rule_name('swift', target.for_machine),
+ self.get_compiler_rule_name(Language.SWIFT, target.for_machine),
abssrc)
elem.add_dep(in_module_files + rel_generated)
elem.add_item('ARGS', compile_args + abs_generated + module_includes + swiftc.get_mod_gen_args())
@@ -1742,7 +1742,7 @@ int dummy;
def generate_static_link_rules(self):
num_pools = self.environment.coredata.backend_options['backend_max_links'].value
- if 'java' in self.environment.coredata.compilers.host:
+ if Language.JAVA in self.environment.coredata.compilers.host:
self.generate_java_link()
for for_machine in MachineChoice:
static_linker = self.build.static_linker[for_machine]
@@ -1778,12 +1778,12 @@ int dummy;
for for_machine in MachineChoice:
complist = self.environment.coredata.compilers[for_machine]
for langname, compiler in complist.items():
- if langname == 'java' \
- or langname == 'vala' \
- or langname == 'rust' \
- or langname == 'cs':
+ if langname == Language.JAVA \
+ or langname == Language.VALA \
+ or langname == Language.RUST \
+ or langname == Language.CS:
continue
- rule = '{}_LINKER{}'.format(langname, self.get_rule_suffix(for_machine))
+ rule = '{}_LINKER{}'.format(langname.get_lower_case_name(), self.get_rule_suffix(for_machine))
command = compiler.get_linker_exelist()
args = ['$ARGS'] + NinjaCommandArg.list(compiler.get_linker_output_args('$out'), Quoting.none) + ['$in', '$LINK_ARGS']
description = 'Linking target $out'
@@ -1875,26 +1875,26 @@ https://gcc.gnu.org/bugzilla/show_bug.cgi?id=47485'''))
self.created_llvm_ir_rule[compiler.for_machine] = True
def generate_compile_rule_for(self, langname, compiler):
- if langname == 'java':
+ if langname == Language.JAVA:
if self.environment.machines.matches_build_machine(compiler.for_machine):
self.generate_java_compile_rule(compiler)
return
- if langname == 'cs':
+ if langname == Language.CS:
if self.environment.machines.matches_build_machine(compiler.for_machine):
self.generate_cs_compile_rule(compiler)
return
- if langname == 'vala':
+ if langname == Language.VALA:
self.generate_vala_compile_rules(compiler)
return
- if langname == 'rust':
+ if langname == Language.RUST:
self.generate_rust_compile_rules(compiler)
return
- if langname == 'swift':
+ if langname == Language.SWIFT:
if self.environment.machines.matches_build_machine(compiler.for_machine):
self.generate_swift_compile_rules(compiler)
return
crstr = self.get_rule_suffix(compiler.for_machine)
- if langname == 'fortran':
+ if langname == Language.FORTRAN:
self.generate_fortran_dep_hack(crstr)
rule = self.get_compiler_rule_name(langname, compiler.for_machine)
depargs = NinjaCommandArg.list(compiler.get_dependency_gen_args('$out', '$DEPFILE'), Quoting.none)
@@ -1914,7 +1914,7 @@ https://gcc.gnu.org/bugzilla/show_bug.cgi?id=47485'''))
deps=deps, depfile=depfile))
def generate_pch_rule_for(self, langname, compiler):
- if langname != 'c' and langname != 'cpp':
+ if langname != Language.C and langname != Language.CPP:
return
rule = self.compiler_to_pch_rule_name(compiler)
depargs = compiler.get_dependency_gen_args('$out', '$DEPFILE')
@@ -2031,7 +2031,7 @@ https://gcc.gnu.org/bugzilla/show_bug.cgi?id=47485'''))
compiler = None
# TODO other compilers
for lang, c in self.environment.coredata.compilers.host.items():
- if lang == 'fortran':
+ if lang == Language.FORTRAN:
compiler = c
break
if compiler is None:
@@ -2257,7 +2257,7 @@ https://gcc.gnu.org/bugzilla/show_bug.cgi?id=47485'''))
compiler)
# The code generated by valac is usually crap and has tons of unused
# variables and such, so disable warnings for Vala C sources.
- no_warn_args = (is_generated == 'vala')
+ no_warn_args = (is_generated == Language.VALA)
# Add compiler args and include paths from several sources; defaults,
# build options, external dependencies, etc.
commands += self.generate_basic_compiler_args(target, compiler, no_warn_args)
@@ -2294,7 +2294,7 @@ https://gcc.gnu.org/bugzilla/show_bug.cgi?id=47485'''))
target.get_extra_args(compiler.get_language()))
# D specific additional flags
- if compiler.language == 'd':
+ if compiler.language == Language.D:
commands += compiler.get_feature_args(target.d_features, self.build_to_src)
# Add source dir and build dir. Project-specific and target-specific
@@ -2373,7 +2373,7 @@ https://gcc.gnu.org/bugzilla/show_bug.cgi?id=47485'''))
compiler_name = self.compiler_to_rule_name(compiler)
extra_deps = []
- if compiler.get_language() == 'fortran':
+ if compiler.get_language() == Language.FORTRAN:
# Can't read source file to scan for deps if it's generated later
# at build-time. Skip scanning for deps, and just set the module
# outdir argument instead.
@@ -2432,7 +2432,7 @@ https://gcc.gnu.org/bugzilla/show_bug.cgi?id=47485'''))
# The real deps are then detected via dep file generation from the compiler. This breaks on compilers that
# produce incorrect dep files but such is life.
def get_fortran_orderdeps(self, target, compiler):
- if compiler.language != 'fortran':
+ if compiler.language != Language.FORTRAN:
return []
return [os.path.join(self.get_target_dir(lt), lt.get_filename()) for lt in target.link_targets]
@@ -2462,7 +2462,7 @@ https://gcc.gnu.org/bugzilla/show_bug.cgi?id=47485'''))
def generate_gcc_pch_command(self, target, compiler, pch):
commands = self._generate_single_compile(target, compiler)
- if pch.split('.')[-1] == 'h' and compiler.language == 'cpp':
+ if pch.split('.')[-1] == 'h' and compiler.language == Language.CPP:
# Explicitly compile pch headers as C++. If Clang is invoked in C++ mode, it actually warns if
# this option is not set, and for gcc it also makes sense to use it.
commands += ['-x', 'c++-header']
@@ -2474,7 +2474,7 @@ https://gcc.gnu.org/bugzilla/show_bug.cgi?id=47485'''))
def generate_pch(self, target, header_deps=None):
header_deps = header_deps if header_deps is not None else []
pch_objects = []
- for lang in ['c', 'cpp']:
+ for lang in [Language.C, Language.CPP]:
pch = target.get_pch(lang)
if not pch:
continue
@@ -2665,7 +2665,7 @@ https://gcc.gnu.org/bugzilla/show_bug.cgi?id=47485'''))
if isinstance(target, build.StaticLibrary):
linker_base = 'STATIC'
else:
- linker_base = linker.get_language() # Fixme.
+ linker_base = linker.get_language().get_lower_case_name() # Fixme.
if isinstance(target, build.SharedLibrary):
self.generate_shsym(target)
crstr = self.get_rule_suffix(target.for_machine)
diff --git a/mesonbuild/backend/vs2010backend.py b/mesonbuild/backend/vs2010backend.py
index f282d02..7e28cfb 100644
--- a/mesonbuild/backend/vs2010backend.py
+++ b/mesonbuild/backend/vs2010backend.py
@@ -587,9 +587,9 @@ class Vs2010Backend(backends.Backend):
def lang_from_source_file(cls, src):
ext = src.split('.')[-1]
if ext in compilers.c_suffixes:
- return 'c'
+ return Language.C
if ext in compilers.cpp_suffixes:
- return 'cpp'
+ return Language.CPP
raise MesonException('Could not guess language from source file %s.' % src)
def add_pch(self, pch_sources, lang, inc_cl):
@@ -726,13 +726,13 @@ class Vs2010Backend(backends.Backend):
def _get_cl_compiler(self, target):
for lang, c in target.compilers.items():
- if lang in ('c', 'cpp'):
+ if lang in (Language.C, Language.CPP):
return c
# No source files, only objects, but we still need a compiler, so
# return a found compiler
if len(target.objects) > 0:
for lang, c in self.environment.coredata.compilers[target.for_machine].items():
- if lang in ('c', 'cpp'):
+ if lang in (Language.C, Language.CPP):
return c
raise MesonException('Could not find a C or C++ compiler. MSVC can only build C/C++ projects.')
@@ -1060,7 +1060,7 @@ class Vs2010Backend(backends.Backend):
# Note: SuppressStartupBanner is /NOLOGO and is 'true' by default
pch_sources = {}
if self.environment.coredata.base_options.get('b_pch', False):
- for lang in ['c', 'cpp']:
+ for lang in [Language.C, Language.CPP]:
pch = target.get_pch(lang)
if not pch:
continue
diff --git a/mesonbuild/backend/xcodebackend.py b/mesonbuild/backend/xcodebackend.py
index 3fe6574..4625468 100644
--- a/mesonbuild/backend/xcodebackend.py
+++ b/mesonbuild/backend/xcodebackend.py
@@ -702,7 +702,12 @@ class XCodeBackend(backends.Backend):
self.write_line('};')
# Now finally targets.
- langnamemap = {'c': 'C', 'cpp': 'CPLUSPLUS', 'objc': 'OBJC', 'objcpp': 'OBJCPLUSPLUS'}
+ langnamemap = {
+ Language.C: 'C',
+ Language.CPP: 'CPLUSPLUS',
+ Language.OBJC: 'OBJC',
+ Language.OBJCPP: 'OBJCPLUSPLUS',
+ }
for target_name, target in self.build.targets.items():
for buildtype in self.buildtypes:
dep_libs = []
@@ -773,7 +778,10 @@ class XCodeBackend(backends.Backend):
# Xcode uses GCC_PREFIX_HEADER which only allows one file per target/executable. Precompiling various header files and
# applying a particular pch to each source file will require custom scripts (as a build phase) and build flags per each
# file. Since Xcode itself already discourages precompiled headers in favor of modules we don't try much harder here.
- pchs = target.get_pch('c') + target.get_pch('cpp') + target.get_pch('objc') + target.get_pch('objcpp')
+ pchs = target.get_pch(Language.C)
+ + target.get_pch(Language.CPP)
+ + target.get_pch(Language.OBJC)
+ + target.get_pch(Language.OBJCPP)
# Make sure to use headers (other backends require implementation files like *.c *.cpp, etc; these should not be used here)
pchs = [pch for pch in pchs if pch.endswith('.h') or pch.endswith('.hh') or pch.endswith('hpp')]
if pchs: