aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbrettw@chromium.org <brettw@chromium.org@7262f16d-afe8-6277-6482-052fa10e57b1>2014-07-21 20:05:21 +0000
committerbrettw@chromium.org <brettw@chromium.org@7262f16d-afe8-6277-6482-052fa10e57b1>2014-07-21 20:05:21 +0000
commit856ff33a9069bf62462ea2a2b88281974f97dba2 (patch)
tree4aa2fa3610908d6d65bce7221aca46767504b72c
parent786be15cb6c0f7d78f3eab9fda9d4266619ddbf0 (diff)
downloadgrit-856ff33a9069bf62462ea2a2b88281974f97dba2.tar.gz
Fix .d file outputs, add support for asserting outputs.
Fixes .d file generation by putting the first output file name as the destination file, rather than the .d file itself. Adds support for asserting that given files are in the output. This allows the user of the build tool to assume that certain output files will be generated while providing a way to catch errors. R=thakis@chromium.org Review=https://codereview.chromium.org/407693002/ git-svn-id: http://grit-i18n.googlecode.com/svn/trunk@171 7262f16d-afe8-6277-6482-052fa10e57b1
-rw-r--r--grit/tool/build.py75
-rw-r--r--grit/tool/build_unittest.py34
2 files changed, 96 insertions, 13 deletions
diff --git a/grit/tool/build.py b/grit/tool/build.py
index 87ee412..537e2c6 100644
--- a/grit/tool/build.py
+++ b/grit/tool/build.py
@@ -63,6 +63,20 @@ option).
Options:
+ -a FILE Assert that the given file is an output. There can be
+ multiple "-a" flags listed for multiple outputs. If a "-a"
+ or "--assert-file-list" argument is present, then the list
+ of asserted files must match the output files or the tool
+ will fail. The use-case is for the build system to maintain
+ separate lists of output files and to catch errors if the
+ build system's list and the grit list are out-of-sync.
+
+ --assert-file-list Provide a file listing multiple asserted output files.
+ There is one file name per line. This acts like specifying
+ each file with "-a" on the command line, but without the
+ possibility of running into OS line-length limits for very
+ long lists.
+
-o OUTPUTDIR Specify what directory output paths are relative to.
Defaults to the current directory.
@@ -104,13 +118,20 @@ are exported to translation interchange files (e.g. XMB files), etc.
self.output_directory = '.'
first_ids_file = None
whitelist_filenames = []
+ assert_output_files = []
target_platform = None
depfile = None
depdir = None
rc_header_format = None
- (own_opts, args) = getopt.getopt(args, 'o:D:E:f:w:t:h:', ('depdir=','depfile='))
+ (own_opts, args) = getopt.getopt(args, 'a:o:D:E:f:w:t:h:',
+ ('depdir=','depfile=','assert-file-list='))
for (key, val) in own_opts:
- if key == '-o':
+ if key == '-a':
+ assert_output_files.append(val)
+ elif key == '--assert-file-list':
+ with open(val) as f:
+ assert_output_files += f.read().splitlines()
+ elif key == '-o':
self.output_directory = val
elif key == '-D':
name, val = util.ParseDefine(val)
@@ -166,8 +187,12 @@ are exported to translation interchange files (e.g. XMB files), etc.
self.res.RunGatherers()
self.Process()
+ if assert_output_files:
+ if not self.CheckAssertedOutputFiles(assert_output_files):
+ return 2
+
if depfile and depdir:
- self.GenerateDepfile(opts.input, depfile, depdir)
+ self.GenerateDepfile(depfile, depdir)
return 0
@@ -324,7 +349,31 @@ are exported to translation interchange files (e.g. XMB files), etc.
print self.res.UberClique().missing_translations_
sys.exit(-1)
- def GenerateDepfile(self, input_filename, depfile, depdir):
+
+ def CheckAssertedOutputFiles(self, assert_output_files):
+ '''Checks that the asserted output files are specified in the given list.
+
+ Returns true if the asserted files are present. If they are not, returns
+ False and prints the failure.
+ '''
+ # Compare the absolute path names, sorted.
+ asserted = sorted([os.path.abspath(i) for i in assert_output_files])
+ actual = sorted([
+ os.path.abspath(os.path.join(self.output_directory, i.GetFilename()))
+ for i in self.res.GetOutputFiles()])
+
+ if asserted != actual:
+ print '''Asserted file list does not match.
+
+Expected output files: %s
+
+Actual output files: %s
+''' % (asserted, actual)
+ return False
+ return True
+
+
+ def GenerateDepfile(self, depfile, depdir):
'''Generate a depfile that contains the imlicit dependencies of the input
grd. The depfile will be in the same format as a makefile, and will contain
references to files relative to |depdir|. It will be put in |depfile|.
@@ -343,19 +392,27 @@ are exported to translation interchange files (e.g. XMB files), etc.
from the directory src/ we will generate a depfile ../out/gen/blah.grd.d
that has the contents
- gen/blah.grd.d: ../src/input1.xtb ../src/input2.xtb
+ gen/blah.h: ../src/input1.xtb ../src/input2.xtb
+
+ Where "gen/blah.h" is the first output (Ninja expects the .d file to list
+ the first output in cases where there is more than one).
Note that all paths in the depfile are relative to ../out, the depdir.
'''
depfile = os.path.abspath(depfile)
depdir = os.path.abspath(depdir)
+ infiles = self.res.GetInputFiles()
+
+ # Get the first output file relative to the depdir.
+ outputs = self.res.GetOutputFiles()
+ output_file = os.path.relpath(os.path.join(
+ self.output_directory, outputs[0].GetFilename()), depdir)
+
# The path prefix to prepend to dependencies in the depfile.
prefix = os.path.relpath(os.getcwd(), depdir)
- # The path that the depfile refers to itself by.
- self_ref_depfile = os.path.relpath(depfile, depdir)
- infiles = self.res.GetInputFiles()
deps_text = ' '.join([os.path.join(prefix, i) for i in infiles])
- depfile_contents = self_ref_depfile + ': ' + deps_text
+
+ depfile_contents = output_file + ': ' + deps_text
self.MakeDirectoriesTo(depfile)
outfile = self.fo_create(depfile, 'wb')
outfile.writelines(depfile_contents)
diff --git a/grit/tool/build_unittest.py b/grit/tool/build_unittest.py
index fd640f7..debe4d4 100644
--- a/grit/tool/build_unittest.py
+++ b/grit/tool/build_unittest.py
@@ -49,15 +49,41 @@ class BuildUnittest(unittest.TestCase):
self.failUnless(os.path.isfile(expected_dep_file))
with open(expected_dep_file) as f:
line = f.readline()
- (dep_file_name, deps_string) = line.split(': ')
+ (dep_output_file, deps_string) = line.split(': ')
deps = deps_string.split(' ')
- self.failUnlessEqual(os.path.abspath(expected_dep_file),
- os.path.abspath(os.path.join(output_dir, dep_file_name)),
- "depfile should refer to itself as the depended upon file")
+
+ self.failUnlessEqual("resource.h", dep_output_file)
self.failUnlessEqual(1, len(deps))
self.failUnlessEqual(deps[0],
util.PathFromRoot('grit/testdata/substitute.xmb'))
+ def testAssertOutputs(self):
+ output_dir = tempfile.mkdtemp()
+ class DummyOpts(object):
+ def __init__(self):
+ self.input = util.PathFromRoot('grit/testdata/substitute.grd')
+ self.verbose = False
+ self.extra_verbose = False
+
+ # Incomplete output file list should fail.
+ builder_fail = build.RcBuilder()
+ self.failUnlessEqual(2,
+ builder_fail.Run(DummyOpts(), [
+ '-o', output_dir,
+ '-a', os.path.abspath(
+ os.path.join(output_dir, 'en_generated_resources.rc'))]))
+
+ # Complete output file list should succeed.
+ builder_ok = build.RcBuilder()
+ self.failUnlessEqual(0,
+ builder_ok.Run(DummyOpts(), [
+ '-o', output_dir,
+ '-a', os.path.abspath(
+ os.path.join(output_dir, 'en_generated_resources.rc')),
+ '-a', os.path.abspath(
+ os.path.join(output_dir, 'sv_generated_resources.rc')),
+ '-a', os.path.abspath(
+ os.path.join(output_dir, 'resource.h'))]))
if __name__ == '__main__':
unittest.main()