125bb94a194859e03fb9a7be8e34294c412d97db9scottmg@chromium.org# Copyright (c) 2012 Google Inc. All rights reserved.
26d8d580da0b6bcedf646b1b4fbc6e580d0254ff9evan@chromium.org# Use of this source code is governed by a BSD-style license that can be
36d8d580da0b6bcedf646b1b4fbc6e580d0254ff9evan@chromium.org# found in the LICENSE file.
46d8d580da0b6bcedf646b1b4fbc6e580d0254ff9evan@chromium.org
56d8d580da0b6bcedf646b1b4fbc6e580d0254ff9evan@chromium.orgimport collections
625bb94a194859e03fb9a7be8e34294c412d97db9scottmg@chromium.orgimport os
76d8d580da0b6bcedf646b1b4fbc6e580d0254ff9evan@chromium.orgimport gyp
86d8d580da0b6bcedf646b1b4fbc6e580d0254ff9evan@chromium.orgimport gyp.common
925bb94a194859e03fb9a7be8e34294c412d97db9scottmg@chromium.orgimport gyp.msvs_emulation
106d8d580da0b6bcedf646b1b4fbc6e580d0254ff9evan@chromium.orgimport json
113e35424d0f99be22e6de6eb3e2c4a60254ee9167thakis@chromium.orgimport sys
126d8d580da0b6bcedf646b1b4fbc6e580d0254ff9evan@chromium.org
13de68fc77635d5aff76e52ca8255f7f4e16847116thakis@chromium.orggenerator_supports_multiple_toolsets = True
14de68fc77635d5aff76e52ca8255f7f4e16847116thakis@chromium.org
156d8d580da0b6bcedf646b1b4fbc6e580d0254ff9evan@chromium.orggenerator_wants_static_library_dependencies_adjusted = False
166d8d580da0b6bcedf646b1b4fbc6e580d0254ff9evan@chromium.org
176d8d580da0b6bcedf646b1b4fbc6e580d0254ff9evan@chromium.orggenerator_default_variables = {
186d8d580da0b6bcedf646b1b4fbc6e580d0254ff9evan@chromium.org}
196d8d580da0b6bcedf646b1b4fbc6e580d0254ff9evan@chromium.orgfor dirname in ['INTERMEDIATE_DIR', 'SHARED_INTERMEDIATE_DIR', 'PRODUCT_DIR',
206d8d580da0b6bcedf646b1b4fbc6e580d0254ff9evan@chromium.org                'LIB_DIR', 'SHARED_LIB_DIR']:
216d8d580da0b6bcedf646b1b4fbc6e580d0254ff9evan@chromium.org  # Some gyp steps fail if these are empty(!).
226d8d580da0b6bcedf646b1b4fbc6e580d0254ff9evan@chromium.org  generator_default_variables[dirname] = 'dir'
236d8d580da0b6bcedf646b1b4fbc6e580d0254ff9evan@chromium.orgfor unused in ['RULE_INPUT_PATH', 'RULE_INPUT_ROOT', 'RULE_INPUT_NAME',
243e35424d0f99be22e6de6eb3e2c4a60254ee9167thakis@chromium.org               'RULE_INPUT_DIRNAME', 'RULE_INPUT_EXT',
256d8d580da0b6bcedf646b1b4fbc6e580d0254ff9evan@chromium.org               'EXECUTABLE_PREFIX', 'EXECUTABLE_SUFFIX',
266d8d580da0b6bcedf646b1b4fbc6e580d0254ff9evan@chromium.org               'STATIC_LIB_PREFIX', 'STATIC_LIB_SUFFIX',
2720568c84a371274c21a763a5680bad0b9bea081atorne@chromium.org               'SHARED_LIB_PREFIX', 'SHARED_LIB_SUFFIX',
2820568c84a371274c21a763a5680bad0b9bea081atorne@chromium.org               'CONFIGURATION_NAME']:
296d8d580da0b6bcedf646b1b4fbc6e580d0254ff9evan@chromium.org  generator_default_variables[unused] = ''
306d8d580da0b6bcedf646b1b4fbc6e580d0254ff9evan@chromium.org
316d8d580da0b6bcedf646b1b4fbc6e580d0254ff9evan@chromium.org
326d8d580da0b6bcedf646b1b4fbc6e580d0254ff9evan@chromium.orgdef CalculateVariables(default_variables, params):
336d8d580da0b6bcedf646b1b4fbc6e580d0254ff9evan@chromium.org  generator_flags = params.get('generator_flags', {})
34315c6d71c86e47204686753a91c10693b0e17d9cthakis@chromium.org  for key, val in generator_flags.items():
35315c6d71c86e47204686753a91c10693b0e17d9cthakis@chromium.org    default_variables.setdefault(key, val)
36315c6d71c86e47204686753a91c10693b0e17d9cthakis@chromium.org  default_variables.setdefault('OS', gyp.common.GetFlavor(params))
376d8d580da0b6bcedf646b1b4fbc6e580d0254ff9evan@chromium.org
3825bb94a194859e03fb9a7be8e34294c412d97db9scottmg@chromium.org  flavor = gyp.common.GetFlavor(params)
3925bb94a194859e03fb9a7be8e34294c412d97db9scottmg@chromium.org  if flavor =='win':
4025bb94a194859e03fb9a7be8e34294c412d97db9scottmg@chromium.org    # Copy additional generator configuration data from VS, which is shared
4125bb94a194859e03fb9a7be8e34294c412d97db9scottmg@chromium.org    # by the Windows Ninja generator.
4225bb94a194859e03fb9a7be8e34294c412d97db9scottmg@chromium.org    import gyp.generator.msvs as msvs_generator
4325bb94a194859e03fb9a7be8e34294c412d97db9scottmg@chromium.org    generator_additional_non_configuration_keys = getattr(msvs_generator,
4425bb94a194859e03fb9a7be8e34294c412d97db9scottmg@chromium.org        'generator_additional_non_configuration_keys', [])
4525bb94a194859e03fb9a7be8e34294c412d97db9scottmg@chromium.org    generator_additional_path_sections = getattr(msvs_generator,
4625bb94a194859e03fb9a7be8e34294c412d97db9scottmg@chromium.org        'generator_additional_path_sections', [])
4725bb94a194859e03fb9a7be8e34294c412d97db9scottmg@chromium.org
48d298d5f26cc170b170ccb42a913dddb401581e27scottmg@chromium.org    gyp.msvs_emulation.CalculateCommonVariables(default_variables, params)
4925bb94a194859e03fb9a7be8e34294c412d97db9scottmg@chromium.org
506d8d580da0b6bcedf646b1b4fbc6e580d0254ff9evan@chromium.org
5136504c0ed15cf167c2fff375b7e0ee663c6f2076thakis@chromium.orgdef CalculateGeneratorInputInfo(params):
5236504c0ed15cf167c2fff375b7e0ee663c6f2076thakis@chromium.org  """Calculate the generator specific info that gets fed to input (called by
5336504c0ed15cf167c2fff375b7e0ee663c6f2076thakis@chromium.org  gyp)."""
5436504c0ed15cf167c2fff375b7e0ee663c6f2076thakis@chromium.org  generator_flags = params.get('generator_flags', {})
5536504c0ed15cf167c2fff375b7e0ee663c6f2076thakis@chromium.org  if generator_flags.get('adjust_static_libraries', False):
5636504c0ed15cf167c2fff375b7e0ee663c6f2076thakis@chromium.org    global generator_wants_static_library_dependencies_adjusted
5736504c0ed15cf167c2fff375b7e0ee663c6f2076thakis@chromium.org    generator_wants_static_library_dependencies_adjusted = True
5836504c0ed15cf167c2fff375b7e0ee663c6f2076thakis@chromium.org
5936504c0ed15cf167c2fff375b7e0ee663c6f2076thakis@chromium.org
606d8d580da0b6bcedf646b1b4fbc6e580d0254ff9evan@chromium.orgdef GenerateOutput(target_list, target_dicts, data, params):
616d8d580da0b6bcedf646b1b4fbc6e580d0254ff9evan@chromium.org  # Map of target -> list of targets it depends on.
626d8d580da0b6bcedf646b1b4fbc6e580d0254ff9evan@chromium.org  edges = {}
636d8d580da0b6bcedf646b1b4fbc6e580d0254ff9evan@chromium.org
646d8d580da0b6bcedf646b1b4fbc6e580d0254ff9evan@chromium.org  # Queue of targets to visit.
656d8d580da0b6bcedf646b1b4fbc6e580d0254ff9evan@chromium.org  targets_to_visit = target_list[:]
666d8d580da0b6bcedf646b1b4fbc6e580d0254ff9evan@chromium.org
676d8d580da0b6bcedf646b1b4fbc6e580d0254ff9evan@chromium.org  while len(targets_to_visit) > 0:
686d8d580da0b6bcedf646b1b4fbc6e580d0254ff9evan@chromium.org    target = targets_to_visit.pop()
696d8d580da0b6bcedf646b1b4fbc6e580d0254ff9evan@chromium.org    if target in edges:
706d8d580da0b6bcedf646b1b4fbc6e580d0254ff9evan@chromium.org      continue
716d8d580da0b6bcedf646b1b4fbc6e580d0254ff9evan@chromium.org    edges[target] = []
726d8d580da0b6bcedf646b1b4fbc6e580d0254ff9evan@chromium.org
736d8d580da0b6bcedf646b1b4fbc6e580d0254ff9evan@chromium.org    for dep in target_dicts[target].get('dependencies', []):
746d8d580da0b6bcedf646b1b4fbc6e580d0254ff9evan@chromium.org      edges[target].append(dep)
756d8d580da0b6bcedf646b1b4fbc6e580d0254ff9evan@chromium.org      targets_to_visit.append(dep)
766d8d580da0b6bcedf646b1b4fbc6e580d0254ff9evan@chromium.org
776d8d580da0b6bcedf646b1b4fbc6e580d0254ff9evan@chromium.org  filename = 'dump.json'
786d8d580da0b6bcedf646b1b4fbc6e580d0254ff9evan@chromium.org  f = open(filename, 'w')
796d8d580da0b6bcedf646b1b4fbc6e580d0254ff9evan@chromium.org  json.dump(edges, f)
806d8d580da0b6bcedf646b1b4fbc6e580d0254ff9evan@chromium.org  f.close()
816d8d580da0b6bcedf646b1b4fbc6e580d0254ff9evan@chromium.org  print 'Wrote json to %s.' % filename
82