|
|
|
@ -45,6 +45,7 @@ if T.TYPE_CHECKING: |
|
|
|
|
from ..linkers.linkers import DynamicLinker, StaticLinker |
|
|
|
|
from ..compilers.cs import CsCompiler |
|
|
|
|
from ..compilers.fortran import FortranCompiler |
|
|
|
|
from ..mesonlib import FileOrString |
|
|
|
|
|
|
|
|
|
CommandArgOrStr = T.List[T.Union['NinjaCommandArg', str]] |
|
|
|
|
RUST_EDITIONS = Literal['2015', '2018', '2021'] |
|
|
|
@ -333,7 +334,7 @@ class NinjaBuildElement: |
|
|
|
|
else: |
|
|
|
|
self.deps.add(dep) |
|
|
|
|
|
|
|
|
|
def add_orderdep(self, dep): |
|
|
|
|
def add_orderdep(self, dep) -> None: |
|
|
|
|
if isinstance(dep, list): |
|
|
|
|
self.orderdeps.update(dep) |
|
|
|
|
else: |
|
|
|
@ -351,7 +352,7 @@ class NinjaBuildElement: |
|
|
|
|
if name == 'DEPFILE': |
|
|
|
|
self.elems.append((name + '_UNQUOTED', elems)) |
|
|
|
|
|
|
|
|
|
def _should_use_rspfile(self): |
|
|
|
|
def _should_use_rspfile(self) -> bool: |
|
|
|
|
# 'phony' is a rule built-in to ninja |
|
|
|
|
if self.rulename == 'phony': |
|
|
|
|
return False |
|
|
|
@ -366,14 +367,14 @@ class NinjaBuildElement: |
|
|
|
|
outfilenames, |
|
|
|
|
self.elems) >= rsp_threshold |
|
|
|
|
|
|
|
|
|
def count_rule_references(self): |
|
|
|
|
def count_rule_references(self) -> None: |
|
|
|
|
if self.rulename != 'phony': |
|
|
|
|
if self._should_use_rspfile(): |
|
|
|
|
self.rule.rsprefcount += 1 |
|
|
|
|
else: |
|
|
|
|
self.rule.refcount += 1 |
|
|
|
|
|
|
|
|
|
def write(self, outfile): |
|
|
|
|
def write(self, outfile: T.TextIO) -> None: |
|
|
|
|
if self.output_errors: |
|
|
|
|
raise MesonException(self.output_errors) |
|
|
|
|
ins = ' '.join([ninja_quote(i, True) for i in self.infilenames]) |
|
|
|
@ -432,7 +433,7 @@ class NinjaBuildElement: |
|
|
|
|
outfile.write(line) |
|
|
|
|
outfile.write('\n') |
|
|
|
|
|
|
|
|
|
def check_outputs(self): |
|
|
|
|
def check_outputs(self) -> None: |
|
|
|
|
for n in self.outfilenames: |
|
|
|
|
if n in self.all_outputs: |
|
|
|
|
self.output_errors = f'Multiple producers for Ninja target "{n}". Please rename your targets.' |
|
|
|
@ -713,7 +714,7 @@ class NinjaBackend(backends.Backend): |
|
|
|
|
f, indent=4) |
|
|
|
|
|
|
|
|
|
# http://clang.llvm.org/docs/JSONCompilationDatabase.html |
|
|
|
|
def generate_compdb(self): |
|
|
|
|
def generate_compdb(self) -> None: |
|
|
|
|
rules = [] |
|
|
|
|
# TODO: Rather than an explicit list here, rules could be marked in the |
|
|
|
|
# rule store as being wanted in compdb |
|
|
|
@ -735,10 +736,10 @@ class NinjaBackend(backends.Backend): |
|
|
|
|
|
|
|
|
|
# Get all generated headers. Any source file might need them so |
|
|
|
|
# we need to add an order dependency to them. |
|
|
|
|
def get_generated_headers(self, target): |
|
|
|
|
def get_generated_headers(self, target: build.BuildTarget) -> T.List[FileOrString]: |
|
|
|
|
if hasattr(target, 'cached_generated_headers'): |
|
|
|
|
return target.cached_generated_headers |
|
|
|
|
header_deps = [] |
|
|
|
|
header_deps: T.List[FileOrString] = [] |
|
|
|
|
# XXX: Why don't we add deps to CustomTarget headers here? |
|
|
|
|
for genlist in target.get_generated_sources(): |
|
|
|
|
if isinstance(genlist, (build.CustomTarget, build.CustomTargetIndex)): |
|
|
|
@ -798,7 +799,7 @@ class NinjaBackend(backends.Backend): |
|
|
|
|
return True |
|
|
|
|
|
|
|
|
|
def create_target_source_introspection(self, target: build.Target, comp: compilers.Compiler, parameters, sources, generated_sources, |
|
|
|
|
unity_sources: T.Optional[T.List[mesonlib.FileOrString]] = None): |
|
|
|
|
unity_sources: T.Optional[T.List[FileOrString]] = None) -> None: |
|
|
|
|
''' |
|
|
|
|
Adds the source file introspection information for a language of a target |
|
|
|
|
|
|
|
|
@ -837,7 +838,7 @@ class NinjaBackend(backends.Backend): |
|
|
|
|
} |
|
|
|
|
tgt[id_hash] = src_block |
|
|
|
|
|
|
|
|
|
def compute_path(file: mesonlib.FileOrString) -> str: |
|
|
|
|
def compute_path(file: FileOrString) -> str: |
|
|
|
|
""" Make source files absolute """ |
|
|
|
|
if isinstance(file, File): |
|
|
|
|
return file.absolute_path(self.source_dir, self.build_dir) |
|
|
|
@ -848,7 +849,7 @@ class NinjaBackend(backends.Backend): |
|
|
|
|
if unity_sources: |
|
|
|
|
src_block['unity_sources'].extend(compute_path(x) for x in unity_sources) |
|
|
|
|
|
|
|
|
|
def create_target_linker_introspection(self, target: build.Target, linker: T.Union[Compiler, StaticLinker], parameters): |
|
|
|
|
def create_target_linker_introspection(self, target: build.Target, linker: T.Union[Compiler, StaticLinker], parameters) -> None: |
|
|
|
|
tid = target.get_id() |
|
|
|
|
tgt = self.introspection_data[tid] |
|
|
|
|
lnk_hash = tuple(parameters) |
|
|
|
@ -868,7 +869,7 @@ class NinjaBackend(backends.Backend): |
|
|
|
|
} |
|
|
|
|
tgt[lnk_hash] = lnk_block |
|
|
|
|
|
|
|
|
|
def generate_target(self, target): |
|
|
|
|
def generate_target(self, target) -> None: |
|
|
|
|
if isinstance(target, build.BuildTarget): |
|
|
|
|
os.makedirs(self.get_target_private_dir_abs(target), exist_ok=True) |
|
|
|
|
if isinstance(target, build.CustomTarget): |
|
|
|
@ -1108,7 +1109,7 @@ class NinjaBackend(backends.Backend): |
|
|
|
|
compiled_sources: T.List[str], |
|
|
|
|
source2object: T.Dict[str, str], |
|
|
|
|
generated_source_files: T.List[mesonlib.File], |
|
|
|
|
object_deps: T.List['mesonlib.FileOrString']) -> None: |
|
|
|
|
object_deps: T.List[FileOrString]) -> None: |
|
|
|
|
if not self.should_use_dyndeps_for_target(target): |
|
|
|
|
return |
|
|
|
|
self._uses_dyndeps = True |
|
|
|
@ -1152,12 +1153,12 @@ class NinjaBackend(backends.Backend): |
|
|
|
|
elif ext.lower() in compilers.lang_suffixes['fortran']: |
|
|
|
|
yield source, 'fortran' |
|
|
|
|
|
|
|
|
|
def process_target_dependencies(self, target): |
|
|
|
|
def process_target_dependencies(self, target) -> None: |
|
|
|
|
for t in target.get_dependencies(): |
|
|
|
|
if t.get_id() not in self.processed_targets: |
|
|
|
|
self.generate_target(t) |
|
|
|
|
|
|
|
|
|
def custom_target_generator_inputs(self, target): |
|
|
|
|
def custom_target_generator_inputs(self, target) -> None: |
|
|
|
|
for s in target.sources: |
|
|
|
|
if isinstance(s, build.GeneratedList): |
|
|
|
|
self.generate_genlist_for_target(s, target) |
|
|
|
@ -1173,7 +1174,7 @@ class NinjaBackend(backends.Backend): |
|
|
|
|
deps.append(os.path.join(self.get_target_dir(i), output)) |
|
|
|
|
return deps |
|
|
|
|
|
|
|
|
|
def generate_custom_target(self, target: build.CustomTarget): |
|
|
|
|
def generate_custom_target(self, target: build.CustomTarget) -> None: |
|
|
|
|
self.custom_target_generator_inputs(target) |
|
|
|
|
(srcs, ofilenames, cmd) = self.eval_custom_target_command(target) |
|
|
|
|
deps = self.unwrap_dep_list(target) |
|
|
|
@ -1215,14 +1216,14 @@ class NinjaBackend(backends.Backend): |
|
|
|
|
self.add_build(elem) |
|
|
|
|
self.processed_targets.add(target.get_id()) |
|
|
|
|
|
|
|
|
|
def build_run_target_name(self, target): |
|
|
|
|
def build_run_target_name(self, target) -> str: |
|
|
|
|
if target.subproject != '': |
|
|
|
|
subproject_prefix = f'{target.subproject}@@' |
|
|
|
|
else: |
|
|
|
|
subproject_prefix = '' |
|
|
|
|
return f'{subproject_prefix}{target.name}' |
|
|
|
|
|
|
|
|
|
def generate_run_target(self, target: build.RunTarget): |
|
|
|
|
def generate_run_target(self, target: build.RunTarget) -> None: |
|
|
|
|
target_name = self.build_run_target_name(target) |
|
|
|
|
if not target.command: |
|
|
|
|
# This is an alias target, it has no command, it just depends on |
|
|
|
@ -1245,7 +1246,8 @@ class NinjaBackend(backends.Backend): |
|
|
|
|
self.add_build(elem) |
|
|
|
|
self.processed_targets.add(target.get_id()) |
|
|
|
|
|
|
|
|
|
def generate_coverage_command(self, elem: NinjaBuildElement, outputs: T.List[str], gcovr_exe: T.Optional[str], llvm_cov_exe: T.Optional[str]): |
|
|
|
|
def generate_coverage_command(self, elem: NinjaBuildElement, outputs: T.List[str], |
|
|
|
|
gcovr_exe: T.Optional[str], llvm_cov_exe: T.Optional[str]) -> None: |
|
|
|
|
targets = self.build.get_targets().values() |
|
|
|
|
use_llvm_cov = False |
|
|
|
|
exe_args = [] |
|
|
|
@ -1272,14 +1274,14 @@ class NinjaBackend(backends.Backend): |
|
|
|
|
exe_args + |
|
|
|
|
(['--use-llvm-cov'] if use_llvm_cov else [])) |
|
|
|
|
|
|
|
|
|
def generate_coverage_rules(self, gcovr_exe: T.Optional[str], gcovr_version: T.Optional[str], llvm_cov_exe: T.Optional[str]): |
|
|
|
|
def generate_coverage_rules(self, gcovr_exe: T.Optional[str], gcovr_version: T.Optional[str], llvm_cov_exe: T.Optional[str]) -> None: |
|
|
|
|
e = self.create_phony_target('coverage', 'CUSTOM_COMMAND', 'PHONY') |
|
|
|
|
self.generate_coverage_command(e, [], gcovr_exe, llvm_cov_exe) |
|
|
|
|
e.add_item('description', 'Generates coverage reports') |
|
|
|
|
self.add_build(e) |
|
|
|
|
self.generate_coverage_legacy_rules(gcovr_exe, gcovr_version, llvm_cov_exe) |
|
|
|
|
|
|
|
|
|
def generate_coverage_legacy_rules(self, gcovr_exe: T.Optional[str], gcovr_version: T.Optional[str], llvm_cov_exe: T.Optional[str]): |
|
|
|
|
def generate_coverage_legacy_rules(self, gcovr_exe: T.Optional[str], gcovr_version: T.Optional[str], llvm_cov_exe: T.Optional[str]) -> None: |
|
|
|
|
e = self.create_phony_target('coverage-html', 'CUSTOM_COMMAND', 'PHONY') |
|
|
|
|
self.generate_coverage_command(e, ['--html'], gcovr_exe, llvm_cov_exe) |
|
|
|
|
e.add_item('description', 'Generates HTML coverage report') |
|
|
|
@ -1302,7 +1304,7 @@ class NinjaBackend(backends.Backend): |
|
|
|
|
e.add_item('description', 'Generates Sonarqube XML coverage report') |
|
|
|
|
self.add_build(e) |
|
|
|
|
|
|
|
|
|
def generate_install(self): |
|
|
|
|
def generate_install(self) -> None: |
|
|
|
|
self.create_install_data_files() |
|
|
|
|
elem = self.create_phony_target('install', 'CUSTOM_COMMAND', 'PHONY') |
|
|
|
|
elem.add_dep('all') |
|
|
|
@ -1311,7 +1313,7 @@ class NinjaBackend(backends.Backend): |
|
|
|
|
elem.add_item('pool', 'console') |
|
|
|
|
self.add_build(elem) |
|
|
|
|
|
|
|
|
|
def generate_tests(self): |
|
|
|
|
def generate_tests(self) -> None: |
|
|
|
|
self.serialize_tests() |
|
|
|
|
cmd = self.environment.get_build_command(True) + ['test', '--no-rebuild'] |
|
|
|
|
if not self.environment.coredata.get_option(OptionKey('stdsplit')): |
|
|
|
@ -1334,7 +1336,7 @@ class NinjaBackend(backends.Backend): |
|
|
|
|
elem.add_item('pool', 'console') |
|
|
|
|
self.add_build(elem) |
|
|
|
|
|
|
|
|
|
def generate_rules(self): |
|
|
|
|
def generate_rules(self) -> None: |
|
|
|
|
self.rules = [] |
|
|
|
|
self.ruledict = {} |
|
|
|
|
|
|
|
|
@ -1409,7 +1411,7 @@ class NinjaBackend(backends.Backend): |
|
|
|
|
elem = NinjaBuildElement(self.all_outputs, 'PHONY', 'phony', '') |
|
|
|
|
self.add_build(elem) |
|
|
|
|
|
|
|
|
|
def generate_jar_target(self, target: build.Jar): |
|
|
|
|
def generate_jar_target(self, target: build.Jar) -> None: |
|
|
|
|
fname = target.get_filename() |
|
|
|
|
outname_rel = os.path.join(self.get_target_dir(target), fname) |
|
|
|
|
src_list = target.get_sources() |
|
|
|
@ -1463,7 +1465,7 @@ class NinjaBackend(backends.Backend): |
|
|
|
|
# Create introspection information |
|
|
|
|
self.create_target_source_introspection(target, compiler, compile_args, src_list, gen_src_list) |
|
|
|
|
|
|
|
|
|
def generate_cs_resource_tasks(self, target): |
|
|
|
|
def generate_cs_resource_tasks(self, target) -> T.Tuple[T.List[str], T.List[str]]: |
|
|
|
|
args = [] |
|
|
|
|
deps = [] |
|
|
|
|
for r in target.resources: |
|
|
|
@ -1484,7 +1486,7 @@ class NinjaBackend(backends.Backend): |
|
|
|
|
args.append(a) |
|
|
|
|
return args, deps |
|
|
|
|
|
|
|
|
|
def generate_cs_target(self, target: build.BuildTarget): |
|
|
|
|
def generate_cs_target(self, target: build.BuildTarget) -> None: |
|
|
|
|
fname = target.get_filename() |
|
|
|
|
outname_rel = os.path.join(self.get_target_dir(target), fname) |
|
|
|
|
src_list = target.get_sources() |
|
|
|
@ -1529,7 +1531,7 @@ class NinjaBackend(backends.Backend): |
|
|
|
|
self.generate_generator_list_rules(target) |
|
|
|
|
self.create_target_source_introspection(target, compiler, commands, rel_srcs, generated_rel_srcs) |
|
|
|
|
|
|
|
|
|
def determine_java_compile_args(self, target, compiler): |
|
|
|
|
def determine_java_compile_args(self, target, compiler) -> T.List[str]: |
|
|
|
|
args = [] |
|
|
|
|
args = self.generate_basic_compiler_args(target, compiler) |
|
|
|
|
args += target.get_java_args() |
|
|
|
@ -1569,13 +1571,13 @@ class NinjaBackend(backends.Backend): |
|
|
|
|
self.add_build(element) |
|
|
|
|
return plain_class_paths |
|
|
|
|
|
|
|
|
|
def generate_java_link(self): |
|
|
|
|
def generate_java_link(self) -> None: |
|
|
|
|
rule = 'java_LINKER' |
|
|
|
|
command = ['jar', '$ARGS'] |
|
|
|
|
description = 'Creating JAR $out' |
|
|
|
|
self.add_rule(NinjaRule(rule, command, [], description)) |
|
|
|
|
|
|
|
|
|
def determine_dep_vapis(self, target): |
|
|
|
|
def determine_dep_vapis(self, target) -> T.List[str]: |
|
|
|
|
""" |
|
|
|
|
Peek into the sources of BuildTargets we're linking with, and if any of |
|
|
|
|
them was built with Vala, assume that it also generated a .vapi file of |
|
|
|
@ -1838,7 +1840,7 @@ class NinjaBackend(backends.Backend): |
|
|
|
|
|
|
|
|
|
return static_sources, generated_sources, cython_sources |
|
|
|
|
|
|
|
|
|
def _generate_copy_target(self, src: 'mesonlib.FileOrString', output: Path) -> None: |
|
|
|
|
def _generate_copy_target(self, src: FileOrString, output: Path) -> None: |
|
|
|
|
"""Create a target to copy a source file from one location to another.""" |
|
|
|
|
if isinstance(src, File): |
|
|
|
|
instr = src.absolute_path(self.environment.source_dir, self.environment.build_dir) |
|
|
|
@ -2191,7 +2193,7 @@ class NinjaBackend(backends.Backend): |
|
|
|
|
others.append(i) |
|
|
|
|
return srcs, others |
|
|
|
|
|
|
|
|
|
def generate_swift_target(self, target): |
|
|
|
|
def generate_swift_target(self, target) -> None: |
|
|
|
|
module_name = self.target_swift_modulename(target) |
|
|
|
|
swiftc = target.compilers['swift'] |
|
|
|
|
abssrc = [] |
|
|
|
@ -2296,7 +2298,7 @@ class NinjaBackend(backends.Backend): |
|
|
|
|
options['rspfile_quote_style'] = tool.rsp_file_syntax() |
|
|
|
|
return options |
|
|
|
|
|
|
|
|
|
def generate_static_link_rules(self): |
|
|
|
|
def generate_static_link_rules(self) -> None: |
|
|
|
|
num_pools = self.environment.coredata.optstore.get_value('backend_max_links') |
|
|
|
|
if 'java' in self.environment.coredata.compilers.host: |
|
|
|
|
self.generate_java_link() |
|
|
|
@ -2344,7 +2346,7 @@ class NinjaBackend(backends.Backend): |
|
|
|
|
options = self._rsp_options(static_linker) |
|
|
|
|
self.add_rule(NinjaRule(rule, cmdlist, args, description, **options, extra=pool)) |
|
|
|
|
|
|
|
|
|
def generate_dynamic_link_rules(self): |
|
|
|
|
def generate_dynamic_link_rules(self) -> None: |
|
|
|
|
num_pools = self.environment.coredata.optstore.get_value('backend_max_links') |
|
|
|
|
for for_machine in MachineChoice: |
|
|
|
|
complist = self.environment.coredata.compilers[for_machine] |
|
|
|
@ -2383,7 +2385,7 @@ class NinjaBackend(backends.Backend): |
|
|
|
|
synstat = 'restat = 1' |
|
|
|
|
self.add_rule(NinjaRule(symrule, symcmd, [], syndesc, extra=synstat)) |
|
|
|
|
|
|
|
|
|
def generate_java_compile_rule(self, compiler): |
|
|
|
|
def generate_java_compile_rule(self, compiler) -> None: |
|
|
|
|
rule = self.compiler_to_rule_name(compiler) |
|
|
|
|
command = compiler.get_exelist() + ['$ARGS', '$in'] |
|
|
|
|
description = 'Compiling Java sources for $FOR_JAR' |
|
|
|
@ -2398,7 +2400,7 @@ class NinjaBackend(backends.Backend): |
|
|
|
|
rspable=mesonlib.is_windows(), |
|
|
|
|
rspfile_quote_style=compiler.rsp_file_syntax())) |
|
|
|
|
|
|
|
|
|
def generate_vala_compile_rules(self, compiler): |
|
|
|
|
def generate_vala_compile_rules(self, compiler) -> None: |
|
|
|
|
rule = self.compiler_to_rule_name(compiler) |
|
|
|
|
command = compiler.get_exelist() + ['$ARGS', '$in'] |
|
|
|
|
description = 'Compiling Vala source $in' |
|
|
|
@ -2419,7 +2421,7 @@ class NinjaBackend(backends.Backend): |
|
|
|
|
depfile=depfile, |
|
|
|
|
extra='restat = 1')) |
|
|
|
|
|
|
|
|
|
def generate_rust_compile_rules(self, compiler): |
|
|
|
|
def generate_rust_compile_rules(self, compiler) -> None: |
|
|
|
|
rule = self.compiler_to_rule_name(compiler) |
|
|
|
|
command = compiler.get_exelist() + ['$ARGS', '$in'] |
|
|
|
|
description = 'Compiling Rust source $in' |
|
|
|
@ -2428,7 +2430,7 @@ class NinjaBackend(backends.Backend): |
|
|
|
|
self.add_rule(NinjaRule(rule, command, [], description, deps=depstyle, |
|
|
|
|
depfile=depfile)) |
|
|
|
|
|
|
|
|
|
def generate_swift_compile_rules(self, compiler): |
|
|
|
|
def generate_swift_compile_rules(self, compiler) -> None: |
|
|
|
|
rule = self.compiler_to_rule_name(compiler) |
|
|
|
|
full_exe = self.environment.get_build_command() + [ |
|
|
|
|
'--internal', |
|
|
|
@ -2459,7 +2461,7 @@ https://groups.google.com/forum/#!topic/ninja-build/j-2RfBIOd_8 |
|
|
|
|
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=47485''')) |
|
|
|
|
self.add_rule(NinjaRule(rule, cmd, [], 'Dep hack', extra='restat = 1')) |
|
|
|
|
|
|
|
|
|
def generate_llvm_ir_compile_rule(self, compiler): |
|
|
|
|
def generate_llvm_ir_compile_rule(self, compiler) -> None: |
|
|
|
|
if self.created_llvm_ir_rule[compiler.for_machine]: |
|
|
|
|
return |
|
|
|
|
rule = self.get_compiler_rule_name('llvm_ir', compiler.for_machine) |
|
|
|
@ -2472,7 +2474,7 @@ https://gcc.gnu.org/bugzilla/show_bug.cgi?id=47485''')) |
|
|
|
|
self.add_rule(NinjaRule(rule, command, args, description, **options)) |
|
|
|
|
self.created_llvm_ir_rule[compiler.for_machine] = True |
|
|
|
|
|
|
|
|
|
def generate_compile_rule_for(self, langname, compiler): |
|
|
|
|
def generate_compile_rule_for(self, langname: str, compiler: Compiler) -> None: |
|
|
|
|
if langname == 'java': |
|
|
|
|
self.generate_java_compile_rule(compiler) |
|
|
|
|
return |
|
|
|
@ -2518,7 +2520,7 @@ https://gcc.gnu.org/bugzilla/show_bug.cgi?id=47485''')) |
|
|
|
|
self.add_rule(NinjaRule(rule, command, args, description, **options, |
|
|
|
|
deps=deps, depfile=depfile)) |
|
|
|
|
|
|
|
|
|
def generate_pch_rule_for(self, langname, compiler): |
|
|
|
|
def generate_pch_rule_for(self, langname: str, compiler: Compiler) -> None: |
|
|
|
|
if langname not in {'c', 'cpp'}: |
|
|
|
|
return |
|
|
|
|
rule = self.compiler_to_pch_rule_name(compiler) |
|
|
|
@ -2544,7 +2546,7 @@ https://gcc.gnu.org/bugzilla/show_bug.cgi?id=47485''')) |
|
|
|
|
self.add_rule(NinjaRule(rule, command, [], description, deps=deps, |
|
|
|
|
depfile=depfile)) |
|
|
|
|
|
|
|
|
|
def generate_scanner_rules(self): |
|
|
|
|
def generate_scanner_rules(self) -> None: |
|
|
|
|
rulename = 'depscan' |
|
|
|
|
if rulename in self.ruledict: |
|
|
|
|
# Scanning command is the same for native and cross compilation. |
|
|
|
@ -2556,7 +2558,7 @@ https://gcc.gnu.org/bugzilla/show_bug.cgi?id=47485''')) |
|
|
|
|
rule = NinjaRule(rulename, command, args, description) |
|
|
|
|
self.add_rule(rule) |
|
|
|
|
|
|
|
|
|
def generate_compile_rules(self): |
|
|
|
|
def generate_compile_rules(self) -> None: |
|
|
|
|
for for_machine in MachineChoice: |
|
|
|
|
clist = self.environment.coredata.compilers[for_machine] |
|
|
|
|
for langname, compiler in clist.items(): |
|
|
|
@ -2567,7 +2569,7 @@ https://gcc.gnu.org/bugzilla/show_bug.cgi?id=47485''')) |
|
|
|
|
for mode in compiler.get_modes(): |
|
|
|
|
self.generate_compile_rule_for(langname, mode) |
|
|
|
|
|
|
|
|
|
def generate_generator_list_rules(self, target): |
|
|
|
|
def generate_generator_list_rules(self, target) -> None: |
|
|
|
|
# CustomTargets have already written their rules and |
|
|
|
|
# CustomTargetIndexes don't actually get generated, so write rules for |
|
|
|
|
# GeneratedLists here |
|
|
|
@ -2652,7 +2654,7 @@ https://gcc.gnu.org/bugzilla/show_bug.cgi?id=47485''')) |
|
|
|
|
elem.add_item('COMMAND', cmdlist) |
|
|
|
|
self.add_build(elem) |
|
|
|
|
|
|
|
|
|
def scan_fortran_module_outputs(self, target): |
|
|
|
|
def scan_fortran_module_outputs(self, target) -> None: |
|
|
|
|
""" |
|
|
|
|
Find all module and submodule made available in a Fortran code file. |
|
|
|
|
""" |
|
|
|
@ -2794,7 +2796,7 @@ https://gcc.gnu.org/bugzilla/show_bug.cgi?id=47485''')) |
|
|
|
|
return linker.get_link_debugfile_args(filename) |
|
|
|
|
return [] |
|
|
|
|
|
|
|
|
|
def generate_llvm_ir_compile(self, target, src: mesonlib.FileOrString): |
|
|
|
|
def generate_llvm_ir_compile(self, target, src: FileOrString): |
|
|
|
|
base_proxy = target.get_options() |
|
|
|
|
compiler = get_compiler_for_source(target.compilers.values(), src) |
|
|
|
|
commands = compiler.compiler_args() |
|
|
|
@ -2954,9 +2956,9 @@ https://gcc.gnu.org/bugzilla/show_bug.cgi?id=47485''')) |
|
|
|
|
|
|
|
|
|
def generate_single_compile(self, target: build.BuildTarget, src, |
|
|
|
|
is_generated: bool = False, header_deps=None, |
|
|
|
|
order_deps: T.Optional[T.List['mesonlib.FileOrString']] = None, |
|
|
|
|
order_deps: T.Optional[T.List[FileOrString]] = None, |
|
|
|
|
extra_args: T.Optional[T.List[str]] = None, |
|
|
|
|
unity_sources: T.Optional[T.List[mesonlib.FileOrString]] = None, |
|
|
|
|
unity_sources: T.Optional[T.List[FileOrString]] = None, |
|
|
|
|
) -> T.Tuple[str, str]: |
|
|
|
|
""" |
|
|
|
|
Compiles C/C++, ObjC/ObjC++, Fortran, and D sources |
|
|
|
@ -3098,7 +3100,7 @@ https://gcc.gnu.org/bugzilla/show_bug.cgi?id=47485''')) |
|
|
|
|
assert isinstance(rel_src, str) |
|
|
|
|
return (rel_obj, rel_src.replace('\\', '/')) |
|
|
|
|
|
|
|
|
|
def add_dependency_scanner_entries_to_element(self, target: build.BuildTarget, compiler, element, src): |
|
|
|
|
def add_dependency_scanner_entries_to_element(self, target: build.BuildTarget, compiler, element, src) -> None: |
|
|
|
|
if not self.should_use_dyndeps_for_target(target): |
|
|
|
|
return |
|
|
|
|
if isinstance(target, build.CompileTarget): |
|
|
|
@ -3123,7 +3125,7 @@ https://gcc.gnu.org/bugzilla/show_bug.cgi?id=47485''')) |
|
|
|
|
d = os.path.join(self.get_target_private_dir(target), d) |
|
|
|
|
ninja_element.add_dep(d) |
|
|
|
|
|
|
|
|
|
def has_dir_part(self, fname: mesonlib.FileOrString) -> bool: |
|
|
|
|
def has_dir_part(self, fname: FileOrString) -> bool: |
|
|
|
|
# FIXME FIXME: The usage of this is a terrible and unreliable hack |
|
|
|
|
if isinstance(fname, File): |
|
|
|
|
return fname.subdir != '' |
|
|
|
@ -3230,7 +3232,7 @@ https://gcc.gnu.org/bugzilla/show_bug.cgi?id=47485''')) |
|
|
|
|
targetdir = self.get_target_private_dir(target) |
|
|
|
|
return os.path.join(targetdir, target.get_filename() + '.symbols') |
|
|
|
|
|
|
|
|
|
def generate_shsym(self, target): |
|
|
|
|
def generate_shsym(self, target) -> None: |
|
|
|
|
target_file = self.get_target_filename(target) |
|
|
|
|
symname = self.get_target_shsym_filename(target) |
|
|
|
|
elem = NinjaBuildElement(self.all_outputs, symname, 'SHSYM', target_file) |
|
|
|
@ -3240,7 +3242,7 @@ https://gcc.gnu.org/bugzilla/show_bug.cgi?id=47485''')) |
|
|
|
|
elem.add_item('CROSS', '--cross-host=' + self.environment.machines[target.for_machine].system) |
|
|
|
|
self.add_build(elem) |
|
|
|
|
|
|
|
|
|
def get_import_filename(self, target): |
|
|
|
|
def get_import_filename(self, target) -> str: |
|
|
|
|
return os.path.join(self.get_target_dir(target), target.import_filename) |
|
|
|
|
|
|
|
|
|
def get_target_type_link_args(self, target, linker): |
|
|
|
@ -3295,7 +3297,7 @@ https://gcc.gnu.org/bugzilla/show_bug.cgi?id=47485''')) |
|
|
|
|
commands += linker.get_win_subsystem_args(target.win_subsystem) |
|
|
|
|
return commands |
|
|
|
|
|
|
|
|
|
def get_link_whole_args(self, linker, target): |
|
|
|
|
def get_link_whole_args(self, linker: DynamicLinker, target): |
|
|
|
|
use_custom = False |
|
|
|
|
if linker.id == 'msvc': |
|
|
|
|
# Expand our object lists manually if we are on pre-Visual Studio 2015 Update 2 |
|
|
|
@ -3565,7 +3567,7 @@ https://gcc.gnu.org/bugzilla/show_bug.cgi?id=47485''')) |
|
|
|
|
self.environment.get_build_dir()) |
|
|
|
|
return self.get_target_filename(t) |
|
|
|
|
|
|
|
|
|
def generate_shlib_aliases(self, target, outdir): |
|
|
|
|
def generate_shlib_aliases(self, target, outdir) -> None: |
|
|
|
|
for alias, to, tag in target.get_aliases(): |
|
|
|
|
aliasfile = os.path.join(outdir, alias) |
|
|
|
|
abs_aliasfile = os.path.join(self.environment.get_build_dir(), outdir, alias) |
|
|
|
@ -3605,7 +3607,7 @@ https://gcc.gnu.org/bugzilla/show_bug.cgi?id=47485''')) |
|
|
|
|
gcda_elem.add_item('description', 'Deleting gcda files') |
|
|
|
|
self.add_build(gcda_elem) |
|
|
|
|
|
|
|
|
|
def get_user_option_args(self): |
|
|
|
|
def get_user_option_args(self) -> T.List[str]: |
|
|
|
|
cmds = [] |
|
|
|
|
for k, v in self.environment.coredata.optstore.items(): |
|
|
|
|
if self.environment.coredata.optstore.is_project_option(k): |
|
|
|
|