aboutsummaryrefslogtreecommitdiff
path: root/mesonbuild/backend/ninjabackend.py
diff options
context:
space:
mode:
authorJussi Pakkanen <jpakkane@gmail.com>2020-11-21 21:30:58 +0200
committerJussi Pakkanen <jpakkane@gmail.com>2020-12-12 19:14:44 +0200
commit92e94b1e92350073e8a3a1bd69daa3a1bbe93e61 (patch)
tree303110b24d6558c437c46da2c61d5da74cd3e445 /mesonbuild/backend/ninjabackend.py
parent5bd1276d2024bf84ea5dfe1b1b43f39cc13b0764 (diff)
downloadmeson-92e94b1e92350073e8a3a1bd69daa3a1bbe93e61.zip
meson-92e94b1e92350073e8a3a1bd69daa3a1bbe93e61.tar.gz
meson-92e94b1e92350073e8a3a1bd69daa3a1bbe93e61.tar.bz2
Generate dependency scanning hooks in the Ninja file.
Diffstat (limited to 'mesonbuild/backend/ninjabackend.py')
-rw-r--r--mesonbuild/backend/ninjabackend.py54
1 files changed, 45 insertions, 9 deletions
diff --git a/mesonbuild/backend/ninjabackend.py b/mesonbuild/backend/ninjabackend.py
index de187c4..dffff56 100644
--- a/mesonbuild/backend/ninjabackend.py
+++ b/mesonbuild/backend/ninjabackend.py
@@ -112,7 +112,7 @@ rsp_threshold = get_rsp_threshold()
# variables (or variables we use them in) is interpreted directly by ninja
# (e.g. the value of the depfile variable is a pathname that ninja will read
# from, etc.), so it must not be shell quoted.
-raw_names = {'DEPFILE_UNQUOTED', 'DESC', 'pool', 'description', 'targetdep'}
+raw_names = {'DEPFILE_UNQUOTED', 'DESC', 'pool', 'description', 'targetdep', 'dyndep'}
NINJA_QUOTE_BUILD_PAT = re.compile(r"[$ :\n]")
NINJA_QUOTE_VAR_PAT = re.compile(r"[$ \n]")
@@ -687,6 +687,8 @@ int dummy;
self.generate_custom_target(target)
if isinstance(target, build.RunTarget):
self.generate_run_target(target)
+ compiled_sources = []
+ source2object = {}
name = target.get_id()
if name in self.processed_targets:
return
@@ -784,10 +786,12 @@ int dummy;
# because we need `header_deps` to be fully generated in the above loop.
for src in generated_source_files:
if self.environment.is_llvm_ir(src):
- o = self.generate_llvm_ir_compile(target, src)
+ o, s = self.generate_llvm_ir_compile(target, src)
else:
- o = self.generate_single_compile(target, src, True,
+ o, s = self.generate_single_compile(target, src, True,
order_deps=header_deps)
+ compiled_sources.append(s)
+ source2object[s] = o
obj_list.append(o)
use_pch = self.environment.coredata.base_options.get('b_pch', False)
@@ -822,32 +826,52 @@ int dummy;
# Passing '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))
+ o, s = self.generate_single_compile(target, src, 'vala', [], header_deps)
+ obj_list.append(o)
# Generate compile targets for all the pre-existing sources for this target
for src in target_sources.values():
if not self.environment.is_header(src):
if self.environment.is_llvm_ir(src):
- obj_list.append(self.generate_llvm_ir_compile(target, src))
+ o, s = self.generate_llvm_ir_compile(target, src)
+ obj_list.append(o)
elif is_unity and self.get_target_source_can_unity(target, src):
abs_src = os.path.join(self.environment.get_build_dir(),
src.rel_to_builddir(self.build_to_src))
unity_src.append(abs_src)
else:
- obj_list.append(self.generate_single_compile(target, src, False, [], header_deps))
+ o, s = self.generate_single_compile(target, src, False, [], header_deps)
+ obj_list.append(o)
+ compiled_sources.append(s)
+ source2object[src] = o
+
obj_list += self.flatten_object_list(target)
if is_unity:
for src in self.generate_unity_files(target, unity_src):
- obj_list.append(self.generate_single_compile(target, src, True, unity_deps + header_deps))
+ o, s = self.generate_single_compile(target, src, True, unity_deps + header_deps)
+ obj_list.append(o)
+ compiled_sources.append(s)
+ source2object[src] = o
linker, stdlib_args = self.determine_linker_and_stdlib_args(target)
if isinstance(target, build.StaticLibrary) and target.prelink:
final_obj_list = self.generate_prelink(target, obj_list)
else:
final_obj_list = obj_list
elem = self.generate_link(target, outname, final_obj_list, linker, pch_objects, stdlib_args=stdlib_args)
+ self.generate_dependency_scan_target(target, compiled_sources, source2object)
self.generate_shlib_aliases(target, self.get_target_dir(target))
self.add_build(elem)
+ def generate_dependency_scan_target(self, target, compiled_sources, source2object):
+ if 'cpp' not in target.compilers:
+ return
+ depscan_file = self.get_dep_scan_file_for(target)
+ pickle_file = os.path.join(self.get_target_private_dir(target), target.name + '.dat').replace('\\', '/')
+ rule_name = 'cppscan'
+ elem = NinjaBuildElement(self.all_outputs, depscan_file, rule_name, compiled_sources)
+ elem.add_item('picklefile', pickle_file)
+ self.add_build(elem)
+
def process_target_dependencies(self, target):
for t in target.get_dependencies():
if t.get_id() not in self.processed_targets:
@@ -2241,7 +2265,7 @@ https://gcc.gnu.org/bugzilla/show_bug.cgi?id=47485'''))
element = NinjaBuildElement(self.all_outputs, rel_obj, compiler_name, rel_src)
element.add_item('ARGS', commands)
self.add_build(element)
- return rel_obj
+ return (rel_obj, rel_src)
def get_source_dir_include_args(self, target, compiler):
curdir = target.get_subdir()
@@ -2463,8 +2487,20 @@ https://gcc.gnu.org/bugzilla/show_bug.cgi?id=47485'''))
element.add_orderdep(i)
element.add_item('DEPFILE', dep_file)
element.add_item('ARGS', commands)
+
+ self.add_dependency_scanner_entries_to_element(target, compiler, element)
self.add_build(element)
- return rel_obj
+ return (rel_obj, rel_src)
+
+ def add_dependency_scanner_entries_to_element(self, target, compiler, element):
+ if compiler.get_language() != 'cpp':
+ return
+ dep_scan_file = self.get_dep_scan_file_for(target)
+ element.add_item('dyndep', dep_scan_file)
+ element.add_orderdep(dep_scan_file)
+
+ def get_dep_scan_file_for(self, target):
+ return os.path.join(self.get_target_private_dir(target), 'depscan.dd')
def add_header_deps(self, target, ninja_element, header_deps):
for d in header_deps: