OLD | NEW |
1 #!/usr/bin/env python | 1 #!/usr/bin/env python |
2 # | 2 # |
3 # Copyright 2013 The Chromium Authors. All rights reserved. | 3 # Copyright 2013 The Chromium Authors. All rights reserved. |
4 # Use of this source code is governed by a BSD-style license that can be | 4 # Use of this source code is governed by a BSD-style license that can be |
5 # found in the LICENSE file. | 5 # found in the LICENSE file. |
6 | 6 |
7 import fnmatch | 7 import fnmatch |
8 import optparse | 8 import optparse |
9 import os | 9 import os |
10 import shutil | 10 import shutil |
11 import re | 11 import re |
12 import sys | 12 import sys |
| 13 import textwrap |
13 | 14 |
14 from util import build_utils | 15 from util import build_utils |
15 from util import md5_check | 16 from util import md5_check |
16 | 17 |
17 import jar | 18 import jar |
18 | 19 |
19 sys.path.append(build_utils.COLORAMA_ROOT) | 20 sys.path.append(build_utils.COLORAMA_ROOT) |
20 import colorama | 21 import colorama |
21 | 22 |
22 | 23 |
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
99 stderr_filter=ColorJavacOutput) | 100 stderr_filter=ColorJavacOutput) |
100 | 101 |
101 record_path = os.path.join(classes_dir, 'javac.md5.stamp') | 102 record_path = os.path.join(classes_dir, 'javac.md5.stamp') |
102 md5_check.CallAndRecordIfStale( | 103 md5_check.CallAndRecordIfStale( |
103 Compile, | 104 Compile, |
104 record_path=record_path, | 105 record_path=record_path, |
105 input_paths=java_files + jar_inputs, | 106 input_paths=java_files + jar_inputs, |
106 input_strings=javac_cmd) | 107 input_strings=javac_cmd) |
107 | 108 |
108 | 109 |
| 110 _MAX_MANIFEST_LINE_LEN = 72 |
| 111 |
| 112 |
| 113 def CreateManifest(manifest_path, classpath, main_class=None): |
| 114 """Creates a manifest file with the given parameters. |
| 115 |
| 116 This generates a manifest file that compiles with the spec found at |
| 117 http://docs.oracle.com/javase/7/docs/technotes/guides/jar/jar.html#JAR_Manifes
t |
| 118 |
| 119 Args: |
| 120 manifest_path: The path to the manifest file that should be created. |
| 121 classpath: The JAR files that should be listed on the manifest file's |
| 122 classpath. |
| 123 main_class: If present, the class containing the main() function. |
| 124 |
| 125 """ |
| 126 output = ['Manifest-Version: 1.0'] |
| 127 if main_class: |
| 128 output.append('Main-Class: %s' % main_class) |
| 129 if classpath: |
| 130 sanitized_paths = [] |
| 131 for path in classpath: |
| 132 sanitized_paths.append(os.path.basename(path.strip('"'))) |
| 133 output.append('Class-Path: %s' % ' '.join(sanitized_paths)) |
| 134 output.append('Created-By: ') |
| 135 output.append('') |
| 136 |
| 137 wrapper = textwrap.TextWrapper(break_long_words=True, |
| 138 drop_whitespace=False, |
| 139 subsequent_indent=' ', |
| 140 width=_MAX_MANIFEST_LINE_LEN - 2) |
| 141 output = '\r\n'.join(w for l in output for w in wrapper.wrap(l)) |
| 142 |
| 143 with open(manifest_path, 'w') as f: |
| 144 f.write(output) |
| 145 |
| 146 |
109 def main(argv): | 147 def main(argv): |
110 colorama.init() | 148 colorama.init() |
111 | 149 |
112 argv = build_utils.ExpandFileArgs(argv) | 150 argv = build_utils.ExpandFileArgs(argv) |
113 | 151 |
114 parser = optparse.OptionParser() | 152 parser = optparse.OptionParser() |
115 build_utils.AddDepfileOption(parser) | 153 build_utils.AddDepfileOption(parser) |
116 | 154 |
117 parser.add_option( | 155 parser.add_option( |
118 '--src-gendirs', | 156 '--src-gendirs', |
(...skipping 20 matching lines...) Expand all Loading... |
139 parser.add_option( | 177 parser.add_option( |
140 '--chromium-code', | 178 '--chromium-code', |
141 type='int', | 179 type='int', |
142 help='Whether code being compiled should be built with stricter ' | 180 help='Whether code being compiled should be built with stricter ' |
143 'warnings for chromium code.') | 181 'warnings for chromium code.') |
144 | 182 |
145 parser.add_option( | 183 parser.add_option( |
146 '--classes-dir', | 184 '--classes-dir', |
147 help='Directory for compiled .class files.') | 185 help='Directory for compiled .class files.') |
148 parser.add_option('--jar-path', help='Jar output path.') | 186 parser.add_option('--jar-path', help='Jar output path.') |
| 187 parser.add_option( |
| 188 '--main-class', |
| 189 help='The class containing the main method.') |
149 | 190 |
150 parser.add_option('--stamp', help='Path to touch on success.') | 191 parser.add_option('--stamp', help='Path to touch on success.') |
151 | 192 |
152 options, args = parser.parse_args(argv) | 193 options, args = parser.parse_args(argv) |
153 | 194 |
| 195 if options.main_class and not options.jar_path: |
| 196 parser.error('--main-class requires --jar-path') |
| 197 |
154 classpath = [] | 198 classpath = [] |
155 for arg in options.classpath: | 199 for arg in options.classpath: |
156 classpath += build_utils.ParseGypList(arg) | 200 classpath += build_utils.ParseGypList(arg) |
157 | 201 |
158 java_srcjars = [] | 202 java_srcjars = [] |
159 for arg in options.java_srcjars: | 203 for arg in options.java_srcjars: |
160 java_srcjars += build_utils.ParseGypList(arg) | 204 java_srcjars += build_utils.ParseGypList(arg) |
161 | 205 |
162 java_files = args | 206 java_files = args |
163 if options.src_gendirs: | 207 if options.src_gendirs: |
(...skipping 21 matching lines...) Expand all Loading... |
185 break | 229 break |
186 java_files = filtered_java_files | 230 java_files = filtered_java_files |
187 | 231 |
188 DoJavac( | 232 DoJavac( |
189 classpath, | 233 classpath, |
190 classes_dir, | 234 classes_dir, |
191 options.chromium_code, | 235 options.chromium_code, |
192 java_files) | 236 java_files) |
193 | 237 |
194 if options.jar_path: | 238 if options.jar_path: |
| 239 if options.main_class: |
| 240 manifest_file = os.path.join(temp_dir, 'manifest') |
| 241 CreateManifest(manifest_file, classpath, |
| 242 options.main_class) |
| 243 else: |
| 244 manifest_file = None |
195 jar.JarDirectory(classes_dir, | 245 jar.JarDirectory(classes_dir, |
196 build_utils.ParseGypList(options.jar_excluded_classes), | 246 build_utils.ParseGypList(options.jar_excluded_classes), |
197 options.jar_path) | 247 options.jar_path, |
| 248 manifest_file=manifest_file) |
198 | 249 |
199 if options.classes_dir: | 250 if options.classes_dir: |
200 # Delete the old classes directory. This ensures that all .class files in | 251 # Delete the old classes directory. This ensures that all .class files in |
201 # the output are actually from the input .java files. For example, if a | 252 # the output are actually from the input .java files. For example, if a |
202 # .java file is deleted or an inner class is removed, the classes | 253 # .java file is deleted or an inner class is removed, the classes |
203 # directory should not contain the corresponding old .class file after | 254 # directory should not contain the corresponding old .class file after |
204 # running this action. | 255 # running this action. |
205 build_utils.DeleteDirectory(options.classes_dir) | 256 build_utils.DeleteDirectory(options.classes_dir) |
206 shutil.copytree(classes_dir, options.classes_dir) | 257 shutil.copytree(classes_dir, options.classes_dir) |
207 | 258 |
208 if options.depfile: | 259 if options.depfile: |
209 build_utils.WriteDepfile( | 260 build_utils.WriteDepfile( |
210 options.depfile, | 261 options.depfile, |
211 input_files + build_utils.GetPythonDependencies()) | 262 input_files + build_utils.GetPythonDependencies()) |
212 | 263 |
213 if options.stamp: | 264 if options.stamp: |
214 build_utils.Touch(options.stamp) | 265 build_utils.Touch(options.stamp) |
215 | 266 |
216 | 267 |
217 if __name__ == '__main__': | 268 if __name__ == '__main__': |
218 sys.exit(main(sys.argv[1:])) | 269 sys.exit(main(sys.argv[1:])) |
219 | 270 |
220 | 271 |
OLD | NEW |