joi@chromium.org | 95640e3 | 2012-03-06 14:05:47 +0000 | [diff] [blame] | 1 | #!/usr/bin/env python |
| 2 | # Copyright (c) 2012 The Chromium Authors. All rights reserved. |
joi@chromium.org | 01b3bc7 | 2011-09-22 15:44:25 +0000 | [diff] [blame] | 3 | # Use of this source code is governed by a BSD-style license that can be |
| 4 | # found in the LICENSE file. |
| 5 | |
| 6 | '''Tool to determine inputs and outputs of a grit file. |
| 7 | ''' |
| 8 | |
| 9 | import optparse |
| 10 | import os |
| 11 | import posixpath |
joi@chromium.org | 01b3bc7 | 2011-09-22 15:44:25 +0000 | [diff] [blame] | 12 | import sys |
| 13 | |
| 14 | from grit import grd_reader |
| 15 | from grit import util |
| 16 | |
joi@chromium.org | 01b3bc7 | 2011-09-22 15:44:25 +0000 | [diff] [blame] | 17 | class WrongNumberOfArguments(Exception): |
| 18 | pass |
| 19 | |
| 20 | |
flackr@chromium.org | 11e589a | 2013-09-05 22:17:36 +0000 | [diff] [blame] | 21 | def Outputs(filename, defines, ids_file, target_platform=None): |
joi@chromium.org | 01b3bc7 | 2011-09-22 15:44:25 +0000 | [diff] [blame] | 22 | grd = grd_reader.Parse( |
joi@chromium.org | 0dc1eef | 2012-03-29 11:36:23 +0000 | [diff] [blame] | 23 | filename, defines=defines, tags_to_ignore=set(['messages']), |
joi@chromium.org | f505a00 | 2013-08-25 17:19:58 +0000 | [diff] [blame] | 24 | first_ids_file=ids_file, target_platform=target_platform) |
joi@chromium.org | 01b3bc7 | 2011-09-22 15:44:25 +0000 | [diff] [blame] | 25 | |
| 26 | target = [] |
| 27 | lang_folders = {} |
| 28 | # Add all explicitly-specified output files |
| 29 | for output in grd.GetOutputFiles(): |
| 30 | path = output.GetFilename() |
| 31 | target.append(path) |
| 32 | |
| 33 | if path.endswith('.h'): |
| 34 | path, filename = os.path.split(path) |
| 35 | if output.attrs['lang']: |
| 36 | lang_folders[output.attrs['lang']] = os.path.dirname(path) |
| 37 | |
| 38 | # Add all generated files, once for each output language. |
| 39 | for node in grd: |
| 40 | if node.name == 'structure': |
benrg@chromium.org | ccda470 | 2012-10-19 17:31:48 +0000 | [diff] [blame] | 41 | with node: |
| 42 | # TODO(joi) Should remove the "if sconsdep is true" thing as it is a |
| 43 | # hack - see grit/node/structure.py |
| 44 | if node.HasFileForLanguage() and node.attrs['sconsdep'] == 'true': |
| 45 | for lang in lang_folders: |
| 46 | path = node.FileForLanguage(lang, lang_folders[lang], |
| 47 | create_file=False, |
| 48 | return_if_not_generated=False) |
| 49 | if path: |
| 50 | target.append(path) |
joi@chromium.org | 01b3bc7 | 2011-09-22 15:44:25 +0000 | [diff] [blame] | 51 | |
| 52 | return [t.replace('\\', '/') for t in target] |
| 53 | |
| 54 | |
| 55 | def GritSourceFiles(): |
| 56 | files = [] |
joi@chromium.org | 95640e3 | 2012-03-06 14:05:47 +0000 | [diff] [blame] | 57 | grit_root_dir = os.path.relpath(os.path.dirname(__file__), os.getcwd()) |
joi@chromium.org | 01b3bc7 | 2011-09-22 15:44:25 +0000 | [diff] [blame] | 58 | for root, dirs, filenames in os.walk(grit_root_dir): |
| 59 | grit_src = [os.path.join(root, f) for f in filenames |
thakis@chromium.org | 6e5c2fe | 2014-01-08 00:49:24 +0000 | [diff] [blame] | 60 | if f.endswith('.py') and not f.endswith('_unittest.py')] |
joi@chromium.org | 01b3bc7 | 2011-09-22 15:44:25 +0000 | [diff] [blame] | 61 | files.extend(grit_src) |
joi@chromium.org | 2de007e | 2013-01-17 22:02:22 +0000 | [diff] [blame] | 62 | return sorted(files) |
joi@chromium.org | 01b3bc7 | 2011-09-22 15:44:25 +0000 | [diff] [blame] | 63 | |
| 64 | |
flackr@chromium.org | 11e589a | 2013-09-05 22:17:36 +0000 | [diff] [blame] | 65 | def Inputs(filename, defines, ids_file, target_platform=None): |
joi@chromium.org | 01b3bc7 | 2011-09-22 15:44:25 +0000 | [diff] [blame] | 66 | grd = grd_reader.Parse( |
benrg@chromium.org | d484c66 | 2012-10-10 19:02:29 +0000 | [diff] [blame] | 67 | filename, debug=False, defines=defines, tags_to_ignore=set(['message']), |
joi@chromium.org | de71a37 | 2013-05-14 18:11:41 +0000 | [diff] [blame] | 68 | first_ids_file=ids_file, target_platform=target_platform) |
benrg@chromium.org | ec8016c | 2012-06-16 20:30:41 +0000 | [diff] [blame] | 69 | files = set() |
benrg@chromium.org | ccda470 | 2012-10-19 17:31:48 +0000 | [diff] [blame] | 70 | for lang, ctx in grd.GetConfigurations(): |
| 71 | grd.SetOutputLanguage(lang or grd.GetSourceLanguage()) |
| 72 | grd.SetOutputContext(ctx) |
| 73 | for node in grd.ActiveDescendants(): |
| 74 | with node: |
| 75 | if (node.name == 'structure' or node.name == 'skeleton' or |
| 76 | (node.name == 'file' and node.parent and |
| 77 | node.parent.name == 'translations')): |
benrg@chromium.org | ec8016c | 2012-06-16 20:30:41 +0000 | [diff] [blame] | 78 | files.add(grd.ToRealPath(node.GetInputPath())) |
benrg@chromium.org | ccda470 | 2012-10-19 17:31:48 +0000 | [diff] [blame] | 79 | # If it's a flattened node, grab inlined resources too. |
| 80 | if node.name == 'structure' and node.attrs['flattenhtml'] == 'true': |
| 81 | node.RunPreSubstitutionGatherer() |
| 82 | files.update(node.GetHtmlResourceFilenames()) |
| 83 | elif node.name == 'grit': |
| 84 | first_ids_file = node.GetFirstIdsFile() |
| 85 | if first_ids_file: |
| 86 | files.add(first_ids_file) |
| 87 | elif node.name == 'include': |
| 88 | files.add(grd.ToRealPath(node.GetInputPath())) |
| 89 | # If it's a flattened node, grab inlined resources too. |
| 90 | if node.attrs['flattenhtml'] == 'true': |
| 91 | files.update(node.GetHtmlResourceFilenames()) |
| 92 | elif node.name == 'part': |
| 93 | files.add(util.normpath(os.path.join(os.path.dirname(filename), |
| 94 | node.GetInputPath()))) |
joi@chromium.org | 01b3bc7 | 2011-09-22 15:44:25 +0000 | [diff] [blame] | 95 | |
joi@chromium.org | 272e5d3 | 2012-03-30 11:42:03 +0000 | [diff] [blame] | 96 | cwd = os.getcwd() |
benrg@chromium.org | ec8016c | 2012-06-16 20:30:41 +0000 | [diff] [blame] | 97 | return [os.path.relpath(f, cwd) for f in sorted(files)] |
joi@chromium.org | 01b3bc7 | 2011-09-22 15:44:25 +0000 | [diff] [blame] | 98 | |
| 99 | |
| 100 | def PrintUsage(): |
joi@chromium.org | 7867001 | 2012-10-11 11:18:02 +0000 | [diff] [blame] | 101 | print 'USAGE: ./grit_info.py --inputs [-D foo] [-f resource_ids] <grd-file>' |
| 102 | print (' ./grit_info.py --outputs [-D foo] [-f resource_ids] ' + |
| 103 | '<out-prefix> <grd-file>') |
joi@chromium.org | 01b3bc7 | 2011-09-22 15:44:25 +0000 | [diff] [blame] | 104 | |
| 105 | |
| 106 | def DoMain(argv): |
| 107 | parser = optparse.OptionParser() |
| 108 | parser.add_option("--inputs", action="store_true", dest="inputs") |
| 109 | parser.add_option("--outputs", action="store_true", dest="outputs") |
| 110 | parser.add_option("-D", action="append", dest="defines", default=[]) |
| 111 | # grit build also supports '-E KEY=VALUE', support that to share command |
| 112 | # line flags. |
| 113 | parser.add_option("-E", action="append", dest="build_env", default=[]) |
| 114 | parser.add_option("-w", action="append", dest="whitelist_files", default=[]) |
joi@chromium.org | 7867001 | 2012-10-11 11:18:02 +0000 | [diff] [blame] | 115 | parser.add_option("-f", dest="ids_file", |
| 116 | default="GRIT_DIR/../gritsettings/resource_ids") |
joi@chromium.org | de71a37 | 2013-05-14 18:11:41 +0000 | [diff] [blame] | 117 | parser.add_option("-t", dest="target_platform", default=None) |
joi@chromium.org | 01b3bc7 | 2011-09-22 15:44:25 +0000 | [diff] [blame] | 118 | |
| 119 | options, args = parser.parse_args(argv) |
| 120 | |
| 121 | defines = {} |
| 122 | for define in options.defines: |
flackr@chromium.org | 418c15a | 2012-06-08 14:05:53 +0000 | [diff] [blame] | 123 | name, val = util.ParseDefine(define) |
| 124 | defines[name] = val |
joi@chromium.org | 01b3bc7 | 2011-09-22 15:44:25 +0000 | [diff] [blame] | 125 | |
joi@chromium.org | 12e636b | 2012-12-05 09:57:03 +0000 | [diff] [blame] | 126 | for env_pair in options.build_env: |
joi@chromium.org | ef7918f | 2012-12-07 17:13:59 +0000 | [diff] [blame] | 127 | (env_name, env_value) = env_pair.split('=', 1) |
joi@chromium.org | 12e636b | 2012-12-05 09:57:03 +0000 | [diff] [blame] | 128 | os.environ[env_name] = env_value |
| 129 | |
joi@chromium.org | 01b3bc7 | 2011-09-22 15:44:25 +0000 | [diff] [blame] | 130 | if options.inputs: |
| 131 | if len(args) > 1: |
| 132 | raise WrongNumberOfArguments("Expected 0 or 1 arguments for --inputs.") |
| 133 | |
| 134 | inputs = [] |
| 135 | if len(args) == 1: |
| 136 | filename = args[0] |
joi@chromium.org | de71a37 | 2013-05-14 18:11:41 +0000 | [diff] [blame] | 137 | inputs = Inputs(filename, defines, options.ids_file, |
| 138 | options.target_platform) |
joi@chromium.org | 01b3bc7 | 2011-09-22 15:44:25 +0000 | [diff] [blame] | 139 | |
| 140 | # Add in the grit source files. If one of these change, we want to re-run |
| 141 | # grit. |
| 142 | inputs.extend(GritSourceFiles()) |
| 143 | inputs = [f.replace('\\', '/') for f in inputs] |
| 144 | |
| 145 | if len(args) == 1: |
| 146 | # Include grd file as second input (works around gyp expecting it). |
benrg@chromium.org | 83717e8 | 2012-10-05 18:24:36 +0000 | [diff] [blame] | 147 | inputs.insert(1, args[0]) |
joi@chromium.org | 01b3bc7 | 2011-09-22 15:44:25 +0000 | [diff] [blame] | 148 | if options.whitelist_files: |
| 149 | inputs.extend(options.whitelist_files) |
| 150 | return '\n'.join(inputs) |
| 151 | elif options.outputs: |
| 152 | if len(args) != 2: |
benrg@chromium.org | 83717e8 | 2012-10-05 18:24:36 +0000 | [diff] [blame] | 153 | raise WrongNumberOfArguments( |
| 154 | "Expected exactly 2 arguments for --outputs.") |
joi@chromium.org | 01b3bc7 | 2011-09-22 15:44:25 +0000 | [diff] [blame] | 155 | |
| 156 | prefix, filename = args |
joi@chromium.org | 7867001 | 2012-10-11 11:18:02 +0000 | [diff] [blame] | 157 | outputs = [posixpath.join(prefix, f) |
joi@chromium.org | f505a00 | 2013-08-25 17:19:58 +0000 | [diff] [blame] | 158 | for f in Outputs(filename, defines, |
| 159 | options.ids_file, options.target_platform)] |
joi@chromium.org | 01b3bc7 | 2011-09-22 15:44:25 +0000 | [diff] [blame] | 160 | return '\n'.join(outputs) |
| 161 | else: |
| 162 | raise WrongNumberOfArguments("Expected --inputs or --outputs.") |
| 163 | |
| 164 | |
| 165 | def main(argv): |
joi@chromium.org | 95640e3 | 2012-03-06 14:05:47 +0000 | [diff] [blame] | 166 | if sys.version_info < (2, 6): |
| 167 | print "GRIT requires Python 2.6 or later." |
| 168 | return 1 |
| 169 | |
joi@chromium.org | 01b3bc7 | 2011-09-22 15:44:25 +0000 | [diff] [blame] | 170 | try: |
| 171 | result = DoMain(argv[1:]) |
| 172 | except WrongNumberOfArguments, e: |
| 173 | PrintUsage() |
| 174 | print e |
| 175 | return 1 |
| 176 | print result |
| 177 | return 0 |
| 178 | |
| 179 | |
| 180 | if __name__ == '__main__': |
| 181 | sys.exit(main(sys.argv)) |