15
15
import re
16
16
import shlex
17
17
18
- from gyp .common import GypError , GetStdout , TopologicallySorted , EncodePOSIXShellList , CycleError
18
+ from gyp .common import GypError , TopologicallySorted , EncodePOSIXShellList , CycleError , memoize
19
19
import XCodeDetect
20
20
21
- # Populated lazily by XCodeDetect.Version, for efficiency, and to fix an issue when
22
- # "xcodebuild" is called too quickly (it has been found to return incorrect
23
- # version number).
24
- XCODE_VERSION_CACHE = None
25
-
26
- # Populated lazily by GetXcodeArchsDefault, to an |XcodeArchsDefault| instance
27
- # corresponding to the installed version of Xcode.
28
- XCODE_ARCHS_DEFAULT_CACHE = None
29
-
30
-
31
- def XcodeArchsVariableMapping (archs , archs_including_64_bit = None ):
32
- """Constructs a dictionary with expansion for $(ARCHS_STANDARD) variable,
33
- and optionally for $(ARCHS_STANDARD_INCLUDING_64_BIT)."""
34
- mapping = {'$(ARCHS_STANDARD)' : archs }
35
- if archs_including_64_bit :
36
- mapping ['$(ARCHS_STANDARD_INCLUDING_64_BIT)' ] = archs_including_64_bit
37
- return mapping
38
-
39
-
40
- class XcodeArchsDefault (object ):
41
- """A class to resolve ARCHS variable from xcode_settings, resolving Xcode
42
- macros and implementing filtering by VALID_ARCHS. The expansion of macros
43
- depends on the SDKROOT used ("macosx", "iphoneos", "iphonesimulator") and
44
- on the version of Xcode.
45
- """
46
-
47
- # Match variable like $(ARCHS_STANDARD).
48
- variable_pattern = re .compile (r'\$\([a-zA-Z_][a-zA-Z0-9_]*\)$' )
49
-
50
- def __init__ (self , default , mac , iphonesimulator , iphoneos ):
51
- self ._default = (default ,)
52
- self ._archs = {'mac' : mac , 'ios' : iphoneos , 'iossim' : iphonesimulator }
53
-
54
- def _VariableMapping (self , sdkroot ):
55
- """Returns the dictionary of variable mapping depending on the SDKROOT."""
56
- sdkroot = sdkroot .lower ()
57
- if 'iphoneos' in sdkroot :
58
- return self ._archs ['ios' ]
59
- elif 'iphonesimulator' in sdkroot :
60
- return self ._archs ['iossim' ]
61
- else :
62
- return self ._archs ['mac' ]
63
-
64
- def _ExpandArchs (self , archs , sdkroot ):
65
- """Expands variables references in ARCHS, and remove duplicates."""
66
- variable_mapping = self ._VariableMapping (sdkroot )
67
- expanded_archs = []
68
- for arch in archs :
69
- if self .variable_pattern .match (arch ):
70
- variable = arch
71
- try :
72
- variable_expansion = variable_mapping [variable ]
73
- for arch2 in variable_expansion :
74
- if arch2 not in expanded_archs :
75
- expanded_archs .append (arch2 )
76
- except KeyError as e :
77
- print ('Warning: Ignoring unsupported variable "%s".' % variable )
78
- print (e )
79
- elif arch not in expanded_archs :
80
- expanded_archs .append (arch )
81
- return expanded_archs
82
-
83
- def ActiveArchs (self , archs , valid_archs , sdkroot ):
84
- """Expands variables references in ARCHS, and filter by VALID_ARCHS if it
85
- is defined (if not set, Xcode accept any value in ARCHS, otherwise, only
86
- values present in VALID_ARCHS are kept)."""
87
- expanded_archs = self ._ExpandArchs (archs or self ._default , sdkroot or '' )
88
- if valid_archs :
89
- filtered_archs = []
90
- for arch in expanded_archs :
91
- if arch in valid_archs :
92
- filtered_archs .append (arch )
93
- expanded_archs = filtered_archs
94
- return expanded_archs
95
-
96
21
22
+ @memoize
97
23
def GetXcodeArchsDefault ():
98
24
"""Returns the |XcodeArchsDefault| object to use to expand ARCHS for the
99
25
installed version of Xcode. The default values used by Xcode for ARCHS
@@ -114,9 +40,71 @@ def GetXcodeArchsDefault():
114
40
All thoses rules are coded in the construction of the |XcodeArchsDefault|
115
41
object to use depending on the version of Xcode detected. The object is
116
42
for performance reason."""
117
- global XCODE_ARCHS_DEFAULT_CACHE
118
- if XCODE_ARCHS_DEFAULT_CACHE :
119
- return XCODE_ARCHS_DEFAULT_CACHE
43
+
44
+ class XcodeArchsDefault (object ):
45
+ """A class to resolve ARCHS variable from xcode_settings, resolving Xcode
46
+ macros and implementing filtering by VALID_ARCHS. The expansion of macros
47
+ depends on the SDKROOT used ("macosx", "iphoneos", "iphonesimulator") and
48
+ on the version of Xcode.
49
+ """
50
+
51
+ # Match variable like $(ARCHS_STANDARD).
52
+ variable_pattern = re .compile (r'\$\([a-zA-Z_][a-zA-Z0-9_]*\)$' )
53
+
54
+ def __init__ (self , default , mac , iphonesimulator , iphoneos ):
55
+ self ._default = (default ,)
56
+ self ._archs = {'mac' : mac , 'ios' : iphoneos , 'iossim' : iphonesimulator }
57
+
58
+ def _VariableMapping (self , sdkroot ):
59
+ """Returns the dictionary of variable mapping depending on the SDKROOT."""
60
+ sdkroot = sdkroot .lower ()
61
+ if 'iphoneos' in sdkroot :
62
+ return self ._archs ['ios' ]
63
+ elif 'iphonesimulator' in sdkroot :
64
+ return self ._archs ['iossim' ]
65
+ else :
66
+ return self ._archs ['mac' ]
67
+
68
+ def _ExpandArchs (self , archs , sdkroot ):
69
+ """Expands variables references in ARCHS, and remove duplicates."""
70
+ variable_mapping = self ._VariableMapping (sdkroot )
71
+ expanded_archs = []
72
+ for arch in archs :
73
+ if self .variable_pattern .match (arch ):
74
+ variable = arch
75
+ try :
76
+ variable_expansion = variable_mapping [variable ]
77
+ for arch2 in variable_expansion :
78
+ if arch2 not in expanded_archs :
79
+ expanded_archs .append (arch2 )
80
+ except KeyError as e :
81
+ print ('Warning: Ignoring unsupported variable "%s".' % variable )
82
+ print (e )
83
+ elif arch not in expanded_archs :
84
+ expanded_archs .append (arch )
85
+ return expanded_archs
86
+
87
+ def ActiveArchs (self , archs , valid_archs , sdkroot ):
88
+ """Expands variables references in ARCHS, and filter by VALID_ARCHS if it
89
+ is defined (if not set, Xcode accept any value in ARCHS, otherwise, only
90
+ values present in VALID_ARCHS are kept)."""
91
+ expanded_archs = self ._ExpandArchs (archs or self ._default , sdkroot or '' )
92
+ if valid_archs :
93
+ filtered_archs = []
94
+ for arch in expanded_archs :
95
+ if arch in valid_archs :
96
+ filtered_archs .append (arch )
97
+ expanded_archs = filtered_archs
98
+ return expanded_archs
99
+
100
+ def XcodeArchsVariableMapping (archs , archs_including_64_bit = None ):
101
+ """Constructs a dictionary with expansion for $(ARCHS_STANDARD) variable,
102
+ and optionally for $(ARCHS_STANDARD_INCLUDING_64_BIT)."""
103
+ mapping = {'$(ARCHS_STANDARD)' : archs }
104
+ if archs_including_64_bit :
105
+ mapping ['$(ARCHS_STANDARD_INCLUDING_64_BIT)' ] = archs_including_64_bit
106
+ return mapping
107
+
120
108
xcode_version = XCodeDetect .Version ()
121
109
if xcode_version < '0500' :
122
110
XCODE_ARCHS_DEFAULT_CACHE = XcodeArchsDefault (
@@ -175,48 +163,14 @@ def _MapLinkerFlagFilename(ldflag, gyp_to_build_path):
175
163
regex = re .compile ('(?:-Wl,)?' + '[ ,]' .join (flag_pattern ))
176
164
m = regex .match (ldflag )
177
165
if m :
178
- ldflag = ldflag [:m .start (1 )] + gyp_to_build_path (m .group (1 )) + \
179
- ldflag [m .end (1 ):]
166
+ ldflag = ldflag [:m .start (1 )] + gyp_to_build_path (m .group (1 )) + ldflag [m .end (1 ):]
180
167
# Required for ffmpeg (no idea why they don't use LIBRARY_SEARCH_PATHS,
181
168
# TODO(thakis): Update ffmpeg.gyp):
182
169
if ldflag .startswith ('-L' ):
183
170
ldflag = '-L' + gyp_to_build_path (ldflag [len ('-L' ):])
184
171
return ldflag
185
172
186
173
187
- def _BuildMachineOSBuild ():
188
- return GetStdout (['sw_vers' , '-buildVersion' ])
189
-
190
-
191
- def _DefaultSdkRoot ():
192
- """Returns the default SDKROOT to use.
193
-
194
- Prior to version 5.0.0, if SDKROOT was not explicitly set in the Xcode
195
- project, then the environment variable was empty. Starting with this
196
- version, Xcode uses the name of the newest SDK installed.
197
- """
198
- xcode_version = XCodeDetect .Version ()
199
- if xcode_version < '0500' :
200
- return ''
201
- default_sdk_path = XCodeDetect .GetSdkVersionInfoItem ('' , '--show-sdk-path' )
202
- default_sdk_root = XcodeSettings ._sdk_root_cache .get (default_sdk_path )
203
- if default_sdk_root :
204
- return default_sdk_root
205
- try :
206
- all_sdks = GetStdout (['xcodebuild' , '-showsdks' ])
207
- except :
208
- # If xcodebuild fails, there will be no valid SDKs
209
- return ''
210
- for line in all_sdks .splitlines ():
211
- items = line .split ()
212
- if len (items ) >= 3 and items [- 2 ] == '-sdk' :
213
- sdk_root = items [- 1 ]
214
- sdk_path = XCodeDetect .GetSdkVersionInfoItem (sdk_root , '--show-sdk-path' )
215
- if sdk_path == default_sdk_path :
216
- return sdk_root
217
- return ''
218
-
219
-
220
174
class XcodeSettings (object ):
221
175
"""A class that understands the gyp 'xcode_settings' object."""
222
176
@@ -1175,7 +1129,7 @@ def GetExtraPlistItems(self, configname=None):
1175
1129
if configname not in XcodeSettings ._plist_cache :
1176
1130
xcode = XCodeDetect .Version ()
1177
1131
cache = {
1178
- 'BuildMachineOSBuild' : _BuildMachineOSBuild (),
1132
+ 'BuildMachineOSBuild' : XCodeDetect . BuildMachineOSBuild (),
1179
1133
'DTXcode' : xcode
1180
1134
}
1181
1135
compiler = self .xcode_settings [configname ].get ('GCC_VERSION' )
@@ -1184,7 +1138,7 @@ def GetExtraPlistItems(self, configname=None):
1184
1138
1185
1139
sdk_root = self ._SdkRoot (configname )
1186
1140
if not sdk_root :
1187
- sdk_root = _DefaultSdkRoot ( )
1141
+ sdk_root = XCodeDetect . GetSdkVersionInfoItem ( 'macosx' , '--show-sdk-path' )
1188
1142
sdk_version = XCodeDetect .GetSdkVersionInfoItem (sdk_root , '--show-sdk-version' )
1189
1143
cache ['DTSDKName' ] = sdk_root + (sdk_version or '' )
1190
1144
if xcode >= '0720' :
@@ -1322,30 +1276,6 @@ def GetPchBuildCommands(self, arch=None):
1322
1276
]
1323
1277
1324
1278
1325
- # This function ported from the logic in Homebrew's CLT version check
1326
- def CLTVersion ():
1327
- """Returns the version of command-line tools from pkgutil."""
1328
- # pkgutil output looks like
1329
- # package-id: com.apple.pkg.CLTools_Executables
1330
- # version: 5.0.1.0.1.1382131676
1331
- # volume: /
1332
- # location: /
1333
- # install-time: 1382544035
1334
- # groups: com.apple.FindSystemFiles.pkg-group com.apple.DevToolsBoth.pkg-group com.apple.DevToolsNonRelocatableShared.pkg-group
1335
- STANDALONE_PKG_ID = "com.apple.pkg.DeveloperToolsCLILeo"
1336
- FROM_XCODE_PKG_ID = "com.apple.pkg.DeveloperToolsCLI"
1337
- MAVERICKS_PKG_ID = "com.apple.pkg.CLTools_Executables"
1338
-
1339
- regex = re .compile ('version: (?P<version>.+)' )
1340
- for key in [MAVERICKS_PKG_ID , STANDALONE_PKG_ID , FROM_XCODE_PKG_ID ]:
1341
- # noinspection PyBroadException
1342
- try :
1343
- output = GetStdout (['/usr/sbin/pkgutil' , '--pkg-info' , key ])
1344
- return re .search (regex , output ).groupdict ()['version' ]
1345
- except Exception :
1346
- pass
1347
-
1348
-
1349
1279
def MergeGlobalXcodeSettingsToSpec (global_dict , spec ):
1350
1280
"""Merges the global xcode_settings dictionary into each configuration of the
1351
1281
target represented by spec. For keys that are both in the global and the local
0 commit comments