| #!/usr/bin/python | 
 |  | 
 | # Copyright 2011 The Android Open Source Project | 
 | # | 
 | # Use of this source code is governed by a BSD-style license that can be | 
 | # found in the LICENSE file. | 
 |  | 
 | # This script is a wrapper which invokes gyp with the correct --depth argument, | 
 | # and supports the automatic regeneration of build files if all.gyp is | 
 | # changed (Linux-only). | 
 |  | 
 | import glob | 
 | import os | 
 | import platform | 
 | import shlex | 
 | import sys | 
 |  | 
 | script_dir = os.path.abspath(os.path.dirname(__file__)) | 
 |  | 
 | # Directory within which we can find the gyp source. | 
 | gyp_source_dir = os.path.join(script_dir, 'third_party', 'externals', 'gyp') | 
 |  | 
 | # Directory within which we can find most of Skia's gyp configuration files. | 
 | gyp_config_dir = os.path.join(script_dir, 'gyp') | 
 |  | 
 | # Ensure we import our current gyp source's module, not any version | 
 | # pre-installed in your PYTHONPATH. | 
 | sys.path.insert(0, os.path.join(gyp_source_dir, 'pylib')) | 
 | import gyp | 
 |  | 
 | ENVVAR_GYP_GENERATORS = 'GYP_GENERATORS' | 
 | ENVVAR_GYP_GENERATOR_FLAGS = 'GYP_GENERATOR_FLAGS' | 
 |  | 
 |  | 
 | def additional_include_files(args=[]): | 
 |   # Determine the include files specified on the command line. | 
 |   # This doesn't cover all the different option formats you can use, | 
 |   # but it's mainly intended to avoid duplicating flags on the automatic | 
 |   # makefile regeneration which only uses this format. | 
 |   specified_includes = set() | 
 |   for arg in args: | 
 |     if arg.startswith('-I') and len(arg) > 2: | 
 |       specified_includes.add(os.path.realpath(arg[2:])) | 
 |  | 
 |   result = [] | 
 |   def AddInclude(path): | 
 |     if os.path.realpath(path) not in specified_includes: | 
 |       result.append(path) | 
 |  | 
 |   # Always include common.gypi. | 
 |   # We do this, rather than including common.gypi explicitly in all our gyp | 
 |   # files, so that gyp files we use but do not maintain (e.g., | 
 |   # third_party/externals/libjpeg/libjpeg.gyp) will include common.gypi too. | 
 |   AddInclude(os.path.join(gyp_config_dir, 'common.gypi')) | 
 |  | 
 |   return result | 
 |  | 
 | # Return the directory where all the build files are to be written. | 
 | def get_output_dir(): | 
 |   # SKIA_OUT can be any directory either as a child of the standard out/ | 
 |   # directory or any given location on the file system (e.g. /tmp/skia) | 
 |   output_dir = os.getenv('SKIA_OUT') | 
 |  | 
 |   if not output_dir: | 
 |     return os.path.join(os.path.abspath(script_dir), 'out') | 
 |  | 
 |   if (sys.platform.startswith('darwin') and | 
 |       (not os.getenv(ENVVAR_GYP_GENERATORS) or | 
 |        'xcode' in os.getenv(ENVVAR_GYP_GENERATORS))): | 
 |     print 'ERROR: variable SKIA_OUT is not valid on Mac (using xcodebuild)' | 
 |     sys.exit(-1); | 
 |  | 
 |   if os.path.isabs(output_dir): | 
 |     return output_dir | 
 |   else: | 
 |     return os.path.join(os.path.abspath(script_dir), output_dir) | 
 |  | 
 |  | 
 | if __name__ == '__main__': | 
 |   args = sys.argv[1:] | 
 |  | 
 |   if not os.getenv(ENVVAR_GYP_GENERATORS): | 
 |     print ('%s environment variable not set, using default' % | 
 |            ENVVAR_GYP_GENERATORS) | 
 |     if sys.platform.startswith('darwin'): | 
 |       default_gyp_generators = 'ninja,xcode' | 
 |     elif sys.platform.startswith('win'): | 
 |       default_gyp_generators = 'ninja,msvs-ninja' | 
 |     elif sys.platform.startswith('cygwin'): | 
 |       default_gyp_generators = 'ninja,msvs-ninja' | 
 |     else: | 
 |       default_gyp_generators = 'ninja' | 
 |     os.environ[ENVVAR_GYP_GENERATORS] = default_gyp_generators | 
 |   print '%s is "%s"' % (ENVVAR_GYP_GENERATORS, os.getenv(ENVVAR_GYP_GENERATORS)) | 
 |  | 
 |   vs2013_runtime_dll_dirs = None | 
 |   if os.getenv('CHROME_HEADLESS', '0') == '1': | 
 |     if sys.platform.startswith('win') or sys.platform.startswith('cygwin'): | 
 |       chrome_path = os.getenv('CHROME_PATH') | 
 |       os.chdir(chrome_path) | 
 |       sys.path.append(os.path.join(chrome_path, 'build')) | 
 |       sys.path.append(os.path.join(chrome_path, 'tools')) | 
 |       import vs_toolchain | 
 |       vs2013_runtime_dll_dirs = \ | 
 |           vs_toolchain.SetEnvironmentAndGetRuntimeDllDirs() | 
 |  | 
 |   # Set CWD to the directory containing this script. | 
 |   # This allows us to launch it from other directories, in spite of gyp's | 
 |   # finickyness about the current working directory. | 
 |   # See http://b.corp.google.com/issue?id=5019517 ('Linux make build | 
 |   # (from out dir) no longer runs skia_gyp correctly') | 
 |   os.chdir(os.path.abspath(script_dir)) | 
 |  | 
 |   # This could give false positives since it doesn't actually do real option | 
 |   # parsing.  Oh well. | 
 |   gyp_file_specified = False | 
 |   for arg in args: | 
 |     if arg.endswith('.gyp'): | 
 |       gyp_file_specified = True | 
 |       break | 
 |  | 
 |   # If we didn't get a file, then fall back to assuming 'skia.gyp' from the | 
 |   # same directory as the script. | 
 |   # The gypfile must be passed as a relative path, not an absolute path, | 
 |   # or else the gyp code doesn't write into the proper output dir. | 
 |   if not gyp_file_specified: | 
 |     args.append('skia.gyp') | 
 |  | 
 |   args.extend(['-I' + i for i in additional_include_files(args)]) | 
 |   args.extend(['--depth', '.']) | 
 |  | 
 |   # Tell gyp to write the build files into output_dir. | 
 |   args.extend(['--generator-output', os.path.abspath(get_output_dir())]) | 
 |  | 
 |   # Tell ninja to write its output into the same directory. | 
 |   args.extend(['-Goutput_dir=.']) | 
 |  | 
 |   # By default, we build 'most' instead of 'all' or 'everything'. See skia.gyp. | 
 |   args.extend(['-Gdefault_target=most']) | 
 |  | 
 |   # Fail if any files specified in the project are missing | 
 |   if sys.platform.startswith('win'): | 
 |     gyp_generator_flags = os.getenv(ENVVAR_GYP_GENERATOR_FLAGS, '') | 
 |     if not 'msvs_error_on_missing_sources' in gyp_generator_flags: | 
 |       os.environ[ENVVAR_GYP_GENERATOR_FLAGS] = ( | 
 |           gyp_generator_flags + ' msvs_error_on_missing_sources=1') | 
 |  | 
 |   # GYP is very conservative about how many concurrent linker calls it allows, | 
 |   # to fit in RAM. We don't need to be nearly as conservative as Chrome.  We'll | 
 |   # just turn that feature off. | 
 |   os.environ['GYP_LINK_CONCURRENCY'] = '9001' | 
 |  | 
 |   print 'Updating projects from gyp files...' | 
 |   sys.stdout.flush() | 
 |  | 
 |   if '--dry-run' in args: | 
 |     args.remove('--dry-run') | 
 |     print gyp_source_dir, ' '.join(args) | 
 |   else: | 
 |     # Off we go... | 
 |     res = gyp.main(args) | 
 |     if res: | 
 |       sys.exit(res) | 
 |  | 
 |   # This code is copied from Chrome's build/gyp_chromium. It's not clear why | 
 |   # the *_runtime variables are reversed. | 
 |   if vs2013_runtime_dll_dirs: | 
 |     x64_runtime, x86_runtime = vs2013_runtime_dll_dirs | 
 |     vs_toolchain.CopyVsRuntimeDlls( | 
 |         os.path.join(os.getenv('CHROME_PATH'), get_output_dir()), | 
 |         (x86_runtime, x64_runtime)) |