| # Copyright (c) 2016 Ben Noordhuis <info@bnoordhuis.nl>. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| import gyp.common |
| import gyp.xcode_emulation |
| import json |
| import os |
| |
| generator_additional_non_configuration_keys = [] |
| generator_additional_path_sections = [] |
| generator_extra_sources_for_rules = [] |
| generator_filelist_paths = None |
| generator_supports_multiple_toolsets = True |
| generator_wants_sorted_dependencies = False |
| |
| # Lifted from make.py. The actual values don't matter much. |
| generator_default_variables = { |
| 'CONFIGURATION_NAME': '$(BUILDTYPE)', |
| 'EXECUTABLE_PREFIX': '', |
| 'EXECUTABLE_SUFFIX': '', |
| 'INTERMEDIATE_DIR': '$(obj).$(TOOLSET)/$(TARGET)/geni', |
| 'PRODUCT_DIR': '$(builddir)', |
| 'RULE_INPUT_DIRNAME': '%(INPUT_DIRNAME)s', |
| 'RULE_INPUT_EXT': '$(suffix $<)', |
| 'RULE_INPUT_NAME': '$(notdir $<)', |
| 'RULE_INPUT_PATH': '$(abspath $<)', |
| 'RULE_INPUT_ROOT': '%(INPUT_ROOT)s', |
| 'SHARED_INTERMEDIATE_DIR': '$(obj)/gen', |
| 'SHARED_LIB_PREFIX': 'lib', |
| 'STATIC_LIB_PREFIX': 'lib', |
| 'STATIC_LIB_SUFFIX': '.a', |
| } |
| |
| |
| def IsMac(params): |
| return 'mac' == gyp.common.GetFlavor(params) |
| |
| |
| def CalculateVariables(default_variables, params): |
| default_variables.setdefault('OS', gyp.common.GetFlavor(params)) |
| |
| |
| def AddCommandsForTarget(cwd, target, params, per_config_commands): |
| output_dir = params['generator_flags']['output_dir'] |
| for configuration_name, configuration in target['configurations'].iteritems(): |
| builddir_name = os.path.join(output_dir, configuration_name) |
| |
| if IsMac(params): |
| xcode_settings = gyp.xcode_emulation.XcodeSettings(target) |
| cflags = xcode_settings.GetCflags(configuration_name) |
| cflags_c = xcode_settings.GetCflagsC(configuration_name) |
| cflags_cc = xcode_settings.GetCflagsCC(configuration_name) |
| else: |
| cflags = configuration.get('cflags', []) |
| cflags_c = configuration.get('cflags_c', []) |
| cflags_cc = configuration.get('cflags_cc', []) |
| |
| cflags_c = cflags + cflags_c |
| cflags_cc = cflags + cflags_cc |
| |
| defines = configuration.get('defines', []) |
| defines = ['-D' + s for s in defines] |
| |
| # TODO(bnoordhuis) Handle generated source files. |
| sources = target.get('sources', []) |
| sources = [s for s in sources if s.endswith('.c') or s.endswith('.cc')] |
| |
| def resolve(filename): |
| return os.path.abspath(os.path.join(cwd, filename)) |
| |
| # TODO(bnoordhuis) Handle generated header files. |
| include_dirs = configuration.get('include_dirs', []) |
| include_dirs = [s for s in include_dirs if not s.startswith('$(obj)')] |
| includes = ['-I' + resolve(s) for s in include_dirs] |
| |
| defines = gyp.common.EncodePOSIXShellList(defines) |
| includes = gyp.common.EncodePOSIXShellList(includes) |
| cflags_c = gyp.common.EncodePOSIXShellList(cflags_c) |
| cflags_cc = gyp.common.EncodePOSIXShellList(cflags_cc) |
| |
| commands = per_config_commands.setdefault(configuration_name, []) |
| for source in sources: |
| file = resolve(source) |
| isc = source.endswith('.c') |
| cc = 'cc' if isc else 'c++' |
| cflags = cflags_c if isc else cflags_cc |
| command = ' '.join((cc, defines, includes, cflags, |
| '-c', gyp.common.EncodePOSIXShellArgument(file))) |
| commands.append(dict(command=command, directory=output_dir, file=file)) |
| |
| |
| def GenerateOutput(target_list, target_dicts, data, params): |
| per_config_commands = {} |
| for qualified_target, target in target_dicts.iteritems(): |
| build_file, target_name, toolset = ( |
| gyp.common.ParseQualifiedTarget(qualified_target)) |
| if IsMac(params): |
| settings = data[build_file] |
| gyp.xcode_emulation.MergeGlobalXcodeSettingsToSpec(settings, target) |
| cwd = os.path.dirname(build_file) |
| AddCommandsForTarget(cwd, target, params, per_config_commands) |
| |
| output_dir = params['generator_flags']['output_dir'] |
| for configuration_name, commands in per_config_commands.iteritems(): |
| filename = os.path.join(output_dir, |
| configuration_name, |
| 'compile_commands.json') |
| gyp.common.EnsureDirExists(filename) |
| fp = open(filename, 'w') |
| json.dump(commands, fp=fp, indent=0, check_circular=False) |
| |
| |
| def PerformBuild(data, configurations, params): |
| pass |