Index: pylib/gyp/SCons.py |
=================================================================== |
--- pylib/gyp/SCons.py (revision 1611) |
+++ pylib/gyp/SCons.py (working copy) |
@@ -1,199 +0,0 @@ |
-# Copyright (c) 2012 Google Inc. All rights reserved. |
-# Use of this source code is governed by a BSD-style license that can be |
-# found in the LICENSE file. |
- |
-""" |
-SCons generator. |
- |
-This contains class definitions and supporting functions for generating |
-pieces of SCons files for the different types of GYP targets. |
-""" |
- |
-import os |
- |
- |
-def WriteList(fp, list, prefix='', |
- separator=',\n ', |
- preamble=None, |
- postamble=None): |
- fp.write(preamble or '') |
- fp.write((separator or ' ').join([prefix + l for l in list])) |
- fp.write(postamble or '') |
- |
- |
-class TargetBase(object): |
- """ |
- Base class for a SCons representation of a GYP target. |
- """ |
- is_ignored = False |
- target_prefix = '' |
- target_suffix = '' |
- def __init__(self, spec): |
- self.spec = spec |
- def full_product_name(self): |
- """ |
- Returns the full name of the product being built: |
- |
- * Uses 'product_name' if it's set, else prefix + 'target_name'. |
- * Prepends 'product_dir' if set. |
- * Appends SCons suffix variables for the target type (or |
- product_extension). |
- """ |
- suffix = self.target_suffix |
- product_extension = self.spec.get('product_extension') |
- if product_extension: |
- suffix = '.' + product_extension |
- prefix = self.spec.get('product_prefix', self.target_prefix) |
- name = self.spec['target_name'] |
- name = prefix + self.spec.get('product_name', name) + suffix |
- product_dir = self.spec.get('product_dir') |
- if product_dir: |
- name = os.path.join(product_dir, name) |
- else: |
- name = os.path.join(self.out_dir, name) |
- return name |
- |
- def write_input_files(self, fp): |
- """ |
- Writes the definition of the input files (sources). |
- """ |
- sources = self.spec.get('sources') |
- if not sources: |
- fp.write('\ninput_files = []\n') |
- return |
- preamble = '\ninput_files = [\n ' |
- postamble = ',\n]\n' |
- WriteList(fp, map(repr, sources), preamble=preamble, postamble=postamble) |
- |
- def builder_call(self): |
- """ |
- Returns the actual SCons builder call to build this target. |
- """ |
- name = self.full_product_name() |
- return 'env.%s(env.File(%r), input_files)' % (self.builder_name, name) |
- def write_target(self, fp, src_dir='', pre=''): |
- """ |
- Writes the lines necessary to build this target. |
- """ |
- fp.write('\n' + pre) |
- fp.write('_outputs = %s\n' % self.builder_call()) |
- fp.write('target_files.extend(_outputs)\n') |
- |
- |
-class NoneTarget(TargetBase): |
- """ |
- A GYP target type of 'none', implicitly or explicitly. |
- """ |
- def write_target(self, fp, src_dir='', pre=''): |
- fp.write('\ntarget_files.extend(input_files)\n') |
- |
- |
-class SettingsTarget(TargetBase): |
- """ |
- A GYP target type of 'settings'. |
- """ |
- is_ignored = True |
- |
- |
-compilable_sources_template = """ |
-_result = [] |
-for infile in input_files: |
- if env.compilable(infile): |
- if (type(infile) == type('') |
- and (infile.startswith(%(src_dir)r) |
- or not os.path.isabs(env.subst(infile)))): |
- # Force files below the build directory by replacing all '..' |
- # elements in the path with '__': |
- base, ext = os.path.splitext(os.path.normpath(infile)) |
- base = [d == '..' and '__' or d for d in base.split('/')] |
- base = os.path.join(*base) |
- object = '${OBJ_DIR}/${COMPONENT_NAME}/${TARGET_NAME}/' + base |
- if not infile.startswith(%(src_dir)r): |
- infile = %(src_dir)r + infile |
- infile = env.%(name)s(object, infile)[0] |
- else: |
- infile = env.%(name)s(infile)[0] |
- _result.append(infile) |
-input_files = _result |
-""" |
- |
-class CompilableSourcesTargetBase(TargetBase): |
- """ |
- An abstract base class for targets that compile their source files. |
- |
- We explicitly transform compilable files into object files, |
- even though SCons could infer that for us, because we want |
- to control where the object file ends up. (The implicit rules |
- in SCons always put the object file next to the source file.) |
- """ |
- intermediate_builder_name = None |
- def write_target(self, fp, src_dir='', pre=''): |
- if self.intermediate_builder_name is None: |
- raise NotImplementedError |
- if src_dir and not src_dir.endswith('/'): |
- src_dir += '/' |
- variables = { |
- 'src_dir': src_dir, |
- 'name': self.intermediate_builder_name, |
- } |
- fp.write(compilable_sources_template % variables) |
- super(CompilableSourcesTargetBase, self).write_target(fp) |
- |
- |
-class ProgramTarget(CompilableSourcesTargetBase): |
- """ |
- A GYP target type of 'executable'. |
- """ |
- builder_name = 'GypProgram' |
- intermediate_builder_name = 'StaticObject' |
- target_prefix = '${PROGPREFIX}' |
- target_suffix = '${PROGSUFFIX}' |
- out_dir = '${TOP_BUILDDIR}' |
- |
- |
-class StaticLibraryTarget(CompilableSourcesTargetBase): |
- """ |
- A GYP target type of 'static_library'. |
- """ |
- builder_name = 'GypStaticLibrary' |
- intermediate_builder_name = 'StaticObject' |
- target_prefix = '${LIBPREFIX}' |
- target_suffix = '${LIBSUFFIX}' |
- out_dir = '${LIB_DIR}' |
- |
- |
-class SharedLibraryTarget(CompilableSourcesTargetBase): |
- """ |
- A GYP target type of 'shared_library'. |
- """ |
- builder_name = 'GypSharedLibrary' |
- intermediate_builder_name = 'SharedObject' |
- target_prefix = '${SHLIBPREFIX}' |
- target_suffix = '${SHLIBSUFFIX}' |
- out_dir = '${LIB_DIR}' |
- |
- |
-class LoadableModuleTarget(CompilableSourcesTargetBase): |
- """ |
- A GYP target type of 'loadable_module'. |
- """ |
- builder_name = 'GypLoadableModule' |
- intermediate_builder_name = 'SharedObject' |
- target_prefix = '${SHLIBPREFIX}' |
- target_suffix = '${SHLIBSUFFIX}' |
- out_dir = '${TOP_BUILDDIR}' |
- |
- |
-TargetMap = { |
- None : NoneTarget, |
- 'none' : NoneTarget, |
- 'settings' : SettingsTarget, |
- 'executable' : ProgramTarget, |
- 'static_library' : StaticLibraryTarget, |
- 'shared_library' : SharedLibraryTarget, |
- 'loadable_module' : LoadableModuleTarget, |
-} |
- |
- |
-def Target(spec): |
- return TargetMap[spec.get('type')](spec) |