Some unbelievable crashes happen in MTP codegen-ed serialization if the binary is using -flto with MTP in non-flto static library. To build and link static libraries with -flto additional GYP patch is required, so that ar/ranlib/nm use gcc- wrappers.
		
			
				
	
	
		
			117 lines
		
	
	
	
		
			4.2 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			117 lines
		
	
	
	
		
			4.2 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
diff --git a/pylib/gyp/generator/cmake.py b/pylib/gyp/generator/cmake.py
 | 
						|
index a2b9629..ac59461 100644
 | 
						|
--- a/pylib/gyp/generator/cmake.py
 | 
						|
+++ b/pylib/gyp/generator/cmake.py
 | 
						|
@@ -1070,6 +1070,23 @@ def WriteTarget(namer, qualified_target, target_dicts, build_dir, config_to_use,
 | 
						|
 
 | 
						|
       output.write(')\n')
 | 
						|
 
 | 
						|
+  # Precompile header
 | 
						|
+  precompiled_header = config.get('cmake_precompiled_header', '')
 | 
						|
+  if precompiled_header:
 | 
						|
+    precompiled_header_script = config.get('cmake_precompiled_header_script', '')
 | 
						|
+    if not precompiled_header_script:
 | 
						|
+      print ('ERROR: cmake_precompiled_header requires cmake_precompiled_header_script')
 | 
						|
+    cmake_precompiled_header = NormjoinPath(path_from_cmakelists_to_gyp, precompiled_header)
 | 
						|
+    cmake_precompiled_header_script = NormjoinPathForceCMakeSource(path_from_cmakelists_to_gyp, precompiled_header_script)
 | 
						|
+    output.write('include(')
 | 
						|
+    output.write(cmake_precompiled_header_script)
 | 
						|
+    output.write(')\n')
 | 
						|
+    output.write('add_precompiled_header(')
 | 
						|
+    output.write(cmake_target_name)
 | 
						|
+    output.write(' ')
 | 
						|
+    output.write(cmake_precompiled_header)
 | 
						|
+    output.write(')\n')
 | 
						|
+
 | 
						|
   UnsetVariable(output, 'TOOLSET')
 | 
						|
   UnsetVariable(output, 'TARGET')
 | 
						|
 
 | 
						|
@@ -1112,6 +1129,8 @@ def GenerateOutputForConfig(target_list, target_dicts, data,
 | 
						|
   SetVariable(output, 'configuration', config_to_use)
 | 
						|
 
 | 
						|
   ar = None
 | 
						|
+  ranlib = None
 | 
						|
+  nm = None
 | 
						|
   cc = None
 | 
						|
   cxx = None
 | 
						|
 
 | 
						|
@@ -1121,17 +1140,27 @@ def GenerateOutputForConfig(target_list, target_dicts, data,
 | 
						|
   for key, value in make_global_settings:
 | 
						|
     if key == 'AR':
 | 
						|
       ar = os.path.join(build_to_top, value)
 | 
						|
+    if key == 'RANLIB':
 | 
						|
+      ranlib = os.path.join(build_to_top, value)
 | 
						|
+    if key == 'NM':
 | 
						|
+      nm = os.path.join(build_to_top, value)
 | 
						|
     if key == 'CC':
 | 
						|
       cc = os.path.join(build_to_top, value)
 | 
						|
     if key == 'CXX':
 | 
						|
       cxx = os.path.join(build_to_top, value)
 | 
						|
 
 | 
						|
   ar = gyp.common.GetEnvironFallback(['AR_target', 'AR'], ar)
 | 
						|
+  ranlib = gyp.common.GetEnvironFallback(['RANLIB_target', 'RANLIB'], ranlib)
 | 
						|
+  nm = gyp.common.GetEnvironFallback(['NM_target', 'NM'], nm)
 | 
						|
   cc = gyp.common.GetEnvironFallback(['CC_target', 'CC'], cc)
 | 
						|
   cxx = gyp.common.GetEnvironFallback(['CXX_target', 'CXX'], cxx)
 | 
						|
 
 | 
						|
   if ar:
 | 
						|
     SetVariable(output, 'CMAKE_AR', ar)
 | 
						|
+  if ranlib:
 | 
						|
+    SetVariable(output, 'CMAKE_RANLIB', ranlib)
 | 
						|
+  if nm:
 | 
						|
+    SetVariable(output, 'CMAKE_NM', nm)
 | 
						|
   if cc:
 | 
						|
     SetVariable(output, 'CMAKE_C_COMPILER', cc)
 | 
						|
   if cxx:
 | 
						|
diff --git a/pylib/gyp/generator/xcode.py b/pylib/gyp/generator/xcode.py
 | 
						|
index db99d6a..8d56baf 100644
 | 
						|
--- a/pylib/gyp/generator/xcode.py
 | 
						|
+++ b/pylib/gyp/generator/xcode.py
 | 
						|
@@ -72,6 +72,10 @@ generator_additional_non_configuration_keys = [
 | 
						|
   'ios_app_extension',
 | 
						|
   'ios_watch_app',
 | 
						|
   'ios_watchkit_extension',
 | 
						|
+
 | 
						|
+  'mac_sandbox', # sandbox support
 | 
						|
+  'mac_sandbox_development_team',
 | 
						|
+
 | 
						|
   'mac_bundle',
 | 
						|
   'mac_bundle_resources',
 | 
						|
   'mac_framework_headers',
 | 
						|
@@ -772,6 +776,26 @@ def GenerateOutput(target_list, target_dicts, data, params):
 | 
						|
     xcode_targets[qualified_target] = xct
 | 
						|
     xcode_target_to_target_dict[xct] = spec
 | 
						|
 
 | 
						|
+    # sandbox support
 | 
						|
+    is_sandbox = int(spec.get('mac_sandbox', 0))
 | 
						|
+    if is_sandbox:
 | 
						|
+      dev_team = spec.get('mac_sandbox_development_team', '%%ERROR%%')
 | 
						|
+      assert dev_team != '%%ERROR%%', (
 | 
						|
+          'mac_sandbox must be accompanied by mac_sandbox_development_team (target "%s")' %
 | 
						|
+          target_name)
 | 
						|
+      try:
 | 
						|
+        tmp =  pbxp._properties['attributes']['TargetAttributes']
 | 
						|
+      except KeyError:
 | 
						|
+        pbxp._properties['attributes']['TargetAttributes'] = {}
 | 
						|
+      pbxp._properties['attributes']['TargetAttributes'][xct] = {
 | 
						|
+        'DevelopmentTeam': dev_team,
 | 
						|
+        'SystemCapabilities': {
 | 
						|
+          'com.apple.Sandbox': {
 | 
						|
+            'enabled': 1,
 | 
						|
+          },
 | 
						|
+        },
 | 
						|
+      }
 | 
						|
+
 | 
						|
     spec_actions = spec.get('actions', [])
 | 
						|
     spec_rules = spec.get('rules', [])
 | 
						|
 
 | 
						|
@@ -1141,7 +1165,8 @@ exit 1
 | 
						|
         groups = [x for x in groups if not x.endswith('_excluded')]
 | 
						|
       for group in groups:
 | 
						|
         for item in rule.get(group, []):
 | 
						|
-          pbxp.AddOrGetFileInRootGroup(item)
 | 
						|
+          concrete_item = ExpandXcodeVariables(item, rule_input_dict)
 | 
						|
+          pbxp.AddOrGetFileInRootGroup(concrete_item)
 | 
						|
 
 | 
						|
     # Add "sources".
 | 
						|
     for source in spec.get('sources', []):
 |