| OLD | NEW |
| 1 # Copyright (c) 2012 Google Inc. All rights reserved. | 1 # Copyright (c) 2012 Google Inc. All rights reserved. |
| 2 # Use of this source code is governed by a BSD-style license that can be | 2 # Use of this source code is governed by a BSD-style license that can be |
| 3 # found in the LICENSE file. | 3 # found in the LICENSE file. |
| 4 | 4 |
| 5 import copy | 5 import copy |
| 6 import hashlib | 6 import hashlib |
| 7 import os.path | 7 import os.path |
| 8 import re | 8 import re |
| 9 import subprocess | 9 import subprocess |
| 10 import sys | 10 import sys |
| (...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 153 # that compose a .lib (rather than the .lib itself). That list is stored | 153 # that compose a .lib (rather than the .lib itself). That list is stored |
| 154 # here. | 154 # here. |
| 155 self.component_objs = None | 155 self.component_objs = None |
| 156 # Windows only. The import .lib is the output of a build step, but | 156 # Windows only. The import .lib is the output of a build step, but |
| 157 # because dependents only link against the lib (not both the lib and the | 157 # because dependents only link against the lib (not both the lib and the |
| 158 # dll) we keep track of the import library here. | 158 # dll) we keep track of the import library here. |
| 159 self.import_lib = None | 159 self.import_lib = None |
| 160 | 160 |
| 161 def Linkable(self): | 161 def Linkable(self): |
| 162 """Return true if this is a target that can be linked against.""" | 162 """Return true if this is a target that can be linked against.""" |
| 163 return self.type in ('static_library', 'shared_library') | 163 return self.type in ('static_library', 'shared_library', |
| 164 'standalone_static_library') |
| 164 | 165 |
| 165 def UsesToc(self, flavor): | 166 def UsesToc(self, flavor): |
| 166 """Return true if the target should produce a restat rule based on a TOC | 167 """Return true if the target should produce a restat rule based on a TOC |
| 167 file.""" | 168 file.""" |
| 168 # For bundles, the .TOC should be produced for the binary, not for | 169 # For bundles, the .TOC should be produced for the binary, not for |
| 169 # FinalOutput(). But the naive approach would put the TOC file into the | 170 # FinalOutput(). But the naive approach would put the TOC file into the |
| 170 # bundle, so don't do this for bundles for now. | 171 # bundle, so don't do this for bundles for now. |
| 171 if flavor == 'win' or self.bundle: | 172 if flavor == 'win' or self.bundle: |
| 172 return False | 173 return False |
| 173 return self.type in ('shared_library', 'loadable_module') | 174 return self.type in ('shared_library', 'loadable_module') |
| (...skipping 253 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 427 pch = gyp.xcode_emulation.MacPrefixHeader( | 428 pch = gyp.xcode_emulation.MacPrefixHeader( |
| 428 self.xcode_settings, self.GypPathToNinja, | 429 self.xcode_settings, self.GypPathToNinja, |
| 429 lambda path, lang: self.GypPathToUniqueOutput(path + '-' + lang)) | 430 lambda path, lang: self.GypPathToUniqueOutput(path + '-' + lang)) |
| 430 link_deps = self.WriteSources( | 431 link_deps = self.WriteSources( |
| 431 config_name, config, sources, compile_depends_stamp, pch, | 432 config_name, config, sources, compile_depends_stamp, pch, |
| 432 case_sensitive_filesystem) | 433 case_sensitive_filesystem) |
| 433 # Some actions/rules output 'sources' that are already object files. | 434 # Some actions/rules output 'sources' that are already object files. |
| 434 link_deps += [self.GypPathToNinja(f) | 435 link_deps += [self.GypPathToNinja(f) |
| 435 for f in sources if f.endswith(self.obj_ext)] | 436 for f in sources if f.endswith(self.obj_ext)] |
| 436 | 437 |
| 437 if self.flavor == 'win' and self.target.type == 'static_library': | 438 if self.flavor == 'win' and self.target.type in ('static_library', |
| 439 'standalone_static_library'): |
| 438 self.target.component_objs = link_deps | 440 self.target.component_objs = link_deps |
| 439 | 441 |
| 440 # Write out a link step, if needed. | 442 # Write out a link step, if needed. |
| 441 output = None | 443 output = None |
| 442 if link_deps or self.target.actions_stamp or actions_depends: | 444 if link_deps or self.target.actions_stamp or actions_depends: |
| 443 output = self.WriteTarget(spec, config_name, config, link_deps, | 445 output = self.WriteTarget(spec, config_name, config, link_deps, |
| 444 self.target.actions_stamp or actions_depends) | 446 self.target.actions_stamp or actions_depends) |
| 445 if self.is_mac_bundle: | 447 if self.is_mac_bundle: |
| 446 mac_bundle_depends.append(output) | 448 mac_bundle_depends.append(output) |
| 447 | 449 |
| (...skipping 499 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 947 variables = [] | 949 variables = [] |
| 948 postbuild = self.GetPostbuildCommand( | 950 postbuild = self.GetPostbuildCommand( |
| 949 spec, self.target.binary, self.target.binary) | 951 spec, self.target.binary, self.target.binary) |
| 950 if postbuild: | 952 if postbuild: |
| 951 variables.append(('postbuilds', postbuild)) | 953 variables.append(('postbuilds', postbuild)) |
| 952 if self.xcode_settings: | 954 if self.xcode_settings: |
| 953 variables.append(('libtool_flags', | 955 variables.append(('libtool_flags', |
| 954 self.xcode_settings.GetLibtoolflags(config_name))) | 956 self.xcode_settings.GetLibtoolflags(config_name))) |
| 955 self.ninja.build(self.target.binary, 'alink', link_deps, | 957 self.ninja.build(self.target.binary, 'alink', link_deps, |
| 956 order_only=compile_deps, variables=variables) | 958 order_only=compile_deps, variables=variables) |
| 959 elif spec['type'] == 'standalone_static_library': |
| 960 self.target.binary = self.ComputeOutput(spec) |
| 961 variables = [] |
| 962 postbuild = self.GetPostbuildCommand( |
| 963 spec, self.target.binary, self.target.binary) |
| 964 if postbuild: |
| 965 variables.append(('postbuilds', postbuild)) |
| 966 if self.xcode_settings: |
| 967 variables.append(('libtool_flags', |
| 968 self.xcode_settings.GetLibtoolflags(config_name))) |
| 969 if self.flavor != 'mac' and self.flavor != 'win': |
| 970 self.ninja.rule( |
| 971 'alink', |
| 972 description='AR $out', |
| 973 command='rm -f $out && $ar rcs $out $in') |
| 974 self.ninja.build(self.target.binary, 'alink', link_deps, |
| 975 order_only=compile_deps, variables=variables) |
| 957 else: | 976 else: |
| 958 self.WriteLink(spec, config_name, config, link_deps) | 977 self.WriteLink(spec, config_name, config, link_deps) |
| 959 return self.target.binary | 978 return self.target.binary |
| 960 | 979 |
| 961 def WriteMacBundle(self, spec, mac_bundle_depends): | 980 def WriteMacBundle(self, spec, mac_bundle_depends): |
| 962 assert self.is_mac_bundle | 981 assert self.is_mac_bundle |
| 963 package_framework = spec['type'] in ('shared_library', 'loadable_module') | 982 package_framework = spec['type'] in ('shared_library', 'loadable_module') |
| 964 output = self.ComputeMacBundleOutput() | 983 output = self.ComputeMacBundleOutput() |
| 965 postbuild = self.GetPostbuildCommand(spec, output, self.target.binary, | 984 postbuild = self.GetPostbuildCommand(spec, output, self.target.binary, |
| 966 is_command_start=not package_framework) | 985 is_command_start=not package_framework) |
| (...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1063 | 1082 |
| 1064 default_variables = copy.copy(generator_default_variables) | 1083 default_variables = copy.copy(generator_default_variables) |
| 1065 CalculateVariables(default_variables, {'flavor': self.flavor}) | 1084 CalculateVariables(default_variables, {'flavor': self.flavor}) |
| 1066 | 1085 |
| 1067 # Compute filename prefix: the product prefix, or a default for | 1086 # Compute filename prefix: the product prefix, or a default for |
| 1068 # the product type. | 1087 # the product type. |
| 1069 DEFAULT_PREFIX = { | 1088 DEFAULT_PREFIX = { |
| 1070 'loadable_module': default_variables['SHARED_LIB_PREFIX'], | 1089 'loadable_module': default_variables['SHARED_LIB_PREFIX'], |
| 1071 'shared_library': default_variables['SHARED_LIB_PREFIX'], | 1090 'shared_library': default_variables['SHARED_LIB_PREFIX'], |
| 1072 'static_library': default_variables['STATIC_LIB_PREFIX'], | 1091 'static_library': default_variables['STATIC_LIB_PREFIX'], |
| 1092 'standalone_static_library': default_variables['STATIC_LIB_PREFIX'], |
| 1073 'executable': default_variables['EXECUTABLE_PREFIX'], | 1093 'executable': default_variables['EXECUTABLE_PREFIX'], |
| 1074 } | 1094 } |
| 1075 prefix = spec.get('product_prefix', DEFAULT_PREFIX.get(type, '')) | 1095 prefix = spec.get('product_prefix', DEFAULT_PREFIX.get(type, '')) |
| 1076 | 1096 |
| 1077 # Compute filename extension: the product extension, or a default | 1097 # Compute filename extension: the product extension, or a default |
| 1078 # for the product type. | 1098 # for the product type. |
| 1079 DEFAULT_EXTENSION = { | 1099 DEFAULT_EXTENSION = { |
| 1080 'loadable_module': default_variables['SHARED_LIB_SUFFIX'], | 1100 'loadable_module': default_variables['SHARED_LIB_SUFFIX'], |
| 1081 'shared_library': default_variables['SHARED_LIB_SUFFIX'], | 1101 'shared_library': default_variables['SHARED_LIB_SUFFIX'], |
| 1082 'static_library': default_variables['STATIC_LIB_SUFFIX'], | 1102 'static_library': default_variables['STATIC_LIB_SUFFIX'], |
| 1103 'standalone_static_library': default_variables['STATIC_LIB_SUFFIX'], |
| 1083 'executable': default_variables['EXECUTABLE_SUFFIX'], | 1104 'executable': default_variables['EXECUTABLE_SUFFIX'], |
| 1084 } | 1105 } |
| 1085 extension = spec.get('product_extension') | 1106 extension = spec.get('product_extension') |
| 1086 if extension: | 1107 if extension: |
| 1087 extension = '.' + extension | 1108 extension = '.' + extension |
| 1088 else: | 1109 else: |
| 1089 extension = DEFAULT_EXTENSION.get(type, '') | 1110 extension = DEFAULT_EXTENSION.get(type, '') |
| 1090 | 1111 |
| 1091 if 'product_name' in spec: | 1112 if 'product_name' in spec: |
| 1092 # If we were given an explicit name, use that. | 1113 # If we were given an explicit name, use that. |
| 1093 target = spec['product_name'] | 1114 target = spec['product_name'] |
| 1094 else: | 1115 else: |
| 1095 # Otherwise, derive a name from the target name. | 1116 # Otherwise, derive a name from the target name. |
| 1096 target = spec['target_name'] | 1117 target = spec['target_name'] |
| 1097 if prefix == 'lib': | 1118 if prefix == 'lib': |
| 1098 # Snip out an extra 'lib' from libs if appropriate. | 1119 # Snip out an extra 'lib' from libs if appropriate. |
| 1099 target = StripPrefix(target, 'lib') | 1120 target = StripPrefix(target, 'lib') |
| 1100 | 1121 |
| 1101 if type in ('static_library', 'loadable_module', 'shared_library', | 1122 if type in ('executable', 'loadable_module', 'shared_library', |
| 1102 'executable'): | 1123 'static_library', 'standalone_static_library'): |
| 1103 return '%s%s%s' % (prefix, target, extension) | 1124 return '%s%s%s' % (prefix, target, extension) |
| 1104 elif type == 'none': | 1125 elif type == 'none': |
| 1105 return '%s.stamp' % target | 1126 return '%s.stamp' % target |
| 1106 else: | 1127 else: |
| 1107 raise Exception('Unhandled output type %s' % type) | 1128 raise Exception('Unhandled output type %s' % type) |
| 1108 | 1129 |
| 1109 def ComputeOutput(self, spec, type=None): | 1130 def ComputeOutput(self, spec, type=None): |
| 1110 """Compute the path for the final output of the spec.""" | 1131 """Compute the path for the final output of the spec.""" |
| 1111 assert not self.is_mac_bundle or type | 1132 assert not self.is_mac_bundle or type |
| 1112 | 1133 |
| 1113 if not type: | 1134 if not type: |
| 1114 type = spec['type'] | 1135 type = spec['type'] |
| 1115 | 1136 |
| 1116 if self.flavor == 'win': | 1137 if self.flavor == 'win': |
| 1117 override = self.msvs_settings.GetOutputName(self.config_name, | 1138 override = self.msvs_settings.GetOutputName(self.config_name, |
| 1118 self.ExpandSpecial) | 1139 self.ExpandSpecial) |
| 1119 if override: | 1140 if override: |
| 1120 return override | 1141 return override |
| 1121 | 1142 |
| 1122 if self.flavor == 'mac' and type in ( | 1143 if self.flavor == 'mac' and type in ( |
| 1123 'static_library', 'executable', 'shared_library', 'loadable_module'): | 1144 'executable', 'loadable_module', 'shared_library', 'static_library', |
| 1145 'standalone_static_library'): |
| 1124 filename = self.xcode_settings.GetExecutablePath() | 1146 filename = self.xcode_settings.GetExecutablePath() |
| 1125 else: | 1147 else: |
| 1126 filename = self.ComputeOutputFileName(spec, type) | 1148 filename = self.ComputeOutputFileName(spec, type) |
| 1127 | 1149 |
| 1128 if 'product_dir' in spec: | 1150 if 'product_dir' in spec: |
| 1129 path = os.path.join(spec['product_dir'], filename) | 1151 path = os.path.join(spec['product_dir'], filename) |
| 1130 return self.ExpandSpecial(path) | 1152 return self.ExpandSpecial(path) |
| 1131 | 1153 |
| 1132 # Some products go into the output root, libraries go into shared library | 1154 # Some products go into the output root, libraries go into shared library |
| 1133 # dir, and everything else goes into the normal place. | 1155 # dir, and everything else goes into the normal place. |
| 1134 type_in_output_root = ['executable', 'loadable_module'] | 1156 type_in_output_root = ['executable', 'loadable_module', |
| 1157 'standalone_static_library'] |
| 1135 if self.flavor == 'mac' and self.toolset == 'target': | 1158 if self.flavor == 'mac' and self.toolset == 'target': |
| 1136 type_in_output_root += ['shared_library', 'static_library'] | 1159 type_in_output_root += ['shared_library', 'static_library'] |
| 1137 elif self.flavor == 'win' and self.toolset == 'target': | 1160 elif self.flavor == 'win' and self.toolset == 'target': |
| 1138 type_in_output_root += ['shared_library'] | 1161 type_in_output_root += ['shared_library'] |
| 1139 | 1162 |
| 1140 if type in type_in_output_root: | 1163 if type in type_in_output_root: |
| 1141 return filename | 1164 return filename |
| 1142 elif type == 'shared_library': | 1165 elif type == 'shared_library': |
| 1143 libdir = 'lib' | 1166 libdir = 'lib' |
| 1144 if self.toolset != 'target': | 1167 if self.toolset != 'target': |
| (...skipping 589 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1734 | 1757 |
| 1735 user_config = params.get('generator_flags', {}).get('config', None) | 1758 user_config = params.get('generator_flags', {}).get('config', None) |
| 1736 if user_config: | 1759 if user_config: |
| 1737 GenerateOutputForConfig(target_list, target_dicts, data, params, | 1760 GenerateOutputForConfig(target_list, target_dicts, data, params, |
| 1738 user_config) | 1761 user_config) |
| 1739 else: | 1762 else: |
| 1740 config_names = target_dicts[target_list[0]]['configurations'].keys() | 1763 config_names = target_dicts[target_list[0]]['configurations'].keys() |
| 1741 for config_name in config_names: | 1764 for config_name in config_names: |
| 1742 GenerateOutputForConfig(target_list, target_dicts, data, params, | 1765 GenerateOutputForConfig(target_list, target_dicts, data, params, |
| 1743 config_name) | 1766 config_name) |
| OLD | NEW |