diff options
Diffstat (limited to 'mesonbuild/backend')
-rw-r--r-- | mesonbuild/backend/backends.py | 12 | ||||
-rw-r--r-- | mesonbuild/backend/ninjabackend.py | 88 | ||||
-rw-r--r-- | mesonbuild/backend/vs2010backend.py | 10 | ||||
-rw-r--r-- | mesonbuild/backend/xcodebackend.py | 12 |
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: |