blob: 95519766a308decf520c9cfab40f667002cb5e90 [file] [log] [blame]
damargulis5c5337d2017-04-21 22:36:081# Copyright 2017 The Chromium Authors. All rights reserved.
2# Use of this source code is governed by a BSD-style license that can be
3# found in the LICENSE file.
4"""Used by a js_binary action to compile javascript files.
5
6This script takes in a list of sources and dependencies and compiles them all
7together into a single compiled .js file. The dependencies are ordered in a
8post-order, left-to-right traversal order. If multiple instances of the same
9source file are read, only the first is kept. The script can also take in
10optional --flags argument which will add custom flags to the compiler. Any
11extern files can also be passed in using the --extern flag.
12"""
13
Mike Bjorge61bf88e2017-05-14 07:34:0614import argparse
damargulis5c5337d2017-04-21 22:36:0815import os
Mike Bjorge61bf88e2017-05-14 07:34:0616import sys
17
damargulis5c5337d2017-04-21 22:36:0818import compile2
19
20
21def ParseDepList(dep):
22 """Parses a depenency list, returns |sources, deps|."""
23 assert os.path.isfile(dep), (os.path.splitext(dep) +
24 ' is not a js_library target')
25 with open(dep, 'r') as dep_list:
26 lines = dep_list.read().splitlines()
27 assert 'deps:' in lines, dep + ' is not formated correctly, missing "deps:"'
28 split = lines.index('deps:')
29 return lines[1:split], lines[split+1:]
30
31
32def CrawlDepsTree(deps, sources):
33 """Parses the dependency tree creating a post-order listing of sources."""
34 for dep in deps:
35 new_sources, new_deps = ParseDepList(dep)
36
37 sources = CrawlDepsTree(new_deps, sources)
38 sources += [source for source in new_sources if source not in sources]
39 return sources
40
41
42def main():
Mike Bjorge61bf88e2017-05-14 07:34:0643 parser = argparse.ArgumentParser()
damargulis5c5337d2017-04-21 22:36:0844 parser.add_argument('-c', '--compiler', required=True,
45 help='Path to compiler')
46 parser.add_argument('-s', '--sources', nargs='*', default=[],
47 help='List of js source files')
48 parser.add_argument('-o', '--output', required=True,
49 help='Compile to output')
50 parser.add_argument('-d', '--deps', nargs='*', default=[],
51 help='List of js_libarary dependencies')
52 parser.add_argument('-b', '--bootstrap',
53 help='A file to include before all others')
54 parser.add_argument('-cf', '--config', nargs='*', default=[],
55 help='A list of files to include after bootstrap and '
56 'before all others')
57 parser.add_argument('-f', '--flags', nargs='*', default=[],
58 help='A list of custom flags to pass to the compiler. '
59 'Do not include leading dashes')
60 parser.add_argument('-e', '--externs', nargs='*', default=[],
61 help='A list of extern files to pass to the compiler')
62
63 args = parser.parse_args()
64 sources = CrawlDepsTree(args.deps, []) + args.sources
65
66 compiler_args = ['--%s' % flag for flag in args.flags]
67 compiler_args += ['--externs=%s' % e for e in args.externs]
68 compiler_args += [
69 '--js_output_file',
70 args.output,
71 '--js',
72 ]
73 if args.bootstrap:
74 compiler_args += [args.bootstrap]
75 compiler_args += args.config
76 compiler_args += sources
77
Mike Bjorge61bf88e2017-05-14 07:34:0678 returncode, errors = compile2.Checker().run_jar(args.compiler, compiler_args)
79 if returncode != 0:
80 print errors
81
82 return returncode
damargulis5c5337d2017-04-21 22:36:0883
84
85if __name__ == '__main__':
Mike Bjorge61bf88e2017-05-14 07:34:0686 sys.exit(main())