| OLD | NEW |
| 1 #!/usr/bin/env python | 1 #!/usr/bin/env python |
| 2 # Copyright (c) 2013 The Chromium Authors. All rights reserved. | 2 # Copyright (c) 2013 The Chromium Authors. All rights reserved. |
| 3 # Use of this source code is governed by a BSD-style license that can be | 3 # Use of this source code is governed by a BSD-style license that can be |
| 4 # found in the LICENSE file. | 4 # found in the LICENSE file. |
| 5 | 5 |
| 6 import multiprocessing | 6 import multiprocessing |
| 7 import optparse | 7 import optparse |
| 8 import os | 8 import os |
| 9 import posixpath | 9 import posixpath |
| 10 import sys | 10 import sys |
| (...skipping 22 matching lines...) Expand all Loading... |
| 33 'bionic', | 33 'bionic', |
| 34 'newlib', | 34 'newlib', |
| 35 'glibc', | 35 'glibc', |
| 36 'pnacl', | 36 'pnacl', |
| 37 'win', | 37 'win', |
| 38 'linux', | 38 'linux', |
| 39 'mac', | 39 'mac', |
| 40 ] | 40 ] |
| 41 | 41 |
| 42 # Global verbosity setting. | 42 # Global verbosity setting. |
| 43 # If set to try (normally via a command line arg) then build_projects will | 43 # If set to True (normally via a command line arg) then build_projects will |
| 44 # add V=1 to all calls to 'make' | 44 # add V=1 to all calls to 'make' |
| 45 verbose = False | 45 verbose = False |
| 46 | 46 |
| 47 | 47 |
| 48 def Trace(msg): |
| 49 if verbose: |
| 50 sys.stderr.write(str(msg) + '\n') |
| 51 |
| 52 |
| 53 def CopyFile(src, dst): |
| 54 buildbot_common.CopyFile(src, dst, verbose) |
| 55 |
| 56 |
| 57 def CopyDir(src, dst, **kwargs): |
| 58 buildbot_common.CopyDir(src, dst, verbose=verbose, **kwargs) |
| 59 |
| 60 |
| 61 def RemoveDir(dst): |
| 62 buildbot_common.RemoveDir(dst, verbose) |
| 63 |
| 64 |
| 65 def MakeDir(dst): |
| 66 buildbot_common.MakeDir(dst, verbose) |
| 67 |
| 68 |
| 48 def CopyFilesFromTo(filelist, srcdir, dstdir): | 69 def CopyFilesFromTo(filelist, srcdir, dstdir): |
| 49 for filename in filelist: | 70 for filename in filelist: |
| 50 srcpath = os.path.join(srcdir, filename) | 71 srcpath = os.path.join(srcdir, filename) |
| 51 dstpath = os.path.join(dstdir, filename) | 72 dstpath = os.path.join(dstdir, filename) |
| 52 buildbot_common.CopyFile(srcpath, dstpath) | 73 CopyFile(srcpath, dstpath) |
| 53 | 74 |
| 54 | 75 |
| 55 def UpdateHelpers(pepperdir, clobber=False): | 76 def UpdateHelpers(pepperdir, clobber=False): |
| 56 tools_dir = os.path.join(pepperdir, 'tools') | 77 tools_dir = os.path.join(pepperdir, 'tools') |
| 57 if not os.path.exists(tools_dir): | 78 if not os.path.exists(tools_dir): |
| 58 buildbot_common.ErrorExit('SDK tools dir is missing: %s' % tools_dir) | 79 buildbot_common.ErrorExit('SDK tools dir is missing: %s' % tools_dir) |
| 59 | 80 |
| 60 exampledir = os.path.join(pepperdir, 'examples') | 81 exampledir = os.path.join(pepperdir, 'examples') |
| 61 if clobber: | 82 if clobber: |
| 62 buildbot_common.RemoveDir(exampledir) | 83 RemoveDir(exampledir) |
| 63 buildbot_common.MakeDir(exampledir) | 84 MakeDir(exampledir) |
| 64 | 85 |
| 65 # Copy files for individual build and landing page | 86 # Copy files for individual build and landing page |
| 66 files = ['favicon.ico', 'httpd.cmd', 'index.css', 'index.js', | 87 files = ['favicon.ico', 'httpd.cmd', 'index.css', 'index.js', |
| 67 'button_close.png', 'button_close_hover.png'] | 88 'button_close.png', 'button_close_hover.png'] |
| 68 CopyFilesFromTo(files, SDK_RESOURCE_DIR, exampledir) | 89 CopyFilesFromTo(files, SDK_RESOURCE_DIR, exampledir) |
| 69 | 90 |
| 70 # Copy tools scripts and make includes | 91 # Copy tools scripts and make includes |
| 71 buildbot_common.CopyDir(os.path.join(SDK_SRC_DIR, 'tools', '*.py'), | 92 CopyDir(os.path.join(SDK_SRC_DIR, 'tools', '*.py'), tools_dir) |
| 72 tools_dir) | 93 CopyDir(os.path.join(SDK_SRC_DIR, 'tools', '*.mk'), tools_dir) |
| 73 buildbot_common.CopyDir(os.path.join(SDK_SRC_DIR, 'tools', '*.mk'), | |
| 74 tools_dir) | |
| 75 | 94 |
| 76 # Copy tools/lib scripts | 95 # Copy tools/lib scripts |
| 77 tools_lib_dir = os.path.join(pepperdir, 'tools', 'lib') | 96 tools_lib_dir = os.path.join(pepperdir, 'tools', 'lib') |
| 78 buildbot_common.MakeDir(tools_lib_dir) | 97 MakeDir(tools_lib_dir) |
| 79 buildbot_common.CopyDir(os.path.join(SDK_SRC_DIR, 'tools', 'lib', '*.py'), | 98 CopyDir(os.path.join(SDK_SRC_DIR, 'tools', 'lib', '*.py'), tools_lib_dir) |
| 80 tools_lib_dir) | |
| 81 | 99 |
| 82 # On Windows add a prebuilt make | 100 # On Windows add a prebuilt make |
| 83 if getos.GetPlatform() == 'win': | 101 if getos.GetPlatform() == 'win': |
| 84 buildbot_common.BuildStep('Add MAKE') | 102 buildbot_common.BuildStep('Add MAKE') |
| 85 make_url = posixpath.join(GSTORE, MAKE) | 103 make_url = posixpath.join(GSTORE, MAKE) |
| 86 make_exe = os.path.join(tools_dir, 'make.exe') | 104 make_exe = os.path.join(tools_dir, 'make.exe') |
| 87 with open(make_exe, 'wb') as f: | 105 with open(make_exe, 'wb') as f: |
| 88 f.write(urllib2.urlopen(make_url).read()) | 106 f.write(urllib2.urlopen(make_url).read()) |
| 89 | 107 |
| 90 | 108 |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 126 | 144 |
| 127 ValidateToolchains(toolchains) | 145 ValidateToolchains(toolchains) |
| 128 | 146 |
| 129 # Create the library output directories | 147 # Create the library output directories |
| 130 libdir = os.path.join(pepperdir, 'lib') | 148 libdir = os.path.join(pepperdir, 'lib') |
| 131 platform = getos.GetPlatform() | 149 platform = getos.GetPlatform() |
| 132 for config in configs: | 150 for config in configs: |
| 133 for arch in LIB_DICT[platform]: | 151 for arch in LIB_DICT[platform]: |
| 134 dirpath = os.path.join(libdir, '%s_%s_host' % (platform, arch), config) | 152 dirpath = os.path.join(libdir, '%s_%s_host' % (platform, arch), config) |
| 135 if clobber: | 153 if clobber: |
| 136 buildbot_common.RemoveDir(dirpath) | 154 RemoveDir(dirpath) |
| 137 buildbot_common.MakeDir(dirpath) | 155 MakeDir(dirpath) |
| 138 | 156 |
| 139 landing_page = None | 157 landing_page = None |
| 140 for branch, projects in project_tree.iteritems(): | 158 for branch, projects in project_tree.iteritems(): |
| 141 dirpath = os.path.join(pepperdir, branch) | 159 dirpath = os.path.join(pepperdir, branch) |
| 142 if clobber: | 160 if clobber: |
| 143 buildbot_common.RemoveDir(dirpath) | 161 RemoveDir(dirpath) |
| 144 buildbot_common.MakeDir(dirpath) | 162 MakeDir(dirpath) |
| 145 targets = [desc['NAME'] for desc in projects] | 163 targets = [desc['NAME'] for desc in projects] |
| 146 deps = GetDeps(projects) | 164 deps = GetDeps(projects) |
| 147 | 165 |
| 148 # Generate master make for this branch of projects | 166 # Generate master make for this branch of projects |
| 149 generate_make.GenerateMasterMakefile(pepperdir, | 167 generate_make.GenerateMasterMakefile(pepperdir, |
| 150 os.path.join(pepperdir, branch), | 168 os.path.join(pepperdir, branch), |
| 151 targets, deps) | 169 targets, deps) |
| 152 | 170 |
| 153 if branch.startswith('examples') and not landing_page: | 171 if branch.startswith('examples') and not landing_page: |
| 154 landing_page = LandingPage() | 172 landing_page = LandingPage() |
| 155 | 173 |
| 156 # Generate individual projects | 174 # Generate individual projects |
| 157 for desc in projects: | 175 for desc in projects: |
| 158 srcroot = os.path.dirname(desc['FILEPATH']) | 176 srcroot = os.path.dirname(desc['FILEPATH']) |
| 159 generate_make.ProcessProject(pepperdir, srcroot, pepperdir, desc, | 177 generate_make.ProcessProject(pepperdir, srcroot, pepperdir, desc, |
| 160 toolchains, configs=configs, | 178 toolchains, configs=configs, |
| 161 first_toolchain=first_toolchain) | 179 first_toolchain=first_toolchain, |
| 180 verbose=verbose) |
| 162 | 181 |
| 163 if branch.startswith('examples'): | 182 if branch.startswith('examples'): |
| 164 landing_page.AddDesc(desc) | 183 landing_page.AddDesc(desc) |
| 165 | 184 |
| 166 if landing_page: | 185 if landing_page: |
| 167 # Generate the landing page text file. | 186 # Generate the landing page text file. |
| 168 index_html = os.path.join(pepperdir, 'examples', 'index.html') | 187 index_html = os.path.join(pepperdir, 'examples', 'index.html') |
| 169 index_template = os.path.join(SDK_RESOURCE_DIR, 'index.html.template') | 188 index_template = os.path.join(SDK_RESOURCE_DIR, 'index.html.template') |
| 170 with open(index_html, 'w') as fh: | 189 with open(index_html, 'w') as fh: |
| 171 out = landing_page.GeneratePage(index_template) | 190 out = landing_page.GeneratePage(index_template) |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 214 make_cmd.append('IGNORE_DEPS=1') | 233 make_cmd.append('IGNORE_DEPS=1') |
| 215 | 234 |
| 216 if verbose: | 235 if verbose: |
| 217 make_cmd.append('V=1') | 236 make_cmd.append('V=1') |
| 218 | 237 |
| 219 if args: | 238 if args: |
| 220 make_cmd += args | 239 make_cmd += args |
| 221 else: | 240 else: |
| 222 make_cmd.append('TOOLCHAIN=all') | 241 make_cmd.append('TOOLCHAIN=all') |
| 223 | 242 |
| 224 buildbot_common.Run(make_cmd, cwd=make_dir, env=env) | 243 buildbot_common.Run(make_cmd, cwd=make_dir, env=env, verbose=verbose) |
| 225 if clean: | 244 if clean: |
| 226 # Clean to remove temporary files but keep the built | 245 # Clean to remove temporary files but keep the built |
| 227 buildbot_common.Run(make_cmd + ['clean'], cwd=make_dir, env=env) | 246 buildbot_common.Run(make_cmd + ['clean'], cwd=make_dir, env=env, |
| 247 verbose=verbose) |
| 228 | 248 |
| 229 | 249 |
| 230 def BuildProjects(pepperdir, project_tree, deps=True, | 250 def BuildProjects(pepperdir, project_tree, deps=True, |
| 231 clean=False, config='Debug'): | 251 clean=False, config='Debug'): |
| 232 | |
| 233 # Make sure we build libraries (which live in 'src') before | 252 # Make sure we build libraries (which live in 'src') before |
| 234 # any of the examples. | 253 # any of the examples. |
| 235 build_first = [p for p in project_tree if p != 'src'] | 254 build_first = [p for p in project_tree if p != 'src'] |
| 236 build_second = [p for p in project_tree if p == 'src'] | 255 build_second = [p for p in project_tree if p == 'src'] |
| 237 | 256 |
| 238 for branch in build_first + build_second: | 257 for branch in build_first + build_second: |
| 239 BuildProjectsBranch(pepperdir, branch, deps, clean, config) | 258 BuildProjectsBranch(pepperdir, branch, deps, clean, config) |
| 240 | 259 |
| 241 | 260 |
| 242 def main(argv): | 261 def main(argv): |
| 243 parser = optparse.OptionParser() | 262 parser = optparse.OptionParser() |
| 244 parser.add_option('-c', '--clobber', | 263 parser.add_option('-c', '--clobber', |
| 245 help='Clobber project directories before copying new files', | 264 help='Clobber project directories before copying new files', |
| 246 action='store_true', default=False) | 265 action='store_true', default=False) |
| 247 parser.add_option('-b', '--build', | 266 parser.add_option('-b', '--build', |
| 248 help='Build the projects.', action='store_true') | 267 help='Build the projects. Otherwise the projects are only copied.', |
| 268 action='store_true') |
| 249 parser.add_option('--config', | 269 parser.add_option('--config', |
| 250 help='Choose configuration to build (Debug or Release). Builds both ' | 270 help='Choose configuration to build (Debug or Release). Builds both ' |
| 251 'by default') | 271 'by default') |
| 252 parser.add_option('--bionic', | 272 parser.add_option('--bionic', |
| 253 help='Enable bionic projects', action='store_true') | 273 help='Enable bionic projects', action='store_true') |
| 254 parser.add_option('-x', '--experimental', | 274 parser.add_option('-x', '--experimental', |
| 255 help='Build experimental projects', action='store_true') | 275 help='Build experimental projects', action='store_true') |
| 256 parser.add_option('-t', '--toolchain', | 276 parser.add_option('-t', '--toolchain', |
| 257 help='Build using toolchain. Can be passed more than once.', | 277 help='Build using toolchain. Can be passed more than once.', |
| 258 action='append', default=[]) | 278 action='append', default=[]) |
| 259 parser.add_option('-d', '--dest', | 279 parser.add_option('-d', '--dest', |
| 260 help='Select which build destinations (project types) are valid.', | 280 help='Select which build destinations (project types) are valid.', |
| 261 action='append') | 281 action='append') |
| 262 parser.add_option('-v', '--verbose', action='store_true') | 282 parser.add_option('-v', '--verbose', action='store_true') |
| 263 | 283 |
| 264 # To setup bash completion for this command first install optcomplete | 284 # To setup bash completion for this command first install optcomplete |
| 265 # and then add this line to your .bashrc: | 285 # and then add this line to your .bashrc: |
| 266 # complete -F _optcomplete build_projects.py | 286 # complete -F _optcomplete build_projects.py |
| 267 try: | 287 try: |
| 268 import optcomplete | 288 import optcomplete |
| 269 optcomplete.autocomplete(parser) | 289 optcomplete.autocomplete(parser) |
| 270 except ImportError: | 290 except ImportError: |
| 271 pass | 291 pass |
| 272 | 292 |
| 273 options, args = parser.parse_args(argv[1:]) | 293 options, args = parser.parse_args(argv[1:]) |
| 274 | 294 |
| 295 global verbose |
| 296 if options.verbose: |
| 297 verbose = True |
| 298 |
| 275 if 'NACL_SDK_ROOT' in os.environ: | 299 if 'NACL_SDK_ROOT' in os.environ: |
| 276 # We don't want the currently configured NACL_SDK_ROOT to have any effect | 300 # We don't want the currently configured NACL_SDK_ROOT to have any effect |
| 277 # on the build. | 301 # on the build. |
| 278 del os.environ['NACL_SDK_ROOT'] | 302 del os.environ['NACL_SDK_ROOT'] |
| 279 | 303 |
| 280 pepper_ver = str(int(build_version.ChromeMajorVersion())) | 304 pepper_ver = str(int(build_version.ChromeMajorVersion())) |
| 281 pepperdir = os.path.join(OUT_DIR, 'pepper_' + pepper_ver) | 305 pepperdir = os.path.join(OUT_DIR, 'pepper_' + pepper_ver) |
| 282 | 306 |
| 283 if not options.toolchain: | 307 if not options.toolchain: |
| 284 # Order matters here: the default toolchain for an example's Makefile will | 308 # Order matters here: the default toolchain for an example's Makefile will |
| 285 # be the first toolchain in this list that is available in the example. | 309 # be the first toolchain in this list that is available in the example. |
| 286 # e.g. If an example supports newlib and glibc, then the default will be | 310 # e.g. If an example supports newlib and glibc, then the default will be |
| 287 # newlib. | 311 # newlib. |
| 288 options.toolchain = ['pnacl', 'newlib', 'glibc', 'host'] | 312 options.toolchain = ['pnacl', 'newlib', 'glibc', 'host'] |
| 289 if options.experimental or options.bionic: | 313 if options.experimental or options.bionic: |
| 290 options.toolchain.append('bionic') | 314 options.toolchain.append('bionic') |
| 291 | 315 |
| 292 if 'host' in options.toolchain: | 316 if 'host' in options.toolchain: |
| 293 options.toolchain.remove('host') | 317 options.toolchain.remove('host') |
| 294 options.toolchain.append(getos.GetPlatform()) | 318 options.toolchain.append(getos.GetPlatform()) |
| 295 print 'Adding platform: ' + getos.GetPlatform() | 319 Trace('Adding platform: ' + getos.GetPlatform()) |
| 296 | 320 |
| 297 ValidateToolchains(options.toolchain) | 321 ValidateToolchains(options.toolchain) |
| 298 | 322 |
| 299 filters = {} | 323 filters = {} |
| 300 if options.toolchain: | 324 if options.toolchain: |
| 301 filters['TOOLS'] = options.toolchain | 325 filters['TOOLS'] = options.toolchain |
| 302 print 'Filter by toolchain: ' + str(options.toolchain) | 326 Trace('Filter by toolchain: ' + str(options.toolchain)) |
| 303 if not options.experimental: | 327 if not options.experimental: |
| 304 filters['EXPERIMENTAL'] = False | 328 filters['EXPERIMENTAL'] = False |
| 305 if options.dest: | 329 if options.dest: |
| 306 filters['DEST'] = options.dest | 330 filters['DEST'] = options.dest |
| 307 print 'Filter by type: ' + str(options.dest) | 331 Trace('Filter by type: ' + str(options.dest)) |
| 308 if args: | 332 if args: |
| 309 filters['NAME'] = args | 333 filters['NAME'] = args |
| 310 print 'Filter by name: ' + str(args) | 334 Trace('Filter by name: ' + str(args)) |
| 311 | 335 |
| 312 try: | 336 try: |
| 313 project_tree = parse_dsc.LoadProjectTree(SDK_SRC_DIR, include=filters) | 337 project_tree = parse_dsc.LoadProjectTree(SDK_SRC_DIR, include=filters) |
| 314 except parse_dsc.ValidationError as e: | 338 except parse_dsc.ValidationError as e: |
| 315 buildbot_common.ErrorExit(str(e)) | 339 buildbot_common.ErrorExit(str(e)) |
| 316 parse_dsc.PrintProjectTree(project_tree) | 340 |
| 341 if verbose: |
| 342 parse_dsc.PrintProjectTree(project_tree) |
| 317 | 343 |
| 318 UpdateHelpers(pepperdir, clobber=options.clobber) | 344 UpdateHelpers(pepperdir, clobber=options.clobber) |
| 319 UpdateProjects(pepperdir, project_tree, options.toolchain, | 345 UpdateProjects(pepperdir, project_tree, options.toolchain, |
| 320 clobber=options.clobber) | 346 clobber=options.clobber) |
| 321 | 347 |
| 322 if options.verbose: | |
| 323 global verbose | |
| 324 verbose = True | |
| 325 | |
| 326 if options.build: | 348 if options.build: |
| 327 if options.config: | 349 if options.config: |
| 328 configs = [options.config] | 350 configs = [options.config] |
| 329 else: | 351 else: |
| 330 configs = ['Debug', 'Release'] | 352 configs = ['Debug', 'Release'] |
| 331 for config in configs: | 353 for config in configs: |
| 332 BuildProjects(pepperdir, project_tree, config=config) | 354 BuildProjects(pepperdir, project_tree, config=config) |
| 333 | 355 |
| 334 return 0 | 356 return 0 |
| 335 | 357 |
| 336 | 358 |
| 337 if __name__ == '__main__': | 359 if __name__ == '__main__': |
| 338 script_name = os.path.basename(sys.argv[0]) | 360 script_name = os.path.basename(sys.argv[0]) |
| 339 try: | 361 try: |
| 340 sys.exit(main(sys.argv)) | 362 sys.exit(main(sys.argv)) |
| 341 except parse_dsc.ValidationError as e: | 363 except parse_dsc.ValidationError as e: |
| 342 buildbot_common.ErrorExit('%s: %s' % (script_name, e)) | 364 buildbot_common.ErrorExit('%s: %s' % (script_name, e)) |
| 343 except KeyboardInterrupt: | 365 except KeyboardInterrupt: |
| 344 buildbot_common.ErrorExit('%s: interrupted' % script_name) | 366 buildbot_common.ErrorExit('%s: interrupted' % script_name) |
| OLD | NEW |