diff --git a/pylib/gyp/MSVSVersion.py b/pylib/gyp/MSVSVersion.py index 71582ccd..6c873b62 100644 --- a/pylib/gyp/MSVSVersion.py +++ b/pylib/gyp/MSVSVersion.py @@ -268,7 +268,7 @@ def _CreateVersion(name, path, sdk_based=False): uses_vcxproj=True, path=path, sdk_based=sdk_based, - default_toolset='v141', + default_toolset='v142', compatible_sdks=['v8.1', 'v10.0']), '2017': VisualStudioVersion('2017', 'Visual Studio 2017', @@ -409,10 +409,18 @@ def _DetectVisualStudioVersions(versions_to_check, force_express): '11.0': '2012', '12.0': '2013', '14.0': '2015', - '15.0': '2017' + '15.0': '2017', + '16.0': '2019' } + shell_path = os.environ.get('VSINSTALLDIR') + shell_path = _ConvertToCygpath(shell_path) if shell_path else None + shell_version = os.environ.get('VisualStudioVersion') if shell_path else None versions = [] for version in versions_to_check: + if version == shell_version: + if os.path.exists(shell_path): + versions.append(_CreateVersion(version_to_year[version], shell_path)) + # Old method of searching for which VS version is installed # We don't use the 2010-encouraged-way because we also want to get the # path to the binaries, which it doesn't offer. @@ -470,7 +478,7 @@ def SelectVisualStudioVersion(version='auto', allow_fallback=True): if version == 'auto': version = os.environ.get('GYP_MSVS_VERSION', 'auto') version_map = { - 'auto': ('15.0', '14.0', '12.0', '10.0', '9.0', '8.0', '11.0'), + 'auto': ('16.0', '15.0', '14.0', '12.0', '10.0', '9.0', '8.0', '11.0'), '2005': ('8.0',), '2005e': ('8.0',), '2008': ('9.0',), @@ -483,6 +491,7 @@ def SelectVisualStudioVersion(version='auto', allow_fallback=True): '2013e': ('12.0',), '2015': ('14.0',), '2017': ('15.0',), + '2019': ('16.0',), } override_path = os.environ.get('GYP_MSVS_OVERRIDE_PATH') if override_path: diff --git a/pylib/gyp/generator/cmake.py b/pylib/gyp/generator/cmake.py index 4a2041cf..e5333926 100644 --- a/pylib/gyp/generator/cmake.py +++ b/pylib/gyp/generator/cmake.py @@ -1078,6 +1078,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') @@ -1120,6 +1137,8 @@ def GenerateOutputForConfig(target_list, target_dicts, data, SetVariable(output, 'configuration', config_to_use) ar = None + ranlib = None + nm = None cc = None cxx = None @@ -1129,17 +1148,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 8bc22bed..24bee427 100644 --- a/pylib/gyp/generator/xcode.py +++ b/pylib/gyp/generator/xcode.py @@ -74,6 +74,12 @@ generator_additional_non_configuration_keys = [ 'ios_app_extension', 'ios_watch_app', 'ios_watchkit_extension', + + 'mac_sandbox', # sandbox support + 'mac_sandbox_development_team', + + 'mac_hardened_runtime', # hardened runtime support + 'mac_bundle', 'mac_bundle_resources', 'mac_framework_headers', @@ -774,6 +780,39 @@ def GenerateOutput(target_list, target_dicts, data, params): xcode_targets[qualified_target] = xct xcode_target_to_target_dict[xct] = spec + # sandbox and hardened runtime support + is_sandbox = int(spec.get('mac_sandbox', 0)) + is_hardened_runtime = int(spec.get('mac_hardened_runtime', 0)) + if is_sandbox or is_hardened_runtime: + try: + tmp = pbxp._properties['attributes']['TargetAttributes'] + except KeyError: + pbxp._properties['attributes']['TargetAttributes'] = {} + try: + tmp = pbxp._properties['attributes']['TargetAttributes'][xct] + except KeyError: + pbxp._properties['attributes']['TargetAttributes'][xct] = {} + try: + tmp = pbxp._properties['attributes']['TargetAttributes'][xct]['SystemCapabilities'] + except KeyError: + pbxp._properties['attributes']['TargetAttributes'][xct]['SystemCapabilities'] = {} + + 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) + pbxp._properties['attributes']['TargetAttributes'][xct]['DevelopmentTeam'] = dev_team + pbxp._properties['attributes']['TargetAttributes'][xct]['SystemCapabilities']['com.apple.Sandbox'] = { + 'enabled': 1, + } + + # hardened runtime support + if is_hardened_runtime: + pbxp._properties['attributes']['TargetAttributes'][xct]['SystemCapabilities']['com.apple.HardenedRuntime'] = { + 'enabled': 1, + } + spec_actions = spec.get('actions', []) spec_rules = spec.get('rules', []) @@ -1132,7 +1171,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', []):