Add depfile support to generators.

pull/696/head
Jussi Pakkanen 9 years ago
parent 3ae918a463
commit c02a175d52
  1. 14
      mesonbuild/backend/ninjabackend.py
  2. 16
      mesonbuild/build.py
  3. 5
      test cases/common/29 pipeline/meson.build
  4. 35
      test cases/common/29 pipeline/srcgen.c

@ -1367,8 +1367,16 @@ rule FORTRAN_DEP_HACK
infilename = os.path.join(self.build_to_src, curfile)
outfiles = genlist.get_outputs_for(curfile)
outfiles = [os.path.join(self.get_target_private_dir(target), of) for of in outfiles]
if generator.depfile is None:
rulename = 'CUSTOM_COMMAND'
args = base_args
else:
rulename = 'CUSTOM_COMMAND_DEP'
depfilename = generator.get_dep_outname(infilename)
depfile = os.path.join(self.get_target_private_dir(target), depfilename)
args = [x.replace('@DEPFILE@', depfile) for x in base_args]
args = [x.replace("@INPUT@", infilename).replace('@OUTPUT@', sole_output)\
for x in base_args]
for x in args]
args = self.replace_outputs(args, self.get_target_private_dir(target), outfilelist)
# We have consumed output files, so drop them from the list of remaining outputs.
if sole_output == '':
@ -1377,7 +1385,9 @@ rule FORTRAN_DEP_HACK
args = [x.replace("@SOURCE_DIR@", self.build_to_src).replace("@BUILD_DIR@", relout)
for x in args]
cmdlist = exe_arr + self.replace_extra_args(args, genlist)
elem = NinjaBuildElement(self.all_outputs, outfiles, 'CUSTOM_COMMAND', infilename)
elem = NinjaBuildElement(self.all_outputs, outfiles, rulename, infilename)
if generator.depfile is not None:
elem.add_item('DEPFILE', depfile)
if len(extra_dependencies) > 0:
elem.add_dep(extra_dependencies)
elem.add_item('DESC', 'Generating $out')

@ -612,6 +612,7 @@ class Generator():
if not isinstance(exe, Executable) and not isinstance(exe, dependencies.ExternalProgram):
raise InvalidArguments('First generator argument must be an executable.')
self.exe = exe
self.depfile = None
self.process_kwargs(kwargs)
def __repr__(self):
@ -633,7 +634,6 @@ class Generator():
if not isinstance(a, str):
raise InvalidArguments('A non-string object in "arguments" keyword argument.')
self.arglist = args
if 'output' not in kwargs:
raise InvalidArguments('Generator must have "output" keyword argument.')
outputs = kwargs['output']
@ -651,12 +651,26 @@ class Generator():
if '@OUTPUT@' in o:
raise InvalidArguments('Tried to use @OUTPUT@ in a rule with more than one output.')
self.outputs = outputs
if 'depfile' in kwargs:
depfile = kwargs['depfile']
if not isinstance(depfile, str):
raise InvalidArguments('Depfile must be a string.')
if os.path.split(depfile)[1] != depfile:
raise InvalidArguments('Depfile must be a plain filename without a subdirectory.')
self.depfile = depfile
def get_base_outnames(self, inname):
plainname = os.path.split(inname)[1]
basename = plainname.split('.')[0]
return [x.replace('@BASENAME@', basename).replace('@PLAINNAME@', plainname) for x in self.outputs]
def get_dep_outname(self, inname):
if self.depfile is None:
raise InvalidArguments('Tried to get dep name for rule that does not have dependency file defined.')
plainname = os.path.split(inname)[1]
basename = plainname.split('.')[0]
return self.depfile.replace('@BASENAME@', basename).replace('@PLAINNAME@', plainname)
def get_arglist(self):
return self.arglist

@ -6,8 +6,9 @@ e1 = executable('srcgen', 'srcgen.c', native : true)
# Generate a source file that needs to be included in the build.
gen = generator(e1, \
output : '@BASENAME@.c', # Line continuation inside arguments should work without needing a "\".
arguments : ['@INPUT@', '@OUTPUT@'])
depfile : '@BASENAME@.d',
output : '@BASENAME@.c', # Line continuation inside arguments should work without needing a "\".
arguments : ['@INPUT@', '@OUTPUT@', '@DEPFILE@'])
generated = gen.process(['input_src.dat'])

@ -1,5 +1,6 @@
#include<stdio.h>
#include<assert.h>
#include<string.h>
#define ARRSIZE 80
@ -7,17 +8,20 @@ int main(int argc, char **argv) {
char arr[ARRSIZE];
char *ofilename;
char *ifilename;
char *dfilename;
FILE *ifile;
FILE *ofile;
FILE *depfile;
size_t bytes;
int i;
if(argc != 3) {
fprintf(stderr, "%s <input file> <output file>\n", argv[0]);
if(argc != 4) {
fprintf(stderr, "%s <input file> <output file> <dependency file>\n", argv[0]);
return 1;
}
ifilename = argv[1];
ofilename = argv[2];
printf("%s\n", ifilename);
dfilename = argv[3];
ifile = fopen(argv[1], "r");
if(!ifile) {
fprintf(stderr, "Could not open source file %s.\n", argv[1]);
@ -34,7 +38,32 @@ int main(int argc, char **argv) {
assert(bytes > 0);
fwrite(arr, 1, bytes, ofile);
depfile = fopen(dfilename, "w");
if(!depfile) {
fprintf(stderr, "Could not open depfile %s\n", ofilename);
fclose(ifile);
fclose(ofile);
return 1;
}
for(i=0; i<strlen(ofilename); i++) {
if(ofilename[i] == ' ') {
fwrite("\\ ", 1, 2, depfile);
} else {
fwrite(&ofilename[i], 1, 1, depfile);
}
}
fwrite(": ", 1, 2, depfile);
for(i=0; i<strlen(ifilename); i++) {
if(ifilename[i] == ' ') {
fwrite("\\ ", 1, 2, depfile);
} else {
fwrite(&ifilename[i], 1, 1, depfile);
}
}
fwrite("\n", 1, 1, depfile);
fclose(ifile);
fclose(ofile);
fclose(depfile);
return 0;
}

Loading…
Cancel
Save