Skip to content
This repository has been archived by the owner on Apr 22, 2023. It is now read-only.

Commit

Permalink
tools: update gyp to r1535
Browse files Browse the repository at this point in the history
This commit contains one additional patch that makes gyp work on DragonFlyBSD,
see https://codereview.chromium.org/11348152/ for details.
  • Loading branch information
bnoordhuis committed Nov 20, 2012
1 parent 019ad34 commit 38c52a0
Show file tree
Hide file tree
Showing 22 changed files with 971 additions and 479 deletions.
4 changes: 3 additions & 1 deletion tools/gyp/gyptest.py
Expand Up @@ -171,7 +171,9 @@ def main(argv=None):
os.chdir(opts.chdir)

if opts.path:
os.environ['PATH'] += ':' + ':'.join(opts.path)
extra_path = [os.path.abspath(p) for p in opts.path]
extra_path = os.pathsep.join(extra_path)
os.environ['PATH'] += os.pathsep + extra_path

if not args:
if not opts.all:
Expand Down
22 changes: 10 additions & 12 deletions tools/gyp/pylib/gyp/MSVSNew.py
Expand Up @@ -59,7 +59,13 @@ def MakeGuid(name, seed='msvs_new'):
#------------------------------------------------------------------------------


class MSVSFolder(object):
class MSVSSolutionEntry(object):
def __cmp__(self, other):
# Sort by name then guid (so things are in order on vs2008).
return cmp((self.name, self.get_guid()), (other.name, other.get_guid()))


class MSVSFolder(MSVSSolutionEntry):
"""Folder in a Visual Studio project or solution."""

def __init__(self, path, name = None, entries = None,
Expand All @@ -85,7 +91,7 @@ def __init__(self, path, name = None, entries = None,
self.guid = guid

# Copy passed lists (or set to empty lists)
self.entries = list(entries or [])
self.entries = sorted(list(entries or []))
self.items = list(items or [])

self.entry_type_guid = ENTRY_TYPE_GUIDS['folder']
Expand All @@ -100,7 +106,7 @@ def get_guid(self):
#------------------------------------------------------------------------------


class MSVSProject(object):
class MSVSProject(MSVSSolutionEntry):
"""Visual Studio project."""

def __init__(self, path, name = None, dependencies = None, guid = None,
Expand Down Expand Up @@ -229,15 +235,7 @@ def Write(self, writer=gyp.common.WriteOnDiff):
if isinstance(e, MSVSFolder):
entries_to_check += e.entries

# Sort by name then guid (so things are in order on vs2008).
def NameThenGuid(a, b):
if a.name < b.name: return -1
if a.name > b.name: return 1
if a.get_guid() < b.get_guid(): return -1
if a.get_guid() > b.get_guid(): return 1
return 0

all_entries = sorted(all_entries, NameThenGuid)
all_entries = sorted(all_entries)

# Open file and print header
f = writer(self.path)
Expand Down
13 changes: 13 additions & 0 deletions tools/gyp/pylib/gyp/MSVSVersion.py
Expand Up @@ -9,6 +9,7 @@
import re
import subprocess
import sys
import gyp


class VisualStudioVersion(object):
Expand Down Expand Up @@ -193,6 +194,8 @@ def _CreateVersion(name, path, sdk_based=False):
autodetected if GYP_MSVS_VERSION is not explicitly specified. If a version is
passed in that doesn't match a value in versions python will throw a error.
"""
if path:
path = os.path.normpath(path)
versions = {
'2012': VisualStudioVersion('2012',
'Visual Studio 2012',
Expand Down Expand Up @@ -264,6 +267,14 @@ def _CreateVersion(name, path, sdk_based=False):
return versions[str(name)]


def _ConvertToCygpath(path):
"""Convert to cygwin path if we are using cygwin."""
if sys.platform == 'cygwin':
p = subprocess.Popen(['cygpath', path], stdout=subprocess.PIPE)
path = p.communicate()[0].strip()
return path


def _DetectVisualStudioVersions(versions_to_check, force_express):
"""Collect the list of installed visual studio versions.
Expand Down Expand Up @@ -294,6 +305,7 @@ def _DetectVisualStudioVersions(versions_to_check, force_express):
path = _RegistryGetValue(keys[index], 'InstallDir')
if not path:
continue
path = _ConvertToCygpath(path)
# Check for full.
full_path = os.path.join(path, 'devenv.exe')
express_path = os.path.join(path, 'vcexpress.exe')
Expand All @@ -314,6 +326,7 @@ def _DetectVisualStudioVersions(versions_to_check, force_express):
path = _RegistryGetValue(keys[index], version)
if not path:
continue
path = _ConvertToCygpath(path)
versions.append(_CreateVersion(version_to_year[version] + 'e',
os.path.join(path, '..'), sdk_based=True))

Expand Down
32 changes: 22 additions & 10 deletions tools/gyp/pylib/gyp/__init__.py
Expand Up @@ -12,6 +12,7 @@
import shlex
import sys
import traceback
from gyp.common import GypError

# Default debug modes for GYP
debug = {}
Expand Down Expand Up @@ -44,15 +45,9 @@ def FindBuildFiles():
return build_files


class GypError(Exception):
"""Error class representing an error, which is to be presented
to the user. The main entry point will catch and display this.
"""
pass


def Load(build_files, format, default_variables={},
includes=[], depth='.', params=None, check=False, circular_check=True):
includes=[], depth='.', params=None, check=False,
circular_check=True):
"""
Loads one or more specified build files.
default_variables and includes will be copied before use.
Expand Down Expand Up @@ -130,7 +125,8 @@ def Load(build_files, format, default_variables={},

# Process the input specific to this generator.
result = gyp.input.Load(build_files, default_variables, includes[:],
depth, generator_input_info, check, circular_check)
depth, generator_input_info, check, circular_check,
params['parallel'])
return [generator] + result

def NameValueListToDict(name_value_list):
Expand Down Expand Up @@ -317,9 +313,14 @@ def gyp_main(args):
help='do not read options from environment variables')
parser.add_option('--check', dest='check', action='store_true',
help='check format of gyp files')
parser.add_option('--parallel', action='store_true',
env_name='GYP_PARALLEL',
help='Use multiprocessing for speed (experimental)')
parser.add_option('--toplevel-dir', dest='toplevel_dir', action='store',
default=None, metavar='DIR', type='path',
help='directory to use as the root of the source tree')
parser.add_option('--build', dest='configs', action='append',
help='configuration for build after project generation')
# --no-circular-check disables the check for circular relationships between
# .gyp files. These relationships should not exist, but they've only been
# observed to be harmful with the Xcode generator. Chromium's .gyp files
Expand Down Expand Up @@ -374,6 +375,9 @@ def gyp_main(args):
if g_o:
options.generator_output = g_o

if not options.parallel and options.use_environment:
options.parallel = bool(os.environ.get('GYP_PARALLEL'))

for mode in options.debug:
gyp.debug[mode] = 1

Expand Down Expand Up @@ -484,7 +488,8 @@ def gyp_main(args):
'cwd': os.getcwd(),
'build_files_arg': build_files_arg,
'gyp_binary': sys.argv[0],
'home_dot_gyp': home_dot_gyp}
'home_dot_gyp': home_dot_gyp,
'parallel': options.parallel}

# Start with the default variables from the command line.
[generator, flat_list, targets, data] = Load(build_files, format,
Expand All @@ -502,6 +507,13 @@ def gyp_main(args):
# generate targets in the order specified in flat_list.
generator.GenerateOutput(flat_list, targets, data, params)

if options.configs:
valid_configs = targets[flat_list[0]]['configurations'].keys()
for conf in options.configs:
if conf not in valid_configs:
raise GypError('Invalid config specified via --build: %s' % conf)
generator.PerformBuild(data, options.configs, params)

# Done
return 0

Expand Down
26 changes: 20 additions & 6 deletions tools/gyp/pylib/gyp/common.py
Expand Up @@ -27,6 +27,13 @@ def __call__(self, *args):
return result


class GypError(Exception):
"""Error class representing an error, which is to be presented
to the user. The main entry point will catch and display this.
"""
pass


def ExceptionAppend(e, msg):
"""Append a message to the given exception's message."""
if not e.args:
Expand Down Expand Up @@ -361,13 +368,20 @@ def GetFlavor(params):
'cygwin': 'win',
'win32': 'win',
'darwin': 'mac',
'sunos5': 'solaris',
'freebsd7': 'freebsd',
'freebsd8': 'freebsd',
'freebsd9': 'freebsd',
}
flavor = flavors.get(sys.platform, 'linux')
return params.get('flavor', flavor)

if 'flavor' in params:
return params['flavor']
if sys.platform in flavors:
return flavors[sys.platform]
if sys.platform.startswith('sunos'):
return 'solaris'
if sys.platform.startswith('freebsd'):
return 'freebsd'
if sys.platform.startswith('dragonfly'):
return 'dragonflybsd'

return 'linux'


def CopyTool(flavor, out_path):
Expand Down
28 changes: 28 additions & 0 deletions tools/gyp/pylib/gyp/common_test.py
Expand Up @@ -8,6 +8,7 @@

import gyp.common
import unittest
import sys


class TestTopologicallySorted(unittest.TestCase):
Expand Down Expand Up @@ -40,5 +41,32 @@ def GetEdge(node):
graph.keys(), GetEdge)


class TestGetFlavor(unittest.TestCase):
"""Test that gyp.common.GetFlavor works as intended"""
original_platform = ''

def setUp(self):
self.original_platform = sys.platform

def tearDown(self):
sys.platform = self.original_platform

def assertFlavor(self, expected, argument, param):
sys.platform = argument
self.assertEqual(expected, gyp.common.GetFlavor(param))

def test_platform_default(self):
self.assertFlavor('dragonflybsd', 'dragonfly3', {})
self.assertFlavor('freebsd' , 'freebsd9' , {})
self.assertFlavor('freebsd' , 'freebsd10' , {})
self.assertFlavor('solaris' , 'sunos5' , {});
self.assertFlavor('solaris' , 'sunos' , {});
self.assertFlavor('linux' , 'linux2' , {});
self.assertFlavor('linux' , 'linux3' , {});

def test_param(self):
self.assertFlavor('foobar', 'linux2' , {'flavor': 'foobar'})


if __name__ == '__main__':
unittest.main()
27 changes: 21 additions & 6 deletions tools/gyp/pylib/gyp/generator/android.py
Expand Up @@ -38,12 +38,22 @@
'RULE_INPUT_PATH': '$(RULE_SOURCES)',
'RULE_INPUT_EXT': '$(suffix $<)',
'RULE_INPUT_NAME': '$(notdir $<)',
'CONFIGURATION_NAME': 'NOT_USED_ON_ANDROID',
}

# Make supports multiple toolsets
generator_supports_multiple_toolsets = True


# Generator-specific gyp specs.
generator_additional_non_configuration_keys = [
# Boolean to declare that this target does not want its name mangled.
'android_unmangled_name',
]
generator_additional_path_sections = []
generator_extra_sources_for_rules = []


SHARED_FOOTER = """\
# "gyp_all_modules" is a concatenation of the "gyp_all_modules" targets from
# all the included sub-makefiles. This is just here to clarify.
Expand Down Expand Up @@ -153,7 +163,7 @@ def Write(self, qualified_target, base_path, output_filename, spec, configs,
extra_outputs = []
extra_sources = []

self.android_class = MODULE_CLASSES.get(self.type, 'NONE')
self.android_class = MODULE_CLASSES.get(self.type, 'GYP')
self.android_module = self.ComputeAndroidModule(spec)
(self.android_stem, self.android_suffix) = self.ComputeOutputParts(spec)
self.output = self.output_binary = self.ComputeOutput(spec)
Expand Down Expand Up @@ -576,6 +586,10 @@ def ComputeAndroidModule(self, spec):
distinguish gyp-generated module names.
"""

if int(spec.get('android_unmangled_name', 0)):
assert self.type != 'shared_library' or self.target.startswith('lib')
return self.target

if self.type == 'shared_library':
# For reasons of convention, the Android build system requires that all
# shared library modules are named 'libfoo' when generating -l flags.
Expand Down Expand Up @@ -838,10 +852,11 @@ def WriteTarget(self, spec, configs, deps, link_deps, part_of_all):
# Add an alias from the gyp target name to the Android module name. This
# simplifies manual builds of the target, and is required by the test
# framework.
self.WriteLn('# Alias gyp target name.')
self.WriteLn('.PHONY: %s' % self.target)
self.WriteLn('%s: %s' % (self.target, self.android_module))
self.WriteLn('')
if self.target != self.android_module:
self.WriteLn('# Alias gyp target name.')
self.WriteLn('.PHONY: %s' % self.target)
self.WriteLn('%s: %s' % (self.target, self.android_module))
self.WriteLn('')

# Add the command to trigger build of the target type depending
# on the toolset. Ex: BUILD_STATIC_LIBRARY vs. BUILD_HOST_STATIC_LIBRARY
Expand Down Expand Up @@ -989,7 +1004,7 @@ def CalculateMakefilePath(build_file, base_name):
default_configuration = 'Default'

srcdir = '.'
makefile_name = 'GypAndroid.mk' + options.suffix
makefile_name = 'GypAndroid' + options.suffix + '.mk'
makefile_path = os.path.join(options.toplevel_dir, makefile_name)
assert not options.generator_output, (
'The Android backend does not support options.generator_output.')
Expand Down
31 changes: 29 additions & 2 deletions tools/gyp/pylib/gyp/generator/dump_dependency_json.py
@@ -1,10 +1,12 @@
# Copyright (c) 2011 Google Inc. All rights reserved.
# Copyright (c) 2012 Google Inc. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import collections
import os
import gyp
import gyp.common
import gyp.msvs_emulation
import json
import sys

Expand All @@ -22,7 +24,8 @@
'RULE_INPUT_DIRNAME', 'RULE_INPUT_EXT',
'EXECUTABLE_PREFIX', 'EXECUTABLE_SUFFIX',
'STATIC_LIB_PREFIX', 'STATIC_LIB_SUFFIX',
'SHARED_LIB_PREFIX', 'SHARED_LIB_SUFFIX']:
'SHARED_LIB_PREFIX', 'SHARED_LIB_SUFFIX',
'CONFIGURATION_NAME']:
generator_default_variables[unused] = ''


Expand All @@ -32,6 +35,30 @@ def CalculateVariables(default_variables, params):
default_variables.setdefault(key, val)
default_variables.setdefault('OS', gyp.common.GetFlavor(params))

flavor = gyp.common.GetFlavor(params)
if flavor =='win':
# Copy additional generator configuration data from VS, which is shared
# by the Windows Ninja generator.
import gyp.generator.msvs as msvs_generator
generator_additional_non_configuration_keys = getattr(msvs_generator,
'generator_additional_non_configuration_keys', [])
generator_additional_path_sections = getattr(msvs_generator,
'generator_additional_path_sections', [])

# Set a variable so conditions can be based on msvs_version.
msvs_version = gyp.msvs_emulation.GetVSVersion(generator_flags)
default_variables['MSVS_VERSION'] = msvs_version.ShortName()

# To determine processor word size on Windows, in addition to checking
# PROCESSOR_ARCHITECTURE (which reflects the word size of the current
# process), it is also necessary to check PROCESSOR_ARCHITEW6432 (which
# contains the actual word size of the system when running thru WOW64).
if ('64' in os.environ.get('PROCESSOR_ARCHITECTURE', '') or
'64' in os.environ.get('PROCESSOR_ARCHITEW6432', '')):
default_variables['MSVS_OS_BITS'] = 64
else:
default_variables['MSVS_OS_BITS'] = 32


def CalculateGeneratorInputInfo(params):
"""Calculate the generator specific info that gets fed to input (called by
Expand Down

0 comments on commit 38c52a0

Please sign in to comment.