Skip to content

Commit

Permalink
use same compiler args for pch as for regular target
Browse files Browse the repository at this point in the history
  • Loading branch information
nioncode committed Feb 1, 2019
1 parent da7b9df commit 2044bc5
Show file tree
Hide file tree
Showing 14 changed files with 88 additions and 12 deletions.
30 changes: 18 additions & 12 deletions mesonbuild/backend/ninjabackend.py
Original file line number Diff line number Diff line change
Expand Up @@ -428,12 +428,7 @@ def generate_target(self, target, outfile):
# Generate rules for building the remaining source files in this target
outname = self.get_target_filename(target)
obj_list = []
use_pch = self.environment.coredata.base_options.get('b_pch', False)
is_unity = self.is_unity(target)
if use_pch and target.has_pch():
pch_objects = self.generate_pch(target, outfile)
else:
pch_objects = []
header_deps = []
unity_src = []
unity_deps = [] # Generated sources that must be built before compiling a Unity target.
Expand Down Expand Up @@ -486,6 +481,12 @@ def generate_target(self, target, outfile):
header_deps=header_deps)
obj_list.append(o)

use_pch = self.environment.coredata.base_options.get('b_pch', False)
if use_pch and target.has_pch():
pch_objects = self.generate_pch(target, outfile, header_deps=header_deps)
else:
pch_objects = []

# Generate compilation targets for C sources generated from Vala
# sources. This can be extended to other $LANG->C compilers later if
# necessary. This needs to be separate for at least Vala
Expand Down Expand Up @@ -2181,12 +2182,7 @@ def generate_single_compile(self, target, outfile, src, is_generated=False, head
commands += compiler.get_module_outdir_args(self.get_target_private_dir(target))

element = NinjaBuildElement(self.all_outputs, rel_obj, compiler_name, rel_src)
for d in header_deps:
if isinstance(d, File):
d = d.rel_to_builddir(self.build_to_src)
elif not self.has_dir_part(d):
d = os.path.join(self.get_target_private_dir(target), d)
element.add_dep(d)
self.add_header_deps(target, element, header_deps)
for d in extra_deps:
element.add_dep(d)
for d in order_deps:
Expand All @@ -2206,6 +2202,14 @@ def generate_single_compile(self, target, outfile, src, is_generated=False, head
element.write(outfile)
return rel_obj

def add_header_deps(self, target, ninja_element, header_deps):
for d in header_deps:
if isinstance(d, File):
d = d.rel_to_builddir(self.build_to_src)
elif not self.has_dir_part(d):
d = os.path.join(self.get_target_private_dir(target), d)
ninja_element.add_dep(d)

def has_dir_part(self, fname):
# FIXME FIXME: The usage of this is a terrible and unreliable hack
if isinstance(fname, File):
Expand Down Expand Up @@ -2236,6 +2240,7 @@ def generate_msvc_pch_command(self, target, compiler, pch):
just_name = os.path.basename(header)
(objname, pch_args) = compiler.gen_pch_args(just_name, source, dst)
commands += pch_args
commands += self._generate_single_compile(target, compiler)
commands += self.get_compile_debugfile_args(compiler, target, objname)
dep = dst + '.' + compiler.get_depfile_suffix()
return commands, dep, dst, [objname]
Expand All @@ -2251,7 +2256,7 @@ def generate_gcc_pch_command(self, target, compiler, pch):
dep = dst + '.' + compiler.get_depfile_suffix()
return commands, dep, dst, [] # Gcc does not create an object file during pch generation.

def generate_pch(self, target, outfile):
def generate_pch(self, target, outfile, header_deps=[]):
cstr = ''
pch_objects = []
if target.is_cross:
Expand Down Expand Up @@ -2282,6 +2287,7 @@ def generate_pch(self, target, outfile):
elem = NinjaBuildElement(self.all_outputs, dst, rulename, src)
if extradep is not None:
elem.add_dep(extradep)
self.add_header_deps(target, elem, header_deps)
elem.add_item('ARGS', commands)
elem.add_item('DEPFILE', dep)
elem.write(outfile)
Expand Down
5 changes: 5 additions & 0 deletions test cases/common/13 pch/generated/gen_custom.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
#!/usr/bin/env python3
import sys

with open(sys.argv[1], 'w') as f:
f.write("#define FOO 0")
7 changes: 7 additions & 0 deletions test cases/common/13 pch/generated/gen_generator.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
#!/usr/bin/env python3
import sys

with open(sys.argv[1]) as f:
content = f.read()
with open(sys.argv[2], 'w') as f:
f.write(content)
1 change: 1 addition & 0 deletions test cases/common/13 pch/generated/generated_generator.in
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
#define BAR 0
16 changes: 16 additions & 0 deletions test cases/common/13 pch/generated/meson.build
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
cc = meson.get_compiler('c')
cc_id = cc.get_id()
if cc_id == 'lcc'
error('MESON_SKIP_TEST: Elbrus compiler does not support PCH.')
endif

generated_customTarget = custom_target('makeheader',
output: 'generated_customTarget.h',
command : [find_program('gen_custom.py'), '@OUTPUT0@'])

generated_generator = generator(find_program('gen_generator.py'),
output: '@BASENAME@.h',
arguments: ['@INPUT@', '@OUTPUT@'])

exe = executable('prog', 'prog.c', generated_customTarget, generated_generator.process('generated_generator.in'),
c_pch: ['pch/prog_pch.c', 'pch/prog.h'])
2 changes: 2 additions & 0 deletions test cases/common/13 pch/generated/pch/prog.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
#include "generated_customTarget.h"
#include "generated_generator.h"
5 changes: 5 additions & 0 deletions test cases/common/13 pch/generated/pch/prog_pch.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
#if !defined(_MSC_VER)
#error "This file is only for use with MSVC."
#endif

#include "prog.h"
6 changes: 6 additions & 0 deletions test cases/common/13 pch/generated/prog.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
// No includes here, they need to come from the PCH

int main(int argc, char **argv) {
return FOO + BAR;
}

2 changes: 2 additions & 0 deletions test cases/common/13 pch/meson.build
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@ project('pch test', 'c', 'cpp')

subdir('c')
subdir('cpp')
subdir('generated')
subdir('withIncludeDirectories')

if meson.backend() == 'xcode'
warning('Xcode backend only supports one precompiled header per target. Skipping "mixed" which has various precompiled headers.')
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
#include <stdio.h>
9 changes: 9 additions & 0 deletions test cases/common/13 pch/withIncludeDirectories/meson.build
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
cc = meson.get_compiler('c')
cc_id = cc.get_id()
if cc_id == 'lcc'
error('MESON_SKIP_TEST: Elbrus compiler does not support PCH.')
endif

exe = executable('prog', 'prog.c',
include_directories: 'include',
c_pch : ['pch/prog_pch.c', 'pch/prog.h'])
1 change: 1 addition & 0 deletions test cases/common/13 pch/withIncludeDirectories/pch/prog.h
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
#include<lib/lib.h>
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
#if !defined(_MSC_VER)
#error "This file is only for use with MSVC."
#endif

#include "prog.h"
10 changes: 10 additions & 0 deletions test cases/common/13 pch/withIncludeDirectories/prog.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
// No includes here, they need to come from the PCH

void func() {
fprintf(stdout, "This is a function that fails if stdio is not #included.\n");
}

int main(int argc, char **argv) {
return 0;
}

0 comments on commit 2044bc5

Please sign in to comment.