Flutter Engine
The Flutter Engine
copy_dart.py
Go to the documentation of this file.
1#!/usr/bin/env python3
2# Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file
3# for details. All rights reserved. Use of this source code is governed by a
4# BSD-style license that can be found in the LICENSE file.
5"""Used to merge and copy dart source files for deployment to AppEngine"""
6
7import fileinput
8import sys
9import os
10import re
11from os.path import basename, dirname, exists, isabs, join
12from glob import glob
13
14re_directive = re.compile(r'^(library|import|part|native|resource)\s+(.*);$')
15re_comment = re.compile(r'^(///|/\*| \*).*$')
16
17
18class Library(object):
19
20 def __init__(self, name, imports, sources, natives, code, comment):
21 self.name = name
22 self.imports = imports
23 self.sources = sources
24 self.natives = natives
25 self.code = code
26 self.comment = comment
27
28
29def parseLibrary(library):
30 """ Parses a .dart source file that is the root of a library, and returns
31 information about it: the name, the imports, included sources, and any
32 code in the file.
33 """
34 libraryname = None
35 imports = []
36 sources = []
37 natives = []
38 inlinecode = []
39 librarycomment = []
40 if exists(library):
41 # TODO(sigmund): stop parsing when import/source
42 for line in fileinput.input(library):
43 match = re_directive.match(line)
44 if match:
45 directive = match.group(1)
46 if directive == 'library':
47 assert libraryname is None
48 libraryname = match.group(2)
49 elif directive == 'part':
50 suffix = match.group(2)
51 if not suffix.startswith('of '):
52 sources.append(match.group(2).strip('"\''))
53 elif directive == 'import':
54 imports.append(match.group(2))
55 else:
56 raise Exception(
57 'unknown directive %s in %s' % (directive, line))
58 else:
59 # Check for library comment.
60 if not libraryname and re_comment.match(line):
61 librarycomment.append(line)
62 else:
63 inlinecode.append(line)
64 fileinput.close()
65 return Library(libraryname, imports, sources, natives, inlinecode,
66 librarycomment)
67
68
69def normjoin(*args):
70 return os.path.normpath(os.path.join(*args))
71
72
73def mergefiles(srcs, dstfile):
74 for src in srcs:
75 with open(src, 'r') as s:
76 for line in s:
77 if not line.startswith('part of '):
78 dstfile.write(line)
79
80
81def main(outdir=None, *inputs):
82 if not outdir or not inputs:
83 print("""Usage: %s OUTDIR INPUTS
84 OUTDIR is the war directory to copy to
85 INPUTS is a list of files or patterns used to specify the input
86 .dart files
87This script should be run from the client root directory.
88Files will be merged and copied to: OUTDIR/relative-path-of-file,
89except for dart files with absolute paths, which will be copied to
90 OUTDIR/absolute-path-as-directories""" % sys.argv[0])
91 return 1
92
93 entry_libraries = []
94 for i in inputs:
95 entry_libraries.extend(glob(i))
96
97 for entrypoint in entry_libraries:
98 # Get the transitive set of dart files this entrypoint depends on, merging
99 # each library along the way.
100 worklist = [os.path.normpath(entrypoint)]
101 seen = set()
102 while len(worklist) > 0:
103 lib = worklist.pop()
104 if lib in seen:
105 continue
106
107 seen.add(lib)
108
109 if (dirname(dirname(lib)).endswith('dom/generated/src') or
110 dirname(lib).endswith('dom/src')):
111 continue
112
113 library = parseLibrary(lib)
114
115 # Ensure output directory exists
116 outpath = join(outdir, lib[1:] if isabs(lib) else lib)
117 dstpath = dirname(outpath)
118 if not exists(dstpath):
119 os.makedirs(dstpath)
120
121 # Create file containing all imports, and inlining all sources
122 with open(outpath, 'w') as f:
123 prefix = os.environ.get('DART_HTML_PREFIX')
124 if prefix:
125 f.write(prefix + '\n')
126 if library.name:
127 if library.comment:
128 f.write('%s' % (''.join(library.comment)))
129 f.write("library %s;\n\n" % library.name)
130 else:
131 f.write("library %s;\n\n" % basename(lib))
132 for importfile in library.imports:
133 f.write("import %s;\n" % importfile)
134 f.write('%s' % (''.join(library.code)))
135 mergefiles([normjoin(dirname(lib), s) for s in library.sources],
136 f)
137
138 for suffix in library.imports:
139 m = re.match(r'[\'"]([^\'"]+)[\'"](\s+as\s+\w+)?.*$', suffix)
140 uri = m.group(1)
141 if not uri.startswith('dart:'):
142 worklist.append(normjoin(dirname(lib), uri))
143
144 return 0
145
146
147if __name__ == '__main__':
148 sys.exit(main(*sys.argv[1:]))
def __init__(self, name, imports, sources, natives, code, comment)
Definition: copy_dart.py:20
def parseLibrary(library)
Definition: copy_dart.py:29
def mergefiles(srcs, dstfile)
Definition: copy_dart.py:73
def normjoin(*args)
Definition: copy_dart.py:69
def main(outdir=None, *inputs)
Definition: copy_dart.py:81
DEF_SWITCHES_START aot vmservice shared library Name of the *so containing AOT compiled Dart assets for launching the service isolate vm snapshot The VM snapshot data that will be memory mapped as read only SnapshotAssetPath must be present isolate snapshot The isolate snapshot data that will be memory mapped as read only SnapshotAssetPath must be present cache dir Path to the cache directory This is different from the persistent_cache_path in embedder which is used for Skia shader cache icu native lib Path to the library file that exports the ICU data vm service The hostname IP address on which the Dart VM Service should be served If not set
Definition: switches.h:76
Definition: main.py:1
basename
Definition: malisc.py:23
def print(*args, **kwargs)
Definition: run_tests.py:49
static SkString join(const CommandLineFlags::StringArray &)
Definition: skpbench.cpp:741