diff options
author | Mike Morris <michael.patrick.morris@gmail.com> | 2015-12-04 13:29:51 -0500 |
---|---|---|
committer | Mike Morris <michael.patrick.morris@gmail.com> | 2015-12-07 15:48:34 -0800 |
commit | d467ae6e7867044b8d7b466776fb37089292c52b (patch) | |
tree | 730ee0656e6bf9f0dff33346f07acd800e83ab25 /deps | |
parent | 59ef8da69549cf6308078c6f656affba96e9439e (diff) | |
download | qtlocation-mapboxgl-d467ae6e7867044b8d7b466776fb37089292c52b.tar.gz |
[core] upgrade gyp to git commit 6fb8bd8
https://chromium.googlesource.com/external/gyp/+/6fb8bd829f0ca8fd432fd85ede788b6881c4f09f
Diffstat (limited to 'deps')
1537 files changed, 58573 insertions, 1853 deletions
diff --git a/deps/gyp/AUTHORS b/deps/gyp/AUTHORS new file mode 100644 index 0000000000..fecf84a1c4 --- /dev/null +++ b/deps/gyp/AUTHORS @@ -0,0 +1,12 @@ +# Names should be added to this file like so: +# Name or Organization <email address> + +Google Inc. +Bloomberg Finance L.P. +Yandex LLC + +Steven Knight <knight@baldmt.com> +Ryan Norton <rnorton10@gmail.com> +David J. Sankel <david@sankelsoftware.com> +Eric N. Vander Weele <ericvw@gmail.com> +Tom Freudenberg <th.freudenberg@gmail.com> diff --git a/deps/gyp/DEPS b/deps/gyp/DEPS new file mode 100644 index 0000000000..2e1120f274 --- /dev/null +++ b/deps/gyp/DEPS @@ -0,0 +1,24 @@ +# DEPS file for gclient use in buildbot execution of gyp tests. +# +# (You don't need to use gclient for normal GYP development work.) + +vars = { + "chrome_trunk": "http://src.chromium.org/svn/trunk", + "googlecode_url": "http://%s.googlecode.com/svn", +} + +deps = { +} + +deps_os = { + "win": { + "third_party/cygwin": + Var("chrome_trunk") + "/deps/third_party/cygwin@66844", + + "third_party/python_26": + Var("chrome_trunk") + "/tools/third_party/python_26@89111", + + "src/third_party/pefile": + (Var("googlecode_url") % "pefile") + "/trunk@63", + }, +} diff --git a/deps/gyp/PRESUBMIT.py b/deps/gyp/PRESUBMIT.py index b79316a915..dde025383c 100644 --- a/deps/gyp/PRESUBMIT.py +++ b/deps/gyp/PRESUBMIT.py @@ -23,6 +23,10 @@ PYLINT_DISABLED_WARNINGS = [ # TODO: fix me. # Many tests include modules they don't use. 'W0611', + # Possible unbalanced tuple unpacking with sequence. + 'W0632', + # Attempting to unpack a non-sequence. + 'W0633', # Include order doesn't properly include local files? 'F0401', # Some use of built-in names. @@ -38,6 +42,10 @@ PYLINT_DISABLED_WARNINGS = [ 'W0613', # String has no effect (docstring in wrong place). 'W0105', + # map/filter on lambda could be replaced by comprehension. + 'W0110', + # Use of eval. + 'W0123', # Comma not followed by space. 'C0324', # Access to a protected member. @@ -54,6 +62,8 @@ PYLINT_DISABLED_WARNINGS = [ 'E1101', # Dangerous default {}. 'W0102', + # Cyclic import. + 'R0401', # Others, too many to sort. 'W0201', 'W0232', 'E1103', 'W0621', 'W0108', 'W0223', 'W0231', 'R0201', 'E0101', 'C0321', @@ -114,5 +124,14 @@ def CheckChangeOnCommit(input_api, output_api): return report -def GetPreferredTrySlaves(): - return ['gyp-win32', 'gyp-win64', 'gyp-linux', 'gyp-mac', 'gyp-android'] +TRYBOTS = [ + 'linux_try', + 'mac_try', + 'win_try', +] + + +def GetPreferredTryMasters(_, change): + return { + 'client.gyp': { t: set(['defaulttests']) for t in TRYBOTS }, + } diff --git a/deps/gyp/README.md b/deps/gyp/README.md new file mode 100644 index 0000000000..c0d73ac958 --- /dev/null +++ b/deps/gyp/README.md @@ -0,0 +1,4 @@ +GYP can Generate Your Projects. +=================================== + +Documents are available at [gyp.gsrc.io](https://gyp.gsrc.io), or you can check out ```md-pages``` branch to read those documents offline. diff --git a/deps/gyp/buildbot/buildbot_run.py b/deps/gyp/buildbot/buildbot_run.py new file mode 100755 index 0000000000..9a2b71f1b3 --- /dev/null +++ b/deps/gyp/buildbot/buildbot_run.py @@ -0,0 +1,136 @@ +#!/usr/bin/env python +# 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. + +"""Argument-less script to select what to run on the buildbots.""" + +import os +import shutil +import subprocess +import sys + + +BUILDBOT_DIR = os.path.dirname(os.path.abspath(__file__)) +TRUNK_DIR = os.path.dirname(BUILDBOT_DIR) +ROOT_DIR = os.path.dirname(TRUNK_DIR) +CMAKE_DIR = os.path.join(ROOT_DIR, 'cmake') +CMAKE_BIN_DIR = os.path.join(CMAKE_DIR, 'bin') +OUT_DIR = os.path.join(TRUNK_DIR, 'out') + + +def CallSubProcess(*args, **kwargs): + """Wrapper around subprocess.call which treats errors as build exceptions.""" + with open(os.devnull) as devnull_fd: + retcode = subprocess.call(stdin=devnull_fd, *args, **kwargs) + if retcode != 0: + print '@@@STEP_EXCEPTION@@@' + sys.exit(1) + + +def PrepareCmake(): + """Build CMake 2.8.8 since the version in Precise is 2.8.7.""" + if os.environ['BUILDBOT_CLOBBER'] == '1': + print '@@@BUILD_STEP Clobber CMake checkout@@@' + shutil.rmtree(CMAKE_DIR) + + # We always build CMake 2.8.8, so no need to do anything + # if the directory already exists. + if os.path.isdir(CMAKE_DIR): + return + + print '@@@BUILD_STEP Initialize CMake checkout@@@' + os.mkdir(CMAKE_DIR) + + print '@@@BUILD_STEP Sync CMake@@@' + CallSubProcess( + ['git', 'clone', + '--depth', '1', + '--single-branch', + '--branch', 'v2.8.8', + '--', + 'git://cmake.org/cmake.git', + CMAKE_DIR], + cwd=CMAKE_DIR) + + print '@@@BUILD_STEP Build CMake@@@' + CallSubProcess( + ['/bin/bash', 'bootstrap', '--prefix=%s' % CMAKE_DIR], + cwd=CMAKE_DIR) + + CallSubProcess( ['make', 'cmake'], cwd=CMAKE_DIR) + + +def GypTestFormat(title, format=None, msvs_version=None, tests=[]): + """Run the gyp tests for a given format, emitting annotator tags. + + See annotator docs at: + https://sites.google.com/a/chromium.org/dev/developers/testing/chromium-build-infrastructure/buildbot-annotations + Args: + format: gyp format to test. + Returns: + 0 for sucesss, 1 for failure. + """ + if not format: + format = title + + print '@@@BUILD_STEP ' + title + '@@@' + sys.stdout.flush() + env = os.environ.copy() + if msvs_version: + env['GYP_MSVS_VERSION'] = msvs_version + command = ' '.join( + [sys.executable, 'gyp/gyptest.py', + '--all', + '--passed', + '--format', format, + '--path', CMAKE_BIN_DIR, + '--chdir', 'gyp'] + tests) + retcode = subprocess.call(command, cwd=ROOT_DIR, env=env, shell=True) + if retcode: + # Emit failure tag, and keep going. + print '@@@STEP_FAILURE@@@' + return 1 + return 0 + + +def GypBuild(): + # Dump out/ directory. + print '@@@BUILD_STEP cleanup@@@' + print 'Removing %s...' % OUT_DIR + shutil.rmtree(OUT_DIR, ignore_errors=True) + print 'Done.' + + retcode = 0 + if sys.platform.startswith('linux'): + retcode += GypTestFormat('ninja') + retcode += GypTestFormat('make') + PrepareCmake() + retcode += GypTestFormat('cmake') + elif sys.platform == 'darwin': + retcode += GypTestFormat('ninja') + retcode += GypTestFormat('xcode') + retcode += GypTestFormat('make') + elif sys.platform == 'win32': + retcode += GypTestFormat('ninja') + if os.environ['BUILDBOT_BUILDERNAME'] == 'gyp-win64': + retcode += GypTestFormat('msvs-ninja-2013', format='msvs-ninja', + msvs_version='2013', + tests=[ + r'test\generator-output\gyptest-actions.py', + r'test\generator-output\gyptest-relocate.py', + r'test\generator-output\gyptest-rules.py']) + retcode += GypTestFormat('msvs-2013', format='msvs', msvs_version='2013') + else: + raise Exception('Unknown platform') + if retcode: + # TODO(bradnelson): once the annotator supports a postscript (section for + # after the build proper that could be used for cumulative failures), + # use that instead of this. This isolates the final return value so + # that it isn't misattributed to the last stage. + print '@@@BUILD_STEP failures@@@' + sys.exit(retcode) + + +if __name__ == '__main__': + GypBuild() diff --git a/deps/gyp/buildbot/commit_queue/OWNERS b/deps/gyp/buildbot/commit_queue/OWNERS new file mode 100644 index 0000000000..b269c198b4 --- /dev/null +++ b/deps/gyp/buildbot/commit_queue/OWNERS @@ -0,0 +1,6 @@ +set noparent +bradnelson@chromium.org +bradnelson@google.com +iannucci@chromium.org +scottmg@chromium.org +thakis@chromium.org diff --git a/deps/gyp/buildbot/commit_queue/README b/deps/gyp/buildbot/commit_queue/README new file mode 100644 index 0000000000..9428497883 --- /dev/null +++ b/deps/gyp/buildbot/commit_queue/README @@ -0,0 +1,3 @@ +cq_config.json describes the trybots that must pass in order +to land a change through the commit queue. +Comments are here as the file is strictly JSON. diff --git a/deps/gyp/buildbot/commit_queue/cq_config.json b/deps/gyp/buildbot/commit_queue/cq_config.json new file mode 100644 index 0000000000..656c21e54f --- /dev/null +++ b/deps/gyp/buildbot/commit_queue/cq_config.json @@ -0,0 +1,15 @@ +{ + "trybots": { + "launched": { + "tryserver.nacl": { + "gyp-presubmit": ["defaulttests"], + "gyp-linux": ["defaulttests"], + "gyp-mac": ["defaulttests"], + "gyp-win32": ["defaulttests"], + "gyp-win64": ["defaulttests"] + } + }, + "triggered": { + } + } +} diff --git a/deps/gyp/codereview.settings b/deps/gyp/codereview.settings index a04a2440df..faf37f1145 100644 --- a/deps/gyp/codereview.settings +++ b/deps/gyp/codereview.settings @@ -1,10 +1,10 @@ # This file is used by gcl to get repository specific information. CODE_REVIEW_SERVER: codereview.chromium.org CC_LIST: gyp-developer@googlegroups.com -VIEW_VC: http://code.google.com/p/gyp/source/detail?r= -TRY_ON_UPLOAD: True +VIEW_VC: https://chromium.googlesource.com/external/gyp/+/ +TRY_ON_UPLOAD: False TRYSERVER_PROJECT: gyp -TRYSERVER_PATCHLEVEL: 0 -TRYSERVER_ROOT: trunk +TRYSERVER_PATCHLEVEL: 1 +TRYSERVER_ROOT: gyp TRYSERVER_SVN_URL: svn://svn.chromium.org/chrome-try/try-nacl - +PROJECT: gyp diff --git a/deps/gyp/data/win/large-pdb-shim.cc b/deps/gyp/data/win/large-pdb-shim.cc new file mode 100644 index 0000000000..8bca510815 --- /dev/null +++ b/deps/gyp/data/win/large-pdb-shim.cc @@ -0,0 +1,12 @@ +// Copyright (c) 2013 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. + +// This file is used to generate an empty .pdb -- with a 4KB pagesize -- that is +// then used during the final link for modules that have large PDBs. Otherwise, +// the linker will generate a pdb with a page size of 1KB, which imposes a limit +// of 1GB on the .pdb. By generating an initial empty .pdb with the compiler +// (rather than the linker), this limit is avoided. With this in place PDBs may +// grow to 2GB. +// +// This file is referenced by the msvs_large_pdb mechanism in MSVSUtil.py. diff --git a/deps/gyp/gyp b/deps/gyp/gyp index b53a6dde8f..1b8b9bdfb0 100755 --- a/deps/gyp/gyp +++ b/deps/gyp/gyp @@ -1,4 +1,4 @@ -#!/bin/bash +#!/bin/sh # Copyright 2013 The Chromium Authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. diff --git a/deps/gyp/gyp_main.py b/deps/gyp/gyp_main.py index 4ec872f0f9..25a6eba94a 100755 --- a/deps/gyp/gyp_main.py +++ b/deps/gyp/gyp_main.py @@ -4,15 +4,13 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. +import os import sys -# TODO(mark): sys.path manipulation is some temporary testing stuff. -try: - import gyp -except ImportError, e: - import os.path - sys.path.append(os.path.join(os.path.dirname(sys.argv[0]), 'pylib')) - import gyp +# Make sure we're using the version of pylib in this repo, not one installed +# elsewhere on the system. +sys.path.insert(0, os.path.join(os.path.dirname(sys.argv[0]), 'pylib')) +import gyp if __name__ == '__main__': sys.exit(gyp.script_main()) diff --git a/deps/gyp/gyptest.py b/deps/gyp/gyptest.py index 8f3ee0ffb0..8e4fc47d5c 100755 --- a/deps/gyp/gyptest.py +++ b/deps/gyp/gyptest.py @@ -13,7 +13,7 @@ import optparse import subprocess import sys -class CommandRunner: +class CommandRunner(object): """ Executor class for commands, including "commands" implemented by Python functions. @@ -117,7 +117,7 @@ class CommandRunner: return self.execute(command, stdout, stderr) -class Unbuffered: +class Unbuffered(object): def __init__(self, fp): self.fp = fp def write(self, arg): @@ -224,7 +224,7 @@ def main(argv=None): 'win32': ['msvs', 'ninja'], 'linux2': ['make', 'ninja'], 'linux3': ['make', 'ninja'], - 'darwin': ['make', 'ninja', 'xcode'], + 'darwin': ['make', 'ninja', 'xcode', 'xcode-ninja'], }[sys.platform] for format in format_list: diff --git a/deps/gyp/pylib/gyp/MSVSNew.py b/deps/gyp/pylib/gyp/MSVSNew.py index 845dcb0639..593f0e5b0b 100644 --- a/deps/gyp/pylib/gyp/MSVSNew.py +++ b/deps/gyp/pylib/gyp/MSVSNew.py @@ -172,7 +172,7 @@ class MSVSProject(MSVSSolutionEntry): #------------------------------------------------------------------------------ -class MSVSSolution: +class MSVSSolution(object): """Visual Studio solution.""" def __init__(self, path, version, entries=None, variants=None, diff --git a/deps/gyp/pylib/gyp/MSVSSettings.py b/deps/gyp/pylib/gyp/MSVSSettings.py index 205b3b5b9b..4985756bdd 100644 --- a/deps/gyp/pylib/gyp/MSVSSettings.py +++ b/deps/gyp/pylib/gyp/MSVSSettings.py @@ -2,7 +2,7 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. -"""Code to validate and convert settings of the Microsoft build tools. +r"""Code to validate and convert settings of the Microsoft build tools. This file contains code to validate and convert settings of the Microsoft build tools. The function ConvertToMSBuildSettings(), ValidateMSVSSettings(), @@ -314,7 +314,14 @@ def _MSBuildOnly(tool, name, setting_type): name: the name of the setting. setting_type: the type of this setting. """ + + def _Translate(value, msbuild_settings): + # Let msbuild-only properties get translated as-is from msvs_settings. + tool_settings = msbuild_settings.setdefault(tool.msbuild_name, {}) + tool_settings[name] = value + _msbuild_validators[tool.msbuild_name][name] = setting_type.ValidateMSBuild + _msvs_to_msbuild_converters[tool.msvs_name][name] = _Translate def _ConvertedToAdditionalOption(tool, msvs_name, flag): @@ -417,11 +424,11 @@ def ConvertVCMacrosToMSBuild(s): if '$' in s: replace_map = { '$(ConfigurationName)': '$(Configuration)', - '$(InputDir)': '%(RootDir)%(Directory)', + '$(InputDir)': '%(RelativeDir)', '$(InputExt)': '%(Extension)', '$(InputFileName)': '%(Filename)%(Extension)', '$(InputName)': '%(Filename)', - '$(InputPath)': '%(FullPath)', + '$(InputPath)': '%(Identity)', '$(ParentName)': '$(ProjectFileName)', '$(PlatformName)': '$(Platform)', '$(SafeInputName)': '%(Filename)', @@ -531,6 +538,7 @@ _midl = _Tool('VCMIDLTool', 'Midl') _rc = _Tool('VCResourceCompilerTool', 'ResourceCompile') _lib = _Tool('VCLibrarianTool', 'Lib') _manifest = _Tool('VCManifestTool', 'Manifest') +_masm = _Tool('MASM', 'MASM') _AddTool(_compile) @@ -539,6 +547,7 @@ _AddTool(_midl) _AddTool(_rc) _AddTool(_lib) _AddTool(_manifest) +_AddTool(_masm) # Add sections only found in the MSBuild settings. _msbuild_validators[''] = {} _msbuild_validators['ProjectReference'] = {} @@ -602,7 +611,8 @@ _Same(_compile, 'BrowseInformation', _Same(_compile, 'CallingConvention', _Enumeration(['Cdecl', # /Gd 'FastCall', # /Gr - 'StdCall'])) # /Gz + 'StdCall', # /Gz + 'VectorCall'])) # /Gv _Same(_compile, 'CompileAs', _Enumeration(['Default', 'CompileAsC', # /TC @@ -618,7 +628,10 @@ _Same(_compile, 'EnableEnhancedInstructionSet', 'StreamingSIMDExtensions', # /arch:SSE 'StreamingSIMDExtensions2', # /arch:SSE2 'AdvancedVectorExtensions', # /arch:AVX (vs2012+) - 'NoExtensions',])) # /arch:IA32 (vs2012+) + 'NoExtensions', # /arch:IA32 (vs2012+) + # This one only exists in the new msbuild format. + 'AdvancedVectorExtensions2', # /arch:AVX2 (vs2013r2+) + ])) _Same(_compile, 'ErrorReporting', _Enumeration(['None', # /errorReport:none 'Prompt', # /errorReport:prompt @@ -695,10 +708,7 @@ _MSVSOnly(_compile, 'UseUnicodeResponseFiles', _boolean) _MSBuildOnly(_compile, 'BuildingInIDE', _boolean) _MSBuildOnly(_compile, 'CompileAsManaged', _Enumeration([], new=['false', - 'true', # /clr - 'Pure', # /clr:pure - 'Safe', # /clr:safe - 'OldSyntax'])) # /clr:oldSyntax + 'true'])) # /clr _MSBuildOnly(_compile, 'CreateHotpatchableImage', _boolean) # /hotpatch _MSBuildOnly(_compile, 'MultiProcessorCompilation', _boolean) # /MP _MSBuildOnly(_compile, 'PreprocessOutputPath', _string) # /Fi @@ -1076,3 +1086,11 @@ _MSBuildOnly(_manifest, 'ManifestFromManagedAssembly', _MSBuildOnly(_manifest, 'OutputResourceManifests', _string) # /outputresource _MSBuildOnly(_manifest, 'SuppressDependencyElement', _boolean) # /nodependency _MSBuildOnly(_manifest, 'TrackerLogDirectory', _folder_name) + + +# Directives for MASM. +# See "$(VCTargetsPath)\BuildCustomizations\masm.xml" for the schema of the +# MSBuild MASM settings. + +# Options that have the same name in MSVS and MSBuild. +_Same(_masm, 'UseSafeExceptionHandlers', _boolean) # /safeseh diff --git a/deps/gyp/pylib/gyp/MSVSSettings_test.py b/deps/gyp/pylib/gyp/MSVSSettings_test.py index 9bd37ec348..bf6ea6b802 100755 --- a/deps/gyp/pylib/gyp/MSVSSettings_test.py +++ b/deps/gyp/pylib/gyp/MSVSSettings_test.py @@ -267,7 +267,7 @@ class TestSequenceFunctions(unittest.TestCase): 'Warning: for VCCLCompilerTool/BrowseInformation, ' "invalid literal for int() with base 10: 'fdkslj'", 'Warning: for VCCLCompilerTool/CallingConvention, ' - 'index value (-1) not in expected range [0, 3)', + 'index value (-1) not in expected range [0, 4)', 'Warning: for VCCLCompilerTool/DebugInformationFormat, ' 'converted value for 2 not specified.', 'Warning: unrecognized setting VCCLCompilerTool/Enableprefast', @@ -296,7 +296,7 @@ class TestSequenceFunctions(unittest.TestCase): 'BuildingInIDE': 'true', 'CallingConvention': 'Cdecl', 'CompileAs': 'CompileAsC', - 'CompileAsManaged': 'Pure', + 'CompileAsManaged': 'true', 'CreateHotpatchableImage': 'true', 'DebugInformationFormat': 'ProgramDatabase', 'DisableLanguageExtensions': 'true', diff --git a/deps/gyp/pylib/gyp/MSVSUtil.py b/deps/gyp/pylib/gyp/MSVSUtil.py index fbf3ed2e3c..0b32e91180 100644 --- a/deps/gyp/pylib/gyp/MSVSUtil.py +++ b/deps/gyp/pylib/gyp/MSVSUtil.py @@ -8,10 +8,12 @@ import copy import os -_TARGET_TYPE_EXT = { - 'executable': '.exe', - 'loadable_module': '.dll', - 'shared_library': '.dll', +# A dictionary mapping supported target types to extensions. +TARGET_TYPE_EXT = { + 'executable': 'exe', + 'loadable_module': 'dll', + 'shared_library': 'dll', + 'static_library': 'lib', } @@ -157,7 +159,7 @@ def _GetPdbPath(target_dict, config_name, vars): pdb_base = target_dict.get('product_name', target_dict['target_name']) - pdb_base = '%s%s.pdb' % (pdb_base, _TARGET_TYPE_EXT[target_dict['type']]) + pdb_base = '%s.%s.pdb' % (pdb_base, TARGET_TYPE_EXT[target_dict['type']]) pdb_path = vars['PRODUCT_DIR'] + '/' + pdb_base return pdb_path diff --git a/deps/gyp/pylib/gyp/MSVSVersion.py b/deps/gyp/pylib/gyp/MSVSVersion.py index bcd6122f2d..d9bfa684fa 100644 --- a/deps/gyp/pylib/gyp/MSVSVersion.py +++ b/deps/gyp/pylib/gyp/MSVSVersion.py @@ -84,10 +84,11 @@ class VisualStudioVersion(object): # vcvars32, which it can only find if VS??COMNTOOLS is set, which it # isn't always. if target_arch == 'x86': - if self.short_name == '2013' and ( + if self.short_name >= '2013' and self.short_name[-1] != 'e' and ( os.environ.get('PROCESSOR_ARCHITECTURE') == 'AMD64' or os.environ.get('PROCESSOR_ARCHITEW6432') == 'AMD64'): - # VS2013 non-Express has a x64-x86 cross that we want to prefer. + # VS2013 and later, non-Express have a x64-x86 cross that we want + # to prefer. return [os.path.normpath( os.path.join(self.path, 'VC/vcvarsall.bat')), 'amd64_x86'] # Otherwise, the standard x86 compiler. @@ -138,7 +139,7 @@ def _RegistryQueryBase(sysdir, key, value): def _RegistryQuery(key, value=None): - """Use reg.exe to read a particular key through _RegistryQueryBase. + r"""Use reg.exe to read a particular key through _RegistryQueryBase. First tries to launch from %WinDir%\Sysnative to avoid WoW64 redirection. If that fails, it falls back to System32. Sysnative is available on Vista and @@ -165,8 +166,33 @@ def _RegistryQuery(key, value=None): return text +def _RegistryGetValueUsingWinReg(key, value): + """Use the _winreg module to obtain the value of a registry key. + + Args: + key: The registry key. + value: The particular registry value to read. + Return: + contents of the registry key's value, or None on failure. Throws + ImportError if _winreg is unavailable. + """ + import _winreg + try: + root, subkey = key.split('\\', 1) + assert root == 'HKLM' # Only need HKLM for now. + with _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE, subkey) as hkey: + return _winreg.QueryValueEx(hkey, value)[0] + except WindowsError: + return None + + def _RegistryGetValue(key, value): - """Use reg.exe to obtain the value of a registry key. + """Use _winreg or reg.exe to obtain the value of a registry key. + + Using _winreg is preferable because it solves an issue on some corporate + environments where access to reg.exe is locked down. However, we still need + to fallback to reg.exe for the case where the _winreg module is not available + (for example in cygwin python). Args: key: The registry key. @@ -174,6 +200,12 @@ def _RegistryGetValue(key, value): Return: contents of the registry key's value, or None on failure. """ + try: + return _RegistryGetValueUsingWinReg(key, value) + except ImportError: + pass + + # Fallback to reg.exe if we fail to import _winreg. text = _RegistryQuery(key, value) if not text: return None @@ -184,19 +216,6 @@ def _RegistryGetValue(key, value): return match.group(1) -def _RegistryKeyExists(key): - """Use reg.exe to see if a key exists. - - Args: - key: The registry key to check. - Return: - True if the key exists - """ - if not _RegistryQuery(key): - return False - return True - - def _CreateVersion(name, path, sdk_based=False): """Sets up MSVS project generation. @@ -207,6 +226,15 @@ def _CreateVersion(name, path, sdk_based=False): if path: path = os.path.normpath(path) versions = { + '2015': VisualStudioVersion('2015', + 'Visual Studio 2015', + solution_version='12.00', + project_version='14.0', + flat_sln=False, + uses_vcxproj=True, + path=path, + sdk_based=sdk_based, + default_toolset='v140'), '2013': VisualStudioVersion('2013', 'Visual Studio 2013', solution_version='13.00', @@ -316,7 +344,8 @@ def _DetectVisualStudioVersions(versions_to_check, force_express): 2008(e) - Visual Studio 2008 (9) 2010(e) - Visual Studio 2010 (10) 2012(e) - Visual Studio 2012 (11) - 2013(e) - Visual Studio 2013 (11) + 2013(e) - Visual Studio 2013 (12) + 2015 - Visual Studio 2015 (14) Where (e) is e for express editions of MSVS and blank otherwise. """ version_to_year = { @@ -325,6 +354,7 @@ def _DetectVisualStudioVersions(versions_to_check, force_express): '10.0': '2010', '11.0': '2012', '12.0': '2013', + '14.0': '2015', } versions = [] for version in versions_to_check: @@ -361,13 +391,14 @@ def _DetectVisualStudioVersions(versions_to_check, force_express): if not path: continue path = _ConvertToCygpath(path) - versions.append(_CreateVersion(version_to_year[version] + 'e', - os.path.join(path, '..'), sdk_based=True)) + if version != '14.0': # There is no Express edition for 2015. + versions.append(_CreateVersion(version_to_year[version] + 'e', + os.path.join(path, '..'), sdk_based=True)) return versions -def SelectVisualStudioVersion(version='auto'): +def SelectVisualStudioVersion(version='auto', allow_fallback=True): """Select which version of Visual Studio projects to generate. Arguments: @@ -379,7 +410,7 @@ def SelectVisualStudioVersion(version='auto'): if version == 'auto': version = os.environ.get('GYP_MSVS_VERSION', 'auto') version_map = { - 'auto': ('12.0', '10.0', '9.0', '8.0', '11.0'), + 'auto': ('14.0', '12.0', '10.0', '9.0', '8.0', '11.0'), '2005': ('8.0',), '2005e': ('8.0',), '2008': ('9.0',), @@ -390,6 +421,7 @@ def SelectVisualStudioVersion(version='auto'): '2012e': ('11.0',), '2013': ('12.0',), '2013e': ('12.0',), + '2015': ('14.0',), } override_path = os.environ.get('GYP_MSVS_OVERRIDE_PATH') if override_path: @@ -401,6 +433,8 @@ def SelectVisualStudioVersion(version='auto'): version = str(version) versions = _DetectVisualStudioVersions(version_map[version], 'e' in version) if not versions: + if not allow_fallback: + raise ValueError('Could not locate Visual Studio installation.') if version == 'auto': # Default to 2005 if we couldn't find anything return _CreateVersion('2005', None) diff --git a/deps/gyp/pylib/gyp/__init__.py b/deps/gyp/pylib/gyp/__init__.py index 30edea5675..668f38b60d 100755 --- a/deps/gyp/pylib/gyp/__init__.py +++ b/deps/gyp/pylib/gyp/__init__.py @@ -49,7 +49,7 @@ def FindBuildFiles(): def Load(build_files, format, default_variables={}, includes=[], depth='.', params=None, check=False, - circular_check=True): + circular_check=True, duplicate_basename_check=True): """ Loads one or more specified build files. default_variables and includes will be copied before use. @@ -59,7 +59,6 @@ def Load(build_files, format, default_variables={}, if params is None: params = {} - flavor = None if '-' in format: format, params['flavor'] = format.split('-', 1) @@ -69,6 +68,7 @@ def Load(build_files, format, default_variables={}, # named WITH_CAPITAL_LETTERS to provide a distinct "best practice" namespace, # avoiding collisions with user and automatic variables. default_variables['GENERATOR'] = format + default_variables['GENERATOR_FLAVOR'] = params.get('flavor', '') # Format can be a custom python file, or by default the name of a module # within gyp.generator. @@ -126,6 +126,7 @@ 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, + duplicate_basename_check, params['parallel'], params['root_targets']) return [generator] + result @@ -324,6 +325,16 @@ def gyp_main(args): parser.add_option('--no-circular-check', dest='circular_check', action='store_false', default=True, regenerate=False, help="don't check for circular relationships between files") + # --no-duplicate-basename-check disables the check for duplicate basenames + # in a static_library/shared_library project. Visual C++ 2008 generator + # doesn't support this configuration. Libtool on Mac also generates warnings + # when duplicate basenames are passed into Make generator on Mac. + # TODO(yukawa): Remove this option when these legacy generators are + # deprecated. + parser.add_option('--no-duplicate-basename-check', + dest='duplicate_basename_check', action='store_false', + default=True, regenerate=False, + help="don't check for duplicate basenames") parser.add_option('--no-parallel', action='store_true', default=False, help='Disable multiprocessing') parser.add_option('-S', '--suffix', dest='suffix', default='', @@ -371,7 +382,7 @@ def gyp_main(args): if options.use_environment: generate_formats = os.environ.get('GYP_GENERATORS', []) if generate_formats: - generate_formats = re.split('[\s,]', generate_formats) + generate_formats = re.split(r'[\s,]', generate_formats) if generate_formats: options.formats = generate_formats else: @@ -493,14 +504,14 @@ def gyp_main(args): 'gyp_binary': sys.argv[0], 'home_dot_gyp': home_dot_gyp, 'parallel': options.parallel, - 'root_targets': options.root_targets} + 'root_targets': options.root_targets, + 'target_arch': cmdline_default_variables.get('target_arch', '')} # Start with the default variables from the command line. - [generator, flat_list, targets, data] = Load(build_files, format, - cmdline_default_variables, - includes, options.depth, - params, options.check, - options.circular_check) + [generator, flat_list, targets, data] = Load( + build_files, format, cmdline_default_variables, includes, options.depth, + params, options.check, options.circular_check, + options.duplicate_basename_check) # TODO(mark): Pass |data| for now because the generator needs a list of # build files that came in. In the future, maybe it should just accept diff --git a/deps/gyp/pylib/gyp/common.py b/deps/gyp/pylib/gyp/common.py index df71d973e1..256e3f3a6b 100644 --- a/deps/gyp/pylib/gyp/common.py +++ b/deps/gyp/pylib/gyp/common.py @@ -131,13 +131,20 @@ def QualifiedTarget(build_file, target, toolset): @memoize -def RelativePath(path, relative_to): +def RelativePath(path, relative_to, follow_path_symlink=True): # Assuming both |path| and |relative_to| are relative to the current # directory, returns a relative path that identifies path relative to # relative_to. + # If |follow_symlink_path| is true (default) and |path| is a symlink, then + # this method returns a path to the real file represented by |path|. If it is + # false, this method returns a path to the symlink. If |path| is not a + # symlink, this option has no effect. # Convert to normalized (and therefore absolute paths). - path = os.path.realpath(path) + if follow_path_symlink: + path = os.path.realpath(path) + else: + path = os.path.abspath(path) relative_to = os.path.realpath(relative_to) # On Windows, we can't create a relative path to a different drive, so just @@ -329,7 +336,7 @@ def WriteOnDiff(filename): the target if it differs (on close). """ - class Writer: + class Writer(object): """Wrapper around file which only covers the target if it differs.""" def __init__(self): # Pick temporary file. @@ -418,6 +425,8 @@ def GetFlavor(params): return 'freebsd' if sys.platform.startswith('openbsd'): return 'openbsd' + if sys.platform.startswith('netbsd'): + return 'netbsd' if sys.platform.startswith('aix'): return 'aix' @@ -548,7 +557,7 @@ class CycleError(Exception): def TopologicallySorted(graph, get_edges): - """Topologically sort based on a user provided edge definition. + r"""Topologically sort based on a user provided edge definition. Args: graph: A list of node names. @@ -586,3 +595,14 @@ def TopologicallySorted(graph, get_edges): for node in sorted(graph): Visit(node) return ordered_nodes + +def CrossCompileRequested(): + # TODO: figure out how to not build extra host objects in the + # non-cross-compile case when this is enabled, and enable unconditionally. + return (os.environ.get('GYP_CROSSCOMPILE') or + os.environ.get('AR_host') or + os.environ.get('CC_host') or + os.environ.get('CXX_host') or + os.environ.get('AR_target') or + os.environ.get('CC_target') or + os.environ.get('CXX_target')) diff --git a/deps/gyp/pylib/gyp/flock_tool.py b/deps/gyp/pylib/gyp/flock_tool.py index 3e7efff26e..b38d8660f7 100755 --- a/deps/gyp/pylib/gyp/flock_tool.py +++ b/deps/gyp/pylib/gyp/flock_tool.py @@ -40,7 +40,12 @@ class FlockTool(object): # with EBADF, that's why we use this F_SETLK # hack instead. fd = os.open(lockfile, os.O_WRONLY|os.O_NOCTTY|os.O_CREAT, 0666) - op = struct.pack('hhllhhl', fcntl.F_WRLCK, 0, 0, 0, 0, 0, 0) + if sys.platform.startswith('aix'): + # Python on AIX is compiled with LARGEFILE support, which changes the + # struct size. + op = struct.pack('hhIllqq', fcntl.F_WRLCK, 0, 0, 0, 0, 0, 0) + else: + op = struct.pack('hhllhhl', fcntl.F_WRLCK, 0, 0, 0, 0, 0, 0) fcntl.fcntl(fd, fcntl.F_SETLK, op) return subprocess.call(cmd_list) diff --git a/deps/gyp/pylib/gyp/generator/analyzer.py b/deps/gyp/pylib/gyp/generator/analyzer.py new file mode 100644 index 0000000000..921c1a6b71 --- /dev/null +++ b/deps/gyp/pylib/gyp/generator/analyzer.py @@ -0,0 +1,741 @@ +# Copyright (c) 2014 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. + +""" +This script is intended for use as a GYP_GENERATOR. It takes as input (by way of +the generator flag config_path) the path of a json file that dictates the files +and targets to search for. The following keys are supported: +files: list of paths (relative) of the files to search for. +test_targets: unqualified target names to search for. Any target in this list +that depends upon a file in |files| is output regardless of the type of target +or chain of dependencies. +additional_compile_targets: Unqualified targets to search for in addition to +test_targets. Targets in the combined list that depend upon a file in |files| +are not necessarily output. For example, if the target is of type none then the +target is not output (but one of the descendants of the target will be). + +The following is output: +error: only supplied if there is an error. +compile_targets: minimal set of targets that directly or indirectly (for + targets of type none) depend on the files in |files| and is one of the + supplied targets or a target that one of the supplied targets depends on. + The expectation is this set of targets is passed into a build step. This list + always contains the output of test_targets as well. +test_targets: set of targets from the supplied |test_targets| that either + directly or indirectly depend upon a file in |files|. This list if useful + if additional processing needs to be done for certain targets after the + build, such as running tests. +status: outputs one of three values: none of the supplied files were found, + one of the include files changed so that it should be assumed everything + changed (in this case test_targets and compile_targets are not output) or at + least one file was found. +invalid_targets: list of supplied targets that were not found. + +Example: +Consider a graph like the following: + A D + / \ +B C +A depends upon both B and C, A is of type none and B and C are executables. +D is an executable, has no dependencies and nothing depends on it. +If |additional_compile_targets| = ["A"], |test_targets| = ["B", "C"] and +files = ["b.cc", "d.cc"] (B depends upon b.cc and D depends upon d.cc), then +the following is output: +|compile_targets| = ["B"] B must built as it depends upon the changed file b.cc +and the supplied target A depends upon it. A is not output as a build_target +as it is of type none with no rules and actions. +|test_targets| = ["B"] B directly depends upon the change file b.cc. + +Even though the file d.cc, which D depends upon, has changed D is not output +as it was not supplied by way of |additional_compile_targets| or |test_targets|. + +If the generator flag analyzer_output_path is specified, output is written +there. Otherwise output is written to stdout. + +In Gyp the "all" target is shorthand for the root targets in the files passed +to gyp. For example, if file "a.gyp" contains targets "a1" and +"a2", and file "b.gyp" contains targets "b1" and "b2" and "a2" has a dependency +on "b2" and gyp is supplied "a.gyp" then "all" consists of "a1" and "a2". +Notice that "b1" and "b2" are not in the "all" target as "b.gyp" was not +directly supplied to gyp. OTOH if both "a.gyp" and "b.gyp" are supplied to gyp +then the "all" target includes "b1" and "b2". +""" + +import gyp.common +import gyp.ninja_syntax as ninja_syntax +import json +import os +import posixpath +import sys + +debug = False + +found_dependency_string = 'Found dependency' +no_dependency_string = 'No dependencies' +# Status when it should be assumed that everything has changed. +all_changed_string = 'Found dependency (all)' + +# MatchStatus is used indicate if and how a target depends upon the supplied +# sources. +# The target's sources contain one of the supplied paths. +MATCH_STATUS_MATCHES = 1 +# The target has a dependency on another target that contains one of the +# supplied paths. +MATCH_STATUS_MATCHES_BY_DEPENDENCY = 2 +# The target's sources weren't in the supplied paths and none of the target's +# dependencies depend upon a target that matched. +MATCH_STATUS_DOESNT_MATCH = 3 +# The target doesn't contain the source, but the dependent targets have not yet +# been visited to determine a more specific status yet. +MATCH_STATUS_TBD = 4 + +generator_supports_multiple_toolsets = gyp.common.CrossCompileRequested() + +generator_wants_static_library_dependencies_adjusted = False + +generator_default_variables = { +} +for dirname in ['INTERMEDIATE_DIR', 'SHARED_INTERMEDIATE_DIR', 'PRODUCT_DIR', + 'LIB_DIR', 'SHARED_LIB_DIR']: + generator_default_variables[dirname] = '!!!' + +for unused in ['RULE_INPUT_PATH', 'RULE_INPUT_ROOT', 'RULE_INPUT_NAME', + 'RULE_INPUT_DIRNAME', 'RULE_INPUT_EXT', + 'EXECUTABLE_PREFIX', 'EXECUTABLE_SUFFIX', + 'STATIC_LIB_PREFIX', 'STATIC_LIB_SUFFIX', + 'SHARED_LIB_PREFIX', 'SHARED_LIB_SUFFIX', + 'CONFIGURATION_NAME']: + generator_default_variables[unused] = '' + + +def _ToGypPath(path): + """Converts a path to the format used by gyp.""" + if os.sep == '\\' and os.altsep == '/': + return path.replace('\\', '/') + return path + + +def _ResolveParent(path, base_path_components): + """Resolves |path|, which starts with at least one '../'. Returns an empty + string if the path shouldn't be considered. See _AddSources() for a + description of |base_path_components|.""" + depth = 0 + while path.startswith('../'): + depth += 1 + path = path[3:] + # Relative includes may go outside the source tree. For example, an action may + # have inputs in /usr/include, which are not in the source tree. + if depth > len(base_path_components): + return '' + if depth == len(base_path_components): + return path + return '/'.join(base_path_components[0:len(base_path_components) - depth]) + \ + '/' + path + + +def _AddSources(sources, base_path, base_path_components, result): + """Extracts valid sources from |sources| and adds them to |result|. Each + source file is relative to |base_path|, but may contain '..'. To make + resolving '..' easier |base_path_components| contains each of the + directories in |base_path|. Additionally each source may contain variables. + Such sources are ignored as it is assumed dependencies on them are expressed + and tracked in some other means.""" + # NOTE: gyp paths are always posix style. + for source in sources: + if not len(source) or source.startswith('!!!') or source.startswith('$'): + continue + # variable expansion may lead to //. + org_source = source + source = source[0] + source[1:].replace('//', '/') + if source.startswith('../'): + source = _ResolveParent(source, base_path_components) + if len(source): + result.append(source) + continue + result.append(base_path + source) + if debug: + print 'AddSource', org_source, result[len(result) - 1] + + +def _ExtractSourcesFromAction(action, base_path, base_path_components, + results): + if 'inputs' in action: + _AddSources(action['inputs'], base_path, base_path_components, results) + + +def _ToLocalPath(toplevel_dir, path): + """Converts |path| to a path relative to |toplevel_dir|.""" + if path == toplevel_dir: + return '' + if path.startswith(toplevel_dir + '/'): + return path[len(toplevel_dir) + len('/'):] + return path + + +def _ExtractSources(target, target_dict, toplevel_dir): + # |target| is either absolute or relative and in the format of the OS. Gyp + # source paths are always posix. Convert |target| to a posix path relative to + # |toplevel_dir_|. This is done to make it easy to build source paths. + base_path = posixpath.dirname(_ToLocalPath(toplevel_dir, _ToGypPath(target))) + base_path_components = base_path.split('/') + + # Add a trailing '/' so that _AddSources() can easily build paths. + if len(base_path): + base_path += '/' + + if debug: + print 'ExtractSources', target, base_path + + results = [] + if 'sources' in target_dict: + _AddSources(target_dict['sources'], base_path, base_path_components, + results) + # Include the inputs from any actions. Any changes to these affect the + # resulting output. + if 'actions' in target_dict: + for action in target_dict['actions']: + _ExtractSourcesFromAction(action, base_path, base_path_components, + results) + if 'rules' in target_dict: + for rule in target_dict['rules']: + _ExtractSourcesFromAction(rule, base_path, base_path_components, results) + + return results + + +class Target(object): + """Holds information about a particular target: + deps: set of Targets this Target depends upon. This is not recursive, only the + direct dependent Targets. + match_status: one of the MatchStatus values. + back_deps: set of Targets that have a dependency on this Target. + visited: used during iteration to indicate whether we've visited this target. + This is used for two iterations, once in building the set of Targets and + again in _GetBuildTargets(). + name: fully qualified name of the target. + requires_build: True if the target type is such that it needs to be built. + See _DoesTargetTypeRequireBuild for details. + added_to_compile_targets: used when determining if the target was added to the + set of targets that needs to be built. + in_roots: true if this target is a descendant of one of the root nodes. + is_executable: true if the type of target is executable. + is_static_library: true if the type of target is static_library. + is_or_has_linked_ancestor: true if the target does a link (eg executable), or + if there is a target in back_deps that does a link.""" + def __init__(self, name): + self.deps = set() + self.match_status = MATCH_STATUS_TBD + self.back_deps = set() + self.name = name + # TODO(sky): I don't like hanging this off Target. This state is specific + # to certain functions and should be isolated there. + self.visited = False + self.requires_build = False + self.added_to_compile_targets = False + self.in_roots = False + self.is_executable = False + self.is_static_library = False + self.is_or_has_linked_ancestor = False + + +class Config(object): + """Details what we're looking for + files: set of files to search for + targets: see file description for details.""" + def __init__(self): + self.files = [] + self.targets = set() + self.additional_compile_target_names = set() + self.test_target_names = set() + + def Init(self, params): + """Initializes Config. This is a separate method as it raises an exception + if there is a parse error.""" + generator_flags = params.get('generator_flags', {}) + config_path = generator_flags.get('config_path', None) + if not config_path: + return + try: + f = open(config_path, 'r') + config = json.load(f) + f.close() + except IOError: + raise Exception('Unable to open file ' + config_path) + except ValueError as e: + raise Exception('Unable to parse config file ' + config_path + str(e)) + if not isinstance(config, dict): + raise Exception('config_path must be a JSON file containing a dictionary') + self.files = config.get('files', []) + self.additional_compile_target_names = set( + config.get('additional_compile_targets', [])) + self.test_target_names = set(config.get('test_targets', [])) + + +def _WasBuildFileModified(build_file, data, files, toplevel_dir): + """Returns true if the build file |build_file| is either in |files| or + one of the files included by |build_file| is in |files|. |toplevel_dir| is + the root of the source tree.""" + if _ToLocalPath(toplevel_dir, _ToGypPath(build_file)) in files: + if debug: + print 'gyp file modified', build_file + return True + + # First element of included_files is the file itself. + if len(data[build_file]['included_files']) <= 1: + return False + + for include_file in data[build_file]['included_files'][1:]: + # |included_files| are relative to the directory of the |build_file|. + rel_include_file = \ + _ToGypPath(gyp.common.UnrelativePath(include_file, build_file)) + if _ToLocalPath(toplevel_dir, rel_include_file) in files: + if debug: + print 'included gyp file modified, gyp_file=', build_file, \ + 'included file=', rel_include_file + return True + return False + + +def _GetOrCreateTargetByName(targets, target_name): + """Creates or returns the Target at targets[target_name]. If there is no + Target for |target_name| one is created. Returns a tuple of whether a new + Target was created and the Target.""" + if target_name in targets: + return False, targets[target_name] + target = Target(target_name) + targets[target_name] = target + return True, target + + +def _DoesTargetTypeRequireBuild(target_dict): + """Returns true if the target type is such that it needs to be built.""" + # If a 'none' target has rules or actions we assume it requires a build. + return bool(target_dict['type'] != 'none' or + target_dict.get('actions') or target_dict.get('rules')) + + +def _GenerateTargets(data, target_list, target_dicts, toplevel_dir, files, + build_files): + """Returns a tuple of the following: + . A dictionary mapping from fully qualified name to Target. + . A list of the targets that have a source file in |files|. + . Targets that constitute the 'all' target. See description at top of file + for details on the 'all' target. + This sets the |match_status| of the targets that contain any of the source + files in |files| to MATCH_STATUS_MATCHES. + |toplevel_dir| is the root of the source tree.""" + # Maps from target name to Target. + name_to_target = {} + + # Targets that matched. + matching_targets = [] + + # Queue of targets to visit. + targets_to_visit = target_list[:] + + # Maps from build file to a boolean indicating whether the build file is in + # |files|. + build_file_in_files = {} + + # Root targets across all files. + roots = set() + + # Set of Targets in |build_files|. + build_file_targets = set() + + while len(targets_to_visit) > 0: + target_name = targets_to_visit.pop() + created_target, target = _GetOrCreateTargetByName(name_to_target, + target_name) + if created_target: + roots.add(target) + elif target.visited: + continue + + target.visited = True + target.requires_build = _DoesTargetTypeRequireBuild( + target_dicts[target_name]) + target_type = target_dicts[target_name]['type'] + target.is_executable = target_type == 'executable' + target.is_static_library = target_type == 'static_library' + target.is_or_has_linked_ancestor = (target_type == 'executable' or + target_type == 'shared_library') + + build_file = gyp.common.ParseQualifiedTarget(target_name)[0] + if not build_file in build_file_in_files: + build_file_in_files[build_file] = \ + _WasBuildFileModified(build_file, data, files, toplevel_dir) + + if build_file in build_files: + build_file_targets.add(target) + + # If a build file (or any of its included files) is modified we assume all + # targets in the file are modified. + if build_file_in_files[build_file]: + print 'matching target from modified build file', target_name + target.match_status = MATCH_STATUS_MATCHES + matching_targets.append(target) + else: + sources = _ExtractSources(target_name, target_dicts[target_name], + toplevel_dir) + for source in sources: + if _ToGypPath(os.path.normpath(source)) in files: + print 'target', target_name, 'matches', source + target.match_status = MATCH_STATUS_MATCHES + matching_targets.append(target) + break + + # Add dependencies to visit as well as updating back pointers for deps. + for dep in target_dicts[target_name].get('dependencies', []): + targets_to_visit.append(dep) + + created_dep_target, dep_target = _GetOrCreateTargetByName(name_to_target, + dep) + if not created_dep_target: + roots.discard(dep_target) + + target.deps.add(dep_target) + dep_target.back_deps.add(target) + + return name_to_target, matching_targets, roots & build_file_targets + + +def _GetUnqualifiedToTargetMapping(all_targets, to_find): + """Returns a tuple of the following: + . mapping (dictionary) from unqualified name to Target for all the + Targets in |to_find|. + . any target names not found. If this is empty all targets were found.""" + result = {} + if not to_find: + return {}, [] + to_find = set(to_find) + for target_name in all_targets.keys(): + extracted = gyp.common.ParseQualifiedTarget(target_name) + if len(extracted) > 1 and extracted[1] in to_find: + to_find.remove(extracted[1]) + result[extracted[1]] = all_targets[target_name] + if not to_find: + return result, [] + return result, [x for x in to_find] + + +def _DoesTargetDependOnMatchingTargets(target): + """Returns true if |target| or any of its dependencies is one of the + targets containing the files supplied as input to analyzer. This updates + |matches| of the Targets as it recurses. + target: the Target to look for.""" + if target.match_status == MATCH_STATUS_DOESNT_MATCH: + return False + if target.match_status == MATCH_STATUS_MATCHES or \ + target.match_status == MATCH_STATUS_MATCHES_BY_DEPENDENCY: + return True + for dep in target.deps: + if _DoesTargetDependOnMatchingTargets(dep): + target.match_status = MATCH_STATUS_MATCHES_BY_DEPENDENCY + print '\t', target.name, 'matches by dep', dep.name + return True + target.match_status = MATCH_STATUS_DOESNT_MATCH + return False + + +def _GetTargetsDependingOnMatchingTargets(possible_targets): + """Returns the list of Targets in |possible_targets| that depend (either + directly on indirectly) on at least one of the targets containing the files + supplied as input to analyzer. + possible_targets: targets to search from.""" + found = [] + print 'Targets that matched by dependency:' + for target in possible_targets: + if _DoesTargetDependOnMatchingTargets(target): + found.append(target) + return found + + +def _AddCompileTargets(target, roots, add_if_no_ancestor, result): + """Recurses through all targets that depend on |target|, adding all targets + that need to be built (and are in |roots|) to |result|. + roots: set of root targets. + add_if_no_ancestor: If true and there are no ancestors of |target| then add + |target| to |result|. |target| must still be in |roots|. + result: targets that need to be built are added here.""" + if target.visited: + return + + target.visited = True + target.in_roots = target in roots + + for back_dep_target in target.back_deps: + _AddCompileTargets(back_dep_target, roots, False, result) + target.added_to_compile_targets |= back_dep_target.added_to_compile_targets + target.in_roots |= back_dep_target.in_roots + target.is_or_has_linked_ancestor |= ( + back_dep_target.is_or_has_linked_ancestor) + + # Always add 'executable' targets. Even though they may be built by other + # targets that depend upon them it makes detection of what is going to be + # built easier. + # And always add static_libraries that have no dependencies on them from + # linkables. This is necessary as the other dependencies on them may be + # static libraries themselves, which are not compile time dependencies. + if target.in_roots and \ + (target.is_executable or + (not target.added_to_compile_targets and + (add_if_no_ancestor or target.requires_build)) or + (target.is_static_library and add_if_no_ancestor and + not target.is_or_has_linked_ancestor)): + print '\t\tadding to compile targets', target.name, 'executable', \ + target.is_executable, 'added_to_compile_targets', \ + target.added_to_compile_targets, 'add_if_no_ancestor', \ + add_if_no_ancestor, 'requires_build', target.requires_build, \ + 'is_static_library', target.is_static_library, \ + 'is_or_has_linked_ancestor', target.is_or_has_linked_ancestor + result.add(target) + target.added_to_compile_targets = True + + +def _GetCompileTargets(matching_targets, supplied_targets): + """Returns the set of Targets that require a build. + matching_targets: targets that changed and need to be built. + supplied_targets: set of targets supplied to analyzer to search from.""" + result = set() + for target in matching_targets: + print 'finding compile targets for match', target.name + _AddCompileTargets(target, supplied_targets, True, result) + return result + + +def _WriteOutput(params, **values): + """Writes the output, either to stdout or a file is specified.""" + if 'error' in values: + print 'Error:', values['error'] + if 'status' in values: + print values['status'] + if 'targets' in values: + values['targets'].sort() + print 'Supplied targets that depend on changed files:' + for target in values['targets']: + print '\t', target + if 'invalid_targets' in values: + values['invalid_targets'].sort() + print 'The following targets were not found:' + for target in values['invalid_targets']: + print '\t', target + if 'build_targets' in values: + values['build_targets'].sort() + print 'Targets that require a build:' + for target in values['build_targets']: + print '\t', target + if 'compile_targets' in values: + values['compile_targets'].sort() + print 'Targets that need to be built:' + for target in values['compile_targets']: + print '\t', target + if 'test_targets' in values: + values['test_targets'].sort() + print 'Test targets:' + for target in values['test_targets']: + print '\t', target + + output_path = params.get('generator_flags', {}).get( + 'analyzer_output_path', None) + if not output_path: + print json.dumps(values) + return + try: + f = open(output_path, 'w') + f.write(json.dumps(values) + '\n') + f.close() + except IOError as e: + print 'Error writing to output file', output_path, str(e) + + +def _WasGypIncludeFileModified(params, files): + """Returns true if one of the files in |files| is in the set of included + files.""" + if params['options'].includes: + for include in params['options'].includes: + if _ToGypPath(os.path.normpath(include)) in files: + print 'Include file modified, assuming all changed', include + return True + return False + + +def _NamesNotIn(names, mapping): + """Returns a list of the values in |names| that are not in |mapping|.""" + return [name for name in names if name not in mapping] + + +def _LookupTargets(names, mapping): + """Returns a list of the mapping[name] for each value in |names| that is in + |mapping|.""" + return [mapping[name] for name in names if name in mapping] + + +def CalculateVariables(default_variables, params): + """Calculate additional variables for use in the build (called by gyp).""" + flavor = gyp.common.GetFlavor(params) + if flavor == 'mac': + default_variables.setdefault('OS', 'mac') + elif flavor == 'win': + default_variables.setdefault('OS', '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', []) + + gyp.msvs_emulation.CalculateCommonVariables(default_variables, params) + else: + operating_system = flavor + if flavor == 'android': + operating_system = 'linux' # Keep this legacy behavior for now. + default_variables.setdefault('OS', operating_system) + + +class TargetCalculator(object): + """Calculates the matching test_targets and matching compile_targets.""" + def __init__(self, files, additional_compile_target_names, test_target_names, + data, target_list, target_dicts, toplevel_dir, build_files): + self._additional_compile_target_names = set(additional_compile_target_names) + self._test_target_names = set(test_target_names) + self._name_to_target, self._changed_targets, self._root_targets = ( + _GenerateTargets(data, target_list, target_dicts, toplevel_dir, + frozenset(files), build_files)) + self._unqualified_mapping, self.invalid_targets = ( + _GetUnqualifiedToTargetMapping(self._name_to_target, + self._supplied_target_names_no_all())) + + def _supplied_target_names(self): + return self._additional_compile_target_names | self._test_target_names + + def _supplied_target_names_no_all(self): + """Returns the supplied test targets without 'all'.""" + result = self._supplied_target_names(); + result.discard('all') + return result + + def is_build_impacted(self): + """Returns true if the supplied files impact the build at all.""" + return self._changed_targets + + def find_matching_test_target_names(self): + """Returns the set of output test targets.""" + assert self.is_build_impacted() + # Find the test targets first. 'all' is special cased to mean all the + # root targets. To deal with all the supplied |test_targets| are expanded + # to include the root targets during lookup. If any of the root targets + # match, we remove it and replace it with 'all'. + test_target_names_no_all = set(self._test_target_names) + test_target_names_no_all.discard('all') + test_targets_no_all = _LookupTargets(test_target_names_no_all, + self._unqualified_mapping) + test_target_names_contains_all = 'all' in self._test_target_names + if test_target_names_contains_all: + test_targets = [x for x in (set(test_targets_no_all) | + set(self._root_targets))] + else: + test_targets = [x for x in test_targets_no_all] + print 'supplied test_targets' + for target_name in self._test_target_names: + print '\t', target_name + print 'found test_targets' + for target in test_targets: + print '\t', target.name + print 'searching for matching test targets' + matching_test_targets = _GetTargetsDependingOnMatchingTargets(test_targets) + matching_test_targets_contains_all = (test_target_names_contains_all and + set(matching_test_targets) & + set(self._root_targets)) + if matching_test_targets_contains_all: + # Remove any of the targets for all that were not explicitly supplied, + # 'all' is subsequentely added to the matching names below. + matching_test_targets = [x for x in (set(matching_test_targets) & + set(test_targets_no_all))] + print 'matched test_targets' + for target in matching_test_targets: + print '\t', target.name + matching_target_names = [gyp.common.ParseQualifiedTarget(target.name)[1] + for target in matching_test_targets] + if matching_test_targets_contains_all: + matching_target_names.append('all') + print '\tall' + return matching_target_names + + def find_matching_compile_target_names(self): + """Returns the set of output compile targets.""" + assert self.is_build_impacted(); + # Compile targets are found by searching up from changed targets. + # Reset the visited status for _GetBuildTargets. + for target in self._name_to_target.itervalues(): + target.visited = False + + supplied_targets = _LookupTargets(self._supplied_target_names_no_all(), + self._unqualified_mapping) + if 'all' in self._supplied_target_names(): + supplied_targets = [x for x in (set(supplied_targets) | + set(self._root_targets))] + print 'Supplied test_targets & compile_targets' + for target in supplied_targets: + print '\t', target.name + print 'Finding compile targets' + compile_targets = _GetCompileTargets(self._changed_targets, + supplied_targets) + return [gyp.common.ParseQualifiedTarget(target.name)[1] + for target in compile_targets] + + +def GenerateOutput(target_list, target_dicts, data, params): + """Called by gyp as the final stage. Outputs results.""" + config = Config() + try: + config.Init(params) + + if not config.files: + raise Exception('Must specify files to analyze via config_path generator ' + 'flag') + + toplevel_dir = _ToGypPath(os.path.abspath(params['options'].toplevel_dir)) + if debug: + print 'toplevel_dir', toplevel_dir + + if _WasGypIncludeFileModified(params, config.files): + result_dict = { 'status': all_changed_string, + 'test_targets': list(config.test_target_names), + 'compile_targets': list( + config.additional_compile_target_names | + config.test_target_names) } + _WriteOutput(params, **result_dict) + return + + calculator = TargetCalculator(config.files, + config.additional_compile_target_names, + config.test_target_names, data, + target_list, target_dicts, toplevel_dir, + params['build_files']) + if not calculator.is_build_impacted(): + result_dict = { 'status': no_dependency_string, + 'test_targets': [], + 'compile_targets': [] } + if calculator.invalid_targets: + result_dict['invalid_targets'] = calculator.invalid_targets + _WriteOutput(params, **result_dict) + return + + test_target_names = calculator.find_matching_test_target_names() + compile_target_names = calculator.find_matching_compile_target_names() + found_at_least_one_target = compile_target_names or test_target_names + result_dict = { 'test_targets': test_target_names, + 'status': found_dependency_string if + found_at_least_one_target else no_dependency_string, + 'compile_targets': list( + set(compile_target_names) | + set(test_target_names)) } + if calculator.invalid_targets: + result_dict['invalid_targets'] = calculator.invalid_targets + _WriteOutput(params, **result_dict) + + except Exception as e: + _WriteOutput(params, error=str(e)) diff --git a/deps/gyp/pylib/gyp/generator/android.py b/deps/gyp/pylib/gyp/generator/android.py deleted file mode 100644 index 39884749b1..0000000000 --- a/deps/gyp/pylib/gyp/generator/android.py +++ /dev/null @@ -1,1090 +0,0 @@ -# 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. - -# Notes: -# -# This generates makefiles suitable for inclusion into the Android build system -# via an Android.mk file. It is based on make.py, the standard makefile -# generator. -# -# The code below generates a separate .mk file for each target, but -# all are sourced by the top-level GypAndroid.mk. This means that all -# variables in .mk-files clobber one another, and furthermore that any -# variables set potentially clash with other Android build system variables. -# Try to avoid setting global variables where possible. - -import gyp -import gyp.common -import gyp.generator.make as make # Reuse global functions from make backend. -import os -import re -import subprocess - -generator_default_variables = { - 'OS': 'android', - 'EXECUTABLE_PREFIX': '', - 'EXECUTABLE_SUFFIX': '', - 'STATIC_LIB_PREFIX': 'lib', - 'SHARED_LIB_PREFIX': 'lib', - 'STATIC_LIB_SUFFIX': '.a', - 'SHARED_LIB_SUFFIX': '.so', - 'INTERMEDIATE_DIR': '$(gyp_intermediate_dir)', - 'SHARED_INTERMEDIATE_DIR': '$(gyp_shared_intermediate_dir)', - 'PRODUCT_DIR': '$(gyp_shared_intermediate_dir)', - 'SHARED_LIB_DIR': '$(builddir)/lib.$(TOOLSET)', - 'LIB_DIR': '$(obj).$(TOOLSET)', - 'RULE_INPUT_ROOT': '%(INPUT_ROOT)s', # This gets expanded by Python. - 'RULE_INPUT_DIRNAME': '%(INPUT_DIRNAME)s', # This gets expanded by Python. - 'RULE_INPUT_PATH': '$(RULE_SOURCES)', - 'RULE_INPUT_EXT': '$(suffix $<)', - 'RULE_INPUT_NAME': '$(notdir $<)', - 'CONFIGURATION_NAME': '$(GYP_CONFIGURATION)', -} - -# 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 = [] - - -ALL_MODULES_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. -gyp_all_modules: -""" - -header = """\ -# This file is generated by gyp; do not edit. - -""" - -android_standard_include_paths = set([ - # JNI_H_INCLUDE in build/core/binary.mk - 'dalvik/libnativehelper/include/nativehelper', - # from SRC_HEADERS in build/core/config.mk - 'system/core/include', - 'hardware/libhardware/include', - 'hardware/libhardware_legacy/include', - 'hardware/ril/include', - 'dalvik/libnativehelper/include', - 'frameworks/native/include', - 'frameworks/native/opengl/include', - 'frameworks/base/include', - 'frameworks/base/opengl/include', - 'frameworks/base/native/include', - 'external/skia/include', - # TARGET_C_INCLUDES in build/core/combo/TARGET_linux-arm.mk - 'bionic/libc/arch-arm/include', - 'bionic/libc/include', - 'bionic/libstdc++/include', - 'bionic/libc/kernel/common', - 'bionic/libc/kernel/arch-arm', - 'bionic/libm/include', - 'bionic/libm/include/arm', - 'bionic/libthread_db/include', - ]) - - -# Map gyp target types to Android module classes. -MODULE_CLASSES = { - 'static_library': 'STATIC_LIBRARIES', - 'shared_library': 'SHARED_LIBRARIES', - 'executable': 'EXECUTABLES', -} - - -def IsCPPExtension(ext): - return make.COMPILABLE_EXTENSIONS.get(ext) == 'cxx' - - -def Sourceify(path): - """Convert a path to its source directory form. The Android backend does not - support options.generator_output, so this function is a noop.""" - return path - - -# Map from qualified target to path to output. -# For Android, the target of these maps is a tuple ('static', 'modulename'), -# ('dynamic', 'modulename'), or ('path', 'some/path') instead of a string, -# since we link by module. -target_outputs = {} -# Map from qualified target to any linkable output. A subset -# of target_outputs. E.g. when mybinary depends on liba, we want to -# include liba in the linker line; when otherbinary depends on -# mybinary, we just want to build mybinary first. -target_link_deps = {} - - -class AndroidMkWriter(object): - """AndroidMkWriter packages up the writing of one target-specific Android.mk. - - Its only real entry point is Write(), and is mostly used for namespacing. - """ - - def __init__(self, android_top_dir): - self.android_top_dir = android_top_dir - - def Write(self, qualified_target, relative_target, base_path, output_filename, - spec, configs, part_of_all, write_alias_target): - """The main entry point: writes a .mk file for a single target. - - Arguments: - qualified_target: target we're generating - relative_target: qualified target name relative to the root - base_path: path relative to source root we're building in, used to resolve - target-relative paths - output_filename: output .mk file name to write - spec, configs: gyp info - part_of_all: flag indicating this target is part of 'all' - write_alias_target: flag indicating whether to create short aliases for - this target - """ - gyp.common.EnsureDirExists(output_filename) - - self.fp = open(output_filename, 'w') - - self.fp.write(header) - - self.qualified_target = qualified_target - self.relative_target = relative_target - self.path = base_path - self.target = spec['target_name'] - self.type = spec['type'] - self.toolset = spec['toolset'] - - deps, link_deps = self.ComputeDeps(spec) - - # Some of the generation below can add extra output, sources, or - # link dependencies. All of the out params of the functions that - # follow use names like extra_foo. - extra_outputs = [] - extra_sources = [] - - 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) - - # Standard header. - self.WriteLn('include $(CLEAR_VARS)\n') - - # Module class and name. - self.WriteLn('LOCAL_MODULE_CLASS := ' + self.android_class) - self.WriteLn('LOCAL_MODULE := ' + self.android_module) - # Only emit LOCAL_MODULE_STEM if it's different to LOCAL_MODULE. - # The library module classes fail if the stem is set. ComputeOutputParts - # makes sure that stem == modulename in these cases. - if self.android_stem != self.android_module: - self.WriteLn('LOCAL_MODULE_STEM := ' + self.android_stem) - self.WriteLn('LOCAL_MODULE_SUFFIX := ' + self.android_suffix) - self.WriteLn('LOCAL_MODULE_TAGS := optional') - if self.toolset == 'host': - self.WriteLn('LOCAL_IS_HOST_MODULE := true') - else: - self.WriteLn('LOCAL_MODULE_TARGET_ARCH := ' - '$(TARGET_$(GYP_VAR_PREFIX)ARCH)') - - # Grab output directories; needed for Actions and Rules. - if self.toolset == 'host': - self.WriteLn('gyp_intermediate_dir := ' - '$(call local-intermediates-dir)') - else: - self.WriteLn('gyp_intermediate_dir := ' - '$(call local-intermediates-dir,,$(GYP_VAR_PREFIX))') - self.WriteLn('gyp_shared_intermediate_dir := ' - '$(call intermediates-dir-for,GYP,shared,,,$(GYP_VAR_PREFIX))') - self.WriteLn() - - # List files this target depends on so that actions/rules/copies/sources - # can depend on the list. - # TODO: doesn't pull in things through transitive link deps; needed? - target_dependencies = [x[1] for x in deps if x[0] == 'path'] - self.WriteLn('# Make sure our deps are built first.') - self.WriteList(target_dependencies, 'GYP_TARGET_DEPENDENCIES', - local_pathify=True) - - # Actions must come first, since they can generate more OBJs for use below. - if 'actions' in spec: - self.WriteActions(spec['actions'], extra_sources, extra_outputs) - - # Rules must be early like actions. - if 'rules' in spec: - self.WriteRules(spec['rules'], extra_sources, extra_outputs) - - if 'copies' in spec: - self.WriteCopies(spec['copies'], extra_outputs) - - # GYP generated outputs. - self.WriteList(extra_outputs, 'GYP_GENERATED_OUTPUTS', local_pathify=True) - - # Set LOCAL_ADDITIONAL_DEPENDENCIES so that Android's build rules depend - # on both our dependency targets and our generated files. - self.WriteLn('# Make sure our deps and generated files are built first.') - self.WriteLn('LOCAL_ADDITIONAL_DEPENDENCIES := $(GYP_TARGET_DEPENDENCIES) ' - '$(GYP_GENERATED_OUTPUTS)') - self.WriteLn() - - # Sources. - if spec.get('sources', []) or extra_sources: - self.WriteSources(spec, configs, extra_sources) - - self.WriteTarget(spec, configs, deps, link_deps, part_of_all, - write_alias_target) - - # Update global list of target outputs, used in dependency tracking. - target_outputs[qualified_target] = ('path', self.output_binary) - - # Update global list of link dependencies. - if self.type == 'static_library': - target_link_deps[qualified_target] = ('static', self.android_module) - elif self.type == 'shared_library': - target_link_deps[qualified_target] = ('shared', self.android_module) - - self.fp.close() - return self.android_module - - - def WriteActions(self, actions, extra_sources, extra_outputs): - """Write Makefile code for any 'actions' from the gyp input. - - extra_sources: a list that will be filled in with newly generated source - files, if any - extra_outputs: a list that will be filled in with any outputs of these - actions (used to make other pieces dependent on these - actions) - """ - for action in actions: - name = make.StringToMakefileVariable('%s_%s' % (self.relative_target, - action['action_name'])) - self.WriteLn('### Rules for action "%s":' % action['action_name']) - inputs = action['inputs'] - outputs = action['outputs'] - - # Build up a list of outputs. - # Collect the output dirs we'll need. - dirs = set() - for out in outputs: - if not out.startswith('$'): - print ('WARNING: Action for target "%s" writes output to local path ' - '"%s".' % (self.target, out)) - dir = os.path.split(out)[0] - if dir: - dirs.add(dir) - if int(action.get('process_outputs_as_sources', False)): - extra_sources += outputs - - # Prepare the actual command. - command = gyp.common.EncodePOSIXShellList(action['action']) - if 'message' in action: - quiet_cmd = 'Gyp action: %s ($@)' % action['message'] - else: - quiet_cmd = 'Gyp action: %s ($@)' % name - if len(dirs) > 0: - command = 'mkdir -p %s' % ' '.join(dirs) + '; ' + command - - cd_action = 'cd $(gyp_local_path)/%s; ' % self.path - command = cd_action + command - - # The makefile rules are all relative to the top dir, but the gyp actions - # are defined relative to their containing dir. This replaces the gyp_* - # variables for the action rule with an absolute version so that the - # output goes in the right place. - # Only write the gyp_* rules for the "primary" output (:1); - # it's superfluous for the "extra outputs", and this avoids accidentally - # writing duplicate dummy rules for those outputs. - main_output = make.QuoteSpaces(self.LocalPathify(outputs[0])) - self.WriteLn('%s: gyp_local_path := $(LOCAL_PATH)' % main_output) - self.WriteLn('%s: gyp_var_prefix := $(GYP_VAR_PREFIX)' % main_output) - self.WriteLn('%s: gyp_intermediate_dir := ' - '$(abspath $(gyp_intermediate_dir))' % main_output) - self.WriteLn('%s: gyp_shared_intermediate_dir := ' - '$(abspath $(gyp_shared_intermediate_dir))' % main_output) - - # Android's envsetup.sh adds a number of directories to the path including - # the built host binary directory. This causes actions/rules invoked by - # gyp to sometimes use these instead of system versions, e.g. bison. - # The built host binaries may not be suitable, and can cause errors. - # So, we remove them from the PATH using the ANDROID_BUILD_PATHS variable - # set by envsetup. - self.WriteLn('%s: export PATH := $(subst $(ANDROID_BUILD_PATHS),,$(PATH))' - % main_output) - - for input in inputs: - assert ' ' not in input, ( - "Spaces in action input filenames not supported (%s)" % input) - for output in outputs: - assert ' ' not in output, ( - "Spaces in action output filenames not supported (%s)" % output) - - self.WriteLn('%s: %s $(GYP_TARGET_DEPENDENCIES)' % - (main_output, ' '.join(map(self.LocalPathify, inputs)))) - self.WriteLn('\t@echo "%s"' % quiet_cmd) - self.WriteLn('\t$(hide)%s\n' % command) - for output in outputs[1:]: - # Make each output depend on the main output, with an empty command - # to force make to notice that the mtime has changed. - self.WriteLn('%s: %s ;' % (self.LocalPathify(output), main_output)) - - extra_outputs += outputs - self.WriteLn() - - self.WriteLn() - - - def WriteRules(self, rules, extra_sources, extra_outputs): - """Write Makefile code for any 'rules' from the gyp input. - - extra_sources: a list that will be filled in with newly generated source - files, if any - extra_outputs: a list that will be filled in with any outputs of these - rules (used to make other pieces dependent on these rules) - """ - if len(rules) == 0: - return - - for rule in rules: - if len(rule.get('rule_sources', [])) == 0: - continue - name = make.StringToMakefileVariable('%s_%s' % (self.relative_target, - rule['rule_name'])) - self.WriteLn('\n### Generated for rule "%s":' % name) - self.WriteLn('# "%s":' % rule) - - inputs = rule.get('inputs') - for rule_source in rule.get('rule_sources', []): - (rule_source_dirname, rule_source_basename) = os.path.split(rule_source) - (rule_source_root, rule_source_ext) = \ - os.path.splitext(rule_source_basename) - - outputs = [self.ExpandInputRoot(out, rule_source_root, - rule_source_dirname) - for out in rule['outputs']] - - dirs = set() - for out in outputs: - if not out.startswith('$'): - print ('WARNING: Rule for target %s writes output to local path %s' - % (self.target, out)) - dir = os.path.dirname(out) - if dir: - dirs.add(dir) - extra_outputs += outputs - if int(rule.get('process_outputs_as_sources', False)): - extra_sources.extend(outputs) - - components = [] - for component in rule['action']: - component = self.ExpandInputRoot(component, rule_source_root, - rule_source_dirname) - if '$(RULE_SOURCES)' in component: - component = component.replace('$(RULE_SOURCES)', - rule_source) - components.append(component) - - command = gyp.common.EncodePOSIXShellList(components) - cd_action = 'cd $(gyp_local_path)/%s; ' % self.path - command = cd_action + command - if dirs: - command = 'mkdir -p %s' % ' '.join(dirs) + '; ' + command - - # We set up a rule to build the first output, and then set up - # a rule for each additional output to depend on the first. - outputs = map(self.LocalPathify, outputs) - main_output = outputs[0] - self.WriteLn('%s: gyp_local_path := $(LOCAL_PATH)' % main_output) - self.WriteLn('%s: gyp_var_prefix := $(GYP_VAR_PREFIX)' % main_output) - self.WriteLn('%s: gyp_intermediate_dir := ' - '$(abspath $(gyp_intermediate_dir))' % main_output) - self.WriteLn('%s: gyp_shared_intermediate_dir := ' - '$(abspath $(gyp_shared_intermediate_dir))' % main_output) - - # See explanation in WriteActions. - self.WriteLn('%s: export PATH := ' - '$(subst $(ANDROID_BUILD_PATHS),,$(PATH))' % main_output) - - main_output_deps = self.LocalPathify(rule_source) - if inputs: - main_output_deps += ' ' - main_output_deps += ' '.join([self.LocalPathify(f) for f in inputs]) - - self.WriteLn('%s: %s $(GYP_TARGET_DEPENDENCIES)' % - (main_output, main_output_deps)) - self.WriteLn('\t%s\n' % command) - for output in outputs[1:]: - # Make each output depend on the main output, with an empty command - # to force make to notice that the mtime has changed. - self.WriteLn('%s: %s ;' % (output, main_output)) - self.WriteLn() - - self.WriteLn() - - - def WriteCopies(self, copies, extra_outputs): - """Write Makefile code for any 'copies' from the gyp input. - - extra_outputs: a list that will be filled in with any outputs of this action - (used to make other pieces dependent on this action) - """ - self.WriteLn('### Generated for copy rule.') - - variable = make.StringToMakefileVariable(self.relative_target + '_copies') - outputs = [] - for copy in copies: - for path in copy['files']: - # The Android build system does not allow generation of files into the - # source tree. The destination should start with a variable, which will - # typically be $(gyp_intermediate_dir) or - # $(gyp_shared_intermediate_dir). Note that we can't use an assertion - # because some of the gyp tests depend on this. - if not copy['destination'].startswith('$'): - print ('WARNING: Copy rule for target %s writes output to ' - 'local path %s' % (self.target, copy['destination'])) - - # LocalPathify() calls normpath, stripping trailing slashes. - path = Sourceify(self.LocalPathify(path)) - filename = os.path.split(path)[1] - output = Sourceify(self.LocalPathify(os.path.join(copy['destination'], - filename))) - - self.WriteLn('%s: %s $(GYP_TARGET_DEPENDENCIES) | $(ACP)' % - (output, path)) - self.WriteLn('\t@echo Copying: $@') - self.WriteLn('\t$(hide) mkdir -p $(dir $@)') - self.WriteLn('\t$(hide) $(ACP) -rpf $< $@') - self.WriteLn() - outputs.append(output) - self.WriteLn('%s = %s' % (variable, - ' '.join(map(make.QuoteSpaces, outputs)))) - extra_outputs.append('$(%s)' % variable) - self.WriteLn() - - - def WriteSourceFlags(self, spec, configs): - """Write out the flags and include paths used to compile source files for - the current target. - - Args: - spec, configs: input from gyp. - """ - for configname, config in sorted(configs.iteritems()): - extracted_includes = [] - - self.WriteLn('\n# Flags passed to both C and C++ files.') - cflags, includes_from_cflags = self.ExtractIncludesFromCFlags( - config.get('cflags', []) + config.get('cflags_c', [])) - extracted_includes.extend(includes_from_cflags) - self.WriteList(cflags, 'MY_CFLAGS_%s' % configname) - - self.WriteList(config.get('defines'), 'MY_DEFS_%s' % configname, - prefix='-D', quoter=make.EscapeCppDefine) - - self.WriteLn('\n# Include paths placed before CFLAGS/CPPFLAGS') - includes = list(config.get('include_dirs', [])) - includes.extend(extracted_includes) - includes = map(Sourceify, map(self.LocalPathify, includes)) - includes = self.NormalizeIncludePaths(includes) - self.WriteList(includes, 'LOCAL_C_INCLUDES_%s' % configname) - - self.WriteLn('\n# Flags passed to only C++ (and not C) files.') - self.WriteList(config.get('cflags_cc'), 'LOCAL_CPPFLAGS_%s' % configname) - - self.WriteLn('\nLOCAL_CFLAGS := $(MY_CFLAGS_$(GYP_CONFIGURATION)) ' - '$(MY_DEFS_$(GYP_CONFIGURATION))') - # Undefine ANDROID for host modules - # TODO: the source code should not use macro ANDROID to tell if it's host - # or target module. - if self.toolset == 'host': - self.WriteLn('# Undefine ANDROID for host modules') - self.WriteLn('LOCAL_CFLAGS += -UANDROID') - self.WriteLn('LOCAL_C_INCLUDES := $(GYP_COPIED_SOURCE_ORIGIN_DIRS) ' - '$(LOCAL_C_INCLUDES_$(GYP_CONFIGURATION))') - self.WriteLn('LOCAL_CPPFLAGS := $(LOCAL_CPPFLAGS_$(GYP_CONFIGURATION))') - # Android uses separate flags for assembly file invocations, but gyp expects - # the same CFLAGS to be applied: - self.WriteLn('LOCAL_ASFLAGS := $(LOCAL_CFLAGS)') - - - def WriteSources(self, spec, configs, extra_sources): - """Write Makefile code for any 'sources' from the gyp input. - These are source files necessary to build the current target. - We need to handle shared_intermediate directory source files as - a special case by copying them to the intermediate directory and - treating them as a genereated sources. Otherwise the Android build - rules won't pick them up. - - Args: - spec, configs: input from gyp. - extra_sources: Sources generated from Actions or Rules. - """ - sources = filter(make.Compilable, spec.get('sources', [])) - generated_not_sources = [x for x in extra_sources if not make.Compilable(x)] - extra_sources = filter(make.Compilable, extra_sources) - - # Determine and output the C++ extension used by these sources. - # We simply find the first C++ file and use that extension. - all_sources = sources + extra_sources - local_cpp_extension = '.cpp' - for source in all_sources: - (root, ext) = os.path.splitext(source) - if IsCPPExtension(ext): - local_cpp_extension = ext - break - if local_cpp_extension != '.cpp': - self.WriteLn('LOCAL_CPP_EXTENSION := %s' % local_cpp_extension) - - # We need to move any non-generated sources that are coming from the - # shared intermediate directory out of LOCAL_SRC_FILES and put them - # into LOCAL_GENERATED_SOURCES. We also need to move over any C++ files - # that don't match our local_cpp_extension, since Android will only - # generate Makefile rules for a single LOCAL_CPP_EXTENSION. - local_files = [] - for source in sources: - (root, ext) = os.path.splitext(source) - if '$(gyp_shared_intermediate_dir)' in source: - extra_sources.append(source) - elif '$(gyp_intermediate_dir)' in source: - extra_sources.append(source) - elif IsCPPExtension(ext) and ext != local_cpp_extension: - extra_sources.append(source) - else: - local_files.append(os.path.normpath(os.path.join(self.path, source))) - - # For any generated source, if it is coming from the shared intermediate - # directory then we add a Make rule to copy them to the local intermediate - # directory first. This is because the Android LOCAL_GENERATED_SOURCES - # must be in the local module intermediate directory for the compile rules - # to work properly. If the file has the wrong C++ extension, then we add - # a rule to copy that to intermediates and use the new version. - final_generated_sources = [] - # If a source file gets copied, we still need to add the orginal source - # directory as header search path, for GCC searches headers in the - # directory that contains the source file by default. - origin_src_dirs = [] - for source in extra_sources: - local_file = source - if not '$(gyp_intermediate_dir)/' in local_file: - basename = os.path.basename(local_file) - local_file = '$(gyp_intermediate_dir)/' + basename - (root, ext) = os.path.splitext(local_file) - if IsCPPExtension(ext) and ext != local_cpp_extension: - local_file = root + local_cpp_extension - if local_file != source: - self.WriteLn('%s: %s' % (local_file, self.LocalPathify(source))) - self.WriteLn('\tmkdir -p $(@D); cp $< $@') - origin_src_dirs.append(os.path.dirname(source)) - final_generated_sources.append(local_file) - - # We add back in all of the non-compilable stuff to make sure that the - # make rules have dependencies on them. - final_generated_sources.extend(generated_not_sources) - self.WriteList(final_generated_sources, 'LOCAL_GENERATED_SOURCES') - - origin_src_dirs = gyp.common.uniquer(origin_src_dirs) - origin_src_dirs = map(Sourceify, map(self.LocalPathify, origin_src_dirs)) - self.WriteList(origin_src_dirs, 'GYP_COPIED_SOURCE_ORIGIN_DIRS') - - self.WriteList(local_files, 'LOCAL_SRC_FILES') - - # Write out the flags used to compile the source; this must be done last - # so that GYP_COPIED_SOURCE_ORIGIN_DIRS can be used as an include path. - self.WriteSourceFlags(spec, configs) - - - def ComputeAndroidModule(self, spec): - """Return the Android module name used for a gyp spec. - - We use the complete qualified target name to avoid collisions between - duplicate targets in different directories. We also add a suffix to - 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. - prefix = 'lib_' - else: - prefix = '' - - if spec['toolset'] == 'host': - suffix = '_$(TARGET_$(GYP_VAR_PREFIX)ARCH)_host_gyp' - else: - suffix = '_gyp' - - if self.path: - middle = make.StringToMakefileVariable('%s_%s' % (self.path, self.target)) - else: - middle = make.StringToMakefileVariable(self.target) - - return ''.join([prefix, middle, suffix]) - - - def ComputeOutputParts(self, spec): - """Return the 'output basename' of a gyp spec, split into filename + ext. - - Android libraries must be named the same thing as their module name, - otherwise the linker can't find them, so product_name and so on must be - ignored if we are building a library, and the "lib" prepending is - not done for Android. - """ - assert self.type != 'loadable_module' # TODO: not supported? - - target = spec['target_name'] - target_prefix = '' - target_ext = '' - if self.type == 'static_library': - target = self.ComputeAndroidModule(spec) - target_ext = '.a' - elif self.type == 'shared_library': - target = self.ComputeAndroidModule(spec) - target_ext = '.so' - elif self.type == 'none': - target_ext = '.stamp' - elif self.type != 'executable': - print ("ERROR: What output file should be generated?", - "type", self.type, "target", target) - - if self.type != 'static_library' and self.type != 'shared_library': - target_prefix = spec.get('product_prefix', target_prefix) - target = spec.get('product_name', target) - product_ext = spec.get('product_extension') - if product_ext: - target_ext = '.' + product_ext - - target_stem = target_prefix + target - return (target_stem, target_ext) - - - def ComputeOutputBasename(self, spec): - """Return the 'output basename' of a gyp spec. - - E.g., the loadable module 'foobar' in directory 'baz' will produce - 'libfoobar.so' - """ - return ''.join(self.ComputeOutputParts(spec)) - - - def ComputeOutput(self, spec): - """Return the 'output' (full output path) of a gyp spec. - - E.g., the loadable module 'foobar' in directory 'baz' will produce - '$(obj)/baz/libfoobar.so' - """ - if self.type == 'executable' and self.toolset == 'host': - # We install host executables into shared_intermediate_dir so they can be - # run by gyp rules that refer to PRODUCT_DIR. - path = '$(gyp_shared_intermediate_dir)' - elif self.type == 'shared_library': - if self.toolset == 'host': - path = '$(HOST_OUT_INTERMEDIATE_LIBRARIES)' - else: - path = '$($(GYP_VAR_PREFIX)TARGET_OUT_INTERMEDIATE_LIBRARIES)' - else: - # Other targets just get built into their intermediate dir. - if self.toolset == 'host': - path = '$(call intermediates-dir-for,%s,%s,true)' % (self.android_class, - self.android_module) - else: - path = ('$(call intermediates-dir-for,%s,%s,,,$(GYP_VAR_PREFIX))' - % (self.android_class, self.android_module)) - - assert spec.get('product_dir') is None # TODO: not supported? - return os.path.join(path, self.ComputeOutputBasename(spec)) - - def NormalizeIncludePaths(self, include_paths): - """ Normalize include_paths. - Convert absolute paths to relative to the Android top directory; - filter out include paths that are already brought in by the Android build - system. - - Args: - include_paths: A list of unprocessed include paths. - Returns: - A list of normalized include paths. - """ - normalized = [] - for path in include_paths: - if path[0] == '/': - path = gyp.common.RelativePath(path, self.android_top_dir) - - # Filter out the Android standard search path. - if path not in android_standard_include_paths: - normalized.append(path) - return normalized - - def ExtractIncludesFromCFlags(self, cflags): - """Extract includes "-I..." out from cflags - - Args: - cflags: A list of compiler flags, which may be mixed with "-I.." - Returns: - A tuple of lists: (clean_clfags, include_paths). "-I.." is trimmed. - """ - clean_cflags = [] - include_paths = [] - for flag in cflags: - if flag.startswith('-I'): - include_paths.append(flag[2:]) - else: - clean_cflags.append(flag) - - return (clean_cflags, include_paths) - - def ComputeAndroidLibraryModuleNames(self, libraries): - """Compute the Android module names from libraries, ie spec.get('libraries') - - Args: - libraries: the value of spec.get('libraries') - Returns: - A tuple (static_lib_modules, dynamic_lib_modules) - """ - static_lib_modules = [] - dynamic_lib_modules = [] - for libs in libraries: - # Libs can have multiple words. - for lib in libs.split(): - # Filter the system libraries, which are added by default by the Android - # build system. - if (lib == '-lc' or lib == '-lstdc++' or lib == '-lm' or - lib.endswith('libgcc.a')): - continue - match = re.search(r'([^/]+)\.a$', lib) - if match: - static_lib_modules.append(match.group(1)) - continue - match = re.search(r'([^/]+)\.so$', lib) - if match: - dynamic_lib_modules.append(match.group(1)) - continue - # "-lstlport" -> libstlport - if lib.startswith('-l'): - if lib.endswith('_static'): - static_lib_modules.append('lib' + lib[2:]) - else: - dynamic_lib_modules.append('lib' + lib[2:]) - return (static_lib_modules, dynamic_lib_modules) - - - def ComputeDeps(self, spec): - """Compute the dependencies of a gyp spec. - - Returns a tuple (deps, link_deps), where each is a list of - filenames that will need to be put in front of make for either - building (deps) or linking (link_deps). - """ - deps = [] - link_deps = [] - if 'dependencies' in spec: - deps.extend([target_outputs[dep] for dep in spec['dependencies'] - if target_outputs[dep]]) - for dep in spec['dependencies']: - if dep in target_link_deps: - link_deps.append(target_link_deps[dep]) - deps.extend(link_deps) - return (gyp.common.uniquer(deps), gyp.common.uniquer(link_deps)) - - - def WriteTargetFlags(self, spec, configs, link_deps): - """Write Makefile code to specify the link flags and library dependencies. - - spec, configs: input from gyp. - link_deps: link dependency list; see ComputeDeps() - """ - for configname, config in sorted(configs.iteritems()): - ldflags = list(config.get('ldflags', [])) - self.WriteLn('') - self.WriteList(ldflags, 'LOCAL_LDFLAGS_%s' % configname) - self.WriteLn('\nLOCAL_LDFLAGS := $(LOCAL_LDFLAGS_$(GYP_CONFIGURATION))') - - # Libraries (i.e. -lfoo) - libraries = gyp.common.uniquer(spec.get('libraries', [])) - static_libs, dynamic_libs = self.ComputeAndroidLibraryModuleNames( - libraries) - - # Link dependencies (i.e. libfoo.a, libfoo.so) - static_link_deps = [x[1] for x in link_deps if x[0] == 'static'] - shared_link_deps = [x[1] for x in link_deps if x[0] == 'shared'] - self.WriteLn('') - self.WriteList(static_libs + static_link_deps, - 'LOCAL_STATIC_LIBRARIES') - self.WriteLn('# Enable grouping to fix circular references') - self.WriteLn('LOCAL_GROUP_STATIC_LIBRARIES := true') - self.WriteLn('') - self.WriteList(dynamic_libs + shared_link_deps, - 'LOCAL_SHARED_LIBRARIES') - - - def WriteTarget(self, spec, configs, deps, link_deps, part_of_all, - write_alias_target): - """Write Makefile code to produce the final target of the gyp spec. - - spec, configs: input from gyp. - deps, link_deps: dependency lists; see ComputeDeps() - part_of_all: flag indicating this target is part of 'all' - write_alias_target: flag indicating whether to create short aliases for this - target - """ - self.WriteLn('### Rules for final target.') - - if self.type != 'none': - self.WriteTargetFlags(spec, configs, link_deps) - - # Add to the set of targets which represent the gyp 'all' target. We use the - # name 'gyp_all_modules' as the Android build system doesn't allow the use - # of the Make target 'all' and because 'all_modules' is the equivalent of - # the Make target 'all' on Android. - if part_of_all and write_alias_target: - self.WriteLn('# Add target alias to "gyp_all_modules" target.') - self.WriteLn('.PHONY: gyp_all_modules') - self.WriteLn('gyp_all_modules: %s' % self.android_module) - self.WriteLn('') - - # 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. - if self.target != self.android_module and write_alias_target: - 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 - # NOTE: This has to come last! - modifier = '' - if self.toolset == 'host': - modifier = 'HOST_' - if self.type == 'static_library': - self.WriteLn('include $(BUILD_%sSTATIC_LIBRARY)' % modifier) - elif self.type == 'shared_library': - self.WriteLn('LOCAL_PRELINK_MODULE := false') - self.WriteLn('include $(BUILD_%sSHARED_LIBRARY)' % modifier) - elif self.type == 'executable': - if self.toolset == 'host': - self.WriteLn('LOCAL_MODULE_PATH := $(gyp_shared_intermediate_dir)') - else: - # Don't install target executables for now, as it results in them being - # included in ROM. This can be revisited if there's a reason to install - # them later. - self.WriteLn('LOCAL_UNINSTALLABLE_MODULE := true') - self.WriteLn('include $(BUILD_%sEXECUTABLE)' % modifier) - else: - self.WriteLn('LOCAL_MODULE_PATH := $(PRODUCT_OUT)/gyp_stamp') - self.WriteLn('LOCAL_UNINSTALLABLE_MODULE := true') - if self.toolset == 'target': - self.WriteLn('LOCAL_2ND_ARCH_VAR_PREFIX := $(GYP_VAR_PREFIX)') - self.WriteLn() - self.WriteLn('include $(BUILD_SYSTEM)/base_rules.mk') - self.WriteLn() - self.WriteLn('$(LOCAL_BUILT_MODULE): $(LOCAL_ADDITIONAL_DEPENDENCIES)') - self.WriteLn('\t$(hide) echo "Gyp timestamp: $@"') - self.WriteLn('\t$(hide) mkdir -p $(dir $@)') - self.WriteLn('\t$(hide) touch $@') - if self.toolset == 'target': - self.WriteLn() - self.WriteLn('LOCAL_2ND_ARCH_VAR_PREFIX :=') - - - def WriteList(self, value_list, variable=None, prefix='', - quoter=make.QuoteIfNecessary, local_pathify=False): - """Write a variable definition that is a list of values. - - E.g. WriteList(['a','b'], 'foo', prefix='blah') writes out - foo = blaha blahb - but in a pretty-printed style. - """ - values = '' - if value_list: - value_list = [quoter(prefix + l) for l in value_list] - if local_pathify: - value_list = [self.LocalPathify(l) for l in value_list] - values = ' \\\n\t' + ' \\\n\t'.join(value_list) - self.fp.write('%s :=%s\n\n' % (variable, values)) - - - def WriteLn(self, text=''): - self.fp.write(text + '\n') - - - def LocalPathify(self, path): - """Convert a subdirectory-relative path into a normalized path which starts - with the make variable $(LOCAL_PATH) (i.e. the top of the project tree). - Absolute paths, or paths that contain variables, are just normalized.""" - if '$(' in path or os.path.isabs(path): - # path is not a file in the project tree in this case, but calling - # normpath is still important for trimming trailing slashes. - return os.path.normpath(path) - local_path = os.path.join('$(LOCAL_PATH)', self.path, path) - local_path = os.path.normpath(local_path) - # Check that normalizing the path didn't ../ itself out of $(LOCAL_PATH) - # - i.e. that the resulting path is still inside the project tree. The - # path may legitimately have ended up containing just $(LOCAL_PATH), though, - # so we don't look for a slash. - assert local_path.startswith('$(LOCAL_PATH)'), ( - 'Path %s attempts to escape from gyp path %s !)' % (path, self.path)) - return local_path - - - def ExpandInputRoot(self, template, expansion, dirname): - if '%(INPUT_ROOT)s' not in template and '%(INPUT_DIRNAME)s' not in template: - return template - path = template % { - 'INPUT_ROOT': expansion, - 'INPUT_DIRNAME': dirname, - } - return os.path.normpath(path) - - -def PerformBuild(data, configurations, params): - # The android backend only supports the default configuration. - options = params['options'] - makefile = os.path.abspath(os.path.join(options.toplevel_dir, - 'GypAndroid.mk')) - env = dict(os.environ) - env['ONE_SHOT_MAKEFILE'] = makefile - arguments = ['make', '-C', os.environ['ANDROID_BUILD_TOP'], 'gyp_all_modules'] - print 'Building: %s' % arguments - subprocess.check_call(arguments, env=env) - - -def GenerateOutput(target_list, target_dicts, data, params): - options = params['options'] - generator_flags = params.get('generator_flags', {}) - builddir_name = generator_flags.get('output_dir', 'out') - limit_to_target_all = generator_flags.get('limit_to_target_all', False) - write_alias_targets = generator_flags.get('write_alias_targets', True) - android_top_dir = os.environ.get('ANDROID_BUILD_TOP') - assert android_top_dir, '$ANDROID_BUILD_TOP not set; you need to run lunch.' - - def CalculateMakefilePath(build_file, base_name): - """Determine where to write a Makefile for a given gyp file.""" - # Paths in gyp files are relative to the .gyp file, but we want - # paths relative to the source root for the master makefile. Grab - # the path of the .gyp file as the base to relativize against. - # E.g. "foo/bar" when we're constructing targets for "foo/bar/baz.gyp". - base_path = gyp.common.RelativePath(os.path.dirname(build_file), - options.depth) - # We write the file in the base_path directory. - output_file = os.path.join(options.depth, base_path, base_name) - assert not options.generator_output, ( - 'The Android backend does not support options.generator_output.') - base_path = gyp.common.RelativePath(os.path.dirname(build_file), - options.toplevel_dir) - return base_path, output_file - - # TODO: search for the first non-'Default' target. This can go - # away when we add verification that all targets have the - # necessary configurations. - default_configuration = None - toolsets = set([target_dicts[target]['toolset'] for target in target_list]) - for target in target_list: - spec = target_dicts[target] - if spec['default_configuration'] != 'Default': - default_configuration = spec['default_configuration'] - break - if not default_configuration: - default_configuration = 'Default' - - srcdir = '.' - 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.') - gyp.common.EnsureDirExists(makefile_path) - root_makefile = open(makefile_path, 'w') - - root_makefile.write(header) - - # We set LOCAL_PATH just once, here, to the top of the project tree. This - # allows all the other paths we use to be relative to the Android.mk file, - # as the Android build system expects. - root_makefile.write('\nLOCAL_PATH := $(call my-dir)\n') - - # Find the list of targets that derive from the gyp file(s) being built. - needed_targets = set() - for build_file in params['build_files']: - for target in gyp.common.AllTargets(target_list, target_dicts, build_file): - needed_targets.add(target) - - build_files = set() - include_list = set() - android_modules = {} - for qualified_target in target_list: - build_file, target, toolset = gyp.common.ParseQualifiedTarget( - qualified_target) - relative_build_file = gyp.common.RelativePath(build_file, - options.toplevel_dir) - build_files.add(relative_build_file) - included_files = data[build_file]['included_files'] - for included_file in included_files: - # The included_files entries are relative to the dir of the build file - # that included them, so we have to undo that and then make them relative - # to the root dir. - relative_include_file = gyp.common.RelativePath( - gyp.common.UnrelativePath(included_file, build_file), - options.toplevel_dir) - abs_include_file = os.path.abspath(relative_include_file) - # If the include file is from the ~/.gyp dir, we should use absolute path - # so that relocating the src dir doesn't break the path. - if (params['home_dot_gyp'] and - abs_include_file.startswith(params['home_dot_gyp'])): - build_files.add(abs_include_file) - else: - build_files.add(relative_include_file) - - base_path, output_file = CalculateMakefilePath(build_file, - target + '.' + toolset + options.suffix + '.mk') - - spec = target_dicts[qualified_target] - configs = spec['configurations'] - - part_of_all = (qualified_target in needed_targets and - not int(spec.get('suppress_wildcard', False))) - if limit_to_target_all and not part_of_all: - continue - - relative_target = gyp.common.QualifiedTarget(relative_build_file, target, - toolset) - writer = AndroidMkWriter(android_top_dir) - android_module = writer.Write(qualified_target, relative_target, base_path, - output_file, spec, configs, - part_of_all=part_of_all, - write_alias_target=write_alias_targets) - if android_module in android_modules: - print ('ERROR: Android module names must be unique. The following ' - 'targets both generate Android module name %s.\n %s\n %s' % - (android_module, android_modules[android_module], - qualified_target)) - return - android_modules[android_module] = qualified_target - - # Our root_makefile lives at the source root. Compute the relative path - # from there to the output_file for including. - mkfile_rel_path = gyp.common.RelativePath(output_file, - os.path.dirname(makefile_path)) - include_list.add(mkfile_rel_path) - - root_makefile.write('GYP_CONFIGURATION ?= %s\n' % default_configuration) - root_makefile.write('GYP_VAR_PREFIX ?=\n') - - # Write out the sorted list of includes. - root_makefile.write('\n') - for include_file in sorted(include_list): - root_makefile.write('include $(LOCAL_PATH)/' + include_file + '\n') - root_makefile.write('\n') - - if write_alias_targets: - root_makefile.write(ALL_MODULES_FOOTER) - - root_makefile.close() diff --git a/deps/gyp/pylib/gyp/generator/cmake.py b/deps/gyp/pylib/gyp/generator/cmake.py index 10d015ee83..17f5e6396c 100644 --- a/deps/gyp/pylib/gyp/generator/cmake.py +++ b/deps/gyp/pylib/gyp/generator/cmake.py @@ -55,7 +55,7 @@ generator_default_variables = { 'CONFIGURATION_NAME': '${configuration}', } -FULL_PATH_VARS = ('${CMAKE_SOURCE_DIR}', '${builddir}', '${obj}') +FULL_PATH_VARS = ('${CMAKE_CURRENT_LIST_DIR}', '${builddir}', '${obj}') generator_supports_multiple_toolsets = True generator_wants_static_library_dependencies_adjusted = True @@ -103,7 +103,7 @@ def NormjoinPathForceCMakeSource(base_path, rel_path): if any([rel_path.startswith(var) for var in FULL_PATH_VARS]): return rel_path # TODO: do we need to check base_path for absolute variables as well? - return os.path.join('${CMAKE_SOURCE_DIR}', + return os.path.join('${CMAKE_CURRENT_LIST_DIR}', os.path.normpath(os.path.join(base_path, rel_path))) @@ -150,20 +150,17 @@ def SetFileProperty(output, source_name, property_name, values, sep): output.write('")\n') -def SetFilesProperty(output, source_names, property_name, values, sep): +def SetFilesProperty(output, variable, property_name, values, sep): """Given a set of source files, sets the given property on them.""" - output.write('set_source_files_properties(\n') - for source_name in source_names: - output.write(' ') - output.write(source_name) - output.write('\n') - output.write(' PROPERTIES\n ') + output.write('set_source_files_properties(') + WriteVariable(output, variable) + output.write(' PROPERTIES ') output.write(property_name) output.write(' "') for value in values: output.write(CMakeStringEscape(value)) output.write(sep) - output.write('"\n)\n') + output.write('")\n') def SetTargetProperty(output, target_name, property_name, values, sep=''): @@ -216,7 +213,7 @@ def WriteVariable(output, variable_name, prepend=None): output.write('}') -class CMakeTargetType: +class CMakeTargetType(object): def __init__(self, command, modifier, property_modifier): self.command = command self.modifier = modifier @@ -236,11 +233,11 @@ def StringToCMakeTargetName(a): """Converts the given string 'a' to a valid CMake target name. All invalid characters are replaced by '_'. - Invalid for cmake: ' ', '/', '(', ')' + Invalid for cmake: ' ', '/', '(', ')', '"' Invalid for make: ':' Invalid for unknown reasons but cause failures: '.' """ - return a.translate(string.maketrans(' /():.', '______')) + return a.translate(string.maketrans(' /():."', '_______')) def WriteActions(target_name, actions, extra_sources, extra_deps, @@ -296,7 +293,7 @@ def WriteActions(target_name, actions, extra_sources, extra_deps, WriteVariable(output, inputs_name) output.write('\n') - output.write(' WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/') + output.write(' WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}/') output.write(path_to_gyp) output.write('\n') @@ -401,9 +398,9 @@ def WriteRules(target_name, rules, extra_sources, extra_deps, output.write(NormjoinPath(path_to_gyp, rule_source)) output.write('\n') - # CMAKE_SOURCE_DIR is where the CMakeLists.txt lives. + # CMAKE_CURRENT_LIST_DIR is where the CMakeLists.txt lives. # The cwd is the current build directory. - output.write(' WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/') + output.write(' WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}/') output.write(path_to_gyp) output.write('\n') @@ -464,7 +461,7 @@ def WriteCopies(target_name, copies, extra_deps, path_to_gyp, output): extra_deps.append(copy_name) return - class Copy: + class Copy(object): def __init__(self, ext, command): self.cmake_inputs = [] self.cmake_outputs = [] @@ -488,7 +485,7 @@ def WriteCopies(target_name, copies, extra_deps, path_to_gyp, output): copy = file_copy if os.path.basename(src) else dir_copy - copy.cmake_inputs.append(NormjoinPath(path_to_gyp, src)) + copy.cmake_inputs.append(NormjoinPathForceCMakeSource(path_to_gyp, src)) copy.cmake_outputs.append(NormjoinPathForceCMakeSource(path_to_gyp, dst)) copy.gyp_inputs.append(src) copy.gyp_outputs.append(dst) @@ -525,7 +522,7 @@ def WriteCopies(target_name, copies, extra_deps, path_to_gyp, output): WriteVariable(output, copy.inputs_name, ' ') output.write('\n') - output.write('WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/') + output.write('WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}/') output.write(path_to_gyp) output.write('\n') @@ -640,6 +637,12 @@ def WriteTarget(namer, qualified_target, target_dicts, build_dir, config_to_use, target_type = spec.get('type', '<missing target type>') target_toolset = spec.get('toolset') + cmake_target_type = cmake_target_type_from_gyp_target_type.get(target_type) + if cmake_target_type is None: + print ('Target %s has unknown target type %s, skipping.' % + ( target_name, target_type ) ) + return + SetVariable(output, 'TARGET', target_name) SetVariable(output, 'TOOLSET', target_toolset) @@ -667,27 +670,89 @@ def WriteTarget(namer, qualified_target, target_dicts, build_dir, config_to_use, srcs = spec.get('sources', []) # Gyp separates the sheep from the goats based on file extensions. - def partition(l, p): - return reduce(lambda x, e: x[not p(e)].append(e) or x, l, ([], [])) - compilable_srcs, other_srcs = partition(srcs, Compilable) + # A full separation is done here because of flag handing (see below). + s_sources = [] + c_sources = [] + cxx_sources = [] + linkable_sources = [] + other_sources = [] + for src in srcs: + _, ext = os.path.splitext(src) + src_type = COMPILABLE_EXTENSIONS.get(ext, None) + src_norm_path = NormjoinPath(path_from_cmakelists_to_gyp, src); - # CMake gets upset when executable targets provide no sources. - if target_type == 'executable' and not compilable_srcs and not extra_sources: - print ('Executable %s has no complilable sources, treating as "none".' % - target_name ) - target_type = 'none' + if src_type == 's': + s_sources.append(src_norm_path) + elif src_type == 'cc': + c_sources.append(src_norm_path) + elif src_type == 'cxx': + cxx_sources.append(src_norm_path) + elif Linkable(ext): + linkable_sources.append(src_norm_path) + else: + other_sources.append(src_norm_path) - cmake_target_type = cmake_target_type_from_gyp_target_type.get(target_type) - if cmake_target_type is None: - print ('Target %s has unknown target type %s, skipping.' % - ( target_name, target_type ) ) - return + for extra_source in extra_sources: + src, real_source = extra_source + _, ext = os.path.splitext(real_source) + src_type = COMPILABLE_EXTENSIONS.get(ext, None) + + if src_type == 's': + s_sources.append(src) + elif src_type == 'cc': + c_sources.append(src) + elif src_type == 'cxx': + cxx_sources.append(src) + elif Linkable(ext): + linkable_sources.append(src) + else: + other_sources.append(src) + + s_sources_name = None + if s_sources: + s_sources_name = cmake_target_name + '__asm_srcs' + SetVariableList(output, s_sources_name, s_sources) + + c_sources_name = None + if c_sources: + c_sources_name = cmake_target_name + '__c_srcs' + SetVariableList(output, c_sources_name, c_sources) + + cxx_sources_name = None + if cxx_sources: + cxx_sources_name = cmake_target_name + '__cxx_srcs' + SetVariableList(output, cxx_sources_name, cxx_sources) + + linkable_sources_name = None + if linkable_sources: + linkable_sources_name = cmake_target_name + '__linkable_srcs' + SetVariableList(output, linkable_sources_name, linkable_sources) + + other_sources_name = None + if other_sources: + other_sources_name = cmake_target_name + '__other_srcs' + SetVariableList(output, other_sources_name, other_sources) + + # CMake gets upset when executable targets provide no sources. + # http://www.cmake.org/pipermail/cmake/2010-July/038461.html + dummy_sources_name = None + has_sources = (s_sources_name or + c_sources_name or + cxx_sources_name or + linkable_sources_name or + other_sources_name) + if target_type == 'executable' and not has_sources: + dummy_sources_name = cmake_target_name + '__dummy_srcs' + SetVariable(output, dummy_sources_name, + "${obj}.${TOOLSET}/${TARGET}/genc/dummy.c") + output.write('if(NOT EXISTS "') + WriteVariable(output, dummy_sources_name) + output.write('")\n') + output.write(' file(WRITE "') + WriteVariable(output, dummy_sources_name) + output.write('" "")\n') + output.write("endif()\n") - other_srcs_name = None - if other_srcs: - other_srcs_name = cmake_target_name + '__other_srcs' - SetVariableList(output, other_srcs_name, - [NormjoinPath(path_from_cmakelists_to_gyp, src) for src in other_srcs]) # CMake is opposed to setting linker directories and considers the practice # of setting linker directories dangerous. Instead, it favors the use of @@ -713,37 +778,54 @@ def WriteTarget(namer, qualified_target, target_dicts, build_dir, config_to_use, output.write(' ') output.write(cmake_target_type.modifier) - if other_srcs_name: - WriteVariable(output, other_srcs_name, ' ') - - output.write('\n') - - for src in compilable_srcs: - output.write(' ') - output.write(NormjoinPath(path_from_cmakelists_to_gyp, src)) - output.write('\n') - for extra_source in extra_sources: - output.write(' ') - src, _ = extra_source - output.write(NormjoinPath(path_from_cmakelists_to_gyp, src)) - output.write('\n') + if s_sources_name: + WriteVariable(output, s_sources_name, ' ') + if c_sources_name: + WriteVariable(output, c_sources_name, ' ') + if cxx_sources_name: + WriteVariable(output, cxx_sources_name, ' ') + if linkable_sources_name: + WriteVariable(output, linkable_sources_name, ' ') + if other_sources_name: + WriteVariable(output, other_sources_name, ' ') + if dummy_sources_name: + WriteVariable(output, dummy_sources_name, ' ') output.write(')\n') + # Let CMake know if the 'all' target should depend on this target. + exclude_from_all = ('TRUE' if qualified_target not in all_qualified_targets + else 'FALSE') + SetTargetProperty(output, cmake_target_name, + 'EXCLUDE_FROM_ALL', exclude_from_all) + for extra_target_name in extra_deps: + SetTargetProperty(output, extra_target_name, + 'EXCLUDE_FROM_ALL', exclude_from_all) + # Output name and location. if target_type != 'none': + # Link as 'C' if there are no other files + if not c_sources and not cxx_sources: + SetTargetProperty(output, cmake_target_name, 'LINKER_LANGUAGE', ['C']) + # Mark uncompiled sources as uncompiled. - if other_srcs_name: + if other_sources_name: output.write('set_source_files_properties(') - WriteVariable(output, other_srcs_name, '') + WriteVariable(output, other_sources_name, '') output.write(' PROPERTIES HEADER_FILE_ONLY "TRUE")\n') + # Mark object sources as linkable. + if linkable_sources_name: + output.write('set_source_files_properties(') + WriteVariable(output, other_sources_name, '') + output.write(' PROPERTIES EXTERNAL_OBJECT "TRUE")\n') + # Output directory target_output_directory = spec.get('product_dir') if target_output_directory is None: if target_type in ('executable', 'loadable_module'): target_output_directory = generator_default_variables['PRODUCT_DIR'] - elif target_type in ('shared_library'): + elif target_type == 'shared_library': target_output_directory = '${builddir}/lib.${TOOLSET}' elif spec.get('standalone_static_library', False): target_output_directory = generator_default_variables['PRODUCT_DIR'] @@ -804,122 +886,84 @@ def WriteTarget(namer, qualified_target, target_dicts, build_dir, config_to_use, cmake_target_output_basename) SetFileProperty(output, cmake_target_output, 'GENERATED', ['TRUE'], '') - # Let CMake know if the 'all' target should depend on this target. - exclude_from_all = ('TRUE' if qualified_target not in all_qualified_targets - else 'FALSE') - SetTargetProperty(output, cmake_target_name, - 'EXCLUDE_FROM_ALL', exclude_from_all) - for extra_target_name in extra_deps: - SetTargetProperty(output, extra_target_name, - 'EXCLUDE_FROM_ALL', exclude_from_all) - - # Includes - includes = config.get('include_dirs') - if includes: - # This (target include directories) is what requires CMake 2.8.8 - includes_name = cmake_target_name + '__include_dirs' - SetVariableList(output, includes_name, - [NormjoinPathForceCMakeSource(path_from_cmakelists_to_gyp, include) - for include in includes]) - output.write('set_property(TARGET ') - output.write(cmake_target_name) - output.write(' APPEND PROPERTY INCLUDE_DIRECTORIES ') - WriteVariable(output, includes_name, '') - output.write(')\n') - - # Defines - defines = config.get('defines') - if defines is not None: - SetTargetProperty(output, - cmake_target_name, - 'COMPILE_DEFINITIONS', - defines, - ';') - - # Compile Flags - http://www.cmake.org/Bug/view.php?id=6493 - # CMake currently does not have target C and CXX flags. - # So, instead of doing... - - # cflags_c = config.get('cflags_c') - # if cflags_c is not None: - # SetTargetProperty(output, cmake_target_name, - # 'C_COMPILE_FLAGS', cflags_c, ' ') - - # cflags_cc = config.get('cflags_cc') - # if cflags_cc is not None: - # SetTargetProperty(output, cmake_target_name, - # 'CXX_COMPILE_FLAGS', cflags_cc, ' ') - - # Instead we must... - s_sources = [] - c_sources = [] - cxx_sources = [] - for src in srcs: - _, ext = os.path.splitext(src) - src_type = COMPILABLE_EXTENSIONS.get(ext, None) - - if src_type == 's': - s_sources.append(NormjoinPath(path_from_cmakelists_to_gyp, src)) - - if src_type == 'cc': - c_sources.append(NormjoinPath(path_from_cmakelists_to_gyp, src)) - - if src_type == 'cxx': - cxx_sources.append(NormjoinPath(path_from_cmakelists_to_gyp, src)) - - for extra_source in extra_sources: - src, real_source = extra_source - _, ext = os.path.splitext(real_source) - src_type = COMPILABLE_EXTENSIONS.get(ext, None) - - if src_type == 's': - s_sources.append(NormjoinPath(path_from_cmakelists_to_gyp, src)) - - if src_type == 'cc': - c_sources.append(NormjoinPath(path_from_cmakelists_to_gyp, src)) - - if src_type == 'cxx': - cxx_sources.append(NormjoinPath(path_from_cmakelists_to_gyp, src)) - - cflags = config.get('cflags', []) - cflags_c = config.get('cflags_c', []) - cflags_cxx = config.get('cflags_cc', []) - if c_sources and not (s_sources or cxx_sources): - flags = [] - flags.extend(cflags) - flags.extend(cflags_c) - SetTargetProperty(output, cmake_target_name, 'COMPILE_FLAGS', flags, ' ') - - elif cxx_sources and not (s_sources or c_sources): - flags = [] - flags.extend(cflags) - flags.extend(cflags_cxx) - SetTargetProperty(output, cmake_target_name, 'COMPILE_FLAGS', flags, ' ') - - else: - if s_sources and cflags: - SetFilesProperty(output, s_sources, 'COMPILE_FLAGS', cflags, ' ') + # Includes + includes = config.get('include_dirs') + if includes: + # This (target include directories) is what requires CMake 2.8.8 + includes_name = cmake_target_name + '__include_dirs' + SetVariableList(output, includes_name, + [NormjoinPathForceCMakeSource(path_from_cmakelists_to_gyp, include) + for include in includes]) + output.write('set_property(TARGET ') + output.write(cmake_target_name) + output.write(' APPEND PROPERTY INCLUDE_DIRECTORIES ') + WriteVariable(output, includes_name, '') + output.write(')\n') - if c_sources and (cflags or cflags_c): + # Defines + defines = config.get('defines') + if defines is not None: + SetTargetProperty(output, + cmake_target_name, + 'COMPILE_DEFINITIONS', + defines, + ';') + + # Compile Flags - http://www.cmake.org/Bug/view.php?id=6493 + # CMake currently does not have target C and CXX flags. + # So, instead of doing... + + # cflags_c = config.get('cflags_c') + # if cflags_c is not None: + # SetTargetProperty(output, cmake_target_name, + # 'C_COMPILE_FLAGS', cflags_c, ' ') + + # cflags_cc = config.get('cflags_cc') + # if cflags_cc is not None: + # SetTargetProperty(output, cmake_target_name, + # 'CXX_COMPILE_FLAGS', cflags_cc, ' ') + + # Instead we must... + cflags = config.get('cflags', []) + cflags_c = config.get('cflags_c', []) + cflags_cxx = config.get('cflags_cc', []) + if (not cflags_c or not c_sources) and (not cflags_cxx or not cxx_sources): + SetTargetProperty(output, cmake_target_name, 'COMPILE_FLAGS', cflags, ' ') + + elif c_sources and not (s_sources or cxx_sources): flags = [] flags.extend(cflags) flags.extend(cflags_c) - SetFilesProperty(output, c_sources, 'COMPILE_FLAGS', flags, ' ') + SetTargetProperty(output, cmake_target_name, 'COMPILE_FLAGS', flags, ' ') - if cxx_sources and (cflags or cflags_cxx): + elif cxx_sources and not (s_sources or c_sources): flags = [] flags.extend(cflags) flags.extend(cflags_cxx) - SetFilesProperty(output, cxx_sources, 'COMPILE_FLAGS', flags, ' ') + SetTargetProperty(output, cmake_target_name, 'COMPILE_FLAGS', flags, ' ') - # Have assembly link as c if there are no other files - if not c_sources and not cxx_sources and s_sources: - SetTargetProperty(output, cmake_target_name, 'LINKER_LANGUAGE', ['C']) - - # Linker flags - ldflags = config.get('ldflags') - if ldflags is not None: - SetTargetProperty(output, cmake_target_name, 'LINK_FLAGS', ldflags, ' ') + else: + # TODO: This is broken, one cannot generally set properties on files, + # as other targets may require different properties on the same files. + if s_sources and cflags: + SetFilesProperty(output, s_sources_name, 'COMPILE_FLAGS', cflags, ' ') + + if c_sources and (cflags or cflags_c): + flags = [] + flags.extend(cflags) + flags.extend(cflags_c) + SetFilesProperty(output, c_sources_name, 'COMPILE_FLAGS', flags, ' ') + + if cxx_sources and (cflags or cflags_cxx): + flags = [] + flags.extend(cflags) + flags.extend(cflags_cxx) + SetFilesProperty(output, cxx_sources_name, 'COMPILE_FLAGS', flags, ' ') + + # Linker flags + ldflags = config.get('ldflags') + if ldflags is not None: + SetTargetProperty(output, cmake_target_name, 'LINK_FLAGS', ldflags, ' ') # Note on Dependencies and Libraries: # CMake wants to handle link order, resolving the link line up front. @@ -1040,20 +1084,49 @@ def GenerateOutputForConfig(target_list, target_dicts, data, output.write('cmake_minimum_required(VERSION 2.8.8 FATAL_ERROR)\n') output.write('cmake_policy(VERSION 2.8.8)\n') - _, project_target, _ = gyp.common.ParseQualifiedTarget(target_list[-1]) + gyp_file, project_target, _ = gyp.common.ParseQualifiedTarget(target_list[-1]) output.write('project(') output.write(project_target) output.write(')\n') SetVariable(output, 'configuration', config_to_use) + ar = None + cc = None + cxx = None + + make_global_settings = data[gyp_file].get('make_global_settings', []) + build_to_top = gyp.common.InvertRelativePath(build_dir, + options.toplevel_dir) + for key, value in make_global_settings: + if key == 'AR': + ar = 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) + cc = gyp.common.GetEnvironFallback(['CC_target', 'CC'], cc) + cxx = gyp.common.GetEnvironFallback(['CXX_target', 'CXX'], cxx) + + if ar: + SetVariable(output, 'CMAKE_AR', ar) + if cc: + SetVariable(output, 'CMAKE_C_COMPILER', cc) + if cxx: + SetVariable(output, 'CMAKE_CXX_COMPILER', cxx) + # The following appears to be as-yet undocumented. # http://public.kitware.com/Bug/view.php?id=8392 output.write('enable_language(ASM)\n') # ASM-ATT does not support .S files. # output.write('enable_language(ASM-ATT)\n') - SetVariable(output, 'builddir', '${CMAKE_BINARY_DIR}') + if cc: + SetVariable(output, 'CMAKE_ASM_COMPILER', cc) + + SetVariable(output, 'builddir', '${CMAKE_CURRENT_BINARY_DIR}') SetVariable(output, 'obj', '${builddir}/obj') output.write('\n') @@ -1066,6 +1139,11 @@ def GenerateOutputForConfig(target_list, target_dicts, data, output.write('set(CMAKE_CXX_OUTPUT_EXTENSION_REPLACE 1)\n') output.write('\n') + # Force ninja to use rsp files. Otherwise link and ar lines can get too long, + # resulting in 'Argument list too long' errors. + output.write('set(CMAKE_NINJA_FORCE_RESPONSE_FILE 1)\n') + output.write('\n') + namer = CMakeNamer(target_list) # The list of targets upon which the 'all' target should depend. diff --git a/deps/gyp/pylib/gyp/generator/dump_dependency_json.py b/deps/gyp/pylib/gyp/generator/dump_dependency_json.py index 927ba6ebad..160eafe2ef 100644 --- a/deps/gyp/pylib/gyp/generator/dump_dependency_json.py +++ b/deps/gyp/pylib/gyp/generator/dump_dependency_json.py @@ -14,6 +14,9 @@ generator_supports_multiple_toolsets = True generator_wants_static_library_dependencies_adjusted = False +generator_filelist_paths = { +} + generator_default_variables = { } for dirname in ['INTERMEDIATE_DIR', 'SHARED_INTERMEDIATE_DIR', 'PRODUCT_DIR', @@ -56,6 +59,17 @@ def CalculateGeneratorInputInfo(params): global generator_wants_static_library_dependencies_adjusted generator_wants_static_library_dependencies_adjusted = True + toplevel = params['options'].toplevel_dir + generator_dir = os.path.relpath(params['options'].generator_output or '.') + # output_dir: relative path from generator_dir to the build directory. + output_dir = generator_flags.get('output_dir', 'out') + qualified_out_dir = os.path.normpath(os.path.join( + toplevel, generator_dir, output_dir, 'gypfiles')) + global generator_filelist_paths + generator_filelist_paths = { + 'toplevel': toplevel, + 'qualified_out_dir': qualified_out_dir, + } def GenerateOutput(target_list, target_dicts, data, params): # Map of target -> list of targets it depends on. @@ -74,7 +88,11 @@ def GenerateOutput(target_list, target_dicts, data, params): edges[target].append(dep) targets_to_visit.append(dep) - filename = 'dump.json' + try: + filepath = params['generator_flags']['output_dir'] + except KeyError: + filepath = '.' + filename = os.path.join(filepath, 'dump.json') f = open(filename, 'w') json.dump(edges, f) f.close() diff --git a/deps/gyp/pylib/gyp/generator/eclipse.py b/deps/gyp/pylib/gyp/generator/eclipse.py index 718eb5d3db..3544347b3b 100644 --- a/deps/gyp/pylib/gyp/generator/eclipse.py +++ b/deps/gyp/pylib/gyp/generator/eclipse.py @@ -24,6 +24,7 @@ import gyp import gyp.common import gyp.msvs_emulation import shlex +import xml.etree.cElementTree as ET generator_wants_static_library_dependencies_adjusted = False @@ -31,8 +32,8 @@ generator_default_variables = { } for dirname in ['INTERMEDIATE_DIR', 'PRODUCT_DIR', 'LIB_DIR', 'SHARED_LIB_DIR']: - # Some gyp steps fail if these are empty(!). - generator_default_variables[dirname] = 'dir' + # Some gyp steps fail if these are empty(!), so we convert them to variables + generator_default_variables[dirname] = '$' + dirname for unused in ['RULE_INPUT_PATH', 'RULE_INPUT_ROOT', 'RULE_INPUT_NAME', 'RULE_INPUT_DIRNAME', 'RULE_INPUT_EXT', @@ -294,33 +295,123 @@ def GenerateOutputForConfig(target_list, target_dicts, data, params, shared_intermediate_dirs = [os.path.join(toplevel_build, 'obj', 'gen'), os.path.join(toplevel_build, 'gen')] - out_name = os.path.join(toplevel_build, 'eclipse-cdt-settings.xml') + GenerateCdtSettingsFile(target_list, + target_dicts, + data, + params, + config_name, + os.path.join(toplevel_build, + 'eclipse-cdt-settings.xml'), + options, + shared_intermediate_dirs) + GenerateClasspathFile(target_list, + target_dicts, + options.toplevel_dir, + toplevel_build, + os.path.join(toplevel_build, + 'eclipse-classpath.xml')) + + +def GenerateCdtSettingsFile(target_list, target_dicts, data, params, + config_name, out_name, options, + shared_intermediate_dirs): gyp.common.EnsureDirExists(out_name) - out = open(out_name, 'w') + with open(out_name, 'w') as out: + out.write('<?xml version="1.0" encoding="UTF-8"?>\n') + out.write('<cdtprojectproperties>\n') + + eclipse_langs = ['C++ Source File', 'C Source File', 'Assembly Source File', + 'GNU C++', 'GNU C', 'Assembly'] + compiler_path = GetCompilerPath(target_list, data, options) + include_dirs = GetAllIncludeDirectories(target_list, target_dicts, + shared_intermediate_dirs, + config_name, params, compiler_path) + WriteIncludePaths(out, eclipse_langs, include_dirs) + defines = GetAllDefines(target_list, target_dicts, data, config_name, + params, compiler_path) + WriteMacros(out, eclipse_langs, defines) + + out.write('</cdtprojectproperties>\n') + + +def GenerateClasspathFile(target_list, target_dicts, toplevel_dir, + toplevel_build, out_name): + '''Generates a classpath file suitable for symbol navigation and code + completion of Java code (such as in Android projects) by finding all + .java and .jar files used as action inputs.''' + gyp.common.EnsureDirExists(out_name) + result = ET.Element('classpath') + + def AddElements(kind, paths): + # First, we need to normalize the paths so they are all relative to the + # toplevel dir. + rel_paths = set() + for path in paths: + if os.path.isabs(path): + rel_paths.add(os.path.relpath(path, toplevel_dir)) + else: + rel_paths.add(path) + + for path in sorted(rel_paths): + entry_element = ET.SubElement(result, 'classpathentry') + entry_element.set('kind', kind) + entry_element.set('path', path) + + AddElements('lib', GetJavaJars(target_list, target_dicts, toplevel_dir)) + AddElements('src', GetJavaSourceDirs(target_list, target_dicts, toplevel_dir)) + # Include the standard JRE container and a dummy out folder + AddElements('con', ['org.eclipse.jdt.launching.JRE_CONTAINER']) + # Include a dummy out folder so that Eclipse doesn't use the default /bin + # folder in the root of the project. + AddElements('output', [os.path.join(toplevel_build, '.eclipse-java-build')]) + + ET.ElementTree(result).write(out_name) - out.write('<?xml version="1.0" encoding="UTF-8"?>\n') - out.write('<cdtprojectproperties>\n') - eclipse_langs = ['C++ Source File', 'C Source File', 'Assembly Source File', - 'GNU C++', 'GNU C', 'Assembly'] - compiler_path = GetCompilerPath(target_list, data, options) - include_dirs = GetAllIncludeDirectories(target_list, target_dicts, - shared_intermediate_dirs, config_name, - params, compiler_path) - WriteIncludePaths(out, eclipse_langs, include_dirs) - defines = GetAllDefines(target_list, target_dicts, data, config_name, params, - compiler_path) - WriteMacros(out, eclipse_langs, defines) +def GetJavaJars(target_list, target_dicts, toplevel_dir): + '''Generates a sequence of all .jars used as inputs.''' + for target_name in target_list: + target = target_dicts[target_name] + for action in target.get('actions', []): + for input_ in action['inputs']: + if os.path.splitext(input_)[1] == '.jar' and not input_.startswith('$'): + if os.path.isabs(input_): + yield input_ + else: + yield os.path.join(os.path.dirname(target_name), input_) + - out.write('</cdtprojectproperties>\n') - out.close() +def GetJavaSourceDirs(target_list, target_dicts, toplevel_dir): + '''Generates a sequence of all likely java package root directories.''' + for target_name in target_list: + target = target_dicts[target_name] + for action in target.get('actions', []): + for input_ in action['inputs']: + if (os.path.splitext(input_)[1] == '.java' and + not input_.startswith('$')): + dir_ = os.path.dirname(os.path.join(os.path.dirname(target_name), + input_)) + # If there is a parent 'src' or 'java' folder, navigate up to it - + # these are canonical package root names in Chromium. This will + # break if 'src' or 'java' exists in the package structure. This + # could be further improved by inspecting the java file for the + # package name if this proves to be too fragile in practice. + parent_search = dir_ + while os.path.basename(parent_search) not in ['src', 'java']: + parent_search, _ = os.path.split(parent_search) + if not parent_search or parent_search == toplevel_dir: + # Didn't find a known root, just return the original path + yield dir_ + break + else: + yield parent_search def GenerateOutput(target_list, target_dicts, data, params): """Generate an XML settings file that can be imported into a CDT project.""" if params['options'].generator_output: - raise NotImplementedError, "--generator_output not implemented for eclipse" + raise NotImplementedError("--generator_output not implemented for eclipse") user_config = params.get('generator_flags', {}).get('config', None) if user_config: diff --git a/deps/gyp/pylib/gyp/generator/gypd.py b/deps/gyp/pylib/gyp/generator/gypd.py index 22ef57f847..3efdb9966a 100644 --- a/deps/gyp/pylib/gyp/generator/gypd.py +++ b/deps/gyp/pylib/gyp/generator/gypd.py @@ -39,9 +39,11 @@ import pprint # These variables should just be spit back out as variable references. _generator_identity_variables = [ + 'CONFIGURATION_NAME', 'EXECUTABLE_PREFIX', 'EXECUTABLE_SUFFIX', 'INTERMEDIATE_DIR', + 'LIB_DIR', 'PRODUCT_DIR', 'RULE_INPUT_ROOT', 'RULE_INPUT_DIRNAME', @@ -49,6 +51,11 @@ _generator_identity_variables = [ 'RULE_INPUT_NAME', 'RULE_INPUT_PATH', 'SHARED_INTERMEDIATE_DIR', + 'SHARED_LIB_DIR', + 'SHARED_LIB_PREFIX', + 'SHARED_LIB_SUFFIX', + 'STATIC_LIB_PREFIX', + 'STATIC_LIB_SUFFIX', ] # gypd doesn't define a default value for OS like many other generator diff --git a/deps/gyp/pylib/gyp/generator/make.py b/deps/gyp/pylib/gyp/generator/make.py index 7a8adb5850..b7da768fb3 100644 --- a/deps/gyp/pylib/gyp/generator/make.py +++ b/deps/gyp/pylib/gyp/generator/make.py @@ -29,6 +29,7 @@ import gyp import gyp.common import gyp.xcode_emulation from gyp.common import GetEnvironFallback +from gyp.common import GypError generator_default_variables = { 'EXECUTABLE_PREFIX': '', @@ -141,7 +142,7 @@ cmd_alink_thin = rm -f $@ && $(AR.$(TOOLSET)) crsT $@ $(filter %.o,$^) # special "figure out circular dependencies" flags around the entire # input list during linking. quiet_cmd_link = LINK($(TOOLSET)) $@ -cmd_link = $(LINK.$(TOOLSET)) -Wl,--start-group $(GYP_LDFLAGS) $(LDFLAGS.$(TOOLSET)) -o $@ $(LD_INPUTS) -Wl,--end-group $(LIBS) +cmd_link = $(LINK.$(TOOLSET)) $(GYP_LDFLAGS) $(LDFLAGS.$(TOOLSET)) -o $@ -Wl,--start-group $(LD_INPUTS) -Wl,--end-group $(LIBS) # We support two kinds of shared objects (.so): # 1) shared_library, which is just bundling together many dependent libraries @@ -210,10 +211,10 @@ cmd_solink_module_host = $(LINK.$(TOOLSET)) -shared $(GYP_LDFLAGS) $(LDFLAGS.$(T LINK_COMMANDS_AIX = """\ quiet_cmd_alink = AR($(TOOLSET)) $@ -cmd_alink = rm -f $@ && $(AR.$(TOOLSET)) crs $@ $(filter %.o,$^) +cmd_alink = rm -f $@ && $(AR.$(TOOLSET)) -X32_64 crs $@ $(filter %.o,$^) quiet_cmd_alink_thin = AR($(TOOLSET)) $@ -cmd_alink_thin = rm -f $@ && $(AR.$(TOOLSET)) crs $@ $(filter %.o,$^) +cmd_alink_thin = rm -f $@ && $(AR.$(TOOLSET)) -X32_64 crs $@ $(filter %.o,$^) quiet_cmd_link = LINK($(TOOLSET)) $@ cmd_link = $(LINK.$(TOOLSET)) $(GYP_LDFLAGS) $(LDFLAGS.$(TOOLSET)) -o $@ $(LD_INPUTS) $(LIBS) @@ -272,30 +273,22 @@ all_deps := %(make_global_settings)s CC.target ?= %(CC.target)s -CFLAGS.target ?= $(CFLAGS) +CFLAGS.target ?= $(CPPFLAGS) $(CFLAGS) CXX.target ?= %(CXX.target)s -CXXFLAGS.target ?= $(CXXFLAGS) +CXXFLAGS.target ?= $(CPPFLAGS) $(CXXFLAGS) LINK.target ?= %(LINK.target)s LDFLAGS.target ?= $(LDFLAGS) AR.target ?= $(AR) # C++ apps need to be linked with g++. -# -# Note: flock is used to seralize linking. Linking is a memory-intensive -# process so running parallel links can often lead to thrashing. To disable -# the serialization, override LINK via an envrionment variable as follows: -# -# export LINK=g++ -# -# This will allow make to invoke N linker processes as specified in -jN. -LINK ?= %(flock)s $(builddir)/linker.lock $(CXX.target) +LINK ?= $(CXX.target) # TODO(evan): move all cross-compilation logic to gyp-time so we don't need # to replicate this environment fallback in make as well. CC.host ?= %(CC.host)s -CFLAGS.host ?= +CFLAGS.host ?= $(CPPFLAGS_host) $(CFLAGS_host) CXX.host ?= %(CXX.host)s -CXXFLAGS.host ?= +CXXFLAGS.host ?= $(CPPFLAGS_host) $(CXXFLAGS_host) LINK.host ?= %(LINK.host)s LDFLAGS.host ?= AR.host ?= %(AR.host)s @@ -372,7 +365,7 @@ cmd_touch = touch $@ quiet_cmd_copy = COPY $@ # send stderr to /dev/null to ignore messages when linking directories. -cmd_copy = ln -f "$<" "$@" 2>/dev/null || (rm -rf "$@" && cp -af "$<" "$@") +cmd_copy = ln -f "$<" "$@" 2>/dev/null || (rm -rf "$@" && cp %(copy_archive_args)s "$<" "$@") %(link_commands)s """ @@ -631,6 +624,38 @@ def QuoteSpaces(s, quote=r'\ '): return s.replace(' ', quote) +# TODO: Avoid code duplication with _ValidateSourcesForMSVSProject in msvs.py. +def _ValidateSourcesForOSX(spec, all_sources): + """Makes sure if duplicate basenames are not specified in the source list. + + Arguments: + spec: The target dictionary containing the properties of the target. + """ + if spec.get('type', None) != 'static_library': + return + + basenames = {} + for source in all_sources: + name, ext = os.path.splitext(source) + is_compiled_file = ext in [ + '.c', '.cc', '.cpp', '.cxx', '.m', '.mm', '.s', '.S'] + if not is_compiled_file: + continue + basename = os.path.basename(name) # Don't include extension. + basenames.setdefault(basename, []).append(source) + + error = '' + for basename, files in basenames.iteritems(): + if len(files) > 1: + error += ' %s: %s\n' % (basename, ' '.join(files)) + + if error: + print('static library %s has several files with the same basename:\n' % + spec['target_name'] + error + 'libtool on OS X will generate' + + ' warnings for them.') + raise GypError('Duplicate basenames in sources section, see list above') + + # Map from qualified target to path to output. target_outputs = {} # Map from qualified target to any linkable output. A subset @@ -640,7 +665,7 @@ target_outputs = {} target_link_deps = {} -class MakefileWriter: +class MakefileWriter(object): """MakefileWriter packages up the writing of one target-specific foobar.mk. Its only real entry point is Write(), and is mostly used for namespacing. @@ -758,6 +783,10 @@ $(obj).$(TOOLSET)/$(TARGET)/%%.o: $(obj)/%%%s FORCE_DO_CMD # Sources. all_sources = spec.get('sources', []) + extra_sources if all_sources: + if self.flavor == 'mac': + # libtool on OS X generates warnings for duplicate basenames in the same + # target. + _ValidateSourcesForOSX(spec, all_sources) self.WriteSources( configs, deps, all_sources, extra_outputs, extra_link_deps, part_of_all, @@ -990,7 +1019,8 @@ $(obj).$(TOOLSET)/$(TARGET)/%%.o: $(obj)/%%%s FORCE_DO_CMD # accidentally writing duplicate dummy rules for those outputs. self.WriteLn('%s: obj := $(abs_obj)' % outputs[0]) self.WriteLn('%s: builddir := $(abs_builddir)' % outputs[0]) - self.WriteMakeRule(outputs, inputs + ['FORCE_DO_CMD'], actions) + self.WriteMakeRule(outputs, inputs, actions, + command="%s_%d" % (name, count)) # Spaces in rule filenames are not supported, but rule variables have # spaces in them (e.g. RULE_INPUT_PATH expands to '$(abspath $<)'). # The spaces within the variables are valid, so remove the variables @@ -1101,9 +1131,12 @@ $(obj).$(TOOLSET)/$(TARGET)/%%.o: $(obj)/%%%s FORCE_DO_CMD for output, res in gyp.xcode_emulation.GetMacBundleResources( generator_default_variables['PRODUCT_DIR'], self.xcode_settings, map(Sourceify, map(self.Absolutify, resources))): - self.WriteDoCmd([output], [res], 'mac_tool,,,copy-bundle-resource', - part_of_all=True) - bundle_deps.append(output) + _, ext = os.path.splitext(output) + if ext != '.xcassets': + # Make does not supports '.xcassets' emulation. + self.WriteDoCmd([output], [res], 'mac_tool,,,copy-bundle-resource', + part_of_all=True) + bundle_deps.append(output) def WriteMacInfoPlist(self, bundle_deps): @@ -1447,8 +1480,7 @@ $(obj).$(TOOLSET)/$(TARGET)/%%.o: $(obj)/%%%s FORCE_DO_CMD libraries = spec.get('libraries') if libraries: # Remove duplicate entries - # Commented out due to https://code.google.com/p/gyp/issues/detail?id=419 - # libraries = gyp.common.uniquer(libraries) + libraries = gyp.common.uniquer(libraries) if self.flavor == 'mac': libraries = self.xcode_settings.AdjustLibraries(libraries) self.WriteList(libraries, 'LIBS') @@ -1547,7 +1579,7 @@ $(obj).$(TOOLSET)/$(TARGET)/%%.o: $(obj)/%%%s FORCE_DO_CMD for link_dep in link_deps: assert ' ' not in link_dep, ( "Spaces in alink input filenames not supported (%s)" % link_dep) - if (self.flavor not in ('mac', 'openbsd', 'win') and not + if (self.flavor not in ('mac', 'openbsd', 'netbsd', 'win') and not self.is_standalone_static_library): self.WriteDoCmd([self.output_binary], link_deps, 'alink_thin', part_of_all, postbuilds=postbuilds) @@ -1657,6 +1689,7 @@ $(obj).$(TOOLSET)/$(TARGET)/%%.o: $(obj)/%%%s FORCE_DO_CMD self.WriteMakeRule(outputs, inputs, actions = ['$(call do_cmd,%s%s)' % (command, suffix)], comment = comment, + command = command, force = True) # Add our outputs to the list of targets we read depfiles from. # all_deps is only used for deps file reading, and for deps files we replace @@ -1667,7 +1700,7 @@ $(obj).$(TOOLSET)/$(TARGET)/%%.o: $(obj)/%%%s FORCE_DO_CMD def WriteMakeRule(self, outputs, inputs, actions=None, comment=None, - order_only=False, force=False, phony=False): + order_only=False, force=False, phony=False, command=None): """Write a Makefile rule, with some extra tricks. outputs: a list of outputs for the rule (note: this is not directly @@ -1680,6 +1713,7 @@ $(obj).$(TOOLSET)/$(TARGET)/%%.o: $(obj)/%%%s FORCE_DO_CMD force: if true, include FORCE_DO_CMD as an order-only dep phony: if true, the rule does not actually generate the named output, the output is just a name to run the rule + command: (optional) command name to generate unambiguous labels """ outputs = map(QuoteSpaces, outputs) inputs = map(QuoteSpaces, inputs) @@ -1688,44 +1722,38 @@ $(obj).$(TOOLSET)/$(TARGET)/%%.o: $(obj)/%%%s FORCE_DO_CMD self.WriteLn('# ' + comment) if phony: self.WriteLn('.PHONY: ' + ' '.join(outputs)) - # TODO(evanm): just make order_only a list of deps instead of these hacks. - if order_only: - order_insert = '| ' - pick_output = ' '.join(outputs) - else: - order_insert = '' - pick_output = outputs[0] - if force: - force_append = ' FORCE_DO_CMD' - else: - force_append = '' if actions: self.WriteLn("%s: TOOLSET := $(TOOLSET)" % outputs[0]) - self.WriteLn('%s: %s%s%s' % (pick_output, order_insert, ' '.join(inputs), - force_append)) + force_append = ' FORCE_DO_CMD' if force else '' + + if order_only: + # Order only rule: Just write a simple rule. + # TODO(evanm): just make order_only a list of deps instead of this hack. + self.WriteLn('%s: | %s%s' % + (' '.join(outputs), ' '.join(inputs), force_append)) + elif len(outputs) == 1: + # Regular rule, one output: Just write a simple rule. + self.WriteLn('%s: %s%s' % (outputs[0], ' '.join(inputs), force_append)) + else: + # Regular rule, more than one output: Multiple outputs are tricky in + # make. We will write three rules: + # - All outputs depend on an intermediate file. + # - Make .INTERMEDIATE depend on the intermediate. + # - The intermediate file depends on the inputs and executes the + # actual command. + # - The intermediate recipe will 'touch' the intermediate file. + # - The multi-output rule will have an do-nothing recipe. + intermediate = "%s.intermediate" % (command if command else self.target) + self.WriteLn('%s: %s' % (' '.join(outputs), intermediate)) + self.WriteLn('\t%s' % '@:'); + self.WriteLn('%s: %s' % ('.INTERMEDIATE', intermediate)) + self.WriteLn('%s: %s%s' % + (intermediate, ' '.join(inputs), force_append)) + actions.insert(0, '$(call do_cmd,touch)') + if actions: for action in actions: self.WriteLn('\t%s' % action) - if not order_only and len(outputs) > 1: - # If we have more than one output, a rule like - # foo bar: baz - # that for *each* output we must run the action, potentially - # in parallel. That is not what we're trying to write -- what - # we want is that we run the action once and it generates all - # the files. - # http://www.gnu.org/software/hello/manual/automake/Multiple-Outputs.html - # discusses this problem and has this solution: - # 1) Write the naive rule that would produce parallel runs of - # the action. - # 2) Make the outputs seralized on each other, so we won't start - # a parallel run until the first run finishes, at which point - # we'll have generated all the outputs and we're done. - self.WriteLn('%s: %s' % (' '.join(outputs[1:]), outputs[0])) - # Add a dummy command to the "extra outputs" rule, otherwise make seems to - # think these outputs haven't (couldn't have?) changed, and thus doesn't - # flag them as changed (i.e. include in '$?') when evaluating dependent - # rules, which in turn causes do_cmd() to skip running dependent commands. - self.WriteLn('%s: ;' % (' '.join(outputs[1:]))) self.WriteLn() @@ -1982,6 +2010,7 @@ def GenerateOutput(target_list, target_dicts, data, params): srcdir_prefix = '$(srcdir)/' flock_command= 'flock' + copy_archive_arguments = '-af' header_params = { 'default_target': default_target, 'builddir': builddir_name, @@ -1991,6 +2020,7 @@ def GenerateOutput(target_list, target_dicts, data, params): 'link_commands': LINK_COMMANDS_LINUX, 'extra_commands': '', 'srcdir': srcdir, + 'copy_archive_args': copy_archive_arguments, } if flavor == 'mac': flock_command = './gyp-mac-tool flock' @@ -2014,8 +2044,15 @@ def GenerateOutput(target_list, target_dicts, data, params): header_params.update({ 'flock': 'lockf', }) + elif flavor == 'openbsd': + copy_archive_arguments = '-pPRf' + header_params.update({ + 'copy_archive_args': copy_archive_arguments, + }) elif flavor == 'aix': + copy_archive_arguments = '-pPRf' header_params.update({ + 'copy_archive_args': copy_archive_arguments, 'link_commands': LINK_COMMANDS_AIX, 'flock': './gyp-flock-tool flock', 'flock_index': 2, @@ -2035,7 +2072,6 @@ def GenerateOutput(target_list, target_dicts, data, params): build_file, _, _ = gyp.common.ParseQualifiedTarget(target_list[0]) make_global_settings_array = data[build_file].get('make_global_settings', []) wrappers = {} - wrappers['LINK'] = '%s $(builddir)/linker.lock' % flock_command for key, value in make_global_settings_array: if key.endswith('_wrapper'): wrappers[key[:-len('_wrapper')]] = '$(abspath %s)' % value diff --git a/deps/gyp/pylib/gyp/generator/msvs.py b/deps/gyp/pylib/gyp/generator/msvs.py index 64991d4248..44cc1304a2 100644 --- a/deps/gyp/pylib/gyp/generator/msvs.py +++ b/deps/gyp/pylib/gyp/generator/msvs.py @@ -12,6 +12,7 @@ import sys import gyp.common import gyp.easy_xml as easy_xml +import gyp.generator.ninja as ninja_generator import gyp.MSVSNew as MSVSNew import gyp.MSVSProject as MSVSProject import gyp.MSVSSettings as MSVSSettings @@ -41,7 +42,7 @@ OrderedDict = _import_OrderedDict() # if IncrediBuild is executed from inside Visual Studio. This regex # validates that the string looks like a GUID with all uppercase hex # letters. -VALID_MSVS_GUID_CHARS = re.compile('^[A-F0-9\-]+$') +VALID_MSVS_GUID_CHARS = re.compile(r'^[A-F0-9\-]+$') generator_default_variables = { @@ -82,6 +83,12 @@ generator_additional_non_configuration_keys = [ 'msvs_external_builder_build_cmd', 'msvs_external_builder_clean_cmd', 'msvs_external_builder_clcompile_cmd', + 'msvs_enable_winrt', + 'msvs_requires_importlibrary', + 'msvs_enable_winphone', + 'msvs_application_type_revision', + 'msvs_target_platform_version', + 'msvs_target_platform_minversion', ] @@ -114,11 +121,11 @@ def _GetDomainAndUserName(): call = subprocess.Popen(['net', 'config', 'Workstation'], stdout=subprocess.PIPE) config = call.communicate()[0] - username_re = re.compile('^User name\s+(\S+)', re.MULTILINE) + username_re = re.compile(r'^User name\s+(\S+)', re.MULTILINE) username_match = username_re.search(config) if username_match: username = username_match.group(1) - domain_re = re.compile('^Logon domain\s+(\S+)', re.MULTILINE) + domain_re = re.compile(r'^Logon domain\s+(\S+)', re.MULTILINE) domain_match = domain_re.search(config) if domain_match: domain = domain_match.group(1) @@ -284,7 +291,7 @@ def _BuildCommandLineForRuleRaw(spec, cmd, cygwin_shell, has_input_path, if [x for x in cmd if '$(InputDir)' in x]: input_dir_preamble = ( 'set INPUTDIR=$(InputDir)\n' - 'set INPUTDIR=%INPUTDIR:$(ProjectDir)=%\n' + 'if NOT DEFINED INPUTDIR set INPUTDIR=.\\\n' 'set INPUTDIR=%INPUTDIR:~0,-1%\n' ) else: @@ -813,10 +820,10 @@ def _GenerateRulesForMSVS(p, output_dir, options, spec, if rules_external: _GenerateExternalRules(rules_external, output_dir, spec, sources, options, actions_to_add) - _AdjustSourcesForRules(spec, rules, sources, excluded_sources) + _AdjustSourcesForRules(rules, sources, excluded_sources, False) -def _AdjustSourcesForRules(spec, rules, sources, excluded_sources): +def _AdjustSourcesForRules(rules, sources, excluded_sources, is_msbuild): # Add outputs generated by each rule (if applicable). for rule in rules: # Add in the outputs from this rule. @@ -833,7 +840,7 @@ def _AdjustSourcesForRules(spec, rules, sources, excluded_sources): outputs = OrderedSet(_FixPaths(outputs)) inputs.remove(_FixPath(trigger_file)) sources.update(inputs) - if spec['type'] != 'none' and not spec.get('msvs_external_builder'): + if not is_msbuild: excluded_sources.update(inputs) sources.update(outputs) @@ -920,6 +927,42 @@ def _GenerateProject(project, options, version, generator_flags): return _GenerateMSVSProject(project, options, version, generator_flags) +# TODO: Avoid code duplication with _ValidateSourcesForOSX in make.py. +def _ValidateSourcesForMSVSProject(spec, version): + """Makes sure if duplicate basenames are not specified in the source list. + + Arguments: + spec: The target dictionary containing the properties of the target. + version: The VisualStudioVersion object. + """ + # This validation should not be applied to MSVC2010 and later. + assert not version.UsesVcxproj() + + # TODO: Check if MSVC allows this for loadable_module targets. + if spec.get('type', None) not in ('static_library', 'shared_library'): + return + sources = spec.get('sources', []) + basenames = {} + for source in sources: + name, ext = os.path.splitext(source) + is_compiled_file = ext in [ + '.c', '.cc', '.cpp', '.cxx', '.m', '.mm', '.s', '.S'] + if not is_compiled_file: + continue + basename = os.path.basename(name) # Don't include extension. + basenames.setdefault(basename, []).append(source) + + error = '' + for basename, files in basenames.iteritems(): + if len(files) > 1: + error += ' %s: %s\n' % (basename, ' '.join(files)) + + if error: + print('static library %s has several files with the same basename:\n' % + spec['target_name'] + error + 'MSVC08 cannot handle that.') + raise GypError('Duplicate basenames in sources section, see list above') + + def _GenerateMSVSProject(project, options, version, generator_flags): """Generates a .vcproj file. It may create .rules and .user files too. @@ -945,6 +988,11 @@ def _GenerateMSVSProject(project, options, version, generator_flags): for config_name, config in spec['configurations'].iteritems(): _AddConfigurationToMSVSProject(p, spec, config_type, config_name, config) + # MSVC08 and prior version cannot handle duplicate basenames in the same + # target. + # TODO: Take excluded sources into consideration if possible. + _ValidateSourcesForMSVSProject(spec, version) + # Prepare list of sources and excluded sources. gyp_file = os.path.split(project.build_file)[1] sources, excluded_sources = _PrepareListOfSources(spec, generator_flags, @@ -1064,7 +1112,8 @@ def _AddConfigurationToMSVSProject(p, spec, config_type, config_name, config): for this configuration. """ # Get the information for this configuration - include_dirs, resource_include_dirs = _GetIncludeDirs(config) + include_dirs, midl_include_dirs, resource_include_dirs = \ + _GetIncludeDirs(config) libraries = _GetLibraries(spec) library_dirs = _GetLibraryDirs(config) out_file, vc_tool, _ = _GetOutputFilePathAndTool(spec, msbuild=False) @@ -1092,6 +1141,8 @@ def _AddConfigurationToMSVSProject(p, spec, config_type, config_name, config): # Add the information to the appropriate tool _ToolAppend(tools, 'VCCLCompilerTool', 'AdditionalIncludeDirectories', include_dirs) + _ToolAppend(tools, 'VCMIDLTool', + 'AdditionalIncludeDirectories', midl_include_dirs) _ToolAppend(tools, 'VCResourceCompilerTool', 'AdditionalIncludeDirectories', resource_include_dirs) # Add in libraries. @@ -1147,10 +1198,14 @@ def _GetIncludeDirs(config): include_dirs = ( config.get('include_dirs', []) + config.get('msvs_system_include_dirs', [])) + midl_include_dirs = ( + config.get('midl_include_dirs', []) + + config.get('msvs_system_include_dirs', [])) resource_include_dirs = config.get('resource_include_dirs', include_dirs) include_dirs = _FixPaths(include_dirs) + midl_include_dirs = _FixPaths(midl_include_dirs) resource_include_dirs = _FixPaths(resource_include_dirs) - return include_dirs, resource_include_dirs + return include_dirs, midl_include_dirs, resource_include_dirs def _GetLibraryDirs(config): @@ -1184,7 +1239,7 @@ def _GetLibraries(spec): found = OrderedSet() unique_libraries_list = [] for entry in reversed(libraries): - library = re.sub('^\-l', '', entry) + library = re.sub(r'^\-l', '', entry) if not os.path.splitext(library)[1]: library += '.lib' if library not in found: @@ -1392,7 +1447,7 @@ def _PrepareListOfSources(spec, generator_flags, gyp_file): # Add all inputs to sources and excluded sources. inputs = OrderedSet(inputs) sources.update(inputs) - if spec['type'] != 'none' and not spec.get('msvs_external_builder'): + if not spec.get('msvs_external_builder'): excluded_sources.update(inputs) if int(a.get('process_outputs_as_sources', False)): _AddNormalizedSources(sources, a.get('outputs', [])) @@ -1787,7 +1842,7 @@ def _CreateProjectObjects(target_list, target_dicts, options, msvs_version): return projects -def _InitNinjaFlavor(options, target_list, target_dicts): +def _InitNinjaFlavor(params, target_list, target_dicts): """Initialize targets for the ninja flavor. This sets up the necessary variables in the targets to generate msvs projects @@ -1795,7 +1850,7 @@ def _InitNinjaFlavor(options, target_list, target_dicts): if they have not been set. This allows individual specs to override the default values initialized here. Arguments: - options: Options provided to the generator. + params: Params provided to the generator. target_list: List of target pairs: 'base/base.gyp:base'. target_dicts: Dict of target properties keyed on target pair. """ @@ -1809,8 +1864,15 @@ def _InitNinjaFlavor(options, target_list, target_dicts): spec['msvs_external_builder'] = 'ninja' if not spec.get('msvs_external_builder_out_dir'): - spec['msvs_external_builder_out_dir'] = \ - options.depth + '/out/$(Configuration)' + gyp_file, _, _ = gyp.common.ParseQualifiedTarget(qualified_target) + gyp_dir = os.path.dirname(gyp_file) + configuration = '$(Configuration)' + if params.get('target_arch') == 'x64': + configuration += '_x64' + spec['msvs_external_builder_out_dir'] = os.path.join( + gyp.common.RelativePath(params['options'].toplevel_dir, gyp_dir), + ninja_generator.ComputeOutputDir(params), + configuration) if not spec.get('msvs_external_builder_build_cmd'): spec['msvs_external_builder_build_cmd'] = [ path_to_ninja, @@ -1823,8 +1885,7 @@ def _InitNinjaFlavor(options, target_list, target_dicts): path_to_ninja, '-C', '$(OutDir)', - '-t', - 'clean', + '-tclean', '$(ProjectName)', ] @@ -1905,7 +1966,7 @@ def GenerateOutput(target_list, target_dicts, data, params): # Optionally configure each spec to use ninja as the external builder. if params.get('flavor') == 'ninja': - _InitNinjaFlavor(options, target_list, target_dicts) + _InitNinjaFlavor(params, target_list, target_dicts) # Prepare the set of configurations. configs = set() @@ -1958,7 +2019,7 @@ def GenerateOutput(target_list, target_dicts, data, params): def _GenerateMSBuildFiltersFile(filters_path, source_files, - extension_to_rule_name): + rule_dependencies, extension_to_rule_name): """Generate the filters file. This file is used by Visual Studio to organize the presentation of source @@ -1971,8 +2032,8 @@ def _GenerateMSBuildFiltersFile(filters_path, source_files, """ filter_group = [] source_group = [] - _AppendFiltersForMSBuild('', source_files, extension_to_rule_name, - filter_group, source_group) + _AppendFiltersForMSBuild('', source_files, rule_dependencies, + extension_to_rule_name, filter_group, source_group) if filter_group: content = ['Project', {'ToolsVersion': '4.0', @@ -1987,7 +2048,7 @@ def _GenerateMSBuildFiltersFile(filters_path, source_files, os.unlink(filters_path) -def _AppendFiltersForMSBuild(parent_filter_name, sources, +def _AppendFiltersForMSBuild(parent_filter_name, sources, rule_dependencies, extension_to_rule_name, filter_group, source_group): """Creates the list of filters and sources to be added in the filter file. @@ -2013,11 +2074,12 @@ def _AppendFiltersForMSBuild(parent_filter_name, sources, ['UniqueIdentifier', MSVSNew.MakeGuid(source.name)]]) # Recurse and add its dependents. _AppendFiltersForMSBuild(filter_name, source.contents, - extension_to_rule_name, + rule_dependencies, extension_to_rule_name, filter_group, source_group) else: # It's a source. Create a source entry. - _, element = _MapFileToMsBuildSourceType(source, extension_to_rule_name) + _, element = _MapFileToMsBuildSourceType(source, rule_dependencies, + extension_to_rule_name) source_entry = [element, {'Include': source}] # Specify the filter it is part of, if any. if parent_filter_name: @@ -2025,7 +2087,8 @@ def _AppendFiltersForMSBuild(parent_filter_name, sources, source_group.append(source_entry) -def _MapFileToMsBuildSourceType(source, extension_to_rule_name): +def _MapFileToMsBuildSourceType(source, rule_dependencies, + extension_to_rule_name): """Returns the group and element type of the source file. Arguments: @@ -2048,9 +2111,15 @@ def _MapFileToMsBuildSourceType(source, extension_to_rule_name): elif ext == '.rc': group = 'resource' element = 'ResourceCompile' + elif ext == '.asm': + group = 'masm' + element = 'MASM' elif ext == '.idl': group = 'midl' element = 'Midl' + elif source in rule_dependencies: + group = 'rule_dependency' + element = 'CustomBuild' else: group = 'none' element = 'None' @@ -2060,7 +2129,8 @@ def _MapFileToMsBuildSourceType(source, extension_to_rule_name): def _GenerateRulesForMSBuild(output_dir, options, spec, sources, excluded_sources, props_files_of_rules, targets_files_of_rules, - actions_to_add, extension_to_rule_name): + actions_to_add, rule_dependencies, + extension_to_rule_name): # MSBuild rules are implemented using three files: an XML file, a .targets # file and a .props file. # See http://blogs.msdn.com/b/vcblog/archive/2010/04/21/quick-help-on-vs2010-custom-build-rule.aspx @@ -2076,6 +2146,7 @@ def _GenerateRulesForMSBuild(output_dir, options, spec, continue msbuild_rule = MSBuildRule(rule, spec) msbuild_rules.append(msbuild_rule) + rule_dependencies.update(msbuild_rule.additional_dependencies.split(';')) extension_to_rule_name[msbuild_rule.extension] = msbuild_rule.rule_name if msbuild_rules: base = spec['target_name'] + options.suffix @@ -2097,7 +2168,7 @@ def _GenerateRulesForMSBuild(output_dir, options, spec, if rules_external: _GenerateExternalRules(rules_external, output_dir, spec, sources, options, actions_to_add) - _AdjustSourcesForRules(spec, rules, sources, excluded_sources) + _AdjustSourcesForRules(rules, sources, excluded_sources, True) class MSBuildRule(object): @@ -2276,6 +2347,9 @@ def _GenerateMSBuildRuleTargetsFile(targets_path, msbuild_rules): rule_name, {'Condition': "'@(%s)' != '' and '%%(%s.ExcludedFromBuild)' != " "'true'" % (rule_name, rule_name), + 'EchoOff': 'true', + 'StandardOutputImportance': 'High', + 'StandardErrorImportance': 'High', 'CommandLineTemplate': '%%(%s.CommandLineTemplate)' % rule_name, 'AdditionalOptions': '%%(%s.AdditionalOptions)' % rule_name, 'Inputs': rule_inputs @@ -2550,15 +2624,45 @@ def _GetMSBuildProjectConfigurations(configurations): def _GetMSBuildGlobalProperties(spec, guid, gyp_file_name): namespace = os.path.splitext(gyp_file_name)[0] - return [ + properties = [ ['PropertyGroup', {'Label': 'Globals'}, - ['ProjectGuid', guid], - ['Keyword', 'Win32Proj'], - ['RootNamespace', namespace], - ['IgnoreWarnCompileDuplicatedFilename', 'true'], + ['ProjectGuid', guid], + ['Keyword', 'Win32Proj'], + ['RootNamespace', namespace], + ['IgnoreWarnCompileDuplicatedFilename', 'true'], ] - ] + ] + + if os.environ.get('PROCESSOR_ARCHITECTURE') == 'AMD64' or \ + os.environ.get('PROCESSOR_ARCHITEW6432') == 'AMD64': + properties[0].append(['PreferredToolArchitecture', 'x64']) + + if spec.get('msvs_enable_winrt'): + properties[0].append(['DefaultLanguage', 'en-US']) + properties[0].append(['AppContainerApplication', 'true']) + if spec.get('msvs_application_type_revision'): + app_type_revision = spec.get('msvs_application_type_revision') + properties[0].append(['ApplicationTypeRevision', app_type_revision]) + else: + properties[0].append(['ApplicationTypeRevision', '8.1']) + + if spec.get('msvs_target_platform_version'): + target_platform_version = spec.get('msvs_target_platform_version') + properties[0].append(['WindowsTargetPlatformVersion', + target_platform_version]) + if spec.get('msvs_target_platform_minversion'): + target_platform_minversion = spec.get('msvs_target_platform_minversion') + properties[0].append(['WindowsTargetPlatformMinVersion', + target_platform_minversion]) + else: + properties[0].append(['WindowsTargetPlatformMinVersion', + target_platform_version]) + if spec.get('msvs_enable_winphone'): + properties[0].append(['ApplicationType', 'Windows Phone']) + else: + properties[0].append(['ApplicationType', 'Windows Store']) + return properties def _GetMSBuildConfigurationDetails(spec, build_file): properties = {} @@ -2569,8 +2673,9 @@ def _GetMSBuildConfigurationDetails(spec, build_file): _AddConditionalProperty(properties, condition, 'ConfigurationType', msbuild_attributes['ConfigurationType']) if character_set: - _AddConditionalProperty(properties, condition, 'CharacterSet', - character_set) + if 'msvs_enable_winrt' not in spec : + _AddConditionalProperty(properties, condition, 'CharacterSet', + character_set) return _GetMSBuildPropertyGroup(spec, 'Configuration', properties) @@ -2785,7 +2890,7 @@ def _AddConditionalProperty(properties, condition, name, value): # Regex for msvs variable references ( i.e. $(FOO) ). -MSVS_VARIABLE_REFERENCE = re.compile('\$\(([a-zA-Z_][a-zA-Z0-9_]*)\)') +MSVS_VARIABLE_REFERENCE = re.compile(r'\$\(([a-zA-Z_][a-zA-Z0-9_]*)\)') def _GetMSBuildPropertyGroup(spec, label, properties): @@ -2869,7 +2974,8 @@ def _FinalizeMSBuildSettings(spec, configuration): converted = True msvs_settings = configuration.get('msvs_settings', {}) msbuild_settings = MSVSSettings.ConvertToMSBuildSettings(msvs_settings) - include_dirs, resource_include_dirs = _GetIncludeDirs(configuration) + include_dirs, midl_include_dirs, resource_include_dirs = \ + _GetIncludeDirs(configuration) libraries = _GetLibraries(spec) library_dirs = _GetLibraryDirs(configuration) out_file, _, msbuild_tool = _GetOutputFilePathAndTool(spec, msbuild=True) @@ -2899,6 +3005,8 @@ def _FinalizeMSBuildSettings(spec, configuration): # if you don't have any resources. _ToolAppend(msbuild_settings, 'ClCompile', 'AdditionalIncludeDirectories', include_dirs) + _ToolAppend(msbuild_settings, 'Midl', + 'AdditionalIncludeDirectories', midl_include_dirs) _ToolAppend(msbuild_settings, 'ResourceCompile', 'AdditionalIncludeDirectories', resource_include_dirs) # Add in libraries, note that even for empty libraries, we want this @@ -2929,6 +3037,13 @@ def _FinalizeMSBuildSettings(spec, configuration): 'PrecompiledHeaderFile', precompiled_header) _ToolAppend(msbuild_settings, 'ClCompile', 'ForcedIncludeFiles', [precompiled_header]) + else: + _ToolAppend(msbuild_settings, 'ClCompile', 'PrecompiledHeader', 'NotUsing') + # Turn off WinRT compilation + _ToolAppend(msbuild_settings, 'ClCompile', 'CompileAsWinRT', 'false') + # Turn on import libraries if appropriate + if spec.get('msvs_requires_importlibrary'): + _ToolAppend(msbuild_settings, '', 'IgnoreImportLibrary', 'false') # Loadable modules don't generate import libraries; # tell dependent projects to not expect one. if spec['type'] == 'loadable_module': @@ -2996,15 +3111,18 @@ def _VerifySourcesExist(sources, root_dir): return missing_sources -def _GetMSBuildSources(spec, sources, exclusions, extension_to_rule_name, - actions_spec, sources_handled_by_action, list_excluded): - groups = ['none', 'midl', 'include', 'compile', 'resource', 'rule'] +def _GetMSBuildSources(spec, sources, exclusions, rule_dependencies, + extension_to_rule_name, actions_spec, + sources_handled_by_action, list_excluded): + groups = ['none', 'masm', 'midl', 'include', 'compile', 'resource', 'rule', + 'rule_dependency'] grouped_sources = {} for g in groups: grouped_sources[g] = [] _AddSources2(spec, sources, exclusions, grouped_sources, - extension_to_rule_name, sources_handled_by_action, list_excluded) + rule_dependencies, extension_to_rule_name, + sources_handled_by_action, list_excluded) sources = [] for g in groups: if grouped_sources[g]: @@ -3015,13 +3133,15 @@ def _GetMSBuildSources(spec, sources, exclusions, extension_to_rule_name, def _AddSources2(spec, sources, exclusions, grouped_sources, - extension_to_rule_name, sources_handled_by_action, + rule_dependencies, extension_to_rule_name, + sources_handled_by_action, list_excluded): extensions_excluded_from_precompile = [] for source in sources: if isinstance(source, MSVSProject.Filter): _AddSources2(spec, source.contents, exclusions, grouped_sources, - extension_to_rule_name, sources_handled_by_action, + rule_dependencies, extension_to_rule_name, + sources_handled_by_action, list_excluded) else: if not source in sources_handled_by_action: @@ -3064,7 +3184,7 @@ def _AddSources2(spec, sources, exclusions, grouped_sources, detail.append(['PrecompiledHeader', '']) detail.append(['ForcedIncludeFiles', '']) - group, element = _MapFileToMsBuildSourceType(source, + group, element = _MapFileToMsBuildSourceType(source, rule_dependencies, extension_to_rule_name) grouped_sources[group].append([element, {'Include': source}] + detail) @@ -3108,6 +3228,7 @@ def _GenerateMSBuildProject(project, options, version, generator_flags): actions_to_add = {} props_files_of_rules = set() targets_files_of_rules = set() + rule_dependencies = set() extension_to_rule_name = {} list_excluded = generator_flags.get('msvs_list_excluded_files', True) @@ -3116,10 +3237,11 @@ def _GenerateMSBuildProject(project, options, version, generator_flags): _GenerateRulesForMSBuild(project_dir, options, spec, sources, excluded_sources, props_files_of_rules, targets_files_of_rules, - actions_to_add, extension_to_rule_name) + actions_to_add, rule_dependencies, + extension_to_rule_name) else: rules = spec.get('rules', []) - _AdjustSourcesForRules(spec, rules, sources, excluded_sources) + _AdjustSourcesForRules(rules, sources, excluded_sources, True) sources, excluded_sources, excluded_idl = ( _AdjustSourcesAndConvertToFilterHierarchy(spec, options, @@ -3142,6 +3264,7 @@ def _GenerateMSBuildProject(project, options, version, generator_flags): spec, actions_to_add) _GenerateMSBuildFiltersFile(project.path + '.filters', sources, + rule_dependencies, extension_to_rule_name) missing_sources = _VerifySourcesExist(sources, project_dir) @@ -3156,6 +3279,12 @@ def _GenerateMSBuildProject(project, options, version, generator_flags): ['Import', {'Project': r'$(VCTargetsPath)\Microsoft.Cpp.props'}]] import_cpp_targets_section = [ ['Import', {'Project': r'$(VCTargetsPath)\Microsoft.Cpp.targets'}]] + import_masm_props_section = [ + ['Import', + {'Project': r'$(VCTargetsPath)\BuildCustomizations\masm.props'}]] + import_masm_targets_section = [ + ['Import', + {'Project': r'$(VCTargetsPath)\BuildCustomizations\masm.targets'}]] macro_section = [['PropertyGroup', {'Label': 'UserMacros'}]] content = [ @@ -3169,8 +3298,12 @@ def _GenerateMSBuildProject(project, options, version, generator_flags): content += _GetMSBuildGlobalProperties(spec, project.guid, project_file_name) content += import_default_section content += _GetMSBuildConfigurationDetails(spec, project.build_file) - content += _GetMSBuildLocalProperties(project.msbuild_toolset) + if spec.get('msvs_enable_winphone'): + content += _GetMSBuildLocalProperties('v120_wp81') + else: + content += _GetMSBuildLocalProperties(project.msbuild_toolset) content += import_cpp_props_section + content += import_masm_props_section content += _GetMSBuildExtensions(props_files_of_rules) content += _GetMSBuildPropertySheets(configurations) content += macro_section @@ -3178,10 +3311,11 @@ def _GenerateMSBuildProject(project, options, version, generator_flags): project.build_file) content += _GetMSBuildToolSettingsSections(spec, configurations) content += _GetMSBuildSources( - spec, sources, exclusions, extension_to_rule_name, actions_spec, - sources_handled_by_action, list_excluded) + spec, sources, exclusions, rule_dependencies, extension_to_rule_name, + actions_spec, sources_handled_by_action, list_excluded) content += _GetMSBuildProjectReferences(project) content += import_cpp_targets_section + content += import_masm_targets_section content += _GetMSBuildExtensionTargets(targets_files_of_rules) if spec.get('msvs_external_builder'): @@ -3283,8 +3417,8 @@ def _GenerateActionsForMSBuild(spec, actions_to_add): # get too long. See also _AddActions: cygwin's setup_env mustn't be called # for every invocation or the command that sets the PATH will grow too # long. - command = ( - '\r\nif %errorlevel% neq 0 exit /b %errorlevel%\r\n'.join(commands)) + command = '\r\n'.join([c + '\r\nif %errorlevel% neq 0 exit /b %errorlevel%' + for c in commands]) _AddMSBuildAction(spec, primary_input, inputs, diff --git a/deps/gyp/pylib/gyp/generator/ninja.py b/deps/gyp/pylib/gyp/generator/ninja.py index e3fafb5d43..b13affe0a1 100644 --- a/deps/gyp/pylib/gyp/generator/ninja.py +++ b/deps/gyp/pylib/gyp/generator/ninja.py @@ -14,6 +14,7 @@ import subprocess import sys import gyp import gyp.common +from gyp.common import OrderedSet import gyp.msvs_emulation import gyp.MSVSUtil as MSVSUtil import gyp.xcode_emulation @@ -61,17 +62,7 @@ generator_additional_path_sections = [] generator_extra_sources_for_rules = [] generator_filelist_paths = None -# TODO: figure out how to not build extra host objects in the non-cross-compile -# case when this is enabled, and enable unconditionally. -generator_supports_multiple_toolsets = ( - os.environ.get('GYP_CROSSCOMPILE') or - os.environ.get('AR_host') or - os.environ.get('CC_host') or - os.environ.get('CXX_host') or - os.environ.get('AR_target') or - os.environ.get('CC_target') or - os.environ.get('CXX_target')) - +generator_supports_multiple_toolsets = gyp.common.CrossCompileRequested() def StripPrefix(arg, prefix): if arg.startswith(prefix): @@ -107,7 +98,7 @@ def AddArch(output, arch): return '%s.%s%s' % (output, arch, extension) -class Target: +class Target(object): """Target represents the paths used within a single gyp target. Conceptually, building a single target A is a series of steps: @@ -148,8 +139,11 @@ class Target: self.bundle = None # On Windows, incremental linking requires linking against all the .objs # that compose a .lib (rather than the .lib itself). That list is stored - # here. + # here. In this case, we also need to save the compile_deps for the target, + # so that the the target that directly depends on the .objs can also depend + # on those. self.component_objs = None + self.compile_deps = None # Windows only. The import .lib is the output of a build step, but # because dependents only link against the lib (not both the lib and the # dll) we keep track of the import library here. @@ -211,8 +205,8 @@ class Target: # an output file; the result can be namespaced such that it is unique # to the input file name as well as the output target name. -class NinjaWriter: - def __init__(self, qualified_target, target_outputs, base_dir, build_dir, +class NinjaWriter(object): + def __init__(self, hash_for_rules, target_outputs, base_dir, build_dir, output_file, toplevel_build, output_file_name, flavor, toplevel_dir=None): """ @@ -222,7 +216,7 @@ class NinjaWriter: toplevel_dir: path to the toplevel directory """ - self.qualified_target = qualified_target + self.hash_for_rules = hash_for_rules self.target_outputs = target_outputs self.base_dir = base_dir self.build_dir = build_dir @@ -339,6 +333,9 @@ class NinjaWriter: obj += '.' + self.toolset path_dir, path_basename = os.path.split(path) + assert not os.path.isabs(path_dir), ( + "'%s' can not be absolute path (see crbug.com/462153)." % path_dir) + if qualified: path_basename = self.name + '.' + path_basename return os.path.normpath(os.path.join(obj, self.base_dir, path_dir, @@ -393,6 +390,9 @@ class NinjaWriter: self.ninja.variable('arch', self.win_env[arch]) self.ninja.variable('cc', '$cl_' + arch) self.ninja.variable('cxx', '$cl_' + arch) + self.ninja.variable('cc_host', '$cl_' + arch) + self.ninja.variable('cxx_host', '$cl_' + arch) + self.ninja.variable('asm', '$ml_' + arch) if self.flavor == 'mac': self.archs = self.xcode_settings.GetActiveArchs(config_name) @@ -477,16 +477,17 @@ class NinjaWriter: elif self.flavor == 'mac' and len(self.archs) > 1: link_deps = collections.defaultdict(list) - + compile_deps = self.target.actions_stamp or actions_depends if self.flavor == 'win' and self.target.type == 'static_library': self.target.component_objs = link_deps + self.target.compile_deps = compile_deps # Write out a link step, if needed. output = None is_empty_bundle = not link_deps and not mac_bundle_depends if link_deps or self.target.actions_stamp or actions_depends: output = self.WriteTarget(spec, config_name, config, link_deps, - self.target.actions_stamp or actions_depends) + compile_deps) if self.is_mac_bundle: mac_bundle_depends.append(output) @@ -527,7 +528,7 @@ class NinjaWriter: def WriteWinIdlFiles(self, spec, prebuild): """Writes rules to match MSVS's implicit idl handling.""" assert self.flavor == 'win' - if self.msvs_settings.HasExplicitIdlRules(spec): + if self.msvs_settings.HasExplicitIdlRulesOrActions(spec): return [] outputs = [] for source in filter(lambda x: x.endswith('.idl'), spec['sources']): @@ -561,9 +562,10 @@ class NinjaWriter: stamp = self.WriteCollapsedDependencies('actions_rules_copies', outputs) if self.is_mac_bundle: - self.WriteMacBundleResources( + xcassets = self.WriteMacBundleResources( extra_mac_bundle_resources + mac_bundle_resources, mac_bundle_depends) - self.WriteMacInfoPlist(mac_bundle_depends) + partial_info_plist = self.WriteMacXCassets(xcassets, mac_bundle_depends) + self.WriteMacInfoPlist(partial_info_plist, mac_bundle_depends) return stamp @@ -588,16 +590,20 @@ class NinjaWriter: all_outputs = [] for action in actions: # First write out a rule for the action. - name = '%s_%s' % (action['action_name'], - hashlib.md5(self.qualified_target).hexdigest()) + name = '%s_%s' % (action['action_name'], self.hash_for_rules) description = self.GenerateDescription('ACTION', action.get('message', None), name) is_cygwin = (self.msvs_settings.IsRuleRunUnderCygwin(action) if self.flavor == 'win' else False) args = action['action'] + depfile = action.get('depfile', None) + if depfile: + depfile = self.ExpandSpecial(depfile, self.base_to_build) + pool = 'console' if int(action.get('ninja_use_console', 0)) else None rule_name, _ = self.WriteNewNinjaRule(name, args, description, - is_cygwin, env=env) + is_cygwin, env, pool, + depfile=depfile) inputs = [self.GypPathToNinja(i, env) for i in action['inputs']] if int(action.get('process_outputs_as_sources', False)): @@ -625,8 +631,7 @@ class NinjaWriter: continue # First write out a rule for the rule action. - name = '%s_%s' % (rule['rule_name'], - hashlib.md5(self.qualified_target).hexdigest()) + name = '%s_%s' % (rule['rule_name'], self.hash_for_rules) args = rule['action'] description = self.GenerateDescription( @@ -635,8 +640,9 @@ class NinjaWriter: ('%s ' + generator_default_variables['RULE_INPUT_PATH']) % name) is_cygwin = (self.msvs_settings.IsRuleRunUnderCygwin(rule) if self.flavor == 'win' else False) + pool = 'console' if int(rule.get('ninja_use_console', 0)) else None rule_name, args = self.WriteNewNinjaRule( - name, args, description, is_cygwin, env=env) + name, args, description, is_cygwin, env, pool) # TODO: if the command references the outputs directly, we should # simplify it to just use $out. @@ -648,10 +654,11 @@ class NinjaWriter: needed_variables = set(['source']) for argument in args: for var in special_locals: - if ('${%s}' % var) in argument: + if '${%s}' % var in argument: needed_variables.add(var) def cygwin_munge(path): + # pylint: disable=cell-var-from-loop if is_cygwin: return path.replace('\\', '/') return path @@ -757,15 +764,68 @@ class NinjaWriter: def WriteMacBundleResources(self, resources, bundle_depends): """Writes ninja edges for 'mac_bundle_resources'.""" + xcassets = [] for output, res in gyp.xcode_emulation.GetMacBundleResources( generator_default_variables['PRODUCT_DIR'], self.xcode_settings, map(self.GypPathToNinja, resources)): output = self.ExpandSpecial(output) - self.ninja.build(output, 'mac_tool', res, - variables=[('mactool_cmd', 'copy-bundle-resource')]) - bundle_depends.append(output) + if os.path.splitext(output)[-1] != '.xcassets': + isBinary = self.xcode_settings.IsBinaryOutputFormat(self.config_name) + self.ninja.build(output, 'mac_tool', res, + variables=[('mactool_cmd', 'copy-bundle-resource'), \ + ('binary', isBinary)]) + bundle_depends.append(output) + else: + xcassets.append(res) + return xcassets + + def WriteMacXCassets(self, xcassets, bundle_depends): + """Writes ninja edges for 'mac_bundle_resources' .xcassets files. + + This add an invocation of 'actool' via the 'mac_tool.py' helper script. + It assumes that the assets catalogs define at least one imageset and + thus an Assets.car file will be generated in the application resources + directory. If this is not the case, then the build will probably be done + at each invocation of ninja.""" + if not xcassets: + return + + extra_arguments = {} + settings_to_arg = { + 'XCASSETS_APP_ICON': 'app-icon', + 'XCASSETS_LAUNCH_IMAGE': 'launch-image', + } + settings = self.xcode_settings.xcode_settings[self.config_name] + for settings_key, arg_name in settings_to_arg.iteritems(): + value = settings.get(settings_key) + if value: + extra_arguments[arg_name] = value + + partial_info_plist = None + if extra_arguments: + partial_info_plist = self.GypPathToUniqueOutput( + 'assetcatalog_generated_info.plist') + extra_arguments['output-partial-info-plist'] = partial_info_plist - def WriteMacInfoPlist(self, bundle_depends): + outputs = [] + outputs.append( + os.path.join( + self.xcode_settings.GetBundleResourceFolder(), + 'Assets.car')) + if partial_info_plist: + outputs.append(partial_info_plist) + + keys = QuoteShellArgument(json.dumps(extra_arguments), self.flavor) + extra_env = self.xcode_settings.GetPerTargetSettings() + env = self.GetSortedXcodeEnv(additional_settings=extra_env) + env = self.ComputeExportEnvString(env) + + bundle_depends.extend(self.ninja.build( + outputs, 'compile_xcassets', xcassets, + variables=[('env', env), ('keys', keys)])) + return partial_info_plist + + def WriteMacInfoPlist(self, partial_info_plist, bundle_depends): """Write build rules for bundle Info.plist files.""" info_plist, out, defines, extra_env = gyp.xcode_emulation.GetMacInfoPlist( generator_default_variables['PRODUCT_DIR'], @@ -785,10 +845,18 @@ class NinjaWriter: env = self.GetSortedXcodeEnv(additional_settings=extra_env) env = self.ComputeExportEnvString(env) + if partial_info_plist: + intermediate_plist = self.GypPathToUniqueOutput('merged_info.plist') + info_plist = self.ninja.build( + intermediate_plist, 'merge_infoplist', + [partial_info_plist, info_plist]) + keys = self.xcode_settings.GetExtraPlistItems(self.config_name) keys = QuoteShellArgument(json.dumps(keys), self.flavor) + isBinary = self.xcode_settings.IsBinaryOutputFormat(self.config_name) self.ninja.build(out, 'copy_infoplist', info_plist, - variables=[('env', env), ('keys', keys)]) + variables=[('env', env), ('keys', keys), + ('binary', isBinary)]) bundle_depends.append(out) def WriteSources(self, ninja_file, config_name, config, sources, predepends, @@ -800,6 +868,8 @@ class NinjaWriter: self.ninja.variable('cxx', '$cxx_host') self.ninja.variable('ld', '$ld_host') self.ninja.variable('ldxx', '$ldxx_host') + self.ninja.variable('nm', '$nm_host') + self.ninja.variable('readelf', '$readelf_host') if self.flavor != 'mac' or len(self.archs) == 1: return self.WriteSourcesForArch( @@ -855,6 +925,11 @@ class NinjaWriter: os.environ.get('CFLAGS', '').split() + cflags_c) cflags_cc = (os.environ.get('CPPFLAGS', '').split() + os.environ.get('CXXFLAGS', '').split() + cflags_cc) + elif self.toolset == 'host': + cflags_c = (os.environ.get('CPPFLAGS_host', '').split() + + os.environ.get('CFLAGS_host', '').split() + cflags_c) + cflags_cc = (os.environ.get('CPPFLAGS_host', '').split() + + os.environ.get('CXXFLAGS_host', '').split() + cflags_cc) defines = config.get('defines', []) + extra_defines self.WriteVariableList(ninja_file, 'defines', @@ -877,6 +952,14 @@ class NinjaWriter: [QuoteShellArgument('-I' + self.GypPathToNinja(i, env), self.flavor) for i in include_dirs]) + if self.flavor == 'win': + midl_include_dirs = config.get('midl_include_dirs', []) + midl_include_dirs = self.msvs_settings.AdjustMidlIncludeDirs( + midl_include_dirs, config_name) + self.WriteVariableList(ninja_file, 'midl_includes', + [QuoteShellArgument('-I' + self.GypPathToNinja(i, env), self.flavor) + for i in midl_include_dirs]) + pch_commands = precompiled_header.GetPchBuildCommands(arch) if self.flavor == 'mac': # Most targets use no precompiled headers, so only write these if needed. @@ -885,6 +968,8 @@ class NinjaWriter: include = precompiled_header.GetInclude(ext, arch) if include: ninja_file.variable(var, include) + arflags = config.get('arflags', []) + self.WriteVariableList(ninja_file, 'cflags', map(self.ExpandSpecial, cflags)) self.WriteVariableList(ninja_file, 'cflags_c', @@ -896,6 +981,8 @@ class NinjaWriter: map(self.ExpandSpecial, cflags_objc)) self.WriteVariableList(ninja_file, 'cflags_objcc', map(self.ExpandSpecial, cflags_objcc)) + self.WriteVariableList(ninja_file, 'arflags', + map(self.ExpandSpecial, arflags)) ninja_file.newline() outputs = [] has_rc_source = False @@ -911,9 +998,7 @@ class NinjaWriter: elif ext == 's' and self.flavor != 'win': # Doesn't generate .o.d files. command = 'cc_s' elif (self.flavor == 'win' and ext == 'asm' and - self.msvs_settings.GetArch(config_name) == 'x86' and not self.msvs_settings.HasExplicitAsmRules(spec)): - # Asm files only get auto assembled for x86 (not x64). command = 'asm' # Add the _asm suffix as msvs is capable of handling .cc and # .asm files of the same name without collision. @@ -985,9 +1070,19 @@ class NinjaWriter: arch=arch) for arch in self.archs] extra_bindings = [] + build_output = output if not self.is_mac_bundle: self.AppendPostbuildVariable(extra_bindings, spec, output, output) - self.ninja.build(output, 'lipo', inputs, variables=extra_bindings) + + # TODO(yyanagisawa): more work needed to fix: + # https://code.google.com/p/gyp/issues/detail?id=411 + if (spec['type'] in ('shared_library', 'loadable_module') and + not self.is_mac_bundle): + extra_bindings.append(('lib', output)) + self.ninja.build([output, output + '.TOC'], 'solipo', inputs, + variables=extra_bindings) + else: + self.ninja.build(build_output, 'lipo', inputs, variables=extra_bindings) return output def WriteLinkForArch(self, ninja_file, spec, config_name, config, @@ -1002,6 +1097,7 @@ class NinjaWriter: implicit_deps = set() solibs = set() + order_deps = set() if 'dependencies' in spec: # Two kinds of dependencies: @@ -1020,6 +1116,8 @@ class NinjaWriter: target.component_objs and self.msvs_settings.IsUseLibraryDependencyInputs(config_name)): new_deps = target.component_objs + if target.compile_deps: + order_deps.add(target.compile_deps) elif self.flavor == 'win' and target.import_lib: new_deps = [target.import_lib] elif target.UsesToc(self.flavor): @@ -1080,10 +1178,10 @@ class NinjaWriter: rpath = 'lib/' if self.toolset != 'target': rpath += self.toolset - ldflags.append('-Wl,-rpath=\$$ORIGIN/%s' % rpath) + ldflags.append(r'-Wl,-rpath=\$$ORIGIN/%s' % rpath) ldflags.append('-Wl,-rpath-link=%s' % rpath) self.WriteVariableList(ninja_file, 'ldflags', - gyp.common.uniquer(map(self.ExpandSpecial, ldflags))) + map(self.ExpandSpecial, ldflags)) library_dirs = config.get('library_dirs', []) if self.flavor == 'win': @@ -1131,7 +1229,8 @@ class NinjaWriter: gyp.common.EncodePOSIXShellArgument(link_file_list))) if self.flavor == 'win': extra_bindings.append(('binary', output)) - if '/NOENTRY' not in ldflags: + if ('/NOENTRY' not in ldflags and + not self.msvs_settings.GetNoImportLibrary(config_name)): self.target.import_lib = output + '.lib' extra_bindings.append(('implibflag', '/IMPLIB:%s' % self.target.import_lib)) @@ -1157,6 +1256,7 @@ class NinjaWriter: ninja_file.build(output, command + command_suffix, link_deps, implicit=list(implicit_deps), + order_only=list(order_deps), variables=extra_bindings) return linked_binary @@ -1171,7 +1271,7 @@ class NinjaWriter: self.target.type = 'none' elif spec['type'] == 'static_library': self.target.binary = self.ComputeOutput(spec) - if (self.flavor not in ('mac', 'openbsd', 'win') and not + if (self.flavor not in ('mac', 'openbsd', 'netbsd', 'win') and not self.is_standalone_static_library): self.ninja.build(self.target.binary, 'alink_thin', link_deps, order_only=compile_deps) @@ -1424,7 +1524,8 @@ class NinjaWriter: values = [] ninja_file.variable(var, ' '.join(values)) - def WriteNewNinjaRule(self, name, args, description, is_cygwin, env): + def WriteNewNinjaRule(self, name, args, description, is_cygwin, env, pool, + depfile=None): """Write out a new ninja "rule" statement for a given command. Returns the name of the new rule, and a copy of |args| with variables @@ -1482,7 +1583,8 @@ class NinjaWriter: # GYP rules/actions express being no-ops by not touching their outputs. # Avoid executing downstream dependencies in this case by specifying # restat=1 to ninja. - self.ninja.rule(rule_name, command, description, restat=True, + self.ninja.rule(rule_name, command, description, depfile=depfile, + restat=True, pool=pool, rspfile=rspfile, rspfile_content=rspfile_content) self.ninja.newline() @@ -1513,12 +1615,13 @@ def CalculateVariables(default_variables, params): generator_extra_sources_for_rules = getattr(xcode_generator, 'generator_extra_sources_for_rules', []) elif flavor == 'win': + exts = gyp.MSVSUtil.TARGET_TYPE_EXT default_variables.setdefault('OS', 'win') - default_variables['EXECUTABLE_SUFFIX'] = '.exe' + default_variables['EXECUTABLE_SUFFIX'] = '.' + exts['executable'] default_variables['STATIC_LIB_PREFIX'] = '' - default_variables['STATIC_LIB_SUFFIX'] = '.lib' + default_variables['STATIC_LIB_SUFFIX'] = '.' + exts['static_library'] default_variables['SHARED_LIB_PREFIX'] = '' - default_variables['SHARED_LIB_SUFFIX'] = '.dll' + default_variables['SHARED_LIB_SUFFIX'] = '.' + exts['shared_library'] # Copy additional generator configuration data from VS, which is shared # by the Windows Ninja generator. @@ -1582,6 +1685,10 @@ def CommandWithWrapper(cmd, wrappers, prog): def GetDefaultConcurrentLinks(): """Returns a best-guess for a number of concurrent links.""" + pool_size = int(os.environ.get('GYP_LINK_CONCURRENCY', 0)) + if pool_size: + return pool_size + if sys.platform in ('win32', 'cygwin'): import ctypes @@ -1602,8 +1709,10 @@ def GetDefaultConcurrentLinks(): stat.dwLength = ctypes.sizeof(stat) ctypes.windll.kernel32.GlobalMemoryStatusEx(ctypes.byref(stat)) - mem_limit = max(1, stat.ullTotalPhys / (4 * (2 ** 30))) # total / 4GB - hard_cap = max(1, int(os.getenv('GYP_LINK_CONCURRENCY_MAX', 2**32))) + # VS 2015 uses 20% more working set than VS 2013 and can consume all RAM + # on a 64 GB machine. + mem_limit = max(1, stat.ullTotalPhys / (5 * (2 ** 30))) # total / 5GB + hard_cap = max(1, int(os.environ.get('GYP_LINK_CONCURRENCY_MAX', 2**32))) return min(mem_limit, hard_cap) elif sys.platform.startswith('linux'): if os.path.exists("/proc/meminfo"): @@ -1711,14 +1820,15 @@ def GenerateOutputForConfig(target_list, target_dicts, data, params, # 'CC_host'/'CXX_host' enviroment variable, cc_host/cxx_host should be set # to cc/cxx. if flavor == 'win': - # Overridden by local arch choice in the use_deps case. - # Chromium's ffmpeg c99conv.py currently looks for a 'cc =' line in - # build.ninja so needs something valid here. http://crbug.com/233985 - cc = 'cl.exe' - cxx = 'cl.exe' + ar = 'lib.exe' + # cc and cxx must be set to the correct architecture by overriding with one + # of cl_x86 or cl_x64 below. + cc = 'UNSET' + cxx = 'UNSET' ld = 'link.exe' ld_host = '$ld' else: + ar = 'ar' cc = 'cc' cxx = 'c++' ld = '$cc' @@ -1726,11 +1836,16 @@ def GenerateOutputForConfig(target_list, target_dicts, data, params, ld_host = '$cc_host' ldxx_host = '$cxx_host' + ar_host = ar cc_host = None cxx_host = None cc_host_global_setting = None cxx_host_global_setting = None clang_cl = None + nm = 'nm' + nm_host = 'nm' + readelf = 'readelf' + readelf_host = 'readelf' build_file, _, _ = gyp.common.ParseQualifiedTarget(target_list[0]) make_global_settings = data[build_file].get('make_global_settings', []) @@ -1738,6 +1853,10 @@ def GenerateOutputForConfig(target_list, target_dicts, data, params, options.toplevel_dir) wrappers = {} for key, value in make_global_settings: + if key == 'AR': + ar = os.path.join(build_to_root, value) + if key == 'AR.host': + ar_host = os.path.join(build_to_root, value) if key == 'CC': cc = os.path.join(build_to_root, value) if cc.endswith('clang-cl'): @@ -1750,6 +1869,18 @@ def GenerateOutputForConfig(target_list, target_dicts, data, params, if key == 'CXX.host': cxx_host = os.path.join(build_to_root, value) cxx_host_global_setting = value + if key == 'LD': + ld = os.path.join(build_to_root, value) + if key == 'LD.host': + ld_host = os.path.join(build_to_root, value) + if key == 'NM': + nm = os.path.join(build_to_root, value) + if key == 'NM.host': + nm_host = os.path.join(build_to_root, value) + if key == 'READELF': + readelf = os.path.join(build_to_root, value) + if key == 'READELF.host': + readelf_host = os.path.join(build_to_root, value) if key.endswith('_wrapper'): wrappers[key[:-len('_wrapper')]] = os.path.join(build_to_root, value) @@ -1761,8 +1892,15 @@ def GenerateOutputForConfig(target_list, target_dicts, data, params, wrappers[key_prefix] = os.path.join(build_to_root, value) if flavor == 'win': + configs = [target_dicts[qualified_target]['configurations'][config_name] + for qualified_target in target_list] + shared_system_includes = None + if not generator_flags.get('ninja_use_custom_environment_files', 0): + shared_system_includes = \ + gyp.msvs_emulation.ExtractSharedMSVSSystemIncludes( + configs, generator_flags) cl_paths = gyp.msvs_emulation.GenerateEnvironmentFiles( - toplevel_build, generator_flags, OpenOutput) + toplevel_build, generator_flags, shared_system_includes, OpenOutput) for arch, path in cl_paths.iteritems(): if clang_cl: # If we have selected clang-cl, use that instead. @@ -1782,14 +1920,22 @@ def GenerateOutputForConfig(target_list, target_dicts, data, params, if flavor == 'win': master_ninja.variable('ld', ld) master_ninja.variable('idl', 'midl.exe') - master_ninja.variable('ar', 'lib.exe') + master_ninja.variable('ar', ar) master_ninja.variable('rc', 'rc.exe') - master_ninja.variable('asm', 'ml.exe') + master_ninja.variable('ml_x86', 'ml.exe') + master_ninja.variable('ml_x64', 'ml64.exe') master_ninja.variable('mt', 'mt.exe') else: master_ninja.variable('ld', CommandWithWrapper('LINK', wrappers, ld)) master_ninja.variable('ldxx', CommandWithWrapper('LINK', wrappers, ldxx)) - master_ninja.variable('ar', GetEnvironFallback(['AR_target', 'AR'], 'ar')) + master_ninja.variable('ar', GetEnvironFallback(['AR_target', 'AR'], ar)) + if flavor != 'mac': + # Mac does not use readelf/nm for .TOC generation, so avoiding polluting + # the master ninja with extra unused variables. + master_ninja.variable( + 'nm', GetEnvironFallback(['NM_target', 'NM'], nm)) + master_ninja.variable( + 'readelf', GetEnvironFallback(['READELF_target', 'READELF'], readelf)) if generator_supports_multiple_toolsets: if not cc_host: @@ -1797,7 +1943,10 @@ def GenerateOutputForConfig(target_list, target_dicts, data, params, if not cxx_host: cxx_host = cxx - master_ninja.variable('ar_host', GetEnvironFallback(['AR_host'], 'ar')) + master_ninja.variable('ar_host', GetEnvironFallback(['AR_host'], ar_host)) + master_ninja.variable('nm_host', GetEnvironFallback(['NM_host'], nm_host)) + master_ninja.variable('readelf_host', + GetEnvironFallback(['READELF_host'], readelf_host)) cc_host = GetEnvironFallback(['CC_host'], cc_host) cxx_host = GetEnvironFallback(['CXX_host'], cxx_host) @@ -1880,7 +2029,7 @@ def GenerateOutputForConfig(target_list, target_dicts, data, params, description='IDL $in', command=('%s gyp-win-tool midl-wrapper $arch $outdir ' '$tlb $h $dlldata $iid $proxy $in ' - '$idlflags' % sys.executable)) + '$midl_includes $idlflags' % sys.executable)) master_ninja.rule( 'rc', description='RC $in', @@ -1899,11 +2048,11 @@ def GenerateOutputForConfig(target_list, target_dicts, data, params, master_ninja.rule( 'alink', description='AR $out', - command='rm -f $out && $ar rcs $out $in') + command='rm -f $out && $ar rcs $arflags $out $in') master_ninja.rule( 'alink_thin', description='AR $out', - command='rm -f $out && $ar rcsT $out $in') + command='rm -f $out && $ar rcsT $arflags $out $in') # This allows targets that only need to depend on $lib's API to declare an # order-only dependency on $lib.TOC and avoid relinking such downstream @@ -1919,8 +2068,8 @@ def GenerateOutputForConfig(target_list, target_dicts, data, params, % { 'solink': '$ld -shared $ldflags -o $lib -Wl,-soname=$soname %(suffix)s', 'extract_toc': - ('{ readelf -d $lib | grep SONAME ; ' - 'nm -gD -f p $lib | cut -f1-2 -d\' \'; }')}) + ('{ $readelf -d $lib | grep SONAME ; ' + '$nm -gD -f p $lib | cut -f1-2 -d\' \'; }')}) master_ninja.rule( 'solink', @@ -1937,13 +2086,13 @@ def GenerateOutputForConfig(target_list, target_dicts, data, params, restat=True, command=mtime_preserving_solink_base % {'suffix': '@$link_file_list'}, rspfile='$link_file_list', - rspfile_content='-Wl,--start-group $in $solibs -Wl,--end-group $libs', + rspfile_content='-Wl,--start-group $in -Wl,--end-group $solibs $libs', pool='link_pool') master_ninja.rule( 'link', description='LINK $out', command=('$ld $ldflags -o $out ' - '-Wl,--start-group $in $solibs -Wl,--end-group $libs'), + '-Wl,--start-group $in -Wl,--end-group $solibs $libs'), pool='link_pool') elif flavor == 'win': master_ninja.rule( @@ -1982,6 +2131,16 @@ def GenerateOutputForConfig(target_list, target_dicts, data, params, 'lipo', description='LIPO $out, POSTBUILDS', command='rm -f $out && lipo -create $in -output $out$postbuilds') + master_ninja.rule( + 'solipo', + description='SOLIPO $out, POSTBUILDS', + command=( + 'rm -f $lib $lib.TOC && lipo -create $in -output $lib$postbuilds &&' + '%(extract_toc)s > $lib.TOC' + % { 'extract_toc': + '{ otool -l $lib | grep LC_ID_DYLIB -A 5; ' + 'nm -gP $lib | cut -f1-2 -d\' \' | grep -v U$$; true; }'})) + # Record the public interface of $lib in $lib.TOC. See the corresponding # comment in the posix section above for details. @@ -2056,11 +2215,19 @@ def GenerateOutputForConfig(target_list, target_dicts, data, params, master_ninja.rule( 'copy_infoplist', description='COPY INFOPLIST $in', - command='$env ./gyp-mac-tool copy-info-plist $in $out $keys') + command='$env ./gyp-mac-tool copy-info-plist $in $out $binary $keys') + master_ninja.rule( + 'merge_infoplist', + description='MERGE INFOPLISTS $in', + command='$env ./gyp-mac-tool merge-info-plist $out $in') + master_ninja.rule( + 'compile_xcassets', + description='COMPILE XCASSETS $in', + command='$env ./gyp-mac-tool compile-xcassets $keys $in') master_ninja.rule( 'mac_tool', description='MACTOOL $mactool_cmd $in', - command='$env ./gyp-mac-tool $mactool_cmd $in $out') + command='$env ./gyp-mac-tool $mactool_cmd $in $out $binary') master_ninja.rule( 'package_framework', description='PACKAGE FRAMEWORK $out, POSTBUILDS', @@ -2100,6 +2267,15 @@ def GenerateOutputForConfig(target_list, target_dicts, data, params, # objects. target_short_names = {} + # short name of targets that were skipped because they didn't contain anything + # interesting. + # NOTE: there may be overlap between this an non_empty_target_names. + empty_target_names = set() + + # Set of non-empty short target names. + # NOTE: there may be overlap between this an empty_target_names. + non_empty_target_names = set() + for qualified_target in target_list: # qualified_target is like: third_party/icu/icu.gyp:icui18n#target build_file, name, toolset = \ @@ -2114,7 +2290,15 @@ def GenerateOutputForConfig(target_list, target_dicts, data, params, if flavor == 'mac': gyp.xcode_emulation.MergeGlobalXcodeSettingsToSpec(data[build_file], spec) - build_file = gyp.common.RelativePath(build_file, options.toplevel_dir) + # If build_file is a symlink, we must not follow it because there's a chance + # it could point to a path above toplevel_dir, and we cannot correctly deal + # with that case at the moment. + build_file = gyp.common.RelativePath(build_file, options.toplevel_dir, + False) + + qualified_target_for_hash = gyp.common.QualifiedTarget(build_file, name, + toolset) + hash_for_rules = hashlib.md5(qualified_target_for_hash).hexdigest() base_path = os.path.dirname(build_file) obj = 'obj' @@ -2123,7 +2307,7 @@ def GenerateOutputForConfig(target_list, target_dicts, data, params, output_file = os.path.join(obj, base_path, name + '.ninja') ninja_output = StringIO() - writer = NinjaWriter(qualified_target, target_outputs, base_path, build_dir, + writer = NinjaWriter(hash_for_rules, target_outputs, base_path, build_dir, ninja_output, toplevel_build, output_file, flavor, toplevel_dir=options.toplevel_dir) @@ -2143,6 +2327,9 @@ def GenerateOutputForConfig(target_list, target_dicts, data, params, target_outputs[qualified_target] = target if qualified_target in all_targets: all_outputs.add(target.FinalOutput()) + non_empty_target_names.add(name) + else: + empty_target_names.add(name) if target_short_names: # Write a short name to build this target. This benefits both the @@ -2154,6 +2341,16 @@ def GenerateOutputForConfig(target_list, target_dicts, data, params, master_ninja.build(short_name, 'phony', [x.FinalOutput() for x in target_short_names[short_name]]) + # Write phony targets for any empty targets that weren't written yet. As + # short names are not necessarily unique only do this for short names that + # haven't already been output for another target. + empty_target_names = empty_target_names - non_empty_target_names + if empty_target_names: + master_ninja.newline() + master_ninja.comment('Empty targets (output for completeness).') + for name in sorted(empty_target_names): + master_ninja.build(name, 'phony') + if all_outputs: master_ninja.newline() master_ninja.build('all', 'phony', list(all_outputs)) diff --git a/deps/gyp/pylib/gyp/generator/ninja_test.py b/deps/gyp/pylib/gyp/generator/ninja_test.py index 52661bcdf0..1767b2f45a 100644 --- a/deps/gyp/pylib/gyp/generator/ninja_test.py +++ b/deps/gyp/pylib/gyp/generator/ninja_test.py @@ -15,15 +15,18 @@ import TestCommon class TestPrefixesAndSuffixes(unittest.TestCase): def test_BinaryNamesWindows(self): - writer = ninja.NinjaWriter('foo', 'wee', '.', '.', 'build.ninja', '.', - 'build.ninja', 'win') - spec = { 'target_name': 'wee' } - self.assertTrue(writer.ComputeOutputFileName(spec, 'executable'). - endswith('.exe')) - self.assertTrue(writer.ComputeOutputFileName(spec, 'shared_library'). - endswith('.dll')) - self.assertTrue(writer.ComputeOutputFileName(spec, 'static_library'). - endswith('.lib')) + # These cannot run on non-Windows as they require a VS installation to + # correctly handle variable expansion. + if sys.platform.startswith('win'): + writer = ninja.NinjaWriter('foo', 'wee', '.', '.', 'build.ninja', '.', + 'build.ninja', 'win') + spec = { 'target_name': 'wee' } + self.assertTrue(writer.ComputeOutputFileName(spec, 'executable'). + endswith('.exe')) + self.assertTrue(writer.ComputeOutputFileName(spec, 'shared_library'). + endswith('.dll')) + self.assertTrue(writer.ComputeOutputFileName(spec, 'static_library'). + endswith('.lib')) def test_BinaryNamesLinux(self): writer = ninja.NinjaWriter('foo', 'wee', '.', '.', 'build.ninja', '.', diff --git a/deps/gyp/pylib/gyp/generator/xcode.py b/deps/gyp/pylib/gyp/generator/xcode.py index 783dafa0b0..0e3fb9301e 100644 --- a/deps/gyp/pylib/gyp/generator/xcode.py +++ b/deps/gyp/pylib/gyp/generator/xcode.py @@ -31,10 +31,6 @@ _intermediate_var = 'INTERMEDIATE_DIR' # targets that share the same BUILT_PRODUCTS_DIR. _shared_intermediate_var = 'SHARED_INTERMEDIATE_DIR' -# ONLY_ACTIVE_ARCH means that only the active architecture should be build for -# Debugging purposes to shorten the build time -_only_active_arch = 'ONLY_ACTIVE_ARCH' - _library_search_paths_var = 'LIBRARY_SEARCH_PATHS' generator_default_variables = { @@ -73,6 +69,9 @@ generator_additional_path_sections = [ # The Xcode-specific keys that exist on targets and aren't moved down to # configurations. generator_additional_non_configuration_keys = [ + 'ios_app_extension', + 'ios_watch_app', + 'ios_watchkit_extension', 'mac_bundle', 'mac_bundle_resources', 'mac_framework_headers', @@ -88,6 +87,8 @@ generator_extra_sources_for_rules = [ 'mac_framework_private_headers', ] +generator_filelist_paths = None + # Xcode's standard set of library directories, which don't need to be duplicated # in LIBRARY_SEARCH_PATHS. This list is not exhaustive, but that's okay. xcode_standard_library_dirs = frozenset([ @@ -172,8 +173,6 @@ class XcodeProject(object): xccl.SetBuildSetting(_shared_intermediate_var, '$(SYMROOT)/DerivedSources/$(CONFIGURATION)') - xccl.ConfigurationNamed('Debug').SetBuildSetting(_only_active_arch, 'YES') - # Set user-specified project-wide build settings and config files. This # is intended to be used very sparingly. Really, almost everything should # go into target-specific build settings sections. The project-wide @@ -491,7 +490,7 @@ sys.exit(subprocess.call(sys.argv[1:]))" """ def AddSourceToTarget(source, type, pbxp, xct): # TODO(mark): Perhaps source_extensions and library_extensions can be made a # little bit fancier. - source_extensions = ['c', 'cc', 'cpp', 'cxx', 'm', 'mm', 's'] + source_extensions = ['c', 'cc', 'cpp', 'cxx', 'm', 'mm', 's', 'swift'] # .o is conceptually more of a "source" than a "library," but Xcode thinks # of "sources" as things to compile and "libraries" (or "frameworks") as @@ -527,7 +526,7 @@ def AddHeaderToTarget(header, pbxp, xct, is_public): xct.HeadersPhase().AddFile(header, settings) -_xcode_variable_re = re.compile('(\$\((.*?)\))') +_xcode_variable_re = re.compile(r'(\$\((.*?)\))') def ExpandXcodeVariables(string, expansions): """Expands Xcode-style $(VARIABLES) in string per the expansions dict. @@ -581,6 +580,26 @@ def PerformBuild(data, configurations, params): subprocess.check_call(arguments) +def CalculateGeneratorInputInfo(params): + toplevel = params['options'].toplevel_dir + if params.get('flavor') == 'ninja': + generator_dir = os.path.relpath(params['options'].generator_output or '.') + output_dir = params.get('generator_flags', {}).get('output_dir', 'out') + output_dir = os.path.normpath(os.path.join(generator_dir, output_dir)) + qualified_out_dir = os.path.normpath(os.path.join( + toplevel, output_dir, 'gypfiles-xcode-ninja')) + else: + output_dir = os.path.normpath(os.path.join(toplevel, 'xcodebuild')) + qualified_out_dir = os.path.normpath(os.path.join( + toplevel, output_dir, 'gypfiles')) + + global generator_filelist_paths + generator_filelist_paths = { + 'toplevel': toplevel, + 'qualified_out_dir': qualified_out_dir, + } + + def GenerateOutput(target_list, target_dicts, data, params): # Optionally configure each spec to use ninja as the external builder. ninja_wrapper = params.get('flavor') == 'ninja' @@ -593,7 +612,15 @@ def GenerateOutput(target_list, target_dicts, data, params): parallel_builds = generator_flags.get('xcode_parallel_builds', True) serialize_all_tests = \ generator_flags.get('xcode_serialize_all_test_runs', True) - project_version = generator_flags.get('xcode_project_version', None) + upgrade_check_project_version = \ + generator_flags.get('xcode_upgrade_check_project_version', None) + + # Format upgrade_check_project_version with leading zeros as needed. + if upgrade_check_project_version: + upgrade_check_project_version = str(upgrade_check_project_version) + while len(upgrade_check_project_version) < 4: + upgrade_check_project_version = '0' + upgrade_check_project_version + skip_excluded_files = \ not generator_flags.get('xcode_list_excluded_files', True) xcode_projects = {} @@ -608,15 +635,17 @@ def GenerateOutput(target_list, target_dicts, data, params): xcode_projects[build_file] = xcp pbxp = xcp.project + # Set project-level attributes from multiple options + project_attributes = {}; if parallel_builds: - pbxp.SetProperty('attributes', - { - 'BuildIndependentTargetsInParallel': 'YES', - 'LastUpgradeCheck': '0500' - } - ) - if project_version: - xcp.project_file.SetXcodeVersion(project_version) + project_attributes['BuildIndependentTargetsInParallel'] = 'YES' + if upgrade_check_project_version: + project_attributes['LastUpgradeCheck'] = upgrade_check_project_version + project_attributes['LastTestingUpgradeCheck'] = \ + upgrade_check_project_version + project_attributes['LastSwiftUpdateCheck'] = \ + upgrade_check_project_version + pbxp.SetProperty('attributes', project_attributes) # Add gyp/gypi files to project if not generator_flags.get('standalone'): @@ -654,14 +683,21 @@ def GenerateOutput(target_list, target_dicts, data, params): # com.googlecode.gyp.xcode.bundle, a pseudo-type that xcode.py interprets # to create a single-file mh_bundle. _types = { - 'executable': 'com.apple.product-type.tool', - 'loadable_module': 'com.googlecode.gyp.xcode.bundle', - 'shared_library': 'com.apple.product-type.library.dynamic', - 'static_library': 'com.apple.product-type.library.static', - 'executable+bundle': 'com.apple.product-type.application', - 'loadable_module+bundle': 'com.apple.product-type.bundle', - 'loadable_module+xctest': 'com.apple.product-type.bundle.unit-test', - 'shared_library+bundle': 'com.apple.product-type.framework', + 'executable': 'com.apple.product-type.tool', + 'loadable_module': 'com.googlecode.gyp.xcode.bundle', + 'shared_library': 'com.apple.product-type.library.dynamic', + 'static_library': 'com.apple.product-type.library.static', + 'mac_kernel_extension': 'com.apple.product-type.kernel-extension', + 'executable+bundle': 'com.apple.product-type.application', + 'loadable_module+bundle': 'com.apple.product-type.bundle', + 'loadable_module+xctest': 'com.apple.product-type.bundle.unit-test', + 'shared_library+bundle': 'com.apple.product-type.framework', + 'executable+extension+bundle': 'com.apple.product-type.app-extension', + 'executable+watch+extension+bundle': + 'com.apple.product-type.watchkit-extension', + 'executable+watch+bundle': + 'com.apple.product-type.application.watchapp', + 'mac_kernel_extension+bundle': 'com.apple.product-type.kernel-extension', } target_properties = { @@ -672,6 +708,9 @@ def GenerateOutput(target_list, target_dicts, data, params): type = spec['type'] is_xctest = int(spec.get('mac_xctest_bundle', 0)) is_bundle = int(spec.get('mac_bundle', 0)) or is_xctest + is_app_extension = int(spec.get('ios_app_extension', 0)) + is_watchkit_extension = int(spec.get('ios_watchkit_extension', 0)) + is_watch_app = int(spec.get('ios_watch_app', 0)) if type != 'none': type_bundle_key = type if is_xctest: @@ -679,6 +718,18 @@ def GenerateOutput(target_list, target_dicts, data, params): assert type == 'loadable_module', ( 'mac_xctest_bundle targets must have type loadable_module ' '(target %s)' % target_name) + elif is_app_extension: + assert is_bundle, ('ios_app_extension flag requires mac_bundle ' + '(target %s)' % target_name) + type_bundle_key += '+extension+bundle' + elif is_watchkit_extension: + assert is_bundle, ('ios_watchkit_extension flag requires mac_bundle ' + '(target %s)' % target_name) + type_bundle_key += '+watch+extension+bundle' + elif is_watch_app: + assert is_bundle, ('ios_watch_app flag requires mac_bundle ' + '(target %s)' % target_name) + type_bundle_key += '+watch+bundle' elif is_bundle: type_bundle_key += '+bundle' @@ -1118,6 +1169,9 @@ exit 1 # Relative paths are relative to $(SRCROOT). dest = '$(SRCROOT)/' + dest + code_sign = int(copy_group.get('xcode_code_sign', 0)) + settings = (None, '{ATTRIBUTES = (CodeSignOnCopy, ); }')[code_sign]; + # Coalesce multiple "copies" sections in the same target with the same # "destination" property into the same PBXCopyFilesBuildPhase, otherwise # they'll wind up with ID collisions. @@ -1136,7 +1190,7 @@ exit 1 pbxcp_dict[dest] = pbxcp for file in copy_group['files']: - pbxcp.AddFile(file) + pbxcp.AddFile(file, settings) # Excluded files can also go into the project file. if not skip_excluded_files: diff --git a/deps/gyp/pylib/gyp/input.py b/deps/gyp/pylib/gyp/input.py index dc143d9dfc..20178672b2 100644 --- a/deps/gyp/pylib/gyp/input.py +++ b/deps/gyp/pylib/gyp/input.py @@ -28,7 +28,12 @@ from gyp.common import OrderedSet # A list of types that are treated as linkable. -linkable_types = ['executable', 'shared_library', 'loadable_module'] +linkable_types = [ + 'executable', + 'shared_library', + 'loadable_module', + 'mac_kernel_extension', +] # A list of sections that contain links to other targets. dependency_sections = ['dependencies', 'export_dependent_settings'] @@ -48,11 +53,16 @@ base_path_sections = [ ] path_sections = set() +# These per-process dictionaries are used to cache build file data when loading +# in parallel mode. +per_process_data = {} +per_process_aux_data = {} + def IsPathSection(section): # If section ends in one of the '=+?!' characters, it's applied to a section # without the trailing characters. '/' is notably absent from this list, # because there's no way for a regular expression to be treated as a path. - while section[-1:] in '=+?!': + while section and section[-1:] in '=+?!': section = section[:-1] if section in path_sections: @@ -210,8 +220,8 @@ def CheckNode(node, keypath): elif isinstance(node, Const): return node.getChildren()[0] else: - raise TypeError, "Unknown AST node at key path '" + '.'.join(keypath) + \ - "': " + repr(node) + raise TypeError("Unknown AST node at key path '" + '.'.join(keypath) + + "': " + repr(node)) def LoadOneBuildFile(build_file_path, data, aux_data, includes, @@ -341,7 +351,8 @@ def ProcessToolsetsInDict(data): for condition in data['conditions']: if type(condition) is list: for condition_dict in condition[1:]: - ProcessToolsetsInDict(condition_dict) + if type(condition_dict) is dict: + ProcessToolsetsInDict(condition_dict) # TODO(mark): I don't love this name. It just means that it's going to load @@ -361,10 +372,17 @@ def LoadTargetBuildFile(build_file_path, data, aux_data, variables, includes, else: variables['DEPTH'] = d.replace('\\', '/') - if build_file_path in data['target_build_files']: - # Already loaded. - return False - data['target_build_files'].add(build_file_path) + # The 'target_build_files' key is only set when loading target build files in + # the non-parallel code path, where LoadTargetBuildFile is called + # recursively. In the parallel code path, we don't need to check whether the + # |build_file_path| has already been loaded, because the 'scheduled' set in + # ParallelState guarantees that we never load the same |build_file_path| + # twice. + if 'target_build_files' in data: + if build_file_path in data['target_build_files']: + # Already loaded. + return False + data['target_build_files'].add(build_file_path) gyp.DebugOutput(gyp.DEBUG_INCLUDES, "Loading Target Build File '%s'", build_file_path) @@ -455,10 +473,8 @@ def LoadTargetBuildFile(build_file_path, data, aux_data, variables, includes, else: return (build_file_path, dependencies) - def CallLoadTargetBuildFile(global_flags, - build_file_path, data, - aux_data, variables, + build_file_path, variables, includes, depth, check, generator_input_info): """Wrapper around LoadTargetBuildFile for parallel processing. @@ -474,35 +490,24 @@ def CallLoadTargetBuildFile(global_flags, for key, value in global_flags.iteritems(): globals()[key] = value - # Save the keys so we can return data that changed. - data_keys = set(data) - aux_data_keys = set(aux_data) - SetGeneratorGlobals(generator_input_info) - result = LoadTargetBuildFile(build_file_path, data, - aux_data, variables, + result = LoadTargetBuildFile(build_file_path, per_process_data, + per_process_aux_data, variables, includes, depth, check, False) if not result: return result (build_file_path, dependencies) = result - data_out = {} - for key in data: - if key == 'target_build_files': - continue - if key not in data_keys: - data_out[key] = data[key] - aux_data_out = {} - for key in aux_data: - if key not in aux_data_keys: - aux_data_out[key] = aux_data[key] + # We can safely pop the build_file_data from per_process_data because it + # will never be referenced by this process again, so we don't need to keep + # it in the cache. + build_file_data = per_process_data.pop(build_file_path) # This gets serialized and sent back to the main process via a pipe. # It's handled in LoadTargetBuildFileCallback. return (build_file_path, - data_out, - aux_data_out, + build_file_data, dependencies) except GypError, e: sys.stderr.write("gyp: %s\n" % e) @@ -533,8 +538,6 @@ class ParallelState(object): self.condition = None # The "data" dict that was passed to LoadTargetBuildFileParallel self.data = None - # The "aux_data" dict that was passed to LoadTargetBuildFileParallel - self.aux_data = None # The number of parallel calls outstanding; decremented when a response # was received. self.pending = 0 @@ -555,12 +558,9 @@ class ParallelState(object): self.condition.notify() self.condition.release() return - (build_file_path0, data0, aux_data0, dependencies0) = result + (build_file_path0, build_file_data0, dependencies0) = result + self.data[build_file_path0] = build_file_data0 self.data['target_build_files'].add(build_file_path0) - for key in data0: - self.data[key] = data0[key] - for key in aux_data0: - self.aux_data[key] = aux_data0[key] for new_dependency in dependencies0: if new_dependency not in self.scheduled: self.scheduled.add(new_dependency) @@ -570,9 +570,8 @@ class ParallelState(object): self.condition.release() -def LoadTargetBuildFilesParallel(build_files, data, aux_data, - variables, includes, depth, check, - generator_input_info): +def LoadTargetBuildFilesParallel(build_files, data, variables, includes, depth, + check, generator_input_info): parallel_state = ParallelState() parallel_state.condition = threading.Condition() # Make copies of the build_files argument that we can modify while working. @@ -580,7 +579,6 @@ def LoadTargetBuildFilesParallel(build_files, data, aux_data, parallel_state.scheduled = set(build_files) parallel_state.pending = 0 parallel_state.data = data - parallel_state.aux_data = aux_data try: parallel_state.condition.acquire() @@ -594,20 +592,16 @@ def LoadTargetBuildFilesParallel(build_files, data, aux_data, dependency = parallel_state.dependencies.pop() parallel_state.pending += 1 - data_in = {} - data_in['target_build_files'] = data['target_build_files'] - aux_data_in = {} global_flags = { 'path_sections': globals()['path_sections'], 'non_configuration_keys': globals()['non_configuration_keys'], 'multiple_toolsets': globals()['multiple_toolsets']} if not parallel_state.pool: - parallel_state.pool = multiprocessing.Pool(8) + parallel_state.pool = multiprocessing.Pool(multiprocessing.cpu_count()) parallel_state.pool.apply_async( CallLoadTargetBuildFile, args = (global_flags, dependency, - data_in, aux_data_in, variables, includes, depth, check, generator_input_info), callback = parallel_state.LoadTargetBuildFileCallback) except KeyboardInterrupt, e: @@ -674,24 +668,24 @@ def IsStrCanonicalInt(string): # "<!interpreter(arguments)", "<([list])", and even "<([)" and "<(<())". # In the last case, the inner "<()" is captured in match['content']. early_variable_re = re.compile( - '(?P<replace>(?P<type><(?:(?:!?@?)|\|)?)' - '(?P<command_string>[-a-zA-Z0-9_.]+)?' - '\((?P<is_array>\s*\[?)' - '(?P<content>.*?)(\]?)\))') + r'(?P<replace>(?P<type><(?:(?:!?@?)|\|)?)' + r'(?P<command_string>[-a-zA-Z0-9_.]+)?' + r'\((?P<is_array>\s*\[?)' + r'(?P<content>.*?)(\]?)\))') # This matches the same as early_variable_re, but with '>' instead of '<'. late_variable_re = re.compile( - '(?P<replace>(?P<type>>(?:(?:!?@?)|\|)?)' - '(?P<command_string>[-a-zA-Z0-9_.]+)?' - '\((?P<is_array>\s*\[?)' - '(?P<content>.*?)(\]?)\))') + r'(?P<replace>(?P<type>>(?:(?:!?@?)|\|)?)' + r'(?P<command_string>[-a-zA-Z0-9_.]+)?' + r'\((?P<is_array>\s*\[?)' + r'(?P<content>.*?)(\]?)\))') # This matches the same as early_variable_re, but with '^' instead of '<'. latelate_variable_re = re.compile( - '(?P<replace>(?P<type>[\^](?:(?:!?@?)|\|)?)' - '(?P<command_string>[-a-zA-Z0-9_.]+)?' - '\((?P<is_array>\s*\[?)' - '(?P<content>.*?)(\]?)\))') + r'(?P<replace>(?P<type>[\^](?:(?:!?@?)|\|)?)' + r'(?P<command_string>[-a-zA-Z0-9_.]+)?' + r'\((?P<is_array>\s*\[?)' + r'(?P<content>.*?)(\]?)\))') # Global cache of results from running commands so they don't have to be run # more then once. @@ -904,11 +898,15 @@ def ExpandVariables(input, phase, variables, build_file): else: # Fix up command with platform specific workarounds. contents = FixupPlatformCommand(contents) - p = subprocess.Popen(contents, shell=use_shell, - stdout=subprocess.PIPE, - stderr=subprocess.PIPE, - stdin=subprocess.PIPE, - cwd=build_file_dir) + try: + p = subprocess.Popen(contents, shell=use_shell, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + stdin=subprocess.PIPE, + cwd=build_file_dir) + except Exception, e: + raise GypError("%s while executing command '%s' in %s" % + (e, contents, build_file)) p_stdout, p_stderr = p.communicate('') @@ -916,8 +914,8 @@ def ExpandVariables(input, phase, variables, build_file): sys.stderr.write(p_stderr) # Simulate check_call behavior, since check_call only exists # in python 2.5 and later. - raise GypError("Call to '%s' returned exit status %d." % - (contents, p.returncode)) + raise GypError("Call to '%s' returned exit status %d while in %s." % + (contents, p.returncode, build_file)) replacement = p_stdout.rstrip() cached_command_results[cache_key] = replacement @@ -994,23 +992,29 @@ def ExpandVariables(input, phase, variables, build_file): # Prepare for the next match iteration. input_str = output - # Look for more matches now that we've replaced some, to deal with - # expanding local variables (variables defined in the same - # variables block as this one). - gyp.DebugOutput(gyp.DEBUG_VARIABLES, "Found output %r, recursing.", output) - if type(output) is list: - if output and type(output[0]) is list: - # Leave output alone if it's a list of lists. - # We don't want such lists to be stringified. - pass - else: - new_output = [] - for item in output: - new_output.append( - ExpandVariables(item, phase, variables, build_file)) - output = new_output + if output == input: + gyp.DebugOutput(gyp.DEBUG_VARIABLES, + "Found only identity matches on %r, avoiding infinite " + "recursion.", + output) else: - output = ExpandVariables(output, phase, variables, build_file) + # Look for more matches now that we've replaced some, to deal with + # expanding local variables (variables defined in the same + # variables block as this one). + gyp.DebugOutput(gyp.DEBUG_VARIABLES, "Found output %r, recursing.", output) + if type(output) is list: + if output and type(output[0]) is list: + # Leave output alone if it's a list of lists. + # We don't want such lists to be stringified. + pass + else: + new_output = [] + for item in output: + new_output.append( + ExpandVariables(item, phase, variables, build_file)) + output = new_output + else: + output = ExpandVariables(output, phase, variables, build_file) # Convert all strings that are canonically-represented integers into integers. if type(output) is list: @@ -1031,17 +1035,40 @@ def EvalCondition(condition, conditions_key, phase, variables, build_file): that nothing should be used.""" if type(condition) is not list: raise GypError(conditions_key + ' must be a list') - if len(condition) != 2 and len(condition) != 3: + if len(condition) < 2: # It's possible that condition[0] won't work in which case this # attempt will raise its own IndexError. That's probably fine. raise GypError(conditions_key + ' ' + condition[0] + - ' must be length 2 or 3, not ' + str(len(condition))) + ' must be at least length 2, not ' + str(len(condition))) + + i = 0 + result = None + while i < len(condition): + cond_expr = condition[i] + true_dict = condition[i + 1] + if type(true_dict) is not dict: + raise GypError('{} {} must be followed by a dictionary, not {}'.format( + conditions_key, cond_expr, type(true_dict))) + if len(condition) > i + 2 and type(condition[i + 2]) is dict: + false_dict = condition[i + 2] + i = i + 3 + if i != len(condition): + raise GypError('{} {} has {} unexpected trailing items'.format( + conditions_key, cond_expr, len(condition) - i)) + else: + false_dict = None + i = i + 2 + if result == None: + result = EvalSingleCondition( + cond_expr, true_dict, false_dict, phase, variables, build_file) + + return result - [cond_expr, true_dict] = condition[0:2] - false_dict = None - if len(condition) == 3: - false_dict = condition[2] +def EvalSingleCondition( + cond_expr, true_dict, false_dict, phase, variables, build_file): + """Returns true_dict if cond_expr evaluates to true, and false_dict + otherwise.""" # Do expansions on the condition itself. Since the conditon can naturally # contain variable references without needing to resort to GYP expansion # syntax, this is of dubious value for variables, but someone might want to @@ -1049,9 +1076,9 @@ def EvalCondition(condition, conditions_key, phase, variables, build_file): cond_expr_expanded = ExpandVariables(cond_expr, phase, variables, build_file) if type(cond_expr_expanded) not in (str, int): - raise ValueError, \ + raise ValueError( 'Variable expansion in this context permits str and int ' + \ - 'only, found ' + cond_expr_expanded.__class__.__name__ + 'only, found ' + cond_expr_expanded.__class__.__name__) try: if cond_expr_expanded in cached_conditions_asts: @@ -1193,9 +1220,9 @@ def ProcessVariablesAndConditionsInDict(the_dict, phase, variables_in, if key != 'variables' and type(value) is str: expanded = ExpandVariables(value, phase, variables, build_file) if type(expanded) not in (str, int): - raise ValueError, \ + raise ValueError( 'Variable expansion in this context permits str and int ' + \ - 'only, found ' + expanded.__class__.__name__ + ' for ' + key + 'only, found ' + expanded.__class__.__name__ + ' for ' + key) the_dict[key] = expanded # Variable expansion may have resulted in changes to automatics. Reload. @@ -1264,8 +1291,8 @@ def ProcessVariablesAndConditionsInDict(the_dict, phase, variables_in, ProcessVariablesAndConditionsInList(value, phase, variables, build_file) elif type(value) is not int: - raise TypeError, 'Unknown type ' + value.__class__.__name__ + \ - ' for ' + key + raise TypeError('Unknown type ' + value.__class__.__name__ + \ + ' for ' + key) def ProcessVariablesAndConditionsInList(the_list, phase, variables, @@ -1292,13 +1319,13 @@ def ProcessVariablesAndConditionsInList(the_list, phase, variables, # without falling into the index increment below. continue else: - raise ValueError, \ + raise ValueError( 'Variable expansion in this context permits strings and ' + \ 'lists only, found ' + expanded.__class__.__name__ + ' at ' + \ - index + index) elif type(item) is not int: - raise TypeError, 'Unknown type ' + item.__class__.__name__ + \ - ' at index ' + index + raise TypeError('Unknown type ' + item.__class__.__name__ + \ + ' at index ' + index) index = index + 1 @@ -1550,26 +1577,25 @@ class DependencyGraphNode(object): return list(flat_list) - def FindCycles(self, path=None): + def FindCycles(self): """ Returns a list of cycles in the graph, where each cycle is its own list. """ - if path is None: - path = [self] - results = [] - for node in self.dependents: - if node in path: - cycle = [node] - for part in path: - cycle.append(part) - if part == node: - break - results.append(tuple(cycle)) - else: - results.extend(node.FindCycles([node] + path)) + visited = set() + + def Visit(node, path): + for child in node.dependents: + if child in path: + results.append([child] + path[:path.index(child) + 1]) + elif not child in visited: + visited.add(child) + Visit(child, [child] + path) + + visited.add(self) + Visit(self, [self]) - return list(set(results)) + return results def DirectDependencies(self, dependencies=None): """Returns a list of just direct dependencies.""" @@ -1645,8 +1671,8 @@ class DependencyGraphNode(object): if dependency.ref is None: continue if dependency.ref not in dependencies: - dependencies.add(dependency.ref) dependency.DeepDependencies(dependencies) + dependencies.add(dependency.ref) return dependencies @@ -1703,11 +1729,12 @@ class DependencyGraphNode(object): dependencies.add(self.ref) return dependencies - # Executables and loadable modules are already fully and finally linked. - # Nothing else can be a link dependency of them, there can only be - # dependencies in the sense that a dependent target might run an - # executable or load the loadable_module. - if not initial and target_type in ('executable', 'loadable_module'): + # Executables, mac kernel extensions and loadable modules are already fully + # and finally linked. Nothing else can be a link dependency of them, there + # can only be dependencies in the sense that a dependent target might run + # an executable or load the loadable_module. + if not initial and target_type in ('executable', 'loadable_module', + 'mac_kernel_extension'): return dependencies # Shared libraries are already fully linked. They should only be included @@ -1786,12 +1813,22 @@ def BuildDependencyList(targets): flat_list = root_node.FlattenToList() # If there's anything left unvisited, there must be a circular dependency - # (cycle). If you need to figure out what's wrong, look for elements of - # targets that are not in flat_list. + # (cycle). if len(flat_list) != len(targets): + if not root_node.dependents: + # If all targets have dependencies, add the first target as a dependent + # of root_node so that the cycle can be discovered from root_node. + target = targets.keys()[0] + target_node = dependency_nodes[target] + target_node.dependencies.append(root_node) + root_node.dependents.append(target_node) + + cycles = [] + for cycle in root_node.FindCycles(): + paths = [node.ref for node in cycle] + cycles.append('Cycle: %s' % ' -> '.join(paths)) raise DependencyGraphNode.CircularException( - 'Some targets not reachable, cycle in dependency graph detected: ' + - ' '.join(set(flat_list) ^ set(targets))) + 'Cycles in dependency graph detected:\n' + '\n'.join(cycles)) return [dependency_nodes, flat_list] @@ -1841,20 +1878,18 @@ def VerifyNoGYPFileCircularDependencies(targets): # If there's anything left unvisited, there must be a circular dependency # (cycle). if len(flat_list) != len(dependency_nodes): - bad_files = [] - for file in dependency_nodes.iterkeys(): - if not file in flat_list: - bad_files.append(file) - common_path_prefix = os.path.commonprefix(dependency_nodes) + if not root_node.dependents: + # If all files have dependencies, add the first file as a dependent + # of root_node so that the cycle can be discovered from root_node. + file_node = dependency_nodes.values()[0] + file_node.dependencies.append(root_node) + root_node.dependents.append(file_node) cycles = [] for cycle in root_node.FindCycles(): - simplified_paths = [] - for node in cycle: - assert(node.ref.startswith(common_path_prefix)) - simplified_paths.append(node.ref[len(common_path_prefix):]) - cycles.append('Cycle: %s' % ' -> '.join(simplified_paths)) - raise DependencyGraphNode.CircularException, \ - 'Cycles in .gyp file dependency graph detected:\n' + '\n'.join(cycles) + paths = [node.ref for node in cycle] + cycles.append('Cycle: %s' % ' -> '.join(paths)) + raise DependencyGraphNode.CircularException( + 'Cycles in .gyp file dependency graph detected:\n' + '\n'.join(cycles)) def DoDependentSettings(key, flat_list, targets, dependency_nodes): @@ -2044,9 +2079,9 @@ def MergeLists(to, fro, to_file, fro_file, is_paths=False, append=True): to_item = [] MergeLists(to_item, item, to_file, fro_file) else: - raise TypeError, \ + raise TypeError( 'Attempt to merge list item of unsupported type ' + \ - item.__class__.__name__ + item.__class__.__name__) if append: # If appending a singleton that's already in the list, don't append. @@ -2088,10 +2123,10 @@ def MergeDicts(to, fro, to_file, fro_file): bad_merge = True if bad_merge: - raise TypeError, \ + raise TypeError( 'Attempt to merge dict value of type ' + v.__class__.__name__ + \ ' into incompatible type ' + to[k].__class__.__name__ + \ - ' for key ' + k + ' for key ' + k) if type(v) in (str, int): # Overwrite the existing value, if any. Cheap and easy. is_path = IsPathSection(k) @@ -2150,10 +2185,10 @@ def MergeDicts(to, fro, to_file, fro_file): elif type(to[list_base]) is not list: # This may not have been checked above if merging in a list with an # extension character. - raise TypeError, \ + raise TypeError( 'Attempt to merge dict value of type ' + v.__class__.__name__ + \ ' into incompatible type ' + to[list_base].__class__.__name__ + \ - ' for key ' + list_base + '(' + k + ')' + ' for key ' + list_base + '(' + k + ')') else: to[list_base] = [] @@ -2165,9 +2200,9 @@ def MergeDicts(to, fro, to_file, fro_file): is_paths = IsPathSection(list_base) MergeLists(to[list_base], v, to_file, fro_file, is_paths, append) else: - raise TypeError, \ + raise TypeError( 'Attempt to merge dict value of unsupported type ' + \ - v.__class__.__name__ + ' for key ' + k + v.__class__.__name__ + ' for key ' + k) def MergeConfigWithInheritance(new_configuration_dict, build_file, @@ -2312,8 +2347,8 @@ def ProcessListFiltersInDict(name, the_dict): continue if type(value) is not list: - raise ValueError, name + ' key ' + key + ' must be list, not ' + \ - value.__class__.__name__ + raise ValueError(name + ' key ' + key + ' must be list, not ' + \ + value.__class__.__name__) list_key = key[:-1] if list_key not in the_dict: @@ -2325,10 +2360,10 @@ def ProcessListFiltersInDict(name, the_dict): if type(the_dict[list_key]) is not list: value = the_dict[list_key] - raise ValueError, name + ' key ' + list_key + \ - ' must be list, not ' + \ - value.__class__.__name__ + ' when applying ' + \ - {'!': 'exclusion', '/': 'regex'}[operation] + raise ValueError(name + ' key ' + list_key + \ + ' must be list, not ' + \ + value.__class__.__name__ + ' when applying ' + \ + {'!': 'exclusion', '/': 'regex'}[operation]) if not list_key in lists: lists.append(list_key) @@ -2377,8 +2412,8 @@ def ProcessListFiltersInDict(name, the_dict): action_value = 1 else: # This is an action that doesn't make any sense. - raise ValueError, 'Unrecognized action ' + action + ' in ' + name + \ - ' key ' + regex_key + raise ValueError('Unrecognized action ' + action + ' in ' + name + \ + ' key ' + regex_key) for index in xrange(0, len(the_list)): list_item = the_list[index] @@ -2450,7 +2485,7 @@ def ValidateTargetType(target, target_dict): """ VALID_TARGET_TYPES = ('executable', 'loadable_module', 'static_library', 'shared_library', - 'none') + 'mac_kernel_extension', 'none') target_type = target_dict.get('type', None) if target_type not in VALID_TARGET_TYPES: raise GypError("Target %s has an invalid target type '%s'. " @@ -2463,9 +2498,11 @@ def ValidateTargetType(target, target_dict): target_type)) -def ValidateSourcesInTarget(target, target_dict, build_file): - # TODO: Check if MSVC allows this for loadable_module targets. - if target_dict.get('type', None) not in ('static_library', 'shared_library'): +def ValidateSourcesInTarget(target, target_dict, build_file, + duplicate_basename_check): + if not duplicate_basename_check: + return + if target_dict.get('type', None) != 'static_library': return sources = target_dict.get('sources', []) basenames = {} @@ -2485,8 +2522,8 @@ def ValidateSourcesInTarget(target, target_dict, build_file): if error: print('static library %s has several files with the same basename:\n' % - target + error + 'Some build systems, e.g. MSVC08, ' - 'cannot handle that.') + target + error + 'libtool on Mac cannot handle that. Use ' + '--no-duplicate-basename-check to disable this validation.') raise GypError('Duplicate basenames in sources section, see list above') @@ -2710,7 +2747,7 @@ def SetGeneratorGlobals(generator_input_info): def Load(build_files, variables, includes, depth, generator_input_info, check, - circular_check, parallel, root_targets): + circular_check, duplicate_basename_check, parallel, root_targets): SetGeneratorGlobals(generator_input_info) # A generator can have other lists (in addition to sources) be processed # for rules. @@ -2724,15 +2761,14 @@ def Load(build_files, variables, includes, depth, generator_input_info, check, # well as meta-data (e.g. 'included_files' key). 'target_build_files' keeps # track of the keys corresponding to "target" files. data = {'target_build_files': set()} - aux_data = {} # Normalize paths everywhere. This is important because paths will be # used as keys to the data dict and for references between input files. build_files = set(map(os.path.normpath, build_files)) if parallel: - LoadTargetBuildFilesParallel(build_files, data, aux_data, - variables, includes, depth, check, - generator_input_info) + LoadTargetBuildFilesParallel(build_files, data, variables, includes, depth, + check, generator_input_info) else: + aux_data = {} for build_file in build_files: try: LoadTargetBuildFile(build_file, data, aux_data, @@ -2843,10 +2879,8 @@ def Load(build_files, variables, includes, depth, generator_input_info, check, target_dict = targets[target] build_file = gyp.common.BuildFile(target) ValidateTargetType(target, target_dict) - # TODO(thakis): Get vpx_scale/arm/scalesystemdependent.c to be renamed to - # scalesystemdependent_arm_additions.c or similar. - if 'arm' not in variables.get('target_arch', ''): - ValidateSourcesInTarget(target, target_dict, build_file) + ValidateSourcesInTarget(target, target_dict, build_file, + duplicate_basename_check) ValidateRulesInTarget(target, target_dict, extra_sources_for_rules) ValidateRunAsInTarget(target, target_dict, build_file) ValidateActionsInTarget(target, target_dict, build_file) diff --git a/deps/gyp/pylib/gyp/input_test.py b/deps/gyp/pylib/gyp/input_test.py index cdbf6b2fad..4234fbb830 100755 --- a/deps/gyp/pylib/gyp/input_test.py +++ b/deps/gyp/pylib/gyp/input_test.py @@ -44,16 +44,16 @@ class TestFindCycles(unittest.TestCase): def test_cycle_self_reference(self): self._create_dependency(self.nodes['a'], self.nodes['a']) - self.assertEquals([(self.nodes['a'], self.nodes['a'])], + self.assertEquals([[self.nodes['a'], self.nodes['a']]], self.nodes['a'].FindCycles()) def test_cycle_two_nodes(self): self._create_dependency(self.nodes['a'], self.nodes['b']) self._create_dependency(self.nodes['b'], self.nodes['a']) - self.assertEquals([(self.nodes['a'], self.nodes['b'], self.nodes['a'])], + self.assertEquals([[self.nodes['a'], self.nodes['b'], self.nodes['a']]], self.nodes['a'].FindCycles()) - self.assertEquals([(self.nodes['b'], self.nodes['a'], self.nodes['b'])], + self.assertEquals([[self.nodes['b'], self.nodes['a'], self.nodes['b']]], self.nodes['b'].FindCycles()) def test_two_cycles(self): @@ -65,9 +65,9 @@ class TestFindCycles(unittest.TestCase): cycles = self.nodes['a'].FindCycles() self.assertTrue( - (self.nodes['a'], self.nodes['b'], self.nodes['a']) in cycles) + [self.nodes['a'], self.nodes['b'], self.nodes['a']] in cycles) self.assertTrue( - (self.nodes['b'], self.nodes['c'], self.nodes['b']) in cycles) + [self.nodes['b'], self.nodes['c'], self.nodes['b']] in cycles) self.assertEquals(2, len(cycles)) def test_big_cycle(self): @@ -77,12 +77,12 @@ class TestFindCycles(unittest.TestCase): self._create_dependency(self.nodes['d'], self.nodes['e']) self._create_dependency(self.nodes['e'], self.nodes['a']) - self.assertEquals([(self.nodes['a'], + self.assertEquals([[self.nodes['a'], self.nodes['b'], self.nodes['c'], self.nodes['d'], self.nodes['e'], - self.nodes['a'])], + self.nodes['a']]], self.nodes['a'].FindCycles()) diff --git a/deps/gyp/pylib/gyp/mac_tool.py b/deps/gyp/pylib/gyp/mac_tool.py index 821e291e9f..eeeaceb0c7 100755 --- a/deps/gyp/pylib/gyp/mac_tool.py +++ b/deps/gyp/pylib/gyp/mac_tool.py @@ -45,7 +45,7 @@ class MacTool(object): """Transforms a tool name like copy-info-plist to CopyInfoPlist""" return name_string.title().replace('-', '') - def ExecCopyBundleResource(self, source, dest): + def ExecCopyBundleResource(self, source, dest, convert_to_binary): """Copies a resource file to the bundle/Resources directory, performing any necessary compilation on each resource.""" extension = os.path.splitext(source)[1].lower() @@ -62,7 +62,7 @@ class MacTool(object): elif extension == '.storyboard': return self._CopyXIBFile(source, dest) elif extension == '.strings': - self._CopyStringsFile(source, dest) + self._CopyStringsFile(source, dest, convert_to_binary) else: shutil.copy(source, dest) @@ -92,7 +92,11 @@ class MacTool(object): sys.stdout.write(line) return ibtoolout.returncode - def _CopyStringsFile(self, source, dest): + def _ConvertToBinary(self, dest): + subprocess.check_call([ + 'xcrun', 'plutil', '-convert', 'binary1', '-o', dest, dest]) + + def _CopyStringsFile(self, source, dest, convert_to_binary): """Copies a .strings file using iconv to reconvert the input into UTF-16.""" input_code = self._DetectInputEncoding(source) or "UTF-8" @@ -112,6 +116,9 @@ class MacTool(object): fp.write(s.decode(input_code).encode('UTF-16')) fp.close() + if convert_to_binary == 'True': + self._ConvertToBinary(dest) + def _DetectInputEncoding(self, file_name): """Reads the first few bytes from file_name and tries to guess the text encoding. Returns None as a guess if it can't detect it.""" @@ -131,7 +138,7 @@ class MacTool(object): else: return None - def ExecCopyInfoPlist(self, source, dest, *keys): + def ExecCopyInfoPlist(self, source, dest, convert_to_binary, *keys): """Copies the |source| Info.plist to the destination directory |dest|.""" # Read the source Info.plist into memory. fd = open(source, 'r') @@ -146,7 +153,7 @@ class MacTool(object): # Go through all the environment variables and replace them as variables in # the file. - IDENT_RE = re.compile('[/\s]') + IDENT_RE = re.compile(r'[/\s]') for key in os.environ: if key.startswith('_'): continue @@ -185,6 +192,9 @@ class MacTool(object): # "compiled". self._WritePkgInfo(dest) + if convert_to_binary == 'True': + self._ConvertToBinary(dest) + def _WritePkgInfo(self, info_plist): """This writes the PkgInfo file from the data stored in Info.plist.""" plist = plistlib.readPlist(info_plist) @@ -223,11 +233,24 @@ class MacTool(object): r'^.*libtool: warning for library: ' + r'.* the table of contents is empty ' + r'\(no object file members in the library define global symbols\)$') - libtoolout = subprocess.Popen(cmd_list, stderr=subprocess.PIPE) + env = os.environ.copy() + # Ref: + # http://www.opensource.apple.com/source/cctools/cctools-809/misc/libtool.c + # The problem with this flag is that it resets the file mtime on the file to + # epoch=0, e.g. 1970-1-1 or 1969-12-31 depending on timezone. + env['ZERO_AR_DATE'] = '1' + libtoolout = subprocess.Popen(cmd_list, stderr=subprocess.PIPE, env=env) _, err = libtoolout.communicate() for line in err.splitlines(): if not libtool_re.match(line) and not libtool_re5.match(line): print >>sys.stderr, line + # Unconditionally touch the output .a file on the command line if present + # and the command succeeded. A bit hacky. + if not libtoolout.returncode: + for i in range(len(cmd_list) - 1): + if cmd_list[i] == "-o" and cmd_list[i+1].endswith('.a'): + os.utime(cmd_list[i+1], None) + break return libtoolout.returncode def ExecPackageFramework(self, framework, version): @@ -266,6 +289,66 @@ class MacTool(object): os.remove(link) os.symlink(dest, link) + def ExecCompileXcassets(self, keys, *inputs): + """Compiles multiple .xcassets files into a single .car file. + + This invokes 'actool' to compile all the inputs .xcassets files. The + |keys| arguments is a json-encoded dictionary of extra arguments to + pass to 'actool' when the asset catalogs contains an application icon + or a launch image. + + Note that 'actool' does not create the Assets.car file if the asset + catalogs does not contains imageset. + """ + command_line = [ + 'xcrun', 'actool', '--output-format', 'human-readable-text', + '--compress-pngs', '--notices', '--warnings', '--errors', + ] + is_iphone_target = 'IPHONEOS_DEPLOYMENT_TARGET' in os.environ + if is_iphone_target: + platform = os.environ['CONFIGURATION'].split('-')[-1] + if platform not in ('iphoneos', 'iphonesimulator'): + platform = 'iphonesimulator' + command_line.extend([ + '--platform', platform, '--target-device', 'iphone', + '--target-device', 'ipad', '--minimum-deployment-target', + os.environ['IPHONEOS_DEPLOYMENT_TARGET'], '--compile', + os.path.abspath(os.environ['CONTENTS_FOLDER_PATH']), + ]) + else: + command_line.extend([ + '--platform', 'macosx', '--target-device', 'mac', + '--minimum-deployment-target', os.environ['MACOSX_DEPLOYMENT_TARGET'], + '--compile', + os.path.abspath(os.environ['UNLOCALIZED_RESOURCES_FOLDER_PATH']), + ]) + if keys: + keys = json.loads(keys) + for key, value in keys.iteritems(): + arg_name = '--' + key + if isinstance(value, bool): + if value: + command_line.append(arg_name) + elif isinstance(value, list): + for v in value: + command_line.append(arg_name) + command_line.append(str(v)) + else: + command_line.append(arg_name) + command_line.append(str(value)) + # Note: actool crashes if inputs path are relative, so use os.path.abspath + # to get absolute path name for inputs. + command_line.extend(map(os.path.abspath, inputs)) + subprocess.check_call(command_line) + + def ExecMergeInfoPlist(self, output, *inputs): + """Merge multiple .plist files into a single .plist file.""" + merged_plist = {} + for path in inputs: + plist = self._LoadPlistMaybeBinary(path) + self._MergePlist(merged_plist, plist) + plistlib.writePlist(merged_plist, output) + def ExecCodeSignBundle(self, key, resource_rules, entitlements, provisioning): """Code sign a bundle. @@ -402,6 +485,19 @@ class MacTool(object): 'security', 'cms', '-D', '-i', profile_path, '-o', temp.name]) return self._LoadPlistMaybeBinary(temp.name) + def _MergePlist(self, merged_plist, plist): + """Merge |plist| into |merged_plist|.""" + for key, value in plist.iteritems(): + if isinstance(value, dict): + merged_value = merged_plist.get(key, {}) + if isinstance(merged_value, dict): + self._MergePlist(merged_value, value) + merged_plist[key] = merged_value + else: + merged_plist[key] = value + else: + merged_plist[key] = value + def _LoadPlistMaybeBinary(self, plist_path): """Loads into a memory a plist possibly encoded in binary format. diff --git a/deps/gyp/pylib/gyp/msvs_emulation.py b/deps/gyp/pylib/gyp/msvs_emulation.py index 63593a424d..ca67b122f0 100644 --- a/deps/gyp/pylib/gyp/msvs_emulation.py +++ b/deps/gyp/pylib/gyp/msvs_emulation.py @@ -12,10 +12,14 @@ import re import subprocess import sys +from gyp.common import OrderedSet +import gyp.MSVSUtil import gyp.MSVSVersion + windows_quoter_regex = re.compile(r'(\\*)"') + def QuoteForRspFile(arg): """Quote a command line argument so that it appears as one argument when processed via cmd.exe and parsed by CommandLineToArgvW (as is typical for @@ -131,6 +135,54 @@ def _FindDirectXInstallation(): return dxsdk_dir +def GetGlobalVSMacroEnv(vs_version): + """Get a dict of variables mapping internal VS macro names to their gyp + equivalents. Returns all variables that are independent of the target.""" + env = {} + # '$(VSInstallDir)' and '$(VCInstallDir)' are available when and only when + # Visual Studio is actually installed. + if vs_version.Path(): + env['$(VSInstallDir)'] = vs_version.Path() + env['$(VCInstallDir)'] = os.path.join(vs_version.Path(), 'VC') + '\\' + # Chromium uses DXSDK_DIR in include/lib paths, but it may or may not be + # set. This happens when the SDK is sync'd via src-internal, rather than + # by typical end-user installation of the SDK. If it's not set, we don't + # want to leave the unexpanded variable in the path, so simply strip it. + dxsdk_dir = _FindDirectXInstallation() + env['$(DXSDK_DIR)'] = dxsdk_dir if dxsdk_dir else '' + # Try to find an installation location for the Windows DDK by checking + # the WDK_DIR environment variable, may be None. + env['$(WDK_DIR)'] = os.environ.get('WDK_DIR', '') + return env + +def ExtractSharedMSVSSystemIncludes(configs, generator_flags): + """Finds msvs_system_include_dirs that are common to all targets, removes + them from all targets, and returns an OrderedSet containing them.""" + all_system_includes = OrderedSet( + configs[0].get('msvs_system_include_dirs', [])) + for config in configs[1:]: + system_includes = config.get('msvs_system_include_dirs', []) + all_system_includes = all_system_includes & OrderedSet(system_includes) + if not all_system_includes: + return None + # Expand macros in all_system_includes. + env = GetGlobalVSMacroEnv(GetVSVersion(generator_flags)) + expanded_system_includes = OrderedSet([ExpandMacros(include, env) + for include in all_system_includes]) + if any(['$' in include for include in expanded_system_includes]): + # Some path relies on target-specific variables, bail. + return None + + # Remove system includes shared by all targets from the targets. + for config in configs: + includes = config.get('msvs_system_include_dirs', []) + if includes: # Don't insert a msvs_system_include_dirs key if not needed. + # This must check the unexpanded includes list: + new_includes = [i for i in includes if i not in all_system_includes] + config['msvs_system_include_dirs'] = new_includes + return expanded_system_includes + + class MsvsSettings(object): """A class that understands the gyp 'msvs_...' values (especially the msvs_settings field). They largely correpond to the VS2008 IDE DOM. This @@ -139,11 +191,6 @@ class MsvsSettings(object): def __init__(self, spec, generator_flags): self.spec = spec self.vs_version = GetVSVersion(generator_flags) - self.dxsdk_dir = _FindDirectXInstallation() - - # Try to find an installation location for the Windows DDK by checking - # the WDK_DIR environment variable, may be None. - self.wdk_dir = os.environ.get('WDK_DIR') supported_fields = [ ('msvs_configuration_attributes', dict), @@ -176,6 +223,17 @@ class MsvsSettings(object): if unsupported: raise Exception('\n'.join(unsupported)) + def GetExtension(self): + """Returns the extension for the target, with no leading dot. + + Uses 'product_extension' if specified, otherwise uses MSVS defaults based on + the target type. + """ + ext = self.spec.get('product_extension', None) + if ext: + return ext + return gyp.MSVSUtil.TARGET_TYPE_EXT.get(self.spec['type'], '') + def GetVSMacroEnv(self, base_to_build=None, config=None): """Get a dict of variables mapping internal VS macro names to their gyp equivalents.""" @@ -183,29 +241,24 @@ class MsvsSettings(object): target_name = self.spec.get('product_prefix', '') + \ self.spec.get('product_name', self.spec['target_name']) target_dir = base_to_build + '\\' if base_to_build else '' + target_ext = '.' + self.GetExtension() + target_file_name = target_name + target_ext + replacements = { - '$(OutDir)\\': target_dir, - '$(TargetDir)\\': target_dir, - '$(IntDir)': '$!INTERMEDIATE_DIR', - '$(InputPath)': '${source}', '$(InputName)': '${root}', - '$(ProjectName)': self.spec['target_name'], - '$(TargetName)': target_name, + '$(InputPath)': '${source}', + '$(IntDir)': '$!INTERMEDIATE_DIR', + '$(OutDir)\\': target_dir, '$(PlatformName)': target_platform, '$(ProjectDir)\\': '', + '$(ProjectName)': self.spec['target_name'], + '$(TargetDir)\\': target_dir, + '$(TargetExt)': target_ext, + '$(TargetFileName)': target_file_name, + '$(TargetName)': target_name, + '$(TargetPath)': os.path.join(target_dir, target_file_name), } - # '$(VSInstallDir)' and '$(VCInstallDir)' are available when and only when - # Visual Studio is actually installed. - if self.vs_version.Path(): - replacements['$(VSInstallDir)'] = self.vs_version.Path() - replacements['$(VCInstallDir)'] = os.path.join(self.vs_version.Path(), - 'VC') + '\\' - # Chromium uses DXSDK_DIR in include/lib paths, but it may or may not be - # set. This happens when the SDK is sync'd via src-internal, rather than - # by typical end-user installation of the SDK. If it's not set, we don't - # want to leave the unexpanded variable in the path, so simply strip it. - replacements['$(DXSDK_DIR)'] = self.dxsdk_dir if self.dxsdk_dir else '' - replacements['$(WDK_DIR)'] = self.wdk_dir if self.wdk_dir else '' + replacements.update(GetGlobalVSMacroEnv(self.vs_version)) return replacements def ConvertVSMacros(self, s, base_to_build=None, config=None): @@ -285,6 +338,15 @@ class MsvsSettings(object): ('VCCLCompilerTool', 'AdditionalIncludeDirectories'), config, default=[])) return [self.ConvertVSMacros(p, config=config) for p in includes] + def AdjustMidlIncludeDirs(self, midl_include_dirs, config): + """Updates midl_include_dirs to expand VS specific paths, and adds the + system include dirs used for platform SDK and similar.""" + config = self._TargetConfig(config) + includes = midl_include_dirs + self.msvs_system_include_dirs[config] + includes.extend(self._Setting( + ('VCMIDLTool', 'AdditionalIncludeDirectories'), config, default=[])) + return [self.ConvertVSMacros(p, config=config) for p in includes] + def GetComputedDefines(self, config): """Returns the set of defines that are injected to the defines list based on other VS settings.""" @@ -337,7 +399,7 @@ class MsvsSettings(object): output_file = self._Setting(('VCLinkerTool', 'ProgramDatabaseFile'), config) generate_debug_info = self._Setting( ('VCLinkerTool', 'GenerateDebugInformation'), config) - if generate_debug_info: + if generate_debug_info == 'true': if output_file: return expand_special(self.ConvertVSMacros(output_file, config=config)) else: @@ -345,6 +407,13 @@ class MsvsSettings(object): else: return None + def GetNoImportLibrary(self, config): + """If NoImportLibrary: true, ninja will not expect the output to include + an import library.""" + config = self._TargetConfig(config) + noimplib = self._Setting(('NoImportLibrary',), config) + return noimplib == 'true' + def GetAsmflags(self, config): """Returns the flags that need to be added to ml invocations.""" config = self._TargetConfig(config) @@ -370,9 +439,15 @@ class MsvsSettings(object): cl('OmitFramePointers', map={'false': '-', 'true': ''}, prefix='/Oy') cl('EnableIntrinsicFunctions', map={'false': '-', 'true': ''}, prefix='/Oi') cl('FavorSizeOrSpeed', map={'1': 't', '2': 's'}, prefix='/O') + cl('FloatingPointModel', + map={'0': 'precise', '1': 'strict', '2': 'fast'}, prefix='/fp:', + default='0') + cl('CompileAsManaged', map={'false': '', 'true': '/clr'}) cl('WholeProgramOptimization', map={'true': '/GL'}) cl('WarningLevel', prefix='/W') cl('WarnAsError', map={'true': '/WX'}) + cl('CallingConvention', + map={'0': 'd', '1': 'r', '2': 'z', '3': 'v'}, prefix='/G') cl('DebugInformationFormat', map={'1': '7', '3': 'i', '4': 'I'}, prefix='/Z') cl('RuntimeTypeInfo', map={'true': '/GR', 'false': '/GR-'}) @@ -389,10 +464,11 @@ class MsvsSettings(object): cl('EnablePREfast', map={'true': '/analyze'}) cl('AdditionalOptions', prefix='') cl('EnableEnhancedInstructionSet', - map={'1': 'SSE', '2': 'SSE2', '3': 'AVX', '4': 'IA32'}, prefix='/arch:') + map={'1': 'SSE', '2': 'SSE2', '3': 'AVX', '4': 'IA32', '5': 'AVX2'}, + prefix='/arch:') cflags.extend(['/FI' + f for f in self._Setting( ('VCCLCompilerTool', 'ForcedIncludeFiles'), config, default=[])]) - if self.vs_version.short_name in ('2013', '2013e'): + if self.vs_version.short_name in ('2013', '2013e', '2015'): # New flag required in 2013 to maintain previous PDB behavior. cflags.append('/FS') # ninja handles parallelism by itself, don't have the compiler do it too. @@ -443,7 +519,8 @@ class MsvsSettings(object): libflags.extend(self._GetAdditionalLibraryDirectories( 'VCLibrarianTool', config, gyp_to_build_path)) lib('LinkTimeCodeGeneration', map={'true': '/LTCG'}) - lib('TargetMachine', map={'1': 'X86', '17': 'X64'}, prefix='/MACHINE:') + lib('TargetMachine', map={'1': 'X86', '17': 'X64', '3': 'ARM'}, + prefix='/MACHINE:') lib('AdditionalOptions') return libflags @@ -486,7 +563,8 @@ class MsvsSettings(object): 'VCLinkerTool', append=ldflags) self._GetDefFileAsLdflags(ldflags, gyp_to_build_path) ld('GenerateDebugInformation', map={'true': '/DEBUG'}) - ld('TargetMachine', map={'1': 'X86', '17': 'X64'}, prefix='/MACHINE:') + ld('TargetMachine', map={'1': 'X86', '17': 'X64', '3': 'ARM'}, + prefix='/MACHINE:') ldflags.extend(self._GetAdditionalLibraryDirectories( 'VCLinkerTool', config, gyp_to_build_path)) ld('DelayLoadDLLs', prefix='/DELAYLOAD:') @@ -516,6 +594,15 @@ class MsvsSettings(object): '2': 'WINDOWS%s' % minimum_required_version}, prefix='/SUBSYSTEM:') + stack_reserve_size = self._Setting( + ('VCLinkerTool', 'StackReserveSize'), config, default='') + if stack_reserve_size: + stack_commit_size = self._Setting( + ('VCLinkerTool', 'StackCommitSize'), config, default='') + if stack_commit_size: + stack_commit_size = ',' + stack_commit_size + ldflags.append('/STACK:%s%s' % (stack_reserve_size, stack_commit_size)) + ld('TerminalServerAware', map={'1': ':NO', '2': ''}, prefix='/TSAWARE') ld('LinkIncremental', map={'1': ':NO', '2': ''}, prefix='/INCREMENTAL') ld('BaseAddress', prefix='/BASE:') @@ -537,10 +624,17 @@ class MsvsSettings(object): ld('Profile', map={'true': '/PROFILE'}) ld('LargeAddressAware', map={'1': ':NO', '2': ''}, prefix='/LARGEADDRESSAWARE') - ld('ImageHasSafeExceptionHandlers', map={'true': '/SAFESEH'}) # TODO(scottmg): This should sort of be somewhere else (not really a flag). ld('AdditionalDependencies', prefix='') + if self.GetArch(config) == 'x86': + safeseh_default = 'true' + else: + safeseh_default = None + ld('ImageHasSafeExceptionHandlers', + map={'false': ':NO', 'true': ''}, prefix='/SAFESEH', + default=safeseh_default) + # If the base address is not specifically controlled, DYNAMICBASE should # be on by default. base_flags = filter(lambda x: 'DYNAMICBASE' in x or x == '/FIXED', @@ -727,10 +821,16 @@ class MsvsSettings(object): return True return False - def HasExplicitIdlRules(self, spec): - """Determine if there's an explicit rule for idl files. When there isn't we - need to generate implicit rules to build MIDL .idl files.""" - return self._HasExplicitRuleForExtension(spec, 'idl') + def _HasExplicitIdlActions(self, spec): + """Determine if an action should not run midl for .idl files.""" + return any([action.get('explicit_idl_action', 0) + for action in spec.get('actions', [])]) + + def HasExplicitIdlRulesOrActions(self, spec): + """Determine if there's an explicit rule or action for idl files. When + there isn't we need to generate implicit rules to build MIDL .idl files.""" + return (self._HasExplicitRuleForExtension(spec, 'idl') or + self._HasExplicitIdlActions(spec)) def HasExplicitAsmRules(self, spec): """Determine if there's an explicit rule for asm files. When there isn't we @@ -829,7 +929,8 @@ def GetVSVersion(generator_flags): global vs_version if not vs_version: vs_version = gyp.MSVSVersion.SelectVisualStudioVersion( - generator_flags.get('msvs_version', 'auto')) + generator_flags.get('msvs_version', 'auto'), + allow_fallback=False) return vs_version def _GetVsvarsSetupArgs(generator_flags, arch): @@ -897,7 +998,8 @@ def _ExtractCLPath(output_of_where): if line.startswith('LOC:'): return line[len('LOC:'):].strip() -def GenerateEnvironmentFiles(toplevel_build_dir, generator_flags, open_out): +def GenerateEnvironmentFiles(toplevel_build_dir, generator_flags, + system_includes, open_out): """It's not sufficient to have the absolute path to the compiler, linker, etc. on Windows, as those tools rely on .dlls being in the PATH. We also need to support both x86 and x64 compilers within the same build (to support @@ -928,6 +1030,13 @@ def GenerateEnvironmentFiles(toplevel_build_dir, generator_flags, open_out): args, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) variables, _ = popen.communicate() env = _ExtractImportantEnvironment(variables) + + # Inject system includes from gyp files into INCLUDE. + if system_includes: + system_includes = system_includes | OrderedSet( + env.get('INCLUDE', '').split(';')) + env['INCLUDE'] = ';'.join(system_includes) + env_block = _FormatAsEnvironmentBlock(env) f = open_out(os.path.join(toplevel_build_dir, 'environment.' + arch), 'wb') f.write(env_block) diff --git a/deps/gyp/pylib/gyp/win_tool.py b/deps/gyp/pylib/gyp/win_tool.py index 44e1b0760b..bb6f1ea436 100755 --- a/deps/gyp/pylib/gyp/win_tool.py +++ b/deps/gyp/pylib/gyp/win_tool.py @@ -116,14 +116,16 @@ class WinTool(object): env = self._GetEnv(arch) if use_separate_mspdbsrv == 'True': self._UseSeparateMspdbsrv(env, args) - link = subprocess.Popen(args, + link = subprocess.Popen([args[0].replace('/', '\\')] + list(args[1:]), shell=True, env=env, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) out, _ = link.communicate() for line in out.splitlines(): - if not line.startswith(' Creating library '): + if (not line.startswith(' Creating library ') and + not line.startswith('Generating code') and + not line.startswith('Finished generating code')): print line return link.returncode @@ -259,9 +261,6 @@ class WinTool(object): def ExecAsmWrapper(self, arch, *args): """Filter logo banner from invocations of asm.exe.""" env = self._GetEnv(arch) - # MSVS doesn't assemble x64 asm files. - if arch == 'environment.x64': - return 0 popen = subprocess.Popen(args, shell=True, env=env, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) out, _ = popen.communicate() diff --git a/deps/gyp/pylib/gyp/xcode_emulation.py b/deps/gyp/pylib/gyp/xcode_emulation.py index 859cd5a937..ac6852faf9 100644 --- a/deps/gyp/pylib/gyp/xcode_emulation.py +++ b/deps/gyp/pylib/gyp/xcode_emulation.py @@ -215,9 +215,24 @@ class XcodeSettings(object): if test_key in self._Settings(): print 'Warning: Ignoring not yet implemented key "%s".' % test_key + def IsBinaryOutputFormat(self, configname): + default = "binary" if self.isIOS else "xml" + format = self.xcode_settings[configname].get('INFOPLIST_OUTPUT_FORMAT', + default) + return format == "binary" + def _IsBundle(self): return int(self.spec.get('mac_bundle', 0)) != 0 + def _IsIosAppExtension(self): + return int(self.spec.get('ios_app_extension', 0)) != 0 + + def _IsIosWatchKitExtension(self): + return int(self.spec.get('ios_watchkit_extension', 0)) != 0 + + def _IsIosWatchApp(self): + return int(self.spec.get('ios_watch_app', 0)) != 0 + def GetFrameworkVersion(self): """Returns the framework version of the current target. Only valid for bundles.""" @@ -237,7 +252,10 @@ class XcodeSettings(object): 'WRAPPER_EXTENSION', default=default_wrapper_extension) return '.' + self.spec.get('product_extension', wrapper_extension) elif self.spec['type'] == 'executable': - return '.' + self.spec.get('product_extension', 'app') + if self._IsIosAppExtension() or self._IsIosWatchKitExtension(): + return '.' + self.spec.get('product_extension', 'appex') + else: + return '.' + self.spec.get('product_extension', 'app') else: assert False, "Don't know extension for '%s', target '%s'" % ( self.spec['type'], self.spec['target_name']) @@ -292,6 +310,18 @@ class XcodeSettings(object): def GetProductType(self): """Returns the PRODUCT_TYPE of this target.""" + if self._IsIosAppExtension(): + assert self._IsBundle(), ('ios_app_extension flag requires mac_bundle ' + '(target %s)' % self.spec['target_name']) + return 'com.apple.product-type.app-extension' + if self._IsIosWatchKitExtension(): + assert self._IsBundle(), ('ios_watchkit_extension flag requires ' + 'mac_bundle (target %s)' % self.spec['target_name']) + return 'com.apple.product-type.watchkit-extension' + if self._IsIosWatchApp(): + assert self._IsBundle(), ('ios_watch_app flag requires mac_bundle ' + '(target %s)' % self.spec['target_name']) + return 'com.apple.product-type.application.watchapp' if self._IsBundle(): return { 'executable': 'com.apple.product-type.application', @@ -495,6 +525,13 @@ class XcodeSettings(object): if self._Test('GCC_WARN_ABOUT_MISSING_NEWLINE', 'YES', default='NO'): cflags.append('-Wnewline-eof') + # In Xcode, this is only activated when GCC_COMPILER_VERSION is clang or + # llvm-gcc. It also requires a fairly recent libtool, and + # if the system clang isn't used, DYLD_LIBRARY_PATH needs to contain the + # path to the libLTO.dylib that matches the used clang. + if self._Test('LLVM_LTO', 'YES', default='NO'): + cflags.append('-flto') + self._AppendPlatformVersionMinFlags(cflags) # TODO: @@ -703,8 +740,8 @@ class XcodeSettings(object): # -exported_symbols_list file # -Wl,exported_symbols_list file # -Wl,exported_symbols_list,file - LINKER_FILE = '(\S+)' - WORD = '\S+' + LINKER_FILE = r'(\S+)' + WORD = r'\S+' linker_flags = [ ['-exported_symbols_list', LINKER_FILE], # Needed for NaCl. ['-unexported_symbols_list', LINKER_FILE], @@ -794,6 +831,20 @@ class XcodeSettings(object): for directory in framework_dirs: ldflags.append('-F' + directory.replace('$(SDKROOT)', sdk_root)) + is_extension = self._IsIosAppExtension() or self._IsIosWatchKitExtension() + if sdk_root and is_extension: + # Adds the link flags for extensions. These flags are common for all + # extensions and provide loader and main function. + # These flags reflect the compilation options used by xcode to compile + # extensions. + ldflags.append('-lpkstart') + if XcodeVersion() < '0900': + ldflags.append(sdk_root + + '/System/Library/PrivateFrameworks/PlugInKit.framework/PlugInKit') + ldflags.append('-fapplication-extension') + ldflags.append('-Xlinker -rpath ' + '-Xlinker @executable_path/../../Frameworks') + self._Appendf(ldflags, 'CLANG_CXX_LIBRARY', '-stdlib=%s') self.configname = None @@ -921,7 +972,7 @@ class XcodeSettings(object): """Return a shell command to codesign the iOS output binary so it can be deployed to a device. This should be run as the very last step of the build.""" - if not (self.isIOS and self.spec['type'] == "executable"): + if not (self.isIOS and self.spec['type'] == 'executable'): return [] settings = self.xcode_settings[configname] @@ -981,7 +1032,23 @@ class XcodeSettings(object): sdk_root = self._SdkPath(config_name) if not sdk_root: sdk_root = '' - return l.replace('$(SDKROOT)', sdk_root) + # Xcode 7 started shipping with ".tbd" (text based stubs) files instead of + # ".dylib" without providing a real support for them. What it does, for + # "/usr/lib" libraries, is do "-L/usr/lib -lname" which is dependent on the + # library order and cause collision when building Chrome. + # + # Instead substitude ".tbd" to ".dylib" in the generated project when the + # following conditions are both true: + # - library is referenced in the gyp file as "$(SDKROOT)/**/*.dylib", + # - the ".dylib" file does not exists but a ".tbd" file do. + library = l.replace('$(SDKROOT)', sdk_root) + if l.startswith('$(SDKROOT)'): + basename, ext = os.path.splitext(library) + if ext == '.dylib' and not os.path.exists(library): + tbd_library = basename + '.tbd' + if os.path.exists(tbd_library): + library = tbd_library + return library def AdjustLibraries(self, libraries, config_name=None): """Transforms entries like 'Cocoa.framework' in libraries into entries like @@ -1191,13 +1258,13 @@ def XcodeVersion(): # In that case this may be a CLT-only install so fall back to # checking that version. if len(version_list) < 2: - raise GypError, "xcodebuild returned unexpected results" + raise GypError("xcodebuild returned unexpected results") except: version = CLTVersion() if version: - version = re.match('(\d\.\d\.?\d*)', version).groups()[0] + version = re.match(r'(\d\.\d\.?\d*)', version).groups()[0] else: - raise GypError, "No Xcode or CLT version detected!" + raise GypError("No Xcode or CLT version detected!") # The CLT has no build information, so we return an empty string. version_list = [version, ''] version = version_list[0] @@ -1385,6 +1452,7 @@ def _GetXcodeEnv(xcode_settings, built_products_dir, srcroot, configuration, # These are filled in on a as-needed basis. env = { + 'BUILT_FRAMEWORKS_DIR' : built_products_dir, 'BUILT_PRODUCTS_DIR' : built_products_dir, 'CONFIGURATION' : configuration, 'PRODUCT_NAME' : xcode_settings.GetProductName(), diff --git a/deps/gyp/pylib/gyp/xcode_ninja.py b/deps/gyp/pylib/gyp/xcode_ninja.py index 0e5a70c714..3820d6bf04 100644 --- a/deps/gyp/pylib/gyp/xcode_ninja.py +++ b/deps/gyp/pylib/gyp/xcode_ninja.py @@ -19,10 +19,13 @@ import re import xml.sax.saxutils -def _WriteWorkspace(main_gyp, sources_gyp): +def _WriteWorkspace(main_gyp, sources_gyp, params): """ Create a workspace to wrap main and sources gyp paths. """ (build_file_root, build_file_ext) = os.path.splitext(main_gyp) workspace_path = build_file_root + '.xcworkspace' + options = params['options'] + if options.generator_output: + workspace_path = os.path.join(options.generator_output, workspace_path) try: os.makedirs(workspace_path) except OSError, e: @@ -64,10 +67,13 @@ def _TargetFromSpec(old_spec, params): target_name = old_spec.get('target_name') product_name = old_spec.get('product_name', target_name) + product_extension = old_spec.get('product_extension') ninja_target = {} ninja_target['target_name'] = target_name ninja_target['product_name'] = product_name + if product_extension: + ninja_target['product_extension'] = product_extension ninja_target['toolset'] = old_spec.get('toolset') ninja_target['default_configuration'] = old_spec.get('default_configuration') ninja_target['configurations'] = {} @@ -80,7 +86,8 @@ def _TargetFromSpec(old_spec, params): if 'configurations' in old_spec: for config in old_spec['configurations'].iterkeys(): - old_xcode_settings = old_spec['configurations'][config]['xcode_settings'] + old_xcode_settings = \ + old_spec['configurations'][config].get('xcode_settings', {}) if 'IPHONEOS_DEPLOYMENT_TARGET' in old_xcode_settings: new_xcode_settings['CODE_SIGNING_REQUIRED'] = "NO" new_xcode_settings['IPHONEOS_DEPLOYMENT_TARGET'] = \ @@ -90,6 +97,10 @@ def _TargetFromSpec(old_spec, params): new_xcode_settings ninja_target['mac_bundle'] = old_spec.get('mac_bundle', 0) + ninja_target['ios_app_extension'] = old_spec.get('ios_app_extension', 0) + ninja_target['ios_watchkit_extension'] = \ + old_spec.get('ios_watchkit_extension', 0) + ninja_target['ios_watchkit_app'] = old_spec.get('ios_watchkit_app', 0) ninja_target['type'] = old_spec['type'] if ninja_toplevel: ninja_target['actions'] = [ @@ -218,9 +229,11 @@ def CreateWrapper(target_list, target_dicts, data, params): sources = [] for target, target_dict in target_dicts.iteritems(): - base = os.path.dirname(target) + base = os.path.dirname(target) files = target_dict.get('sources', []) + \ target_dict.get('mac_bundle_resources', []) + for action in target_dict.get('actions', []): + files.extend(action.get('inputs', [])) # Remove files starting with $. These are mostly intermediate files for the # build system. files = [ file for file in files if not file.startswith('$')] @@ -253,5 +266,5 @@ def CreateWrapper(target_list, target_dicts, data, params): new_data[sources_gyp]['targets'].append(new_data_target) # Write workspace to file. - _WriteWorkspace(main_gyp, sources_gyp) + _WriteWorkspace(main_gyp, sources_gyp, params) return (new_target_list, new_target_dicts, new_data) diff --git a/deps/gyp/pylib/gyp/xcodeproj_file.py b/deps/gyp/pylib/gyp/xcodeproj_file.py index fc40fcb2db..d08b7f7770 100644 --- a/deps/gyp/pylib/gyp/xcodeproj_file.py +++ b/deps/gyp/pylib/gyp/xcodeproj_file.py @@ -173,7 +173,7 @@ _escaped = re.compile('[\\\\"]|[\x00-\x1f]') # Used by SourceTreeAndPathFromPath -_path_leading_variable = re.compile('^\$\((.*?)\)(/(.*))?$') +_path_leading_variable = re.compile(r'^\$\((.*?)\)(/(.*))?$') def SourceTreeAndPathFromPath(input_path): """Given input_path, returns a tuple with sourceTree and path values. @@ -196,7 +196,7 @@ def SourceTreeAndPathFromPath(input_path): return (source_tree, output_path) def ConvertVariablesToShellSyntax(input_string): - return re.sub('\$\((.*?)\)', '${\\1}', input_string) + return re.sub(r'\$\((.*?)\)', '${\\1}', input_string) class XCObject(object): """The abstract base of all class types used in Xcode project files. @@ -341,13 +341,13 @@ class XCObject(object): elif isinstance(value, dict): # dicts are never strong. if is_strong: - raise TypeError, 'Strong dict for key ' + key + ' in ' + \ - self.__class__.__name__ + raise TypeError('Strong dict for key ' + key + ' in ' + \ + self.__class__.__name__) else: that._properties[key] = value.copy() else: - raise TypeError, 'Unexpected type ' + value.__class__.__name__ + \ - ' for key ' + key + ' in ' + self.__class__.__name__ + raise TypeError('Unexpected type ' + value.__class__.__name__ + \ + ' for key ' + key + ' in ' + self.__class__.__name__) return that @@ -366,8 +366,7 @@ class XCObject(object): ('name' in self._schema and self._schema['name'][3]): return self._properties['name'] - raise NotImplementedError, \ - self.__class__.__name__ + ' must implement Name' + raise NotImplementedError(self.__class__.__name__ + ' must implement Name') def Comment(self): """Return a comment string for the object. @@ -466,10 +465,10 @@ class XCObject(object): for descendant in descendants: if descendant.id in ids: other = ids[descendant.id] - raise KeyError, \ + raise KeyError( 'Duplicate ID %s, objects "%s" and "%s" in "%s"' % \ (descendant.id, str(descendant._properties), - str(other._properties), self._properties['rootObject'].Name()) + str(other._properties), self._properties['rootObject'].Name())) ids[descendant.id] = descendant def Children(self): @@ -630,7 +629,7 @@ class XCObject(object): sep printable += end_tabs + '}' else: - raise TypeError, "Can't make " + value.__class__.__name__ + ' printable' + raise TypeError("Can't make " + value.__class__.__name__ + ' printable') if comment != None: printable += ' ' + self._EncodeComment(comment) @@ -756,31 +755,31 @@ class XCObject(object): for property, value in properties.iteritems(): # Make sure the property is in the schema. if not property in self._schema: - raise KeyError, property + ' not in ' + self.__class__.__name__ + raise KeyError(property + ' not in ' + self.__class__.__name__) # Make sure the property conforms to the schema. (is_list, property_type, is_strong) = self._schema[property][0:3] if is_list: if value.__class__ != list: - raise TypeError, \ + raise TypeError( property + ' of ' + self.__class__.__name__ + \ - ' must be list, not ' + value.__class__.__name__ + ' must be list, not ' + value.__class__.__name__) for item in value: if not isinstance(item, property_type) and \ not (item.__class__ == unicode and property_type == str): # Accept unicode where str is specified. str is treated as # UTF-8-encoded. - raise TypeError, \ + raise TypeError( 'item of ' + property + ' of ' + self.__class__.__name__ + \ ' must be ' + property_type.__name__ + ', not ' + \ - item.__class__.__name__ + item.__class__.__name__) elif not isinstance(value, property_type) and \ not (value.__class__ == unicode and property_type == str): # Accept unicode where str is specified. str is treated as # UTF-8-encoded. - raise TypeError, \ + raise TypeError( property + ' of ' + self.__class__.__name__ + ' must be ' + \ - property_type.__name__ + ', not ' + value.__class__.__name__ + property_type.__name__ + ', not ' + value.__class__.__name__) # Checks passed, perform the assignment. if do_copy: @@ -804,9 +803,9 @@ class XCObject(object): elif isinstance(value, dict): self._properties[property] = value.copy() else: - raise TypeError, "Don't know how to copy a " + \ - value.__class__.__name__ + ' object for ' + \ - property + ' in ' + self.__class__.__name__ + raise TypeError("Don't know how to copy a " + \ + value.__class__.__name__ + ' object for ' + \ + property + ' in ' + self.__class__.__name__) else: self._properties[property] = value @@ -837,15 +836,15 @@ class XCObject(object): # Schema validation. if not key in self._schema: - raise KeyError, key + ' not in ' + self.__class__.__name__ + raise KeyError(key + ' not in ' + self.__class__.__name__) (is_list, property_type, is_strong) = self._schema[key][0:3] if not is_list: - raise TypeError, key + ' of ' + self.__class__.__name__ + ' must be list' + raise TypeError(key + ' of ' + self.__class__.__name__ + ' must be list') if not isinstance(value, property_type): - raise TypeError, 'item of ' + key + ' of ' + self.__class__.__name__ + \ - ' must be ' + property_type.__name__ + ', not ' + \ - value.__class__.__name__ + raise TypeError('item of ' + key + ' of ' + self.__class__.__name__ + \ + ' must be ' + property_type.__name__ + ', not ' + \ + value.__class__.__name__) # If the property doesn't exist yet, create a new empty list to receive the # item. @@ -869,7 +868,7 @@ class XCObject(object): for property, attributes in self._schema.iteritems(): (is_list, property_type, is_strong, is_required) = attributes[0:4] if is_required and not property in self._properties: - raise KeyError, self.__class__.__name__ + ' requires ' + property + raise KeyError(self.__class__.__name__ + ' requires ' + property) def _SetDefaultsFromSchema(self): """Assign object default values according to the schema. This will not @@ -1143,16 +1142,16 @@ class PBXGroup(XCHierarchicalElement): child_path = child.PathFromSourceTreeAndPath() if child_path: if child_path in self._children_by_path: - raise ValueError, 'Found multiple children with path ' + child_path + raise ValueError('Found multiple children with path ' + child_path) self._children_by_path[child_path] = child if isinstance(child, PBXVariantGroup): child_name = child._properties.get('name', None) key = (child_name, child_path) if key in self._variant_children_by_name_and_path: - raise ValueError, 'Found multiple PBXVariantGroup children with ' + \ - 'name ' + str(child_name) + ' and path ' + \ - str(child_path) + raise ValueError('Found multiple PBXVariantGroup children with ' + \ + 'name ' + str(child_name) + ' and path ' + \ + str(child_path)) self._variant_children_by_name_and_path[key] = child def AppendChild(self, child): @@ -1493,6 +1492,7 @@ class PBXFileReference(XCFileLikeElement, XCContainerPortal, XCRemoteObject): 'icns': 'image.icns', 'java': 'sourcecode.java', 'js': 'sourcecode.javascript', + 'kext': 'wrapper.kext', 'm': 'sourcecode.c.objc', 'mm': 'sourcecode.cpp.objcpp', 'nib': 'wrapper.nib', @@ -1508,10 +1508,12 @@ class PBXFileReference(XCFileLikeElement, XCContainerPortal, XCRemoteObject): 's': 'sourcecode.asm', 'storyboard': 'file.storyboard', 'strings': 'text.plist.strings', + 'swift': 'sourcecode.swift', 'ttf': 'file', 'xcassets': 'folder.assetcatalog', 'xcconfig': 'text.xcconfig', 'xcdatamodel': 'wrapper.xcdatamodel', + 'xcdatamodeld':'wrapper.xcdatamodeld', 'xib': 'file.xib', 'y': 'sourcecode.yacc', } @@ -1606,7 +1608,7 @@ class XCConfigurationList(XCObject): if configuration._properties['name'] == name: return configuration - raise KeyError, name + raise KeyError(name) def DefaultConfiguration(self): """Convenience accessor to obtain the default XCBuildConfiguration.""" @@ -1663,7 +1665,7 @@ class XCConfigurationList(XCObject): value = configuration_value else: if value != configuration_value: - raise ValueError, 'Variant values for ' + key + raise ValueError('Variant values for ' + key) return value @@ -1770,8 +1772,8 @@ class XCBuildPhase(XCObject): # added, either as a child or deeper descendant. The second item should # be a boolean indicating whether files should be added into hierarchical # groups or one single flat group. - raise NotImplementedError, \ - self.__class__.__name__ + ' must implement FileGroup' + raise NotImplementedError( + self.__class__.__name__ + ' must implement FileGroup') def _AddPathToDict(self, pbxbuildfile, path): """Adds path to the dict tracking paths belonging to this build phase. @@ -1780,7 +1782,7 @@ class XCBuildPhase(XCObject): """ if path in self._files_by_path: - raise ValueError, 'Found multiple build files with path ' + path + raise ValueError('Found multiple build files with path ' + path) self._files_by_path[path] = pbxbuildfile def _AddBuildFileToDicts(self, pbxbuildfile, path=None): @@ -1835,8 +1837,8 @@ class XCBuildPhase(XCObject): # problem. if xcfilelikeelement in self._files_by_xcfilelikeelement and \ self._files_by_xcfilelikeelement[xcfilelikeelement] != pbxbuildfile: - raise ValueError, 'Found multiple build files for ' + \ - xcfilelikeelement.Name() + raise ValueError('Found multiple build files for ' + \ + xcfilelikeelement.Name()) self._files_by_xcfilelikeelement[xcfilelikeelement] = pbxbuildfile def AppendBuildFile(self, pbxbuildfile, path=None): @@ -1950,6 +1952,7 @@ class PBXCopyFilesBuildPhase(XCBuildPhase): # path_tree_to_subfolder maps names of Xcode variables to the associated # dstSubfolderSpec property value used in a PBXCopyFilesBuildPhase object. path_tree_to_subfolder = { + 'BUILT_FRAMEWORKS_DIR': 10, # Frameworks Directory 'BUILT_PRODUCTS_DIR': 16, # Products Directory # Other types that can be chosen via the Xcode UI. # TODO(mark): Map Xcode variable names to these. @@ -1957,7 +1960,6 @@ class PBXCopyFilesBuildPhase(XCBuildPhase): # : 6, # Executables: 6 # : 7, # Resources # : 15, # Java Resources - # : 10, # Frameworks # : 11, # Shared Frameworks # : 12, # Shared Support # : 13, # PlugIns @@ -2000,8 +2002,8 @@ class PBXCopyFilesBuildPhase(XCBuildPhase): subfolder = 0 relative_path = path[1:] else: - raise ValueError, 'Can\'t use path %s in a %s' % \ - (path, self.__class__.__name__) + raise ValueError('Can\'t use path %s in a %s' % \ + (path, self.__class__.__name__)) self._properties['dstPath'] = relative_path self._properties['dstSubfolderSpec'] = subfolder @@ -2158,7 +2160,6 @@ class XCTarget(XCRemoteObject): if configs.HasBuildSetting('PRODUCT_NAME') == 0: configs.SetBuildSetting('PRODUCT_NAME', self._properties['productName']) - configs.SetBuildSetting('COMBINE_HIDPI_IMAGES', 'YES') def AddDependency(self, other): pbxproject = self.PBXProjectAncestor() @@ -2238,10 +2239,16 @@ class PBXNativeTarget(XCTarget): # Mapping from Xcode product-types to settings. The settings are: # filetype : used for explicitFileType in the project file # prefix : the prefix for the file name - # suffix : the suffix for the filen ame + # suffix : the suffix for the file name _product_filetypes = { - 'com.apple.product-type.application': ['wrapper.application', - '', '.app'], + 'com.apple.product-type.application': ['wrapper.application', + '', '.app'], + 'com.apple.product-type.application.watchapp': ['wrapper.application', + '', '.app'], + 'com.apple.product-type.watchkit-extension': ['wrapper.app-extension', + '', '.appex'], + 'com.apple.product-type.app-extension': ['wrapper.app-extension', + '', '.appex'], 'com.apple.product-type.bundle': ['wrapper.cfbundle', '', '.bundle'], 'com.apple.product-type.framework': ['wrapper.framework', @@ -2256,6 +2263,8 @@ class PBXNativeTarget(XCTarget): '', '.xctest'], 'com.googlecode.gyp.xcode.bundle': ['compiled.mach-o.dylib', '', '.so'], + 'com.apple.product-type.kernel-extension': ['wrapper.kext', + '', '.kext'], } def __init__(self, properties=None, id=None, parent=None, @@ -2314,11 +2323,11 @@ class PBXNativeTarget(XCTarget): if force_extension is not None: # If it's a wrapper (bundle), set WRAPPER_EXTENSION. + # Extension override. + suffix = '.' + force_extension if filetype.startswith('wrapper.'): self.SetBuildSetting('WRAPPER_EXTENSION', force_extension) else: - # Extension override. - suffix = '.' + force_extension self.SetBuildSetting('EXECUTABLE_EXTENSION', force_extension) if filetype.startswith('compiled.mach-o.executable'): @@ -2734,8 +2743,53 @@ class PBXProject(XCContainerPortal): self._SetUpProductReferences(other_pbxproject, product_group, project_ref) + inherit_unique_symroot = self._AllSymrootsUnique(other_pbxproject, False) + targets = other_pbxproject.GetProperty('targets') + if all(self._AllSymrootsUnique(t, inherit_unique_symroot) for t in targets): + dir_path = project_ref._properties['path'] + product_group._hashables.extend(dir_path) + return [product_group, project_ref] + def _AllSymrootsUnique(self, target, inherit_unique_symroot): + # Returns True if all configurations have a unique 'SYMROOT' attribute. + # The value of inherit_unique_symroot decides, if a configuration is assumed + # to inherit a unique 'SYMROOT' attribute from its parent, if it doesn't + # define an explicit value for 'SYMROOT'. + symroots = self._DefinedSymroots(target) + for s in self._DefinedSymroots(target): + if (s is not None and not self._IsUniqueSymrootForTarget(s) or + s is None and not inherit_unique_symroot): + return False + return True if symroots else inherit_unique_symroot + + def _DefinedSymroots(self, target): + # Returns all values for the 'SYMROOT' attribute defined in all + # configurations for this target. If any configuration doesn't define the + # 'SYMROOT' attribute, None is added to the returned set. If all + # configurations don't define the 'SYMROOT' attribute, an empty set is + # returned. + config_list = target.GetProperty('buildConfigurationList') + symroots = set() + for config in config_list.GetProperty('buildConfigurations'): + setting = config.GetProperty('buildSettings') + if 'SYMROOT' in setting: + symroots.add(setting['SYMROOT']) + else: + symroots.add(None) + if len(symroots) == 1 and None in symroots: + return set() + return symroots + + def _IsUniqueSymrootForTarget(self, symroot): + # This method returns True if all configurations in target contain a + # 'SYMROOT' attribute that is unique for the given target. A value is + # unique, if the Xcode macro '$SRCROOT' appears in it in any form. + uniquifier = ['$SRCROOT', '$(SRCROOT)'] + if any(x in symroot for x in uniquifier): + return True + return False + def _SetUpProductReferences(self, other_pbxproject, product_group, project_ref): # TODO(mark): This only adds references to products in other_pbxproject @@ -2804,7 +2858,7 @@ class PBXProject(XCContainerPortal): product_group = ref_dict['ProductGroup'] product_group._properties['children'] = sorted( product_group._properties['children'], - cmp=lambda x, y: CompareProducts(x, y, remote_products)) + cmp=lambda x, y, rp=remote_products: CompareProducts(x, y, rp)) class XCProjectFile(XCObject): @@ -2816,23 +2870,6 @@ class XCProjectFile(XCObject): 'rootObject': [0, PBXProject, 1, 1], }) - def SetXcodeVersion(self, version): - version_to_object_version = { - '2.4': 45, - '3.0': 45, - '3.1': 45, - '3.2': 46, - } - if not version in version_to_object_version: - supported_str = ', '.join(sorted(version_to_object_version.keys())) - raise Exception( - 'Unsupported Xcode version %s (supported: %s)' % - ( version, supported_str ) ) - compatibility_version = 'Xcode %s' % version - self._properties['rootObject'].SetProperty('compatibilityVersion', - compatibility_version) - self.SetProperty('objectVersion', version_to_object_version[version]); - def ComputeIDs(self, recursive=True, overwrite=True, hash=None): # Although XCProjectFile is implemented here as an XCObject, it's not a # proper object in the Xcode sense, and it certainly doesn't have its own diff --git a/deps/gyp/samples/samples b/deps/gyp/samples/samples new file mode 100755 index 0000000000..804b618998 --- /dev/null +++ b/deps/gyp/samples/samples @@ -0,0 +1,81 @@ +#!/usr/bin/python + +# Copyright (c) 2009 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 os.path +import shutil +import sys + + +gyps = [ + 'app/app.gyp', + 'base/base.gyp', + 'build/temp_gyp/googleurl.gyp', + 'build/all.gyp', + 'build/common.gypi', + 'build/external_code.gypi', + 'chrome/test/security_tests/security_tests.gyp', + 'chrome/third_party/hunspell/hunspell.gyp', + 'chrome/chrome.gyp', + 'media/media.gyp', + 'net/net.gyp', + 'printing/printing.gyp', + 'sdch/sdch.gyp', + 'skia/skia.gyp', + 'testing/gmock.gyp', + 'testing/gtest.gyp', + 'third_party/bzip2/bzip2.gyp', + 'third_party/icu38/icu38.gyp', + 'third_party/libevent/libevent.gyp', + 'third_party/libjpeg/libjpeg.gyp', + 'third_party/libpng/libpng.gyp', + 'third_party/libxml/libxml.gyp', + 'third_party/libxslt/libxslt.gyp', + 'third_party/lzma_sdk/lzma_sdk.gyp', + 'third_party/modp_b64/modp_b64.gyp', + 'third_party/npapi/npapi.gyp', + 'third_party/sqlite/sqlite.gyp', + 'third_party/zlib/zlib.gyp', + 'v8/tools/gyp/v8.gyp', + 'webkit/activex_shim/activex_shim.gyp', + 'webkit/activex_shim_dll/activex_shim_dll.gyp', + 'webkit/build/action_csspropertynames.py', + 'webkit/build/action_cssvaluekeywords.py', + 'webkit/build/action_jsconfig.py', + 'webkit/build/action_makenames.py', + 'webkit/build/action_maketokenizer.py', + 'webkit/build/action_useragentstylesheets.py', + 'webkit/build/rule_binding.py', + 'webkit/build/rule_bison.py', + 'webkit/build/rule_gperf.py', + 'webkit/tools/test_shell/test_shell.gyp', + 'webkit/webkit.gyp', +] + + +def Main(argv): + if len(argv) != 3 or argv[1] not in ['push', 'pull']: + print 'Usage: %s push/pull PATH_TO_CHROME' % argv[0] + return 1 + + path_to_chrome = argv[2] + + for g in gyps: + chrome_file = os.path.join(path_to_chrome, g) + local_file = os.path.join(os.path.dirname(argv[0]), os.path.split(g)[1]) + if argv[1] == 'push': + print 'Copying %s to %s' % (local_file, chrome_file) + shutil.copyfile(local_file, chrome_file) + elif argv[1] == 'pull': + print 'Copying %s to %s' % (chrome_file, local_file) + shutil.copyfile(chrome_file, local_file) + else: + assert False + + return 0 + + +if __name__ == '__main__': + sys.exit(Main(sys.argv)) diff --git a/deps/gyp/samples/samples.bat b/deps/gyp/samples/samples.bat new file mode 100644 index 0000000000..778d9c90f0 --- /dev/null +++ b/deps/gyp/samples/samples.bat @@ -0,0 +1,5 @@ +@rem Copyright (c) 2009 Google Inc. All rights reserved.
+@rem Use of this source code is governed by a BSD-style license that can be
+@rem found in the LICENSE file.
+
+@python %~dp0/samples %*
diff --git a/deps/gyp/test/actions-bare/gyptest-bare.py b/deps/gyp/test/actions-bare/gyptest-bare.py new file mode 100755 index 0000000000..e3d6db1029 --- /dev/null +++ b/deps/gyp/test/actions-bare/gyptest-bare.py @@ -0,0 +1,24 @@ +#!/usr/bin/env python + +# Copyright (c) 2009 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. + +""" +Verifies actions which are not depended on by other targets get executed. +""" + +import TestGyp + +test = TestGyp.TestGyp() + +test.run_gyp('bare.gyp', chdir='src') + +test.relocate('src', 'relocate/src') +test.build('bare.gyp', chdir='relocate/src') + +file_content = 'Hello from bare.py\n' + +test.built_file_must_match('out.txt', file_content, chdir='relocate/src') + +test.pass_test() diff --git a/deps/gyp/test/actions-bare/src/bare.gyp b/deps/gyp/test/actions-bare/src/bare.gyp new file mode 100644 index 0000000000..3d28f099d4 --- /dev/null +++ b/deps/gyp/test/actions-bare/src/bare.gyp @@ -0,0 +1,25 @@ +# Copyright (c) 2009 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. + +{ + 'targets': [ + { + 'target_name': 'bare', + 'type': 'none', + 'actions': [ + { + 'action_name': 'action1', + 'inputs': [ + 'bare.py', + ], + 'outputs': [ + '<(PRODUCT_DIR)/out.txt', + ], + 'action': ['python', 'bare.py', '<(PRODUCT_DIR)/out.txt'], + 'msvs_cygwin_shell': 0, + }, + ], + }, + ], +} diff --git a/deps/gyp/test/actions-bare/src/bare.py b/deps/gyp/test/actions-bare/src/bare.py new file mode 100755 index 0000000000..12307500f2 --- /dev/null +++ b/deps/gyp/test/actions-bare/src/bare.py @@ -0,0 +1,11 @@ +#!/usr/bin/env python + +# Copyright (c) 2009 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 sys + +f = open(sys.argv[1], 'wb') +f.write('Hello from bare.py\n') +f.close() diff --git a/deps/gyp/test/actions-depfile/depfile.gyp b/deps/gyp/test/actions-depfile/depfile.gyp new file mode 100644 index 0000000000..dc2397de05 --- /dev/null +++ b/deps/gyp/test/actions-depfile/depfile.gyp @@ -0,0 +1,25 @@ +# Copyright (c) 2015 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. + +{ + 'targets': [ + { + 'target_name': 'depfile_target', + 'type': 'none', + 'actions': [ + { + 'action_name': 'depfile_action', + 'inputs': [ + 'input.txt', + ], + 'outputs': [ + 'output.txt', + ], + 'depfile': 'depfile.d', + 'action': [ ] + }, + ], + }, + ], +} diff --git a/deps/gyp/test/actions-depfile/gyptest-all.py b/deps/gyp/test/actions-depfile/gyptest-all.py new file mode 100644 index 0000000000..23f6f4a056 --- /dev/null +++ b/deps/gyp/test/actions-depfile/gyptest-all.py @@ -0,0 +1,20 @@ +#!/usr/bin/env python + +# Copyright (c) 2014 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. + +"""Verifies that depfile fields are output in ninja rules.""" + +import TestGyp + +test = TestGyp.TestGyp() + +if test.format == 'ninja': + test.run_gyp('depfile.gyp') + contents = open(test.built_file_path('obj/depfile_target.ninja')).read() + + expected = 'depfile = depfile.d' + if expected not in contents: + test.fail_test() + test.pass_test() diff --git a/deps/gyp/test/actions-depfile/input.txt b/deps/gyp/test/actions-depfile/input.txt new file mode 100644 index 0000000000..3f9177e45e --- /dev/null +++ b/deps/gyp/test/actions-depfile/input.txt @@ -0,0 +1 @@ +input diff --git a/deps/gyp/test/actions-multiple-outputs-with-dependencies/gyptest-action.py b/deps/gyp/test/actions-multiple-outputs-with-dependencies/gyptest-action.py new file mode 100755 index 0000000000..ebc7f4fd94 --- /dev/null +++ b/deps/gyp/test/actions-multiple-outputs-with-dependencies/gyptest-action.py @@ -0,0 +1,43 @@ +#!/usr/bin/env python + +# Copyright (c) 2015 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. + +""" +Verifies actions with multiple outputs & dependncies will correctly rebuild. + +This is a regression test for crrev.com/1177163002. +""" + +import TestGyp +import os +import sys +import time + +if sys.platform in ('darwin', 'win32'): + print "This test is currently disabled: https://crbug.com/483696." + sys.exit(0) + +test = TestGyp.TestGyp() + +TESTDIR='relocate/src' +test.run_gyp('action.gyp', chdir='src') +test.relocate('src', TESTDIR) + +def build_and_check(content): + test.write(TESTDIR + '/input.txt', content) + test.build('action.gyp', 'upper', chdir=TESTDIR) + test.built_file_must_match('result.txt', content, chdir=TESTDIR) + +build_and_check('Content for first build.') + +# Ninja works with timestamps and the test above is fast enough that the +# 'updated' file may end up with the same timestamp as the original, meaning +# that ninja may not always recognize the input file has changed. +if test.format == 'ninja': + time.sleep(1) + +build_and_check('An updated input file.') + +test.pass_test() diff --git a/deps/gyp/test/actions-multiple-outputs-with-dependencies/src/action.gyp b/deps/gyp/test/actions-multiple-outputs-with-dependencies/src/action.gyp new file mode 100644 index 0000000000..a305d65ea9 --- /dev/null +++ b/deps/gyp/test/actions-multiple-outputs-with-dependencies/src/action.gyp @@ -0,0 +1,28 @@ +# Copyright (c) 2015 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. + +{ + 'targets': [ + { + 'target_name': 'upper', + 'type': 'none', + 'actions': [{ + 'action_name': 'upper_action', + 'inputs': ['<(PRODUCT_DIR)/out2.txt'], + 'outputs': ['<(PRODUCT_DIR)/result.txt'], + 'action': ['python', 'rcopy.py', '<@(_inputs)', '<@(_outputs)'], + }], + }, + { + 'target_name': 'lower', + 'type': 'none', + 'actions': [{ + 'action_name': 'lower_action', + 'inputs': ['input.txt'], + 'outputs': ['<(PRODUCT_DIR)/out1.txt', '<(PRODUCT_DIR)/out2.txt'], + 'action': ['python', 'rcopy.py', '<@(_inputs)', '<@(_outputs)'], + }], + }, + ], +} diff --git a/deps/gyp/test/actions-multiple-outputs-with-dependencies/src/rcopy.py b/deps/gyp/test/actions-multiple-outputs-with-dependencies/src/rcopy.py new file mode 100644 index 0000000000..fb029598c4 --- /dev/null +++ b/deps/gyp/test/actions-multiple-outputs-with-dependencies/src/rcopy.py @@ -0,0 +1,20 @@ +#!/usr/bin/env python +# +# Copyright (c) 2015 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 os +import sys + +"""A slightly odd 'cp' implementation for this test. + +This 'cp' can have many targets, but only one source. 'cp src dest1 dest2' +will copy the file 'src' to both 'dest1' and 'dest2'.""" + +with open(sys.argv[1], 'r') as f: + src = f.read() +for dest in sys.argv[2:]: + with open(dest, 'w') as f: + f.write(src) + diff --git a/deps/gyp/test/actions-multiple-outputs/gyptest-multiple-outputs.py b/deps/gyp/test/actions-multiple-outputs/gyptest-multiple-outputs.py new file mode 100755 index 0000000000..72a7040a01 --- /dev/null +++ b/deps/gyp/test/actions-multiple-outputs/gyptest-multiple-outputs.py @@ -0,0 +1,43 @@ +#!/usr/bin/env python + +# Copyright (c) 2015 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. + +""" +Verifies actions with multiple outputs will correctly rebuild. +""" + +import TestGyp +import os +import sys + +if sys.platform == 'win32': + print "This test is currently disabled: https://crbug.com/483696." + sys.exit(0) + +test = TestGyp.TestGyp() + +test.run_gyp('multiple-outputs.gyp', chdir='src') + +chdir = 'relocate/src' +test.relocate('src', chdir) + +def build_and_check(): + # Build + check that both outputs exist. + test.build('multiple-outputs.gyp', chdir=chdir) + test.built_file_must_exist('out1.txt', chdir=chdir) + test.built_file_must_exist('out2.txt', chdir=chdir) + +# Plain build. +build_and_check() + +# Remove either + rebuild. Both should exist (again). +os.remove(test.built_file_path('out1.txt', chdir=chdir)) +build_and_check(); + +# Remove the other + rebuild. Both should exist (again). +os.remove(test.built_file_path('out2.txt', chdir=chdir)) +build_and_check(); + +test.pass_test() diff --git a/deps/gyp/test/actions-multiple-outputs/src/multiple-outputs.gyp b/deps/gyp/test/actions-multiple-outputs/src/multiple-outputs.gyp new file mode 100644 index 0000000000..7a3d74b11a --- /dev/null +++ b/deps/gyp/test/actions-multiple-outputs/src/multiple-outputs.gyp @@ -0,0 +1,23 @@ +# Copyright (c) 2015 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. + +{ + 'targets': [ + { + 'target_name': 'multiple-outputs', + 'type': 'none', + 'actions': [ + { + 'action_name': 'action1', + 'inputs': [], + 'outputs': [ + '<(PRODUCT_DIR)/out1.txt', + '<(PRODUCT_DIR)/out2.txt', + ], + 'action': ['python', 'touch.py', '<@(_outputs)'], + }, + ], + }, + ], +} diff --git a/deps/gyp/test/actions-multiple-outputs/src/touch.py b/deps/gyp/test/actions-multiple-outputs/src/touch.py new file mode 100644 index 0000000000..bc61267f39 --- /dev/null +++ b/deps/gyp/test/actions-multiple-outputs/src/touch.py @@ -0,0 +1,16 @@ +#!/usr/bin/env python +# +# Copyright (c) 2015 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 os +import sys + +"""Cross-platform touch.""" + +for fname in sys.argv[1:]: + if os.path.exists(fname): + os.utime(fname, None) + else: + open(fname, 'w').close() diff --git a/deps/gyp/test/actions-multiple/gyptest-all.py b/deps/gyp/test/actions-multiple/gyptest-all.py new file mode 100755 index 0000000000..2a083de9b0 --- /dev/null +++ b/deps/gyp/test/actions-multiple/gyptest-all.py @@ -0,0 +1,72 @@ +#!/usr/bin/env python + +# 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. + +""" +Verifies two actions can be attached to the same input files. +""" + +import sys + +import TestGyp + +test = TestGyp.TestGyp() + +test.run_gyp('actions.gyp', chdir='src') + +test.relocate('src', 'relocate/src') + +# Test of fine-grained dependencies for generators that can build individual +# files on demand. +# In particular: +# - TargetA depends on TargetB. +# - TargetA and TargetB are 'none' type with actions attached. +# - TargetA has multiple actions. +# - An output from one of the actions in TargetA (not the first listed), +# is requested as the build target. +# Ensure that TargetB gets built. +# +# This sub-test can only be done with generators/build tools that can +# be asked to build individual files rather than whole targets (make, ninja). +if test.format in ['make', 'ninja']: + # Select location of target based on generator. + if test.format == 'make': + target = 'multi2.txt' + elif test.format == 'ninja': + if sys.platform in ['win32', 'cygwin']: + target = '..\\..\\multi2.txt' + else: + target = '../../multi2.txt' + else: + assert False + test.build('actions.gyp', chdir='relocate/src', target=target) + test.must_contain('relocate/src/multi2.txt', 'hello there') + test.must_contain('relocate/src/multi_dep.txt', 'hello there') + + +# Test that two actions can be attached to the same inputs. +test.build('actions.gyp', test.ALL, chdir='relocate/src') +test.must_contain('relocate/src/output1.txt', 'hello there') +test.must_contain('relocate/src/output2.txt', 'hello there') +test.must_contain('relocate/src/output3.txt', 'hello there') +test.must_contain('relocate/src/output4.txt', 'hello there') + +# Test that process_outputs_as_sources works in conjuction with merged +# actions. +test.run_built_executable( + 'multiple_action_source_filter', + chdir='relocate/src', + stdout=( + '{\n' + 'bar\n' + 'car\n' + 'dar\n' + 'ear\n' + '}\n' + ), +) + + +test.pass_test() diff --git a/deps/gyp/test/actions-multiple/src/actions.gyp b/deps/gyp/test/actions-multiple/src/actions.gyp new file mode 100644 index 0000000000..c70a58f702 --- /dev/null +++ b/deps/gyp/test/actions-multiple/src/actions.gyp @@ -0,0 +1,226 @@ +# Copyright (c) 2011 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. + +{ + 'variables': { + # Have a long string so that actions will exceed xp 512 character + # command limit on xp. + 'long_string': + 'abcdefghijklmnopqrstuvwxyz0123456789' + 'abcdefghijklmnopqrstuvwxyz0123456789' + 'abcdefghijklmnopqrstuvwxyz0123456789' + 'abcdefghijklmnopqrstuvwxyz0123456789' + 'abcdefghijklmnopqrstuvwxyz0123456789' + 'abcdefghijklmnopqrstuvwxyz0123456789' + 'abcdefghijklmnopqrstuvwxyz0123456789' + 'abcdefghijklmnopqrstuvwxyz0123456789' + 'abcdefghijklmnopqrstuvwxyz0123456789' + 'abcdefghijklmnopqrstuvwxyz0123456789' + 'abcdefghijklmnopqrstuvwxyz0123456789' + }, + 'targets': [ + { + 'target_name': 'multiple_action_target', + 'type': 'none', + 'actions': [ + { + 'action_name': 'action1', + 'inputs': [ + 'copy.py', + 'input.txt', + ], + 'outputs': [ + 'output1.txt', + ], + 'action': [ + 'python', '<@(_inputs)', '<(_outputs)', '<(long_string)', + ], + # Allows the test to run without hermetic cygwin on windows. + 'msvs_cygwin_shell': 0, + }, + { + 'action_name': 'action2', + 'inputs': [ + 'copy.py', + 'input.txt', + ], + 'outputs': [ + 'output2.txt', + ], + 'action': [ + 'python', '<@(_inputs)', '<(_outputs)', '<(long_string)', + ], + # Allows the test to run without hermetic cygwin on windows. + 'msvs_cygwin_shell': 0, + }, + { + 'action_name': 'action3', + 'inputs': [ + 'copy.py', + 'input.txt', + ], + 'outputs': [ + 'output3.txt', + ], + 'action': [ + 'python', '<@(_inputs)', '<(_outputs)', '<(long_string)', + ], + # Allows the test to run without hermetic cygwin on windows. + 'msvs_cygwin_shell': 0, + }, + { + 'action_name': 'action4', + 'inputs': [ + 'copy.py', + 'input.txt', + ], + 'outputs': [ + 'output4.txt', + ], + 'action': [ + 'python', '<@(_inputs)', '<(_outputs)', '<(long_string)', + ], + # Allows the test to run without hermetic cygwin on windows. + 'msvs_cygwin_shell': 0, + }, + ], + }, + { + 'target_name': 'multiple_action_source_filter', + 'type': 'executable', + 'sources': [ + 'main.c', + # TODO(bradnelson): add foo.c here once this issue is fixed: + # http://code.google.com/p/gyp/issues/detail?id=175 + ], + 'actions': [ + { + 'action_name': 'action1', + 'inputs': [ + 'foo.c', + 'filter.py', + ], + 'outputs': [ + '<(INTERMEDIATE_DIR)/output1.c', + ], + 'process_outputs_as_sources': 1, + 'action': [ + 'python', 'filter.py', 'foo', 'bar', 'foo.c', '<@(_outputs)', + ], + # Allows the test to run without hermetic cygwin on windows. + 'msvs_cygwin_shell': 0, + }, + { + 'action_name': 'action2', + 'inputs': [ + 'foo.c', + 'filter.py', + ], + 'outputs': [ + '<(INTERMEDIATE_DIR)/output2.c', + ], + 'process_outputs_as_sources': 1, + 'action': [ + 'python', 'filter.py', 'foo', 'car', 'foo.c', '<@(_outputs)', + ], + # Allows the test to run without hermetic cygwin on windows. + 'msvs_cygwin_shell': 0, + }, + { + 'action_name': 'action3', + 'inputs': [ + 'foo.c', + 'filter.py', + ], + 'outputs': [ + '<(INTERMEDIATE_DIR)/output3.c', + ], + 'process_outputs_as_sources': 1, + 'action': [ + 'python', 'filter.py', 'foo', 'dar', 'foo.c', '<@(_outputs)', + ], + # Allows the test to run without hermetic cygwin on windows. + 'msvs_cygwin_shell': 0, + }, + { + 'action_name': 'action4', + 'inputs': [ + 'foo.c', + 'filter.py', + ], + 'outputs': [ + '<(INTERMEDIATE_DIR)/output4.c', + ], + 'process_outputs_as_sources': 1, + 'action': [ + 'python', 'filter.py', 'foo', 'ear', 'foo.c', '<@(_outputs)', + ], + # Allows the test to run without hermetic cygwin on windows. + 'msvs_cygwin_shell': 0, + }, + ], + }, + { + 'target_name': 'multiple_dependent_target', + 'type': 'none', + 'actions': [ + { + 'action_name': 'action1', + 'inputs': [ + 'copy.py', + 'input.txt', + ], + 'outputs': [ + 'multi1.txt', + ], + 'action': [ + 'python', '<@(_inputs)', '<(_outputs)', '<(long_string)', + ], + # Allows the test to run without hermetic cygwin on windows. + 'msvs_cygwin_shell': 0, + }, + { + 'action_name': 'action2', + 'inputs': [ + 'copy.py', + 'input.txt', + ], + 'outputs': [ + 'multi2.txt', + ], + 'action': [ + 'python', '<@(_inputs)', '<(_outputs)', '<(long_string)', + ], + # Allows the test to run without hermetic cygwin on windows. + 'msvs_cygwin_shell': 0, + }, + ], + 'dependencies': [ + 'multiple_required_target', + ], + }, + { + 'target_name': 'multiple_required_target', + 'type': 'none', + 'actions': [ + { + 'action_name': 'multi_dep', + 'inputs': [ + 'copy.py', + 'input.txt', + ], + 'outputs': [ + 'multi_dep.txt', + ], + 'process_outputs_as_sources': 1, + 'action': [ + 'python', '<@(_inputs)', '<(_outputs)', '<(long_string)', + ], + # Allows the test to run without hermetic cygwin on windows. + 'msvs_cygwin_shell': 0, + }, + ], + }, + ], +} diff --git a/deps/gyp/test/actions-multiple/src/copy.py b/deps/gyp/test/actions-multiple/src/copy.py new file mode 100755 index 0000000000..0774679380 --- /dev/null +++ b/deps/gyp/test/actions-multiple/src/copy.py @@ -0,0 +1,9 @@ +#!/usr/bin/env python +# Copyright (c) 2011 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 shutil +import sys + +shutil.copyfile(sys.argv[1], sys.argv[2]) diff --git a/deps/gyp/test/actions-multiple/src/filter.py b/deps/gyp/test/actions-multiple/src/filter.py new file mode 100755 index 0000000000..f61a5fa59a --- /dev/null +++ b/deps/gyp/test/actions-multiple/src/filter.py @@ -0,0 +1,12 @@ +#!/usr/bin/env python +# Copyright (c) 2011 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 sys + +data = open(sys.argv[3], 'r').read() +fh = open(sys.argv[4], 'w') +fh.write(data.replace(sys.argv[1], sys.argv[2])) +fh.close() diff --git a/deps/gyp/test/actions-multiple/src/foo.c b/deps/gyp/test/actions-multiple/src/foo.c new file mode 100644 index 0000000000..23c4ef7f26 --- /dev/null +++ b/deps/gyp/test/actions-multiple/src/foo.c @@ -0,0 +1,11 @@ +/* + * Copyright (c) 2011 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. + */ + +#include <stdio.h> + +void foo(void) { + printf("foo\n"); +} diff --git a/deps/gyp/test/actions-multiple/src/input.txt b/deps/gyp/test/actions-multiple/src/input.txt new file mode 100644 index 0000000000..c7c7da3c64 --- /dev/null +++ b/deps/gyp/test/actions-multiple/src/input.txt @@ -0,0 +1 @@ +hello there diff --git a/deps/gyp/test/actions-multiple/src/main.c b/deps/gyp/test/actions-multiple/src/main.c new file mode 100644 index 0000000000..0a420b9034 --- /dev/null +++ b/deps/gyp/test/actions-multiple/src/main.c @@ -0,0 +1,22 @@ +/* + * Copyright (c) 2011 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. + */ + +#include <stdio.h> + +void bar(void); +void car(void); +void dar(void); +void ear(void); + +int main() { + printf("{\n"); + bar(); + car(); + dar(); + ear(); + printf("}\n"); + return 0; +} diff --git a/deps/gyp/test/actions-none/gyptest-none.py b/deps/gyp/test/actions-none/gyptest-none.py new file mode 100755 index 0000000000..933cfad30c --- /dev/null +++ b/deps/gyp/test/actions-none/gyptest-none.py @@ -0,0 +1,24 @@ +#!/usr/bin/env python + +# 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. + +""" +Verifies actions can be in 'none' type targets with source files. +""" + +import TestGyp + +test = TestGyp.TestGyp() + +test.run_gyp('none_with_source_files.gyp', chdir='src') + +test.relocate('src', 'relocate/src') +test.build('none_with_source_files.gyp', chdir='relocate/src') + +file_content = 'foo.cc\n' + +test.built_file_must_match('fake.out', file_content, chdir='relocate/src') + +test.pass_test() diff --git a/deps/gyp/test/actions-none/src/fake_cross.py b/deps/gyp/test/actions-none/src/fake_cross.py new file mode 100644 index 0000000000..2913f66a68 --- /dev/null +++ b/deps/gyp/test/actions-none/src/fake_cross.py @@ -0,0 +1,12 @@ +#!/usr/bin/python +# 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 sys + +fh = open(sys.argv[-1], 'wb') +for filename in sys.argv[1:-1]: + fh.write(open(filename).read()) +fh.close() diff --git a/deps/gyp/test/actions-none/src/foo.cc b/deps/gyp/test/actions-none/src/foo.cc new file mode 100644 index 0000000000..c6c61745ba --- /dev/null +++ b/deps/gyp/test/actions-none/src/foo.cc @@ -0,0 +1 @@ +foo.cc diff --git a/deps/gyp/test/actions-none/src/none_with_source_files.gyp b/deps/gyp/test/actions-none/src/none_with_source_files.gyp new file mode 100644 index 0000000000..e2aaebc10a --- /dev/null +++ b/deps/gyp/test/actions-none/src/none_with_source_files.gyp @@ -0,0 +1,35 @@ +# 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. + +# Test that 'none' type targets can have .cc files in them. + +{ + 'targets': [ + { + 'target_name': 'none_with_sources', + 'type': 'none', + 'msvs_cygwin_shell': 0, + 'sources': [ + 'foo.cc', + ], + 'actions': [ + { + 'action_name': 'fake_cross', + 'inputs': [ + 'fake_cross.py', + '<@(_sources)', + ], + 'outputs': [ + '<(PRODUCT_DIR)/fake.out', + ], + 'action': [ + 'python', '<@(_inputs)', '<@(_outputs)', + ], + # Allows the test to run without hermetic cygwin on windows. + 'msvs_cygwin_shell': 0, + } + ], + }, + ], +} diff --git a/deps/gyp/test/actions-subdir/gyptest-action.py b/deps/gyp/test/actions-subdir/gyptest-action.py new file mode 100755 index 0000000000..09cfef1893 --- /dev/null +++ b/deps/gyp/test/actions-subdir/gyptest-action.py @@ -0,0 +1,26 @@ +#!/usr/bin/env python + +# Copyright (c) 2009 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. + +""" +Test actions that output to PRODUCT_DIR. +""" + +import TestGyp + +# TODO fix this for xcode: http://code.google.com/p/gyp/issues/detail?id=88 +test = TestGyp.TestGyp(formats=['!xcode']) + +test.run_gyp('none.gyp', chdir='src') + +test.build('none.gyp', test.ALL, chdir='src') + +file_content = 'Hello from make-file.py\n' +subdir_file_content = 'Hello from make-subdir-file.py\n' + +test.built_file_must_match('file.out', file_content, chdir='src') +test.built_file_must_match('subdir_file.out', subdir_file_content, chdir='src') + +test.pass_test() diff --git a/deps/gyp/test/actions-subdir/src/make-file.py b/deps/gyp/test/actions-subdir/src/make-file.py new file mode 100755 index 0000000000..74e55811d2 --- /dev/null +++ b/deps/gyp/test/actions-subdir/src/make-file.py @@ -0,0 +1,11 @@ +#!/usr/bin/env python + +# Copyright (c) 2009 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 sys + +contents = 'Hello from make-file.py\n' + +open(sys.argv[1], 'wb').write(contents) diff --git a/deps/gyp/test/actions-subdir/src/none.gyp b/deps/gyp/test/actions-subdir/src/none.gyp new file mode 100644 index 0000000000..23f8d25a53 --- /dev/null +++ b/deps/gyp/test/actions-subdir/src/none.gyp @@ -0,0 +1,31 @@ +# Copyright (c) 2009 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. + +{ + 'targets': [ + { + 'target_name': 'file', + 'type': 'none', + 'msvs_cygwin_shell': 0, + 'actions': [ + { + 'action_name': 'make-file', + 'inputs': [ + 'make-file.py', + ], + 'outputs': [ + '<(PRODUCT_DIR)/file.out', + ], + 'action': [ + 'python', '<(_inputs)', '<@(_outputs)', + ], + 'process_outputs_as_sources': 1, + } + ], + 'dependencies': [ + 'subdir/subdir.gyp:subdir_file', + ], + }, + ], +} diff --git a/deps/gyp/test/actions-subdir/src/subdir/make-subdir-file.py b/deps/gyp/test/actions-subdir/src/subdir/make-subdir-file.py new file mode 100755 index 0000000000..80ce19ae0e --- /dev/null +++ b/deps/gyp/test/actions-subdir/src/subdir/make-subdir-file.py @@ -0,0 +1,11 @@ +#!/usr/bin/env python + +# Copyright (c) 2009 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 sys + +contents = 'Hello from make-subdir-file.py\n' + +open(sys.argv[1], 'wb').write(contents) diff --git a/deps/gyp/test/actions-subdir/src/subdir/subdir.gyp b/deps/gyp/test/actions-subdir/src/subdir/subdir.gyp new file mode 100644 index 0000000000..0315d4eb83 --- /dev/null +++ b/deps/gyp/test/actions-subdir/src/subdir/subdir.gyp @@ -0,0 +1,28 @@ +# Copyright (c) 2009 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. + +{ + 'targets': [ + { + 'target_name': 'subdir_file', + 'type': 'none', + 'msvs_cygwin_shell': 0, + 'actions': [ + { + 'action_name': 'make-subdir-file', + 'inputs': [ + 'make-subdir-file.py', + ], + 'outputs': [ + '<(PRODUCT_DIR)/subdir_file.out', + ], + 'action': [ + 'python', '<(_inputs)', '<@(_outputs)', + ], + 'process_outputs_as_sources': 1, + } + ], + }, + ], +} diff --git a/deps/gyp/test/actions/generated-header/action.py b/deps/gyp/test/actions/generated-header/action.py new file mode 100644 index 0000000000..9be98798d6 --- /dev/null +++ b/deps/gyp/test/actions/generated-header/action.py @@ -0,0 +1,11 @@ +#!/usr/bin/env python + +# Copyright (c) 2013 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 os +import sys + +outfile = sys.argv[1] +open(outfile, 'w').write('const char kFoo[] = "%s";' % sys.argv[2]) diff --git a/deps/gyp/test/actions/generated-header/main.cc b/deps/gyp/test/actions/generated-header/main.cc new file mode 100644 index 0000000000..7973781bc6 --- /dev/null +++ b/deps/gyp/test/actions/generated-header/main.cc @@ -0,0 +1,7 @@ +#include <stdio.h> + +#include "MyHeader.h" + +int main() { + printf("%s\n", kFoo); +} diff --git a/deps/gyp/test/actions/generated-header/test.gyp b/deps/gyp/test/actions/generated-header/test.gyp new file mode 100644 index 0000000000..209b951ef6 --- /dev/null +++ b/deps/gyp/test/actions/generated-header/test.gyp @@ -0,0 +1,34 @@ +# Copyright (c) 2013 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. +{ + 'targets': [ + { + 'target_name': 'generate_header', + 'type': 'none', + 'actions': [ + { + 'inputs': [ ], + 'outputs': [ + '<(SHARED_INTERMEDIATE_DIR)/MyHeader.h', + ], + 'action_name': 'generate header', + 'action': ['python', './action.py', + '<(SHARED_INTERMEDIATE_DIR)/MyHeader.h', 'foobar output' ], + }, + ], + 'msvs_cygwin_shell': 0, + }, + { + 'target_name': 'program', + 'type': 'executable', + 'dependencies': [ + 'generate_header', + ], + 'include_dirs': [ + '<(SHARED_INTERMEDIATE_DIR)', + ], + 'sources': [ 'main.cc' ], + }, + ], +} diff --git a/deps/gyp/test/actions/gyptest-all.py b/deps/gyp/test/actions/gyptest-all.py new file mode 100755 index 0000000000..c8833a5d1e --- /dev/null +++ b/deps/gyp/test/actions/gyptest-all.py @@ -0,0 +1,101 @@ +#!/usr/bin/env python + +# 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. + +""" +Verifies simple actions when using an explicit build target of 'all'. +""" + +import glob +import os +import TestGyp + +test = TestGyp.TestGyp(workdir='workarea_all') + +test.run_gyp('actions.gyp', chdir='src') + +test.relocate('src', 'relocate/src') + +# Some gyp files use an action that mentions an output but never +# writes it as a means to making the action run on every build. That +# doesn't mesh well with ninja's semantics. TODO(evan): figure out +# how to work always-run actions in to ninja. +if test.format in ['ninja', 'xcode-ninja']: + test.build('actions.gyp', test.ALL, chdir='relocate/src') +else: + # Test that an "always run" action increases a counter on multiple + # invocations, and that a dependent action updates in step. + test.build('actions.gyp', test.ALL, chdir='relocate/src') + test.must_match('relocate/src/subdir1/actions-out/action-counter.txt', '1') + test.must_match('relocate/src/subdir1/actions-out/action-counter_2.txt', '1') + test.build('actions.gyp', test.ALL, chdir='relocate/src') + test.must_match('relocate/src/subdir1/actions-out/action-counter.txt', '2') + test.must_match('relocate/src/subdir1/actions-out/action-counter_2.txt', '2') + + # The "always run" action only counts to 2, but the dependent target + # will count forever if it's allowed to run. This verifies that the + # dependent target only runs when the "always run" action generates + # new output, not just because the "always run" ran. + test.build('actions.gyp', test.ALL, chdir='relocate/src') + test.must_match('relocate/src/subdir1/actions-out/action-counter.txt', '2') + test.must_match('relocate/src/subdir1/actions-out/action-counter_2.txt', '2') + +expect = """\ +Hello from program.c +Hello from make-prog1.py +Hello from make-prog2.py +""" + +if test.format == 'xcode': + chdir = 'relocate/src/subdir1' +else: + chdir = 'relocate/src' +test.run_built_executable('program', chdir=chdir, stdout=expect) + + +test.must_match('relocate/src/subdir2/file.out', "Hello from make-file.py\n") + + +expect = "Hello from generate_main.py\n" + +if test.format == 'xcode': + chdir = 'relocate/src/subdir3' +else: + chdir = 'relocate/src' +test.run_built_executable('null_input', chdir=chdir, stdout=expect) + + +# Clean out files which may have been created if test.ALL was run. +def clean_dep_files(): + for file in (glob.glob('relocate/src/dep_*.txt') + + glob.glob('relocate/src/deps_all_done_*.txt')): + if os.path.exists(file): + os.remove(file) + +# Confirm our clean. +clean_dep_files() +test.must_not_exist('relocate/src/dep_1.txt') +test.must_not_exist('relocate/src/deps_all_done_first_123.txt') + +# Make sure all deps finish before an action is run on a 'None' target. +# If using the Make builder, add -j to make things more difficult. +arguments = [] +if test.format == 'make': + arguments = ['-j'] +test.build('actions.gyp', 'action_with_dependencies_123', chdir='relocate/src', + arguments=arguments) +test.must_exist('relocate/src/deps_all_done_first_123.txt') + +# Try again with a target that has deps in reverse. Output files from +# previous tests deleted. Confirm this execution did NOT run the ALL +# target which would mess up our dep tests. +clean_dep_files() +test.build('actions.gyp', 'action_with_dependencies_321', chdir='relocate/src', + arguments=arguments) +test.must_exist('relocate/src/deps_all_done_first_321.txt') +test.must_not_exist('relocate/src/deps_all_done_first_123.txt') + + +test.pass_test() diff --git a/deps/gyp/test/actions/gyptest-default.py b/deps/gyp/test/actions/gyptest-default.py new file mode 100755 index 0000000000..70c99ec9ce --- /dev/null +++ b/deps/gyp/test/actions/gyptest-default.py @@ -0,0 +1,68 @@ +#!/usr/bin/env python + +# 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. + +""" +Verifies simple actions when using the default build target. +""" + +import TestGyp + +test = TestGyp.TestGyp(workdir='workarea_default') + +test.run_gyp('actions.gyp', chdir='src') + +test.relocate('src', 'relocate/src') + +# Some gyp files use an action that mentions an output but never +# writes it as a means to making the action run on every build. That +# doesn't mesh well with ninja's semantics. TODO(evan): figure out +# how to work always-run actions in to ninja. +if test.format in ['ninja', 'xcode-ninja']: + test.build('actions.gyp', test.ALL, chdir='relocate/src') +else: + # Test that an "always run" action increases a counter on multiple + # invocations, and that a dependent action updates in step. + test.build('actions.gyp', chdir='relocate/src') + test.must_match('relocate/src/subdir1/actions-out/action-counter.txt', '1') + test.must_match('relocate/src/subdir1/actions-out/action-counter_2.txt', '1') + test.build('actions.gyp', chdir='relocate/src') + test.must_match('relocate/src/subdir1/actions-out/action-counter.txt', '2') + test.must_match('relocate/src/subdir1/actions-out/action-counter_2.txt', '2') + + # The "always run" action only counts to 2, but the dependent target + # will count forever if it's allowed to run. This verifies that the + # dependent target only runs when the "always run" action generates + # new output, not just because the "always run" ran. + test.build('actions.gyp', test.ALL, chdir='relocate/src') + test.must_match('relocate/src/subdir1/actions-out/action-counter.txt', '2') + test.must_match('relocate/src/subdir1/actions-out/action-counter_2.txt', '2') + +expect = """\ +Hello from program.c +Hello from make-prog1.py +Hello from make-prog2.py +""" + +if test.format == 'xcode': + chdir = 'relocate/src/subdir1' +else: + chdir = 'relocate/src' +test.run_built_executable('program', chdir=chdir, stdout=expect) + + +test.must_match('relocate/src/subdir2/file.out', "Hello from make-file.py\n") + + +expect = "Hello from generate_main.py\n" + +if test.format == 'xcode': + chdir = 'relocate/src/subdir3' +else: + chdir = 'relocate/src' +test.run_built_executable('null_input', chdir=chdir, stdout=expect) + + +test.pass_test() diff --git a/deps/gyp/test/actions/gyptest-errors.py b/deps/gyp/test/actions/gyptest-errors.py new file mode 100755 index 0000000000..e1ef883e1e --- /dev/null +++ b/deps/gyp/test/actions/gyptest-errors.py @@ -0,0 +1,24 @@ +#!/usr/bin/env python + +# Copyright (c) 2009 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. + +""" +Verifies behavior for different action configuration errors: +exit status of 1, and the expected error message must be in stderr. +""" + +import TestGyp + +test = TestGyp.TestGyp(workdir='workarea_errors') + + +test.run_gyp('action_missing_name.gyp', chdir='src', status=1, stderr=None) +expect = [ + "Anonymous action in target broken_actions2. An action must have an 'action_name' field.", +] +test.must_contain_all_lines(test.stderr(), expect) + + +test.pass_test() diff --git a/deps/gyp/test/actions/gyptest-generated-header.py b/deps/gyp/test/actions/gyptest-generated-header.py new file mode 100644 index 0000000000..cd5bd691a6 --- /dev/null +++ b/deps/gyp/test/actions/gyptest-generated-header.py @@ -0,0 +1,38 @@ +#!/usr/bin/env python + +# Copyright (c) 2013 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. + +""" +Verifies that dependencies on generated headers work, even if the header has +a mixed-case file name. +""" + +import TestGyp + +test = TestGyp.TestGyp() + +CHDIR = 'generated-header' + +test.run_gyp('test.gyp', chdir=CHDIR) +test.build('test.gyp', 'program', chdir=CHDIR) +test.up_to_date('test.gyp', 'program', chdir=CHDIR) + +expect = 'foobar output\n' +test.run_built_executable('program', chdir=CHDIR, stdout=expect) + +# Change what's written to the generated header, regyp and rebuild, and check +# that the change makes it to the executable and that the build is clean. +test.sleep() +test.write('generated-header/test.gyp', + test.read('generated-header/test.gyp').replace('foobar', 'barbaz')) + +test.run_gyp('test.gyp', chdir=CHDIR) +test.build('test.gyp', 'program', chdir=CHDIR) +test.up_to_date('test.gyp', 'program', chdir=CHDIR) + +expect = 'barbaz output\n' +test.run_built_executable('program', chdir=CHDIR, stdout=expect) + +test.pass_test() diff --git a/deps/gyp/test/actions/src/action_missing_name.gyp b/deps/gyp/test/actions/src/action_missing_name.gyp new file mode 100644 index 0000000000..00424c35a1 --- /dev/null +++ b/deps/gyp/test/actions/src/action_missing_name.gyp @@ -0,0 +1,24 @@ +# Copyright (c) 2009 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. + +{ + 'targets': [ + { + 'target_name': 'broken_actions2', + 'type': 'none', + 'actions': [ + { + 'inputs': [ + 'no_name.input', + ], + 'action': [ + 'python', + '-c', + 'print \'missing name\'', + ], + }, + ], + }, + ], +} diff --git a/deps/gyp/test/actions/src/actions.gyp b/deps/gyp/test/actions/src/actions.gyp new file mode 100644 index 0000000000..5d2db1955e --- /dev/null +++ b/deps/gyp/test/actions/src/actions.gyp @@ -0,0 +1,114 @@ +# Copyright (c) 2009 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. + +{ + 'targets': [ + { + 'target_name': 'pull_in_all_actions', + 'type': 'none', + 'dependencies': [ + 'subdir1/executable.gyp:*', + 'subdir2/none.gyp:*', + 'subdir3/null_input.gyp:*', + ], + }, + { + 'target_name': 'depend_on_always_run_action', + 'type': 'none', + 'dependencies': [ 'subdir1/executable.gyp:counter' ], + 'actions': [ + { + 'action_name': 'use_always_run_output', + 'inputs': [ + 'subdir1/actions-out/action-counter.txt', + 'subdir1/counter.py', + ], + 'outputs': [ + 'subdir1/actions-out/action-counter_2.txt', + ], + 'action': [ + 'python', 'subdir1/counter.py', '<(_outputs)', + ], + # Allows the test to run without hermetic cygwin on windows. + 'msvs_cygwin_shell': 0, + }, + ], + }, + + # Three deps which don't finish immediately. + # Each one has a small delay then creates a file. + # Delays are 1.0, 1.1, and 2.0 seconds. + { + 'target_name': 'dep_1', + 'type': 'none', + 'actions': [{ + 'inputs': [ 'actions.gyp' ], + 'outputs': [ 'dep_1.txt' ], + 'action_name': 'dep_1', + 'action': [ 'python', '-c', + 'import time; time.sleep(1); open(\'dep_1.txt\', \'w\')' ], + # Allows the test to run without hermetic cygwin on windows. + 'msvs_cygwin_shell': 0, + }], + }, + { + 'target_name': 'dep_2', + 'type': 'none', + 'actions': [{ + 'inputs': [ 'actions.gyp' ], + 'outputs': [ 'dep_2.txt' ], + 'action_name': 'dep_2', + 'action': [ 'python', '-c', + 'import time; time.sleep(1.1); open(\'dep_2.txt\', \'w\')' ], + # Allows the test to run without hermetic cygwin on windows. + 'msvs_cygwin_shell': 0, + }], + }, + { + 'target_name': 'dep_3', + 'type': 'none', + 'actions': [{ + 'inputs': [ 'actions.gyp' ], + 'outputs': [ 'dep_3.txt' ], + 'action_name': 'dep_3', + 'action': [ 'python', '-c', + 'import time; time.sleep(2.0); open(\'dep_3.txt\', \'w\')' ], + # Allows the test to run without hermetic cygwin on windows. + 'msvs_cygwin_shell': 0, + }], + }, + + # An action which assumes the deps have completed. + # Does NOT list the output files of it's deps as inputs. + # On success create the file deps_all_done_first.txt. + { + 'target_name': 'action_with_dependencies_123', + 'type': 'none', + 'dependencies': [ 'dep_1', 'dep_2', 'dep_3' ], + 'actions': [{ + 'inputs': [ 'actions.gyp' ], + 'outputs': [ 'deps_all_done_first_123.txt' ], + 'action_name': 'action_with_dependencies_123', + 'action': [ 'python', 'confirm-dep-files.py', '<(_outputs)' ], + # Allows the test to run without hermetic cygwin on windows. + 'msvs_cygwin_shell': 0, + }], + }, + # Same as above but with deps in reverse. + { + 'target_name': 'action_with_dependencies_321', + 'type': 'none', + 'dependencies': [ 'dep_3', 'dep_2', 'dep_1' ], + 'actions': [{ + 'inputs': [ 'actions.gyp' ], + 'outputs': [ 'deps_all_done_first_321.txt' ], + 'action_name': 'action_with_dependencies_321', + 'action': [ 'python', 'confirm-dep-files.py', '<(_outputs)' ], + # Allows the test to run without hermetic cygwin on windows. + 'msvs_cygwin_shell': 0, + }], + }, + + ], +} diff --git a/deps/gyp/test/actions/src/confirm-dep-files.py b/deps/gyp/test/actions/src/confirm-dep-files.py new file mode 100755 index 0000000000..3b8463057d --- /dev/null +++ b/deps/gyp/test/actions/src/confirm-dep-files.py @@ -0,0 +1,21 @@ +#!/usr/bin/env python + +# Copyright (c) 2011 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. + +"""Confirms presence of files generated by our targets we depend on. +If they exist, create a new file. + +Note target's input files are explicitly NOT defined in the gyp file +so they can't easily be passed to this script as args. +""" + +import os +import sys + +outfile = sys.argv[1] # Example value we expect: deps_all_done_first_123.txt +if (os.path.exists("dep_1.txt") and + os.path.exists("dep_2.txt") and + os.path.exists("dep_3.txt")): + open(outfile, "w") diff --git a/deps/gyp/test/actions/src/subdir1/counter.py b/deps/gyp/test/actions/src/subdir1/counter.py new file mode 100755 index 0000000000..d888f2e803 --- /dev/null +++ b/deps/gyp/test/actions/src/subdir1/counter.py @@ -0,0 +1,44 @@ +#!/usr/bin/env python + +# Copyright (c) 2010 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 sys +import time + +output = sys.argv[1] +persistoutput = "%s.persist" % sys.argv[1] + +count = 0 +try: + count = open(persistoutput, 'r').read() +except: + pass +count = int(count) + 1 + +if len(sys.argv) > 2: + max_count = int(sys.argv[2]) + if count > max_count: + count = max_count + +oldcount = 0 +try: + oldcount = open(output, 'r').read() +except: + pass + +# Save the count in a file that is undeclared, and thus hidden, to gyp. We need +# to do this because, prior to running commands, some build systems deletes +# any declared outputs, so we would lose our count if we just wrote to the +# given output file. +open(persistoutput, 'w').write('%d' % (count)) + +# Only write the given output file if the count has changed. +if int(oldcount) != count: + open(output, 'w').write('%d' % (count)) + # Sleep so the next run changes the file time sufficiently to make the build + # detect the file as changed. + time.sleep(1) + +sys.exit(0) diff --git a/deps/gyp/test/actions/src/subdir1/executable.gyp b/deps/gyp/test/actions/src/subdir1/executable.gyp new file mode 100644 index 0000000000..6a1ce4f91e --- /dev/null +++ b/deps/gyp/test/actions/src/subdir1/executable.gyp @@ -0,0 +1,74 @@ +# Copyright (c) 2009 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. + +{ + 'targets': [ + { + 'target_name': 'program', + 'type': 'executable', + 'msvs_cygwin_shell': 0, + 'sources': [ + 'program.c', + ], + 'actions': [ + { + 'action_name': 'make-prog1', + 'inputs': [ + 'make-prog1.py', + ], + 'outputs': [ + '<(INTERMEDIATE_DIR)/prog1.c', + ], + 'action': [ + 'python', '<(_inputs)', '<@(_outputs)', + ], + 'process_outputs_as_sources': 1, + }, + { + 'action_name': 'make-prog2', + 'inputs': [ + 'make-prog2.py', + ], + 'outputs': [ + 'actions-out/prog2.c', + ], + 'action': [ + 'python', '<(_inputs)', '<@(_outputs)', + ], + 'process_outputs_as_sources': 1, + # Allows the test to run without hermetic cygwin on windows. + 'msvs_cygwin_shell': 0, + }, + ], + }, + { + 'target_name': 'counter', + 'type': 'none', + 'actions': [ + { + # This action should always run, regardless of whether or not it's + # inputs or the command-line change. We do this by creating a dummy + # first output, which is always missing, thus causing the build to + # always try to recreate it. Actual output files should be listed + # after the dummy one, and dependent targets should list the real + # output(s) in their inputs + # (see '../actions.gyp:depend_on_always_run_action'). + 'action_name': 'action_counter', + 'inputs': [ + 'counter.py', + ], + 'outputs': [ + 'actions-out/action-counter.txt.always', + 'actions-out/action-counter.txt', + ], + 'action': [ + 'python', '<(_inputs)', 'actions-out/action-counter.txt', '2', + ], + # Allows the test to run without hermetic cygwin on windows. + 'msvs_cygwin_shell': 0, + }, + ], + }, + ], +} diff --git a/deps/gyp/test/actions/src/subdir1/make-prog1.py b/deps/gyp/test/actions/src/subdir1/make-prog1.py new file mode 100755 index 0000000000..7ea1d8a2d4 --- /dev/null +++ b/deps/gyp/test/actions/src/subdir1/make-prog1.py @@ -0,0 +1,20 @@ +#!/usr/bin/env python + +# Copyright (c) 2009 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 sys + +contents = r""" +#include <stdio.h> + +void prog1(void) +{ + printf("Hello from make-prog1.py\n"); +} +""" + +open(sys.argv[1], 'w').write(contents) + +sys.exit(0) diff --git a/deps/gyp/test/actions/src/subdir1/make-prog2.py b/deps/gyp/test/actions/src/subdir1/make-prog2.py new file mode 100755 index 0000000000..0bfe4973c2 --- /dev/null +++ b/deps/gyp/test/actions/src/subdir1/make-prog2.py @@ -0,0 +1,20 @@ +#!/usr/bin/env python + +# Copyright (c) 2009 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 sys + +contents = r""" +#include <stdio.h> + +void prog2(void) +{ + printf("Hello from make-prog2.py\n"); +} +""" + +open(sys.argv[1], 'w').write(contents) + +sys.exit(0) diff --git a/deps/gyp/test/actions/src/subdir1/program.c b/deps/gyp/test/actions/src/subdir1/program.c new file mode 100644 index 0000000000..c0931534eb --- /dev/null +++ b/deps/gyp/test/actions/src/subdir1/program.c @@ -0,0 +1,12 @@ +#include <stdio.h>
+
+extern void prog1(void);
+extern void prog2(void);
+
+int main(void) +{
+ printf("Hello from program.c\n");
+ prog1();
+ prog2();
+ return 0;
+}
diff --git a/deps/gyp/test/actions/src/subdir2/make-file.py b/deps/gyp/test/actions/src/subdir2/make-file.py new file mode 100755 index 0000000000..fff0653144 --- /dev/null +++ b/deps/gyp/test/actions/src/subdir2/make-file.py @@ -0,0 +1,11 @@ +#!/usr/bin/env python + +# Copyright (c) 2009 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 sys + +contents = "Hello from make-file.py\n" + +open(sys.argv[1], 'wb').write(contents) diff --git a/deps/gyp/test/actions/src/subdir2/none.gyp b/deps/gyp/test/actions/src/subdir2/none.gyp new file mode 100644 index 0000000000..2caa97d55c --- /dev/null +++ b/deps/gyp/test/actions/src/subdir2/none.gyp @@ -0,0 +1,33 @@ +# Copyright (c) 2009 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. + +{ + 'targets': [ + { + 'target_name': 'file', + 'type': 'none', + 'msvs_cygwin_shell': 0, + 'actions': [ + { + 'action_name': 'make-file', + 'inputs': [ + 'make-file.py', + ], + 'outputs': [ + 'file.out', + # TODO: enhance testing infrastructure to test this + # without having to hard-code the intermediate dir paths. + #'<(INTERMEDIATE_DIR)/file.out', + ], + 'action': [ + 'python', '<(_inputs)', '<@(_outputs)', + ], + 'process_outputs_as_sources': 1, + # Allows the test to run without hermetic cygwin on windows. + 'msvs_cygwin_shell': 0, + } + ], + }, + ], +} diff --git a/deps/gyp/test/actions/src/subdir3/generate_main.py b/deps/gyp/test/actions/src/subdir3/generate_main.py new file mode 100755 index 0000000000..804d38df31 --- /dev/null +++ b/deps/gyp/test/actions/src/subdir3/generate_main.py @@ -0,0 +1,21 @@ +#!/usr/bin/env python + +# Copyright (c) 2009 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 sys + +contents = """ +#include <stdio.h> + +int main(void) +{ + printf("Hello from generate_main.py\\n"); + return 0; +} +""" + +open(sys.argv[1], 'w').write(contents) + +sys.exit(0) diff --git a/deps/gyp/test/actions/src/subdir3/null_input.gyp b/deps/gyp/test/actions/src/subdir3/null_input.gyp new file mode 100644 index 0000000000..9b0bea5fdb --- /dev/null +++ b/deps/gyp/test/actions/src/subdir3/null_input.gyp @@ -0,0 +1,29 @@ +# Copyright (c) 2009 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. + +{ + 'targets': [ + { + 'target_name': 'null_input', + 'type': 'executable', + 'msvs_cygwin_shell': 0, + 'actions': [ + { + 'action_name': 'generate_main', + 'process_outputs_as_sources': 1, + 'inputs': [], + 'outputs': [ + '<(INTERMEDIATE_DIR)/main.c', + ], + 'action': [ + # TODO: we can't just use <(_outputs) here?! + 'python', 'generate_main.py', '<(INTERMEDIATE_DIR)/main.c', + ], + # Allows the test to run without hermetic cygwin on windows. + 'msvs_cygwin_shell': 0, + }, + ], + }, + ], +} diff --git a/deps/gyp/test/additional-targets/gyptest-additional.py b/deps/gyp/test/additional-targets/gyptest-additional.py new file mode 100755 index 0000000000..466283e55c --- /dev/null +++ b/deps/gyp/test/additional-targets/gyptest-additional.py @@ -0,0 +1,63 @@ +#!/usr/bin/env python + +# 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. + +""" +Verifies simple actions when using an explicit build target of 'all'. +""" + +import TestGyp + +test = TestGyp.TestGyp() + +test.run_gyp('all.gyp', + '-G', 'xcode_ninja_target_pattern=^all_targets$', + chdir='src') + +test.relocate('src', 'relocate/src') + +# Build all. +test.build('all.gyp', chdir='relocate/src') + +if test.format=='xcode': + chdir = 'relocate/src/dir1' +else: + chdir = 'relocate/src' + +# Output is as expected. +file_content = 'Hello from emit.py\n' +test.built_file_must_match('out2.txt', file_content, chdir=chdir) + +test.built_file_must_not_exist('out.txt', chdir='relocate/src') +test.built_file_must_not_exist('foolib1', + type=test.SHARED_LIB, + chdir=chdir) + +# xcode-ninja doesn't generate separate workspaces for sub-gyps by design +if test.format == 'xcode-ninja': + test.pass_test() + +# TODO(mmoss) Make consistent with msvs, with 'dir1' before 'out/Default'? +if test.format in ('make', 'ninja', 'cmake'): + chdir='relocate/src' +else: + chdir='relocate/src/dir1' + +# Build the action explicitly. +test.build('actions.gyp', 'action1_target', chdir=chdir) + +# Check that things got run. +file_content = 'Hello from emit.py\n' +test.built_file_must_exist('out.txt', chdir=chdir) + +# Build the shared library explicitly. +test.build('actions.gyp', 'foolib1', chdir=chdir) + +test.built_file_must_exist('foolib1', + type=test.SHARED_LIB, + chdir=chdir, + subdir='dir1') + +test.pass_test() diff --git a/deps/gyp/test/additional-targets/src/all.gyp b/deps/gyp/test/additional-targets/src/all.gyp new file mode 100644 index 0000000000..21c83080aa --- /dev/null +++ b/deps/gyp/test/additional-targets/src/all.gyp @@ -0,0 +1,13 @@ +# Copyright (c) 2009 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. + +{ + 'targets': [ + { + 'target_name': 'all_targets', + 'type': 'none', + 'dependencies': ['dir1/actions.gyp:*'], + }, + ], +} diff --git a/deps/gyp/test/additional-targets/src/dir1/actions.gyp b/deps/gyp/test/additional-targets/src/dir1/actions.gyp new file mode 100644 index 0000000000..5089c80913 --- /dev/null +++ b/deps/gyp/test/additional-targets/src/dir1/actions.gyp @@ -0,0 +1,56 @@ +# Copyright (c) 2009 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. + +{ + 'targets': [ + { + 'target_name': 'action1_target', + 'type': 'none', + 'suppress_wildcard': 1, + 'actions': [ + { + 'action_name': 'action1', + 'inputs': [ + 'emit.py', + ], + 'outputs': [ + '<(PRODUCT_DIR)/out.txt', + ], + 'action': ['python', 'emit.py', '<(PRODUCT_DIR)/out.txt'], + 'msvs_cygwin_shell': 0, + }, + ], + }, + { + 'target_name': 'action2_target', + 'type': 'none', + 'actions': [ + { + 'action_name': 'action2', + 'inputs': [ + 'emit.py', + ], + 'outputs': [ + '<(PRODUCT_DIR)/out2.txt', + ], + 'action': ['python', 'emit.py', '<(PRODUCT_DIR)/out2.txt'], + 'msvs_cygwin_shell': 0, + }, + ], + }, + { + 'target_name': 'foolib1', + 'type': 'shared_library', + 'suppress_wildcard': 1, + 'sources': ['lib1.c'], + }, + ], + 'conditions': [ + ['OS=="linux"', { + 'target_defaults': { + 'cflags': ['-fPIC'], + }, + }], + ], +} diff --git a/deps/gyp/test/additional-targets/src/dir1/emit.py b/deps/gyp/test/additional-targets/src/dir1/emit.py new file mode 100755 index 0000000000..fd3138738e --- /dev/null +++ b/deps/gyp/test/additional-targets/src/dir1/emit.py @@ -0,0 +1,11 @@ +#!/usr/bin/env python + +# Copyright (c) 2009 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 sys + +f = open(sys.argv[1], 'wb') +f.write('Hello from emit.py\n') +f.close() diff --git a/deps/gyp/test/additional-targets/src/dir1/lib1.c b/deps/gyp/test/additional-targets/src/dir1/lib1.c new file mode 100644 index 0000000000..df4cb10f79 --- /dev/null +++ b/deps/gyp/test/additional-targets/src/dir1/lib1.c @@ -0,0 +1,6 @@ +#ifdef _WIN32 +__declspec(dllexport) +#endif +int func1(void) { + return 42; +} diff --git a/deps/gyp/test/analyzer/common.gypi b/deps/gyp/test/analyzer/common.gypi new file mode 100644 index 0000000000..7c664e40da --- /dev/null +++ b/deps/gyp/test/analyzer/common.gypi @@ -0,0 +1,6 @@ +# Copyright (c) 2014 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. + +{ +} diff --git a/deps/gyp/test/analyzer/gyptest-analyzer.py b/deps/gyp/test/analyzer/gyptest-analyzer.py new file mode 100644 index 0000000000..72de21813c --- /dev/null +++ b/deps/gyp/test/analyzer/gyptest-analyzer.py @@ -0,0 +1,425 @@ +#!/usr/bin/env python +# Copyright (c) 2014 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. + +"""Tests for analyzer +""" + +import json +import TestGyp + +found = 'Found dependency' +found_all = 'Found dependency (all)' +not_found = 'No dependencies' + + +def _CreateConfigFile(files, additional_compile_targets, test_targets=[]): + """Creates the analyzer config file, which is used as the input to analyzer. + See description of analyzer.py for description of the arguments.""" + f = open('test_file', 'w') + to_write = {'files': files, + 'test_targets': test_targets, + 'additional_compile_targets': additional_compile_targets } + json.dump(to_write, f) + f.close() + + +def _CreateBogusConfigFile(): + f = open('test_file','w') + f.write('bogus') + f.close() + + +def _ReadOutputFileContents(): + f = open('analyzer_output', 'r') + result = json.load(f) + f.close() + return result + + +# NOTE: this would be clearer if it subclassed TestGypCustom, but that trips +# over a bug in pylint (E1002). +test = TestGyp.TestGypCustom(format='analyzer') + +def CommonArgs(): + return ('-Gconfig_path=test_file', + '-Ganalyzer_output_path=analyzer_output') + + +def run_analyzer(*args, **kw): + """Runs the test specifying a particular config and output path.""" + args += CommonArgs() + test.run_gyp('test.gyp', *args, **kw) + + +def run_analyzer2(*args, **kw): + """Same as run_analyzer(), but passes in test2.gyp instead of test.gyp.""" + args += CommonArgs() + test.run_gyp('test2.gyp', *args, **kw) + + +def run_analyzer3(*args, **kw): + """Same as run_analyzer(), but passes in test3.gyp instead of test.gyp.""" + args += CommonArgs() + test.run_gyp('test3.gyp', *args, **kw) + + +def run_analyzer4(*args, **kw): + """Same as run_analyzer(), but passes in test3.gyp instead of test.gyp.""" + args += CommonArgs() + test.run_gyp('test4.gyp', *args, **kw) + + +def EnsureContains(matched=False, compile_targets=set(), test_targets=set()): + """Verifies output contains |compile_targets|.""" + result = _ReadOutputFileContents() + if 'error' in result: + print 'unexpected error', result.get('error') + test.fail_test() + + if 'invalid_targets' in result: + print 'unexpected invalid_targets', result.get('invalid_targets') + test.fail_test() + + actual_compile_targets = set(result['compile_targets']) + if actual_compile_targets != compile_targets: + print 'actual compile_targets:', actual_compile_targets, \ + '\nexpected compile_targets:', compile_targets + test.fail_test() + + actual_test_targets = set(result['test_targets']) + if actual_test_targets != test_targets: + print 'actual test_targets:', actual_test_targets, \ + '\nexpected test_targets:', test_targets + test.fail_test() + + if matched and result['status'] != found: + print 'expected', found, 'got', result['status'] + test.fail_test() + elif not matched and result['status'] != not_found: + print 'expected', not_found, 'got', result['status'] + test.fail_test() + + +def EnsureMatchedAll(compile_targets, test_targets=set()): + result = _ReadOutputFileContents() + if 'error' in result: + print 'unexpected error', result.get('error') + test.fail_test() + + if 'invalid_targets' in result: + print 'unexpected invalid_targets', result.get('invalid_targets') + test.fail_test() + + if result['status'] != found_all: + print 'expected', found_all, 'got', result['status'] + test.fail_test() + + actual_compile_targets = set(result['compile_targets']) + if actual_compile_targets != compile_targets: + print ('actual compile_targets:', actual_compile_targets, + '\nexpected compile_targets:', compile_targets) + test.fail_test() + + actual_test_targets = set(result['test_targets']) + if actual_test_targets != test_targets: + print ('actual test_targets:', actual_test_targets, + '\nexpected test_targets:', test_targets) + test.fail_test() + + +def EnsureError(expected_error_string): + """Verifies output contains the error string.""" + result = _ReadOutputFileContents() + if result.get('error', '').find(expected_error_string) == -1: + print 'actual error:', result.get('error', ''), '\nexpected error:', \ + expected_error_string + test.fail_test() + + +def EnsureStdoutContains(expected_error_string): + if test.stdout().find(expected_error_string) == -1: + print 'actual stdout:', test.stdout(), '\nexpected stdout:', \ + expected_error_string + test.fail_test() + + +def EnsureInvalidTargets(expected_invalid_targets): + """Verifies output contains invalid_targets.""" + result = _ReadOutputFileContents() + actual_invalid_targets = set(result['invalid_targets']) + if actual_invalid_targets != expected_invalid_targets: + print 'actual invalid_targets:', actual_invalid_targets, \ + '\nexpected :', expected_invalid_targets + test.fail_test() + + +# Two targets, A and B (both static_libraries) and A depends upon B. If a file +# in B changes, then both A and B are output. It is not strictly necessary that +# A is compiled in this case, only B. +_CreateConfigFile(['b.c'], ['all']) +test.run_gyp('static_library_test.gyp', *CommonArgs()) +EnsureContains(matched=True, compile_targets={'a' ,'b'}) + +# Verifies config_path must be specified. +test.run_gyp('test.gyp') +EnsureStdoutContains('Must specify files to analyze via config_path') + +# Verifies config_path must point to a valid file. +test.run_gyp('test.gyp', '-Gconfig_path=bogus_file', + '-Ganalyzer_output_path=analyzer_output') +EnsureError('Unable to open file bogus_file') + +# Verify 'invalid_targets' is present when bad target is specified. +_CreateConfigFile(['exe2.c'], ['bad_target']) +run_analyzer() +EnsureInvalidTargets({'bad_target'}) + +# Verifies config_path must point to a valid json file. +_CreateBogusConfigFile() +run_analyzer() +EnsureError('Unable to parse config file test_file') + +# Trivial test of a source. +_CreateConfigFile(['foo.c'], ['all']) +run_analyzer() +EnsureContains(matched=True, compile_targets={'exe'}) + +# Conditional source that is excluded. +_CreateConfigFile(['conditional_source.c'], ['all']) +run_analyzer() +EnsureContains(matched=False) + +# Conditional source that is included by way of argument. +_CreateConfigFile(['conditional_source.c'], ['all']) +run_analyzer('-Dtest_variable=1') +EnsureContains(matched=True, compile_targets={'exe'}) + +# Two unknown files. +_CreateConfigFile(['unknown1.c', 'unoknow2.cc'], ['all']) +run_analyzer() +EnsureContains() + +# Two unknown files. +_CreateConfigFile(['unknown1.c', 'subdir/subdir_sourcex.c'], ['all']) +run_analyzer() +EnsureContains() + +# Included dependency +_CreateConfigFile(['unknown1.c', 'subdir/subdir_source.c'], ['all']) +run_analyzer() +EnsureContains(matched=True, compile_targets={'exe', 'exe3'}) + +# Included inputs to actions. +_CreateConfigFile(['action_input.c'], ['all']) +run_analyzer() +EnsureContains(matched=True, compile_targets={'exe'}) + +# Don't consider outputs. +_CreateConfigFile(['action_output.c'], ['all']) +run_analyzer() +EnsureContains(matched=False) + +# Rule inputs. +_CreateConfigFile(['rule_input.c'], ['all']) +run_analyzer() +EnsureContains(matched=True, compile_targets={'exe'}) + +# Ignore path specified with PRODUCT_DIR. +_CreateConfigFile(['product_dir_input.c'], ['all']) +run_analyzer() +EnsureContains(matched=False) + +# Path specified via a variable. +_CreateConfigFile(['subdir/subdir_source2.c'], ['all']) +run_analyzer() +EnsureContains(matched=True, compile_targets={'exe'}) + +# Verifies paths with // are fixed up correctly. +_CreateConfigFile(['parent_source.c'], ['all']) +run_analyzer() +EnsureContains(matched=True, compile_targets={'exe', 'exe3'}) + +# Verifies relative paths are resolved correctly. +_CreateConfigFile(['subdir/subdir_source.h'], ['all']) +run_analyzer() +EnsureContains(matched=True, compile_targets={'exe'}) + +# Verifies relative paths in inputs are resolved correctly. +_CreateConfigFile(['rel_path1.h'], ['all']) +run_analyzer() +EnsureContains(matched=True, compile_targets={'exe'}) + +# Various permutations when passing in targets. +_CreateConfigFile(['exe2.c', 'subdir/subdir2b_source.c'], + ['all'], ['exe', 'exe3']) +run_analyzer() +EnsureContains(matched=True, test_targets={'exe3'}, + compile_targets={'exe2', 'exe3'}) + +_CreateConfigFile(['exe2.c', 'subdir/subdir2b_source.c'], ['all'], ['exe']) +run_analyzer() +EnsureContains(matched=True, compile_targets={'exe2', 'exe3'}) + +# Verifies duplicates are ignored. +_CreateConfigFile(['exe2.c', 'subdir/subdir2b_source.c'], ['all'], + ['exe', 'exe']) +run_analyzer() +EnsureContains(matched=True, compile_targets={'exe2', 'exe3'}) + +_CreateConfigFile(['exe2.c'], ['all'], ['exe']) +run_analyzer() +EnsureContains(matched=True, compile_targets={'exe2'}) + +_CreateConfigFile(['exe2.c'], ['all']) +run_analyzer() +EnsureContains(matched=True, compile_targets={'exe2'}) + +_CreateConfigFile(['subdir/subdir2b_source.c', 'exe2.c'], ['all']) +run_analyzer() +EnsureContains(matched=True, compile_targets={'exe2', 'exe3'}) + +_CreateConfigFile(['subdir/subdir2b_source.c'], ['all'], ['exe3']) +run_analyzer() +EnsureContains(matched=True, test_targets={'exe3'}, compile_targets={'exe3'}) + +_CreateConfigFile(['exe2.c'], ['all']) +run_analyzer() +EnsureContains(matched=True, compile_targets={'exe2'}) + +_CreateConfigFile(['foo.c'], ['all']) +run_analyzer() +EnsureContains(matched=True, compile_targets={'exe'}) + +# Assertions when modifying build (gyp/gypi) files, especially when said files +# are included. +_CreateConfigFile(['subdir2/d.cc'], ['all'], ['exe', 'exe2', 'foo', 'exe3']) +run_analyzer2() +EnsureContains(matched=True, test_targets={'exe', 'foo'}, + compile_targets={'exe', 'foo'}) + +_CreateConfigFile(['subdir2/subdir.includes.gypi'], ['all'], + ['exe', 'exe2', 'foo', 'exe3']) +run_analyzer2() +EnsureContains(matched=True, test_targets={'exe', 'foo'}, + compile_targets={'exe', 'foo'}) + +_CreateConfigFile(['subdir2/subdir.gyp'], ['all'], + ['exe', 'exe2', 'foo', 'exe3']) +run_analyzer2() +EnsureContains(matched=True, test_targets={'exe', 'foo'}, + compile_targets={'exe', 'foo'}) + +_CreateConfigFile(['test2.includes.gypi'], ['all'], + ['exe', 'exe2', 'foo', 'exe3']) +run_analyzer2() +EnsureContains(matched=True, test_targets={'exe', 'exe2', 'exe3'}, + compile_targets={'exe', 'exe2', 'exe3'}) + +# Verify modifying a file included makes all targets dirty. +_CreateConfigFile(['common.gypi'], ['all'], ['exe', 'exe2', 'foo', 'exe3']) +run_analyzer2('-Icommon.gypi') +EnsureMatchedAll({'all', 'exe', 'exe2', 'foo', 'exe3'}, + {'exe', 'exe2', 'foo', 'exe3'}) + +# Assertions from test3.gyp. +_CreateConfigFile(['d.c', 'f.c'], ['all'], ['a']) +run_analyzer3() +EnsureContains(matched=True, test_targets={'a'}, compile_targets={'a', 'b'}) + +_CreateConfigFile(['f.c'], ['all'], ['a']) +run_analyzer3() +EnsureContains(matched=True, test_targets={'a'}, compile_targets={'a', 'b'}) + +_CreateConfigFile(['f.c'], ['all']) +run_analyzer3() +EnsureContains(matched=True, compile_targets={'a', 'b'}) + +_CreateConfigFile(['c.c', 'e.c'], ['all']) +run_analyzer3() +EnsureContains(matched=True, compile_targets={'a', 'b', 'c', 'e'}) + +_CreateConfigFile(['d.c'], ['all'], ['a']) +run_analyzer3() +EnsureContains(matched=True, test_targets={'a'}, compile_targets={'a', 'b'}) + +_CreateConfigFile(['a.c'], ['all'], ['a', 'b']) +run_analyzer3() +EnsureContains(matched=True, test_targets={'a'}, compile_targets={'a'}) + +_CreateConfigFile(['a.c'], ['all'], ['a', 'b']) +run_analyzer3() +EnsureContains(matched=True, test_targets={'a'}, compile_targets={'a'}) + +_CreateConfigFile(['d.c'], ['all'], ['a', 'b']) +run_analyzer3() +EnsureContains(matched=True, test_targets={'a', 'b'}, + compile_targets={'a', 'b'}) + +_CreateConfigFile(['f.c'], ['all'], ['a']) +run_analyzer3() +EnsureContains(matched=True, test_targets={'a'}, compile_targets={'a', 'b'}) + +_CreateConfigFile(['a.c'], ['all'], ['a']) +run_analyzer3() +EnsureContains(matched=True, test_targets={'a'}, compile_targets={'a'}) + +_CreateConfigFile(['a.c'], ['all']) +run_analyzer3() +EnsureContains(matched=True, compile_targets={'a'}) + +_CreateConfigFile(['d.c'], ['all']) +run_analyzer3() +EnsureContains(matched=True, compile_targets={'a', 'b'}) + +# Assertions around test4.gyp. +_CreateConfigFile(['f.c'], ['all']) +run_analyzer4() +EnsureContains(matched=True, compile_targets={'e', 'f'}) + +_CreateConfigFile(['d.c'], ['all']) +run_analyzer4() +EnsureContains(matched=True, compile_targets={'a', 'b', 'c', 'd'}) + +_CreateConfigFile(['i.c'], ['all']) +run_analyzer4() +EnsureContains(matched=True, compile_targets={'h', 'i'}) + +# Assertions where 'all' is not supplied in compile_targets. + +_CreateConfigFile(['exe2.c'], [], ['exe2']) +run_analyzer() +EnsureContains(matched=True, test_targets={'exe2'}, compile_targets={'exe2'}) + +_CreateConfigFile(['exe20.c'], [], ['exe2']) +run_analyzer() +EnsureContains(matched=False) + + +_CreateConfigFile(['exe2.c', 'exe3.c'], [], ['exe2', 'exe3']) +run_analyzer() +EnsureContains(matched=True, test_targets={'exe2', 'exe3'}, + compile_targets={'exe2', 'exe3'}) + +_CreateConfigFile(['exe2.c', 'exe3.c'], ['exe3'], ['exe2']) +run_analyzer() +EnsureContains(matched=True, test_targets={'exe2'}, + compile_targets={'exe2', 'exe3'}) + +_CreateConfigFile(['exe3.c'], ['exe2'], ['exe2']) +run_analyzer() +EnsureContains(matched=False) + +# Assertions with 'all' listed as a test_target. +_CreateConfigFile(['exe3.c'], [], ['all']) +run_analyzer() +EnsureContains(matched=True, compile_targets={'exe3', 'all'}, + test_targets={'all'}) + +_CreateConfigFile(['exe2.c'], [], ['all', 'exe2']) +run_analyzer() +EnsureContains(matched=True, compile_targets={'exe2', 'all'}, + test_targets={'all', 'exe2'}) + +test.pass_test() diff --git a/deps/gyp/test/analyzer/static_library_test.gyp b/deps/gyp/test/analyzer/static_library_test.gyp new file mode 100644 index 0000000000..2c8e4bd826 --- /dev/null +++ b/deps/gyp/test/analyzer/static_library_test.gyp @@ -0,0 +1,34 @@ +# Copyright 2015 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. + +# These gyp files create the following dependencies: +# +# test.gyp: +# #a -> b +# a.c +# #b +# b.c +# a and b are static libraries. + +{ + 'targets': [ + { + 'target_name': 'a', + 'type': 'static_library', + 'sources': [ + 'a.c', + ], + 'dependencies': [ + 'b', + ], + }, + { + 'target_name': 'b', + 'type': 'static_library', + 'sources': [ + 'b.c', + ], + }, + ], +} diff --git a/deps/gyp/test/analyzer/subdir/subdir.gyp b/deps/gyp/test/analyzer/subdir/subdir.gyp new file mode 100644 index 0000000000..bfa2df48e1 --- /dev/null +++ b/deps/gyp/test/analyzer/subdir/subdir.gyp @@ -0,0 +1,36 @@ +# Copyright (c) 2014 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. + +{ + 'variables': { + 'trailing_dir_path': '../', + }, + 'targets': [ + { + 'target_name': 'foo', + 'type': 'static_library', + 'sources': [ + 'subdir_source.c', + '<(trailing_dir_path)/parent_source.c', + ], + }, + { + 'target_name': 'subdir2a', + 'type': 'static_library', + 'sources': [ + 'subdir2_source.c', + ], + 'dependencies': [ + 'subdir2b', + ], + }, + { + 'target_name': 'subdir2b', + 'type': 'static_library', + 'sources': [ + 'subdir2b_source.c', + ], + }, + ], +} diff --git a/deps/gyp/test/analyzer/subdir/subdir2/subdir2.gyp b/deps/gyp/test/analyzer/subdir/subdir2/subdir2.gyp new file mode 100644 index 0000000000..e5aaa92b18 --- /dev/null +++ b/deps/gyp/test/analyzer/subdir/subdir2/subdir2.gyp @@ -0,0 +1,15 @@ +# Copyright (c) 2014 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. + +{ + 'targets': [ + { + 'target_name': 'subdir2', + 'type': 'static_library', + 'sources': [ + '../subdir_source.h', + ], + }, + ], +} diff --git a/deps/gyp/test/analyzer/subdir2/subdir.gyp b/deps/gyp/test/analyzer/subdir2/subdir.gyp new file mode 100644 index 0000000000..d6c709c9ef --- /dev/null +++ b/deps/gyp/test/analyzer/subdir2/subdir.gyp @@ -0,0 +1,18 @@ +# Copyright (c) 2014 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. + +{ + 'targets': [ + { + 'target_name': 'foo', + 'type': 'static_library', + 'sources': [ + 'subdir_source.c', + ], + 'includes': [ + 'subdir.includes.gypi', + ], + }, + ], +} diff --git a/deps/gyp/test/analyzer/subdir2/subdir.includes.gypi b/deps/gyp/test/analyzer/subdir2/subdir.includes.gypi new file mode 100644 index 0000000000..324e92bcd4 --- /dev/null +++ b/deps/gyp/test/analyzer/subdir2/subdir.includes.gypi @@ -0,0 +1,9 @@ +# Copyright (c) 2014 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. + +{ + 'sources': [ + 'd.cc' + ], +} diff --git a/deps/gyp/test/analyzer/test.gyp b/deps/gyp/test/analyzer/test.gyp new file mode 100644 index 0000000000..c25ca73bff --- /dev/null +++ b/deps/gyp/test/analyzer/test.gyp @@ -0,0 +1,114 @@ +# Copyright (c) 2014 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. + +# These gyp files create the following dependencies: +# +# test.gyp: +# #exe -> subdir/subdir.gyp#foo, subdir/subdir2/subdir2.gyp#subdir2 +# foo.c +# subdir/subdir_source2.c +# conditional_source.c (if test_variable==1) +# action_input.c +# action_output.c +# rule_input.c +# rule_output.pdf +# #exe2 +# exe2.c +# #exe3 -> subdir/subdir.gyp#foo, subdir/subdir.gyp#subdir2a +# exe3.c +# #allx (type none) -> exe, exe3 +# +# subdir/subdir.gyp +# #foo +# subdir/subdir_source.c +# parent_source.c +# #subdir2a -> subdir2b +# subdir/subdir2_source.c +# #subdir2b +# subdir/subdir2b_source.c +# +# subdir/subdir2/subdir2.gyp +# #subdir2 +# subdir/subdir_source.h + +{ + 'variables': { + 'test_variable%': 0, + 'variable_path': 'subdir', + }, + 'targets': [ + { + 'target_name': 'exe', + 'type': 'executable', + 'dependencies': [ + 'subdir/subdir.gyp:foo', + 'subdir/subdir2/subdir2.gyp:subdir2', + ], + 'sources': [ + 'foo.c', + '<(variable_path)/subdir_source2.c', + ], + 'conditions': [ + ['test_variable==1', { + 'sources': [ + 'conditional_source.c', + ], + }], + ], + 'actions': [ + { + 'action_name': 'action', + 'inputs': [ + '<(PRODUCT_DIR)/product_dir_input.c', + 'action_input.c', + '../bad_path1.h', + '../../bad_path2.h', + './rel_path1.h', + ], + 'outputs': [ + 'action_output.c', + ], + }, + ], + 'rules': [ + { + 'rule_name': 'rule', + 'extension': 'pdf', + 'inputs': [ + 'rule_input.c', + ], + 'outputs': [ + 'rule_output.pdf', + ], + }, + ], + }, + { + 'target_name': 'exe2', + 'type': 'executable', + 'sources': [ + 'exe2.c', + ], + }, + { + 'target_name': 'exe3', + 'type': 'executable', + 'dependencies': [ + 'subdir/subdir.gyp:foo', + 'subdir/subdir.gyp:subdir2a', + ], + 'sources': [ + 'exe3.c', + ], + }, + { + 'target_name': 'allx', + 'type': 'none', + 'dependencies': [ + 'exe', + 'exe3', + ], + }, + ], +} diff --git a/deps/gyp/test/analyzer/test2.gyp b/deps/gyp/test/analyzer/test2.gyp new file mode 100644 index 0000000000..782b6e6428 --- /dev/null +++ b/deps/gyp/test/analyzer/test2.gyp @@ -0,0 +1,25 @@ +# Copyright (c) 2014 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. + +{ + 'targets': [ + { + 'target_name': 'exe', + 'type': 'executable', + 'dependencies': [ + 'subdir2/subdir.gyp:foo', + ], + }, + { + 'target_name': 'exe2', + 'type': 'executable', + 'includes': [ + 'test2.includes.gypi', + ], + }, + ], + 'includes': [ + 'test2.toplevel_includes.gypi', + ], +} diff --git a/deps/gyp/test/analyzer/test2.includes.gypi b/deps/gyp/test/analyzer/test2.includes.gypi new file mode 100644 index 0000000000..3e21de23cb --- /dev/null +++ b/deps/gyp/test/analyzer/test2.includes.gypi @@ -0,0 +1,13 @@ +# Copyright (c) 2014 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. + +{ + 'sources': [ + 'a.cc', + 'b.cc' + ], + 'includes': [ + 'test2.includes.includes.gypi', + ], +} diff --git a/deps/gyp/test/analyzer/test2.includes.includes.gypi b/deps/gyp/test/analyzer/test2.includes.includes.gypi new file mode 100644 index 0000000000..de3a025dbb --- /dev/null +++ b/deps/gyp/test/analyzer/test2.includes.includes.gypi @@ -0,0 +1,9 @@ +# Copyright (c) 2014 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. + +{ + 'sources': [ + 'c.cc' + ], +} diff --git a/deps/gyp/test/analyzer/test2.toplevel_includes.gypi b/deps/gyp/test/analyzer/test2.toplevel_includes.gypi new file mode 100644 index 0000000000..54fa453b08 --- /dev/null +++ b/deps/gyp/test/analyzer/test2.toplevel_includes.gypi @@ -0,0 +1,15 @@ +# Copyright (c) 2014 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. + +{ + 'targets': [ + { + 'target_name': 'exe3', + 'type': 'executable', + 'sources': [ + 'e.cc', + ], + }, + ], +} diff --git a/deps/gyp/test/analyzer/test3.gyp b/deps/gyp/test/analyzer/test3.gyp new file mode 100644 index 0000000000..e52f6bc7d3 --- /dev/null +++ b/deps/gyp/test/analyzer/test3.gyp @@ -0,0 +1,77 @@ +# Copyright (c) 2014 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. + +{ + 'targets': [ + { + 'target_name': 'allx', + 'type': 'none', + 'dependencies': [ + 'a', + 'b', + ], + }, + { + 'target_name': 'a', + 'type': 'executable', + 'sources': [ + 'a.c', + ], + 'dependencies': [ + 'c', + 'd', + ], + }, + { + 'target_name': 'b', + 'type': 'executable', + 'sources': [ + 'b.c', + ], + 'dependencies': [ + 'd', + 'e', + ], + }, + { + 'target_name': 'c', + 'type': 'executable', + 'sources': [ + 'c.c', + ], + }, + { + 'target_name': 'd', + 'type': 'none', + 'sources': [ + 'd.c', + ], + 'dependencies': [ + 'f', + 'g', + ], + }, + { + 'target_name': 'e', + 'type': 'executable', + 'sources': [ + 'e.c', + ], + }, + { + 'target_name': 'f', + 'type': 'static_library', + 'sources': [ + 'f.c', + ], + }, + { + 'target_name': 'g', + 'type': 'executable', + 'sources': [ + 'g.c', + ], + }, + ], +} diff --git a/deps/gyp/test/analyzer/test4.gyp b/deps/gyp/test/analyzer/test4.gyp new file mode 100644 index 0000000000..91cea56c1f --- /dev/null +++ b/deps/gyp/test/analyzer/test4.gyp @@ -0,0 +1,80 @@ +# Copyright (c) 2014 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. + +{ + 'targets': [ + { + 'target_name': 'a', + 'type': 'executable', + 'sources': [ + 'a.c', + ], + 'dependencies': [ + 'b', + 'c', + ], + }, + { + 'target_name': 'b', + 'type': 'executable', + 'sources': [ + 'b.c', + ], + 'dependencies': [ + 'd', + ], + }, + { + 'target_name': 'c', + 'type': 'executable', + 'sources': [ + 'c.c', + ], + 'dependencies': [ + 'b', + 'd', + ], + }, + { + 'target_name': 'd', + 'type': 'executable', + 'sources': [ + 'd.c', + ], + }, + { + 'target_name': 'e', + 'type': 'executable', + 'dependencies': [ + 'test5.gyp:f', + ], + }, + { + 'target_name': 'h', + 'type': 'none', + 'dependencies': [ + 'i', + ], + 'rules': [ + { + 'rule_name': 'rule', + 'extension': 'pdf', + 'inputs': [ + 'rule_input.c', + ], + 'outputs': [ + 'rule_output.pdf', + ], + }, + ], + }, + { + 'target_name': 'i', + 'type': 'static_library', + 'sources': [ + 'i.c', + ], + }, + ], +} diff --git a/deps/gyp/test/analyzer/test5.gyp b/deps/gyp/test/analyzer/test5.gyp new file mode 100644 index 0000000000..f3ea5b0061 --- /dev/null +++ b/deps/gyp/test/analyzer/test5.gyp @@ -0,0 +1,25 @@ +# Copyright (c) 2014 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. + +{ + 'targets': [ + { + 'target_name': 'f', + 'type': 'executable', + 'sources': [ + 'f.c', + ], + }, + { + 'target_name': 'g', + 'type': 'executable', + 'sources': [ + 'g.c', + ], + 'dependencies': [ + 'f', + ], + }, + ], +} diff --git a/deps/gyp/test/arflags/gyptest-arflags.py b/deps/gyp/test/arflags/gyptest-arflags.py new file mode 100644 index 0000000000..a5cbcac77d --- /dev/null +++ b/deps/gyp/test/arflags/gyptest-arflags.py @@ -0,0 +1,24 @@ +#!/usr/bin/env python + +# Copyright (c) 2014 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. + +""" +Verifies that building a target with invalid arflags fails. +""" + +import os +import sys +import TestGyp + +if sys.platform == 'darwin': + print "This test is currently disabled: https://crbug.com/483696." + sys.exit(0) + + +test = TestGyp.TestGyp(formats=['ninja']) +test.run_gyp('test.gyp') +expected_status = 0 if sys.platform in ['darwin', 'win32'] else 1 +test.build('test.gyp', target='lib', status=expected_status) +test.pass_test() diff --git a/deps/gyp/test/arflags/lib.cc b/deps/gyp/test/arflags/lib.cc new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/deps/gyp/test/arflags/lib.cc diff --git a/deps/gyp/test/arflags/test.gyp b/deps/gyp/test/arflags/test.gyp new file mode 100644 index 0000000000..f7430fae2d --- /dev/null +++ b/deps/gyp/test/arflags/test.gyp @@ -0,0 +1,10 @@ +{ + 'targets': [ + { + 'target_name': 'lib', + 'type': 'static_library', + 'sources': ['lib.cc'], + 'arflags': ['--nonexistent'], + }, + ], +} diff --git a/deps/gyp/test/assembly/gyptest-assembly.py b/deps/gyp/test/assembly/gyptest-assembly.py new file mode 100755 index 0000000000..8a84310544 --- /dev/null +++ b/deps/gyp/test/assembly/gyptest-assembly.py @@ -0,0 +1,31 @@ +#!/usr/bin/env python + +# 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. + +""" +A basic test of compiling assembler files. +""" + +import sys +import TestGyp + +if sys.platform != 'win32': + # TODO(bradnelson): get this working for windows. + test = TestGyp.TestGyp(formats=['!msvs']) + + test.run_gyp('assembly.gyp', chdir='src') + + test.relocate('src', 'relocate/src') + + test.build('assembly.gyp', test.ALL, chdir='relocate/src') + + expect = """\ +Hello from program.c +Got 42. +""" + test.run_built_executable('program', chdir='relocate/src', stdout=expect) + + + test.pass_test() diff --git a/deps/gyp/test/assembly/gyptest-override.py b/deps/gyp/test/assembly/gyptest-override.py new file mode 100644 index 0000000000..e84a23e855 --- /dev/null +++ b/deps/gyp/test/assembly/gyptest-override.py @@ -0,0 +1,24 @@ +#!/usr/bin/env python + +# 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. + +""" +Make sure that manual rules on Windows override the built in ones. +""" + +import sys +import TestGyp + +if sys.platform == 'win32': + test = TestGyp.TestGyp(formats=['msvs', 'ninja']) + CHDIR = 'src' + test.run_gyp('override.gyp', chdir=CHDIR) + test.build('override.gyp', test.ALL, chdir=CHDIR) + expect = """\ +Hello from program.c +Got 42. +""" + test.run_built_executable('program', chdir=CHDIR, stdout=expect) + test.pass_test() diff --git a/deps/gyp/test/assembly/src/as.bat b/deps/gyp/test/assembly/src/as.bat new file mode 100644 index 0000000000..b796db97ca --- /dev/null +++ b/deps/gyp/test/assembly/src/as.bat @@ -0,0 +1,4 @@ +@echo off +:: Mock windows assembler. +cl /MD /c %1 /Fo"%2" + diff --git a/deps/gyp/test/assembly/src/assembly.gyp b/deps/gyp/test/assembly/src/assembly.gyp new file mode 100644 index 0000000000..565cb0fa0e --- /dev/null +++ b/deps/gyp/test/assembly/src/assembly.gyp @@ -0,0 +1,62 @@ +# Copyright (c) 2009 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. + +{ + 'target_defaults': { + 'conditions': [ + ['OS=="win"', { + 'defines': ['PLATFORM_WIN'], + }], + ['OS=="mac" or OS=="ios"', { + 'defines': ['PLATFORM_MAC'], + }], + ['OS=="linux"', { + 'defines': ['PLATFORM_LINUX'], + }], + ['OS=="android"', { + 'defines': ['PLATFORM_ANDROID'], + }], + ], + }, + 'targets': [ + { + 'target_name': 'program', + 'type': 'executable', + 'dependencies': ['lib1'], + 'sources': [ + 'program.c', + ], + }, + { + 'target_name': 'lib1', + 'type': 'static_library', + 'sources': [ + 'lib1.S', + ], + }, + ], + 'conditions': [ + ['OS=="win"', { + 'target_defaults': { + 'rules': [ + { + 'rule_name': 'assembler', + 'msvs_cygwin_shell': 0, + 'extension': 'S', + 'inputs': [ + 'as.bat', + ], + 'outputs': [ + '<(INTERMEDIATE_DIR)/<(RULE_INPUT_ROOT).obj', + ], + 'action': + ['as.bat', 'lib1.c', '<(_outputs)'], + 'message': 'Building assembly file <(RULE_INPUT_PATH)', + 'process_outputs_as_sources': 1, + }, + ], + }, + },], + ], +} diff --git a/deps/gyp/test/assembly/src/lib1.S b/deps/gyp/test/assembly/src/lib1.S new file mode 100644 index 0000000000..7de9f19cf9 --- /dev/null +++ b/deps/gyp/test/assembly/src/lib1.S @@ -0,0 +1,15 @@ +#if PLATFORM_WINDOWS || PLATFORM_MAC +# define IDENTIFIER(n) _##n +#else /* Linux */ +# define IDENTIFIER(n) n +#endif + +.globl IDENTIFIER(lib1_function) +IDENTIFIER(lib1_function): +#if !defined(PLATFORM_ANDROID) + movl $42, %eax + ret +#else /* Android (assuming ARM) */ + mov r0, #42 + bx lr +#endif diff --git a/deps/gyp/test/assembly/src/lib1.c b/deps/gyp/test/assembly/src/lib1.c new file mode 100644 index 0000000000..be21ecd5f6 --- /dev/null +++ b/deps/gyp/test/assembly/src/lib1.c @@ -0,0 +1,3 @@ +int lib1_function(void) { + return 42; +} diff --git a/deps/gyp/test/assembly/src/override.gyp b/deps/gyp/test/assembly/src/override.gyp new file mode 100644 index 0000000000..39a4072eff --- /dev/null +++ b/deps/gyp/test/assembly/src/override.gyp @@ -0,0 +1,34 @@ +# 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. + +{ + 'targets': [ + { + 'target_name': 'program', + 'type': 'executable', + 'sources': [ + 'program.c', + 'override_asm.asm', + ], + 'rules': [ + { + # Test that if there's a specific .asm rule, it overrides the + # built in one on Windows. + 'rule_name': 'assembler', + 'msvs_cygwin_shell': 0, + 'extension': 'asm', + 'inputs': [ + 'as.bat', + ], + 'outputs': [ + 'output.obj', + ], + 'action': ['as.bat', 'lib1.c', '<(_outputs)'], + 'message': 'Building assembly file <(RULE_INPUT_PATH)', + 'process_outputs_as_sources': 1, + }, + ], + }, + ], +} diff --git a/deps/gyp/test/assembly/src/override_asm.asm b/deps/gyp/test/assembly/src/override_asm.asm new file mode 100644 index 0000000000..be93b23baa --- /dev/null +++ b/deps/gyp/test/assembly/src/override_asm.asm @@ -0,0 +1,8 @@ +; 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. + +; This is a placeholder. It should not be referenced if overrides work +; correctly. + +Bad stuff that shouldn't assemble. diff --git a/deps/gyp/test/assembly/src/program.c b/deps/gyp/test/assembly/src/program.c new file mode 100644 index 0000000000..eee862712e --- /dev/null +++ b/deps/gyp/test/assembly/src/program.c @@ -0,0 +1,12 @@ +#include <stdio.h> + +extern int lib1_function(void); + +int main(void) +{ + fprintf(stdout, "Hello from program.c\n"); + fflush(stdout); + fprintf(stdout, "Got %d.\n", lib1_function()); + fflush(stdout); + return 0; +} diff --git a/deps/gyp/test/build-option/gyptest-build.py b/deps/gyp/test/build-option/gyptest-build.py new file mode 100755 index 0000000000..34a9e11d35 --- /dev/null +++ b/deps/gyp/test/build-option/gyptest-build.py @@ -0,0 +1,27 @@ +#!/usr/bin/env python + +# 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. + +""" +Verifies simplest-possible build of a "Hello, world!" program +using the default build target. +""" + +import TestGyp + +test = TestGyp.TestGyp(workdir='workarea_default') + +if test.format == 'xcode-ninja': + # The xcode-ninja generator doesn't support --build + # cf. https://code.google.com/p/gyp/issues/detail?id=453 + test.skip_test() + +test.run_gyp('hello.gyp', '--build=Default') + +test.run_built_executable('hello', stdout="Hello, world!\n") + +test.up_to_date('hello.gyp', test.DEFAULT) + +test.pass_test() diff --git a/deps/gyp/test/build-option/hello.c b/deps/gyp/test/build-option/hello.c new file mode 100644 index 0000000000..f6ad129fd7 --- /dev/null +++ b/deps/gyp/test/build-option/hello.c @@ -0,0 +1,13 @@ +/* + * 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. + */ + +#include <stdio.h> + +int main(void) +{ + printf("Hello, world!\n"); + return 0; +} diff --git a/deps/gyp/test/build-option/hello.gyp b/deps/gyp/test/build-option/hello.gyp new file mode 100644 index 0000000000..1974d51ccd --- /dev/null +++ b/deps/gyp/test/build-option/hello.gyp @@ -0,0 +1,15 @@ +# Copyright (c) 2009 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. + +{ + 'targets': [ + { + 'target_name': 'hello', + 'type': 'executable', + 'sources': [ + 'hello.c', + ], + }, + ], +} diff --git a/deps/gyp/test/builddir/gyptest-all.py b/deps/gyp/test/builddir/gyptest-all.py new file mode 100755 index 0000000000..a26543f49e --- /dev/null +++ b/deps/gyp/test/builddir/gyptest-all.py @@ -0,0 +1,85 @@ +#!/usr/bin/env python + +# 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. + +""" +Verify the settings that cause a set of programs to be created in +a specific build directory, and that no intermediate built files +get created outside of that build directory hierarchy even when +referred to with deeply-nested ../../.. paths. +""" + +import TestGyp + +# TODO(mmoss): Make only supports (theoretically) a single, global build +# directory (through GYP_GENERATOR_FLAGS 'output_dir'), rather than +# gyp-file-specific settings (e.g. the stuff in builddir.gypi) that the other +# generators support, so this doesn't work yet for make. +# TODO(mmoss) Make also has the issue that the top-level Makefile is written to +# the "--depth" location, which is one level above 'src', but then this test +# moves 'src' somewhere else, leaving the Makefile behind, so make can't find +# its sources. I'm not sure if make is wrong for writing outside the current +# directory, or if the test is wrong for assuming everything generated is under +# the current directory. +# Ninja and CMake do not support setting the build directory. +test = TestGyp.TestGyp(formats=['!make', '!ninja', '!cmake']) + +test.run_gyp('prog1.gyp', '--depth=..', chdir='src') +if test.format == 'msvs': + if test.uses_msbuild: + test.must_contain('src/prog1.vcxproj', + '<OutDir>..\\builddir\\Default\\</OutDir>') + else: + test.must_contain('src/prog1.vcproj', + 'OutputDirectory="..\\builddir\\Default\\"') + +test.relocate('src', 'relocate/src') + +test.subdir('relocate/builddir') + +# Make sure that all the built ../../etc. files only get put under builddir, +# by making all of relocate read-only and then making only builddir writable. +test.writable('relocate', False) +test.writable('relocate/builddir', True) + +# Suppress the test infrastructure's setting SYMROOT on the command line. +test.build('prog1.gyp', test.ALL, SYMROOT=None, chdir='relocate/src') + +expect1 = """\ +Hello from prog1.c +Hello from func1.c +""" + +expect2 = """\ +Hello from subdir2/prog2.c +Hello from func2.c +""" + +expect3 = """\ +Hello from subdir2/subdir3/prog3.c +Hello from func3.c +""" + +expect4 = """\ +Hello from subdir2/subdir3/subdir4/prog4.c +Hello from func4.c +""" + +expect5 = """\ +Hello from subdir2/subdir3/subdir4/subdir5/prog5.c +Hello from func5.c +""" + +def run_builddir(prog, expect): + dir = 'relocate/builddir/Default/' + test.run(program=test.workpath(dir + prog), stdout=expect) + +run_builddir('prog1', expect1) +run_builddir('prog2', expect2) +run_builddir('prog3', expect3) +run_builddir('prog4', expect4) +run_builddir('prog5', expect5) + +test.pass_test() diff --git a/deps/gyp/test/builddir/gyptest-default.py b/deps/gyp/test/builddir/gyptest-default.py new file mode 100755 index 0000000000..4904cdab42 --- /dev/null +++ b/deps/gyp/test/builddir/gyptest-default.py @@ -0,0 +1,85 @@ +#!/usr/bin/env python + +# 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. + +""" +Verify the settings that cause a set of programs to be created in +a specific build directory, and that no intermediate built files +get created outside of that build directory hierarchy even when +referred to with deeply-nested ../../.. paths. +""" + +import TestGyp + +# TODO(mmoss): Make only supports (theoretically) a single, global build +# directory (through GYP_GENERATOR_FLAGS 'output_dir'), rather than +# gyp-file-specific settings (e.g. the stuff in builddir.gypi) that the other +# generators support, so this doesn't work yet for make. +# TODO(mmoss) Make also has the issue that the top-level Makefile is written to +# the "--depth" location, which is one level above 'src', but then this test +# moves 'src' somewhere else, leaving the Makefile behind, so make can't find +# its sources. I'm not sure if make is wrong for writing outside the current +# directory, or if the test is wrong for assuming everything generated is under +# the current directory. +# Ninja and CMake do not support setting the build directory. +test = TestGyp.TestGyp(formats=['!make', '!ninja', '!cmake']) + +test.run_gyp('prog1.gyp', '--depth=..', chdir='src') +if test.format == 'msvs': + if test.uses_msbuild: + test.must_contain('src/prog1.vcxproj', + '<OutDir>..\\builddir\\Default\\</OutDir>') + else: + test.must_contain('src/prog1.vcproj', + 'OutputDirectory="..\\builddir\\Default\\"') + +test.relocate('src', 'relocate/src') + +test.subdir('relocate/builddir') + +# Make sure that all the built ../../etc. files only get put under builddir, +# by making all of relocate read-only and then making only builddir writable. +test.writable('relocate', False) +test.writable('relocate/builddir', True) + +# Suppress the test infrastructure's setting SYMROOT on the command line. +test.build('prog1.gyp', SYMROOT=None, chdir='relocate/src') + +expect1 = """\ +Hello from prog1.c +Hello from func1.c +""" + +expect2 = """\ +Hello from subdir2/prog2.c +Hello from func2.c +""" + +expect3 = """\ +Hello from subdir2/subdir3/prog3.c +Hello from func3.c +""" + +expect4 = """\ +Hello from subdir2/subdir3/subdir4/prog4.c +Hello from func4.c +""" + +expect5 = """\ +Hello from subdir2/subdir3/subdir4/subdir5/prog5.c +Hello from func5.c +""" + +def run_builddir(prog, expect): + dir = 'relocate/builddir/Default/' + test.run(program=test.workpath(dir + prog), stdout=expect) + +run_builddir('prog1', expect1) +run_builddir('prog2', expect2) +run_builddir('prog3', expect3) +run_builddir('prog4', expect4) +run_builddir('prog5', expect5) + +test.pass_test() diff --git a/deps/gyp/test/builddir/src/builddir.gypi b/deps/gyp/test/builddir/src/builddir.gypi new file mode 100644 index 0000000000..ce175db8f8 --- /dev/null +++ b/deps/gyp/test/builddir/src/builddir.gypi @@ -0,0 +1,18 @@ +# Copyright (c) 2009 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. + +{ + 'target_defaults': { + 'configurations': { + 'Default': { + 'msvs_configuration_attributes': { + 'OutputDirectory': '<(DEPTH)\\builddir/Default', + }, + }, + }, + }, + 'xcode_settings': { + 'SYMROOT': '<(DEPTH)/builddir', + }, +} diff --git a/deps/gyp/test/builddir/src/func1.c b/deps/gyp/test/builddir/src/func1.c new file mode 100644 index 0000000000..b8e6a06951 --- /dev/null +++ b/deps/gyp/test/builddir/src/func1.c @@ -0,0 +1,6 @@ +#include <stdio.h> + +void func1(void) +{ + printf("Hello from func1.c\n"); +} diff --git a/deps/gyp/test/builddir/src/func2.c b/deps/gyp/test/builddir/src/func2.c new file mode 100644 index 0000000000..14aabac475 --- /dev/null +++ b/deps/gyp/test/builddir/src/func2.c @@ -0,0 +1,6 @@ +#include <stdio.h> + +void func2(void) +{ + printf("Hello from func2.c\n"); +} diff --git a/deps/gyp/test/builddir/src/func3.c b/deps/gyp/test/builddir/src/func3.c new file mode 100644 index 0000000000..3b4edeae6d --- /dev/null +++ b/deps/gyp/test/builddir/src/func3.c @@ -0,0 +1,6 @@ +#include <stdio.h> + +void func3(void) +{ + printf("Hello from func3.c\n"); +} diff --git a/deps/gyp/test/builddir/src/func4.c b/deps/gyp/test/builddir/src/func4.c new file mode 100644 index 0000000000..732891b79a --- /dev/null +++ b/deps/gyp/test/builddir/src/func4.c @@ -0,0 +1,6 @@ +#include <stdio.h> + +void func4(void) +{ + printf("Hello from func4.c\n"); +} diff --git a/deps/gyp/test/builddir/src/func5.c b/deps/gyp/test/builddir/src/func5.c new file mode 100644 index 0000000000..18fdfabbbe --- /dev/null +++ b/deps/gyp/test/builddir/src/func5.c @@ -0,0 +1,6 @@ +#include <stdio.h> + +void func5(void) +{ + printf("Hello from func5.c\n"); +} diff --git a/deps/gyp/test/builddir/src/prog1.c b/deps/gyp/test/builddir/src/prog1.c new file mode 100644 index 0000000000..a32aaf04f9 --- /dev/null +++ b/deps/gyp/test/builddir/src/prog1.c @@ -0,0 +1,10 @@ +#include <stdio.h> + +extern void func1(void); + +int main(void) +{ + printf("Hello from prog1.c\n"); + func1(); + return 0; +} diff --git a/deps/gyp/test/builddir/src/prog1.gyp b/deps/gyp/test/builddir/src/prog1.gyp new file mode 100644 index 0000000000..5b96f035ec --- /dev/null +++ b/deps/gyp/test/builddir/src/prog1.gyp @@ -0,0 +1,30 @@ +# Copyright (c) 2009 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. + +{ + 'includes': [ + 'builddir.gypi', + ], + 'targets': [ + { + 'target_name': 'pull_in_all', + 'type': 'none', + 'dependencies': [ + 'prog1', + 'subdir2/prog2.gyp:prog2', + 'subdir2/subdir3/prog3.gyp:prog3', + 'subdir2/subdir3/subdir4/prog4.gyp:prog4', + 'subdir2/subdir3/subdir4/subdir5/prog5.gyp:prog5', + ], + }, + { + 'target_name': 'prog1', + 'type': 'executable', + 'sources': [ + 'prog1.c', + 'func1.c', + ], + }, + ], +} diff --git a/deps/gyp/test/builddir/src/subdir2/prog2.c b/deps/gyp/test/builddir/src/subdir2/prog2.c new file mode 100644 index 0000000000..9d682cd783 --- /dev/null +++ b/deps/gyp/test/builddir/src/subdir2/prog2.c @@ -0,0 +1,10 @@ +#include <stdio.h> + +extern void func2(void); + +int main(void) +{ + printf("Hello from subdir2/prog2.c\n"); + func2(); + return 0; +} diff --git a/deps/gyp/test/builddir/src/subdir2/prog2.gyp b/deps/gyp/test/builddir/src/subdir2/prog2.gyp new file mode 100644 index 0000000000..96299b646d --- /dev/null +++ b/deps/gyp/test/builddir/src/subdir2/prog2.gyp @@ -0,0 +1,19 @@ +# Copyright (c) 2009 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. + +{ + 'includes': [ + '../builddir.gypi', + ], + 'targets': [ + { + 'target_name': 'prog2', + 'type': 'executable', + 'sources': [ + 'prog2.c', + '../func2.c', + ], + }, + ], +} diff --git a/deps/gyp/test/builddir/src/subdir2/subdir3/prog3.c b/deps/gyp/test/builddir/src/subdir2/subdir3/prog3.c new file mode 100644 index 0000000000..da74965985 --- /dev/null +++ b/deps/gyp/test/builddir/src/subdir2/subdir3/prog3.c @@ -0,0 +1,10 @@ +#include <stdio.h> + +extern void func3(void); + +int main(void) +{ + printf("Hello from subdir2/subdir3/prog3.c\n"); + func3(); + return 0; +} diff --git a/deps/gyp/test/builddir/src/subdir2/subdir3/prog3.gyp b/deps/gyp/test/builddir/src/subdir2/subdir3/prog3.gyp new file mode 100644 index 0000000000..d7df43c7bd --- /dev/null +++ b/deps/gyp/test/builddir/src/subdir2/subdir3/prog3.gyp @@ -0,0 +1,19 @@ +# Copyright (c) 2009 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. + +{ + 'includes': [ + '../../builddir.gypi', + ], + 'targets': [ + { + 'target_name': 'prog3', + 'type': 'executable', + 'sources': [ + 'prog3.c', + '../../func3.c', + ], + }, + ], +} diff --git a/deps/gyp/test/builddir/src/subdir2/subdir3/subdir4/prog4.c b/deps/gyp/test/builddir/src/subdir2/subdir3/subdir4/prog4.c new file mode 100644 index 0000000000..5787d5fa43 --- /dev/null +++ b/deps/gyp/test/builddir/src/subdir2/subdir3/subdir4/prog4.c @@ -0,0 +1,10 @@ +#include <stdio.h> + +extern void func4(void); + +int main(void) +{ + printf("Hello from subdir2/subdir3/subdir4/prog4.c\n"); + func4(); + return 0; +} diff --git a/deps/gyp/test/builddir/src/subdir2/subdir3/subdir4/prog4.gyp b/deps/gyp/test/builddir/src/subdir2/subdir3/subdir4/prog4.gyp new file mode 100644 index 0000000000..862a8a18cd --- /dev/null +++ b/deps/gyp/test/builddir/src/subdir2/subdir3/subdir4/prog4.gyp @@ -0,0 +1,19 @@ +# Copyright (c) 2009 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. + +{ + 'includes': [ + '../../../builddir.gypi', + ], + 'targets': [ + { + 'target_name': 'prog4', + 'type': 'executable', + 'sources': [ + 'prog4.c', + '../../../func4.c', + ], + }, + ], +} diff --git a/deps/gyp/test/builddir/src/subdir2/subdir3/subdir4/subdir5/prog5.c b/deps/gyp/test/builddir/src/subdir2/subdir3/subdir4/subdir5/prog5.c new file mode 100644 index 0000000000..c6e2ab521f --- /dev/null +++ b/deps/gyp/test/builddir/src/subdir2/subdir3/subdir4/subdir5/prog5.c @@ -0,0 +1,10 @@ +#include <stdio.h> + +extern void func5(void); + +int main(void) +{ + printf("Hello from subdir2/subdir3/subdir4/subdir5/prog5.c\n"); + func5(); + return 0; +} diff --git a/deps/gyp/test/builddir/src/subdir2/subdir3/subdir4/subdir5/prog5.gyp b/deps/gyp/test/builddir/src/subdir2/subdir3/subdir4/subdir5/prog5.gyp new file mode 100644 index 0000000000..fe1c9cbf50 --- /dev/null +++ b/deps/gyp/test/builddir/src/subdir2/subdir3/subdir4/subdir5/prog5.gyp @@ -0,0 +1,19 @@ +# Copyright (c) 2009 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. + +{ + 'includes': [ + '../../../../builddir.gypi', + ], + 'targets': [ + { + 'target_name': 'prog5', + 'type': 'executable', + 'sources': [ + 'prog5.c', + '../../../../func5.c', + ], + }, + ], +} diff --git a/deps/gyp/test/cflags/cflags.c b/deps/gyp/test/cflags/cflags.c new file mode 100644 index 0000000000..0a02ba9074 --- /dev/null +++ b/deps/gyp/test/cflags/cflags.c @@ -0,0 +1,15 @@ +/* Copyright (c) 2010 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. */ + +#include <stdio.h> + +int main(void) +{ +#ifdef FOO + printf("FOO defined\n"); +#else + printf("FOO not defined\n"); +#endif + return 0; +} diff --git a/deps/gyp/test/cflags/cflags.gyp b/deps/gyp/test/cflags/cflags.gyp new file mode 100644 index 0000000000..2840dc6318 --- /dev/null +++ b/deps/gyp/test/cflags/cflags.gyp @@ -0,0 +1,23 @@ +# Copyright (c) 2010 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. + +{ + 'targets': [ + { + 'target_name': 'cflags', + 'type': 'executable', + 'sources': [ + 'cflags.c', + ], + }, + { + 'target_name': 'cflags_host', + 'toolsets': ['host'], + 'type': 'executable', + 'sources': [ + 'cflags.c', + ], + }, + ], +} diff --git a/deps/gyp/test/cflags/gyptest-cflags.py b/deps/gyp/test/cflags/gyptest-cflags.py new file mode 100755 index 0000000000..f4efccba9b --- /dev/null +++ b/deps/gyp/test/cflags/gyptest-cflags.py @@ -0,0 +1,75 @@ +#!/usr/bin/env python + +# 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. + +""" +Verifies the use of the environment during regeneration when the gyp file +changes, specifically via build of an executable with C preprocessor +definition specified by CFLAGS. + +In this test, gyp and build both run in same local environment. +""" + +import TestGyp + +# CPPFLAGS works in ninja but not make; CFLAGS works in both +FORMATS = ('make', 'ninja') + +test = TestGyp.TestGyp(formats=FORMATS) + +# First set CFLAGS to blank in case the platform doesn't support unsetenv. +with TestGyp.LocalEnv({'CFLAGS': '', + 'GYP_CROSSCOMPILE': '1'}): + test.run_gyp('cflags.gyp') + test.build('cflags.gyp') + +expect = """FOO not defined\n""" +test.run_built_executable('cflags', stdout=expect) +test.run_built_executable('cflags_host', stdout=expect) + +test.sleep() + +with TestGyp.LocalEnv({'CFLAGS': '-DFOO=1', + 'GYP_CROSSCOMPILE': '1'}): + test.run_gyp('cflags.gyp') + test.build('cflags.gyp') + +expect = """FOO defined\n""" +test.run_built_executable('cflags', stdout=expect) + +# Environment variable CFLAGS shouldn't influence the flags for the host. +expect = """FOO not defined\n""" +test.run_built_executable('cflags_host', stdout=expect) + +test.sleep() + +with TestGyp.LocalEnv({'CFLAGS_host': '-DFOO=1', + 'GYP_CROSSCOMPILE': '1'}): + test.run_gyp('cflags.gyp') + test.build('cflags.gyp') + +# Environment variable CFLAGS_host should influence the flags for the host. +expect = """FOO defined\n""" +test.run_built_executable('cflags_host', stdout=expect) + +test.sleep() + +with TestGyp.LocalEnv({'CFLAGS': ''}): + test.run_gyp('cflags.gyp') + test.build('cflags.gyp') + +expect = """FOO not defined\n""" +test.run_built_executable('cflags', stdout=expect) + +test.sleep() + +with TestGyp.LocalEnv({'CFLAGS': '-DFOO=1'}): + test.run_gyp('cflags.gyp') + test.build('cflags.gyp') + +expect = """FOO defined\n""" +test.run_built_executable('cflags', stdout=expect) + +test.pass_test() diff --git a/deps/gyp/test/compilable/gyptest-headers.py b/deps/gyp/test/compilable/gyptest-headers.py new file mode 100755 index 0000000000..91760216fb --- /dev/null +++ b/deps/gyp/test/compilable/gyptest-headers.py @@ -0,0 +1,29 @@ +#!/usr/bin/env python + +# Copyright (c) 2009 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. + +""" +Verifies that .hpp files are ignored when included in the source list on all +platforms. +""" + +import TestGyp + +test = TestGyp.TestGyp() + +test.run_gyp('headers.gyp', chdir='src') + +test.relocate('src', 'relocate/src') + +test.build('headers.gyp', test.ALL, chdir='relocate/src') + +expect = """\ +Hello from program.c +Hello from lib1.c +""" +test.run_built_executable('program', chdir='relocate/src', stdout=expect) + + +test.pass_test() diff --git a/deps/gyp/test/compilable/src/headers.gyp b/deps/gyp/test/compilable/src/headers.gyp new file mode 100644 index 0000000000..b6c2a8857b --- /dev/null +++ b/deps/gyp/test/compilable/src/headers.gyp @@ -0,0 +1,26 @@ +# Copyright (c) 2009 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. + +{ + 'targets': [ + { + 'target_name': 'program', + 'type': 'executable', + 'dependencies': [ + 'lib1' + ], + 'sources': [ + 'program.cpp', + ], + }, + { + 'target_name': 'lib1', + 'type': 'static_library', + 'sources': [ + 'lib1.hpp', + 'lib1.cpp', + ], + }, + ], +} diff --git a/deps/gyp/test/compilable/src/lib1.cpp b/deps/gyp/test/compilable/src/lib1.cpp new file mode 100644 index 0000000000..51bc31a40b --- /dev/null +++ b/deps/gyp/test/compilable/src/lib1.cpp @@ -0,0 +1,7 @@ +#include <stdio.h> +#include "lib1.hpp" + +void lib1_function(void) { + fprintf(stdout, "Hello from lib1.c\n"); + fflush(stdout); +} diff --git a/deps/gyp/test/compilable/src/lib1.hpp b/deps/gyp/test/compilable/src/lib1.hpp new file mode 100644 index 0000000000..72e63e8acd --- /dev/null +++ b/deps/gyp/test/compilable/src/lib1.hpp @@ -0,0 +1,6 @@ +#ifndef _lib1_hpp +#define _lib1_hpp + +extern void lib1_function(void); + +#endif diff --git a/deps/gyp/test/compilable/src/program.cpp b/deps/gyp/test/compilable/src/program.cpp new file mode 100644 index 0000000000..8af2c9b6ff --- /dev/null +++ b/deps/gyp/test/compilable/src/program.cpp @@ -0,0 +1,9 @@ +#include <stdio.h> +#include "lib1.hpp" + +int main(void) { + fprintf(stdout, "Hello from program.c\n"); + fflush(stdout); + lib1_function(); + return 0; +} diff --git a/deps/gyp/test/compiler-override/compiler-exe.gyp b/deps/gyp/test/compiler-override/compiler-exe.gyp new file mode 100644 index 0000000000..c2f3002f20 --- /dev/null +++ b/deps/gyp/test/compiler-override/compiler-exe.gyp @@ -0,0 +1,16 @@ +# 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. + +{ + 'targets': [ + { + 'target_name': 'hello', + 'type': 'executable', + 'sources': [ + 'test.c', + 'cxxtest.cc', + ], + }, + ], +} diff --git a/deps/gyp/test/compiler-override/compiler-global-settings.gyp.in b/deps/gyp/test/compiler-override/compiler-global-settings.gyp.in new file mode 100644 index 0000000000..ca13a53e8d --- /dev/null +++ b/deps/gyp/test/compiler-override/compiler-global-settings.gyp.in @@ -0,0 +1,34 @@ +# 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. + +{ + # PYTHON and PWD are replaced by the test code before this + # gyp file runs + 'make_global_settings': [ + ['CC', r'$PYTHON $PWD/my_cc.py FOO'], + ['CXX', r'$PYTHON $PWD/my_cxx.py FOO'], + ['CC.host', r'$PYTHON $PWD/my_cc.py BAR'], + ['CXX.host', r'$PYTHON $PWD/my_cxx.py BAR'], + + ['LD', r'$PYTHON $PWD/my_ld.py FOO_LINK'], + ['LD.host', r'$PYTHON $PWD/my_ld.py BAR_LINK'], + ['LINK', r'$PYTHON $PWD/my_ld.py FOO_LINK'], + ['LINK.host', r'$PYTHON $PWD/my_ld.py BAR_LINK'], + ], + + # The above global settings should mean that + # that these targets are built using the fake + # toolchain above. + 'targets': [ + { + 'toolset': '$TOOLSET', + 'target_name': 'hello', + 'type': 'executable', + 'sources': [ + 'test.c', + 'cxxtest.cc', + ], + }, + ], +} diff --git a/deps/gyp/test/compiler-override/compiler-host.gyp b/deps/gyp/test/compiler-override/compiler-host.gyp new file mode 100644 index 0000000000..ab3d247e0b --- /dev/null +++ b/deps/gyp/test/compiler-override/compiler-host.gyp @@ -0,0 +1,17 @@ +# 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. + +{ + 'targets': [ + { + 'toolset': 'host', + 'target_name': 'hello', + 'type': 'executable', + 'sources': [ + 'test.c', + 'cxxtest.cc', + ], + }, + ], +} diff --git a/deps/gyp/test/compiler-override/compiler-shared-lib.gyp b/deps/gyp/test/compiler-override/compiler-shared-lib.gyp new file mode 100644 index 0000000000..d3e4316135 --- /dev/null +++ b/deps/gyp/test/compiler-override/compiler-shared-lib.gyp @@ -0,0 +1,16 @@ +# 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. + +{ + 'targets': [ + { + 'target_name': 'hello-lib', + 'type': 'shared_library', + 'sources': [ + 'test.c', + 'cxxtest.cc', + ], + }, + ], +} diff --git a/deps/gyp/test/compiler-override/cxxtest.cc b/deps/gyp/test/compiler-override/cxxtest.cc new file mode 100644 index 0000000000..517a353619 --- /dev/null +++ b/deps/gyp/test/compiler-override/cxxtest.cc @@ -0,0 +1,7 @@ +// 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. + +// Deliberate C syntax error as this file should never be passed to +// the actual compiler +#error Should not be passed to a real compiler diff --git a/deps/gyp/test/compiler-override/gyptest-compiler-env-toolchain.py b/deps/gyp/test/compiler-override/gyptest-compiler-env-toolchain.py new file mode 100644 index 0000000000..2361d0c7c2 --- /dev/null +++ b/deps/gyp/test/compiler-override/gyptest-compiler-env-toolchain.py @@ -0,0 +1,78 @@ +#!/usr/bin/env python +# 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. +""" +Verifies that the user can override the compiler and linker using +CC/CXX/NM/READELF environment variables. +""" + +import TestGyp +import os +import copy +import sys + +here = os.path.dirname(os.path.abspath(__file__)) + +if sys.platform == 'win32': + # cross compiling not supported by ninja on windows + # and make not supported on windows at all. + sys.exit(0) + +# Clear any existing compiler related env vars. +for key in ['CC', 'CXX', 'LINK', 'CC_host', 'CXX_host', 'LINK_host', + 'NM_target', 'READELF_target']: + if key in os.environ: + del os.environ[key] + + +def CheckCompiler(test, gypfile, check_for, run_gyp): + if run_gyp: + test.run_gyp(gypfile) + test.build(gypfile) + + test.must_contain_all_lines(test.stdout(), check_for) + + +test = TestGyp.TestGyp(formats=['ninja']) +# Must set the test format to something with a flavor (the part after the '-') +# in order to test the desired behavior. Since we want to run a non-host +# toolchain, we have to set the flavor to something that the ninja generator +# doesn't know about, so it doesn't default to the host-specific tools (e.g., +# 'otool' on mac to generate the .TOC). +# +# Note that we can't just pass format=['ninja-some_toolchain'] to the +# constructor above, because then this test wouldn't be recognized as a ninja +# format test. +test.formats = ['ninja-my_flavor' if f == 'ninja' else f for f in test.formats] + + +def TestTargetOverideSharedLib(): + # The std output from nm and readelf is redirected to files, so we can't + # expect their output to appear. Instead, check for the files they create to + # see if they actually ran. + expected = ['my_cc.py', 'my_cxx.py', 'FOO'] + + # Check that CC, CXX, NM, READELF, set target compiler + env = {'CC': 'python %s/my_cc.py FOO' % here, + 'CXX': 'python %s/my_cxx.py FOO' % here, + 'NM': 'python %s/my_nm.py' % here, + 'READELF': 'python %s/my_readelf.py' % here} + + with TestGyp.LocalEnv(env): + CheckCompiler(test, 'compiler-shared-lib.gyp', expected, True) + test.must_contain(test.built_file_path('RAN_MY_NM'), 'RAN_MY_NM') + test.must_contain(test.built_file_path('RAN_MY_READELF'), 'RAN_MY_READELF') + test.unlink(test.built_file_path('RAN_MY_NM')) + test.unlink(test.built_file_path('RAN_MY_READELF')) + + # Run the same tests once the eviron has been restored. The generated + # projects should have embedded all the settings in the project files so the + # results should be the same. + CheckCompiler(test, 'compiler-shared-lib.gyp', expected, False) + test.must_contain(test.built_file_path('RAN_MY_NM'), 'RAN_MY_NM') + test.must_contain(test.built_file_path('RAN_MY_READELF'), 'RAN_MY_READELF') + + +TestTargetOverideSharedLib() +test.pass_test() diff --git a/deps/gyp/test/compiler-override/gyptest-compiler-env.py b/deps/gyp/test/compiler-override/gyptest-compiler-env.py new file mode 100755 index 0000000000..bb38b6e55b --- /dev/null +++ b/deps/gyp/test/compiler-override/gyptest-compiler-env.py @@ -0,0 +1,110 @@ +#!/usr/bin/env python +# 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. +""" +Verifies that the user can override the compiler and linker using CC/CXX/LD +environment variables. +""" + +import TestGyp +import os +import copy +import sys + +here = os.path.dirname(os.path.abspath(__file__)) + +if sys.platform == 'win32': + # cross compiling not supported by ninja on windows + # and make not supported on windows at all. + sys.exit(0) + +# Clear any existing compiler related env vars. +for key in ['CC', 'CXX', 'LINK', 'CC_host', 'CXX_host', 'LINK_host']: + if key in os.environ: + del os.environ[key] + + +def CheckCompiler(test, gypfile, check_for, run_gyp): + if run_gyp: + test.run_gyp(gypfile) + test.build(gypfile) + + test.must_contain_all_lines(test.stdout(), check_for) + + +test = TestGyp.TestGyp(formats=['ninja', 'make']) + +def TestTargetOveride(): + expected = ['my_cc.py', 'my_cxx.py', 'FOO' ] + + # ninja just uses $CC / $CXX as linker. + if test.format not in ['ninja', 'xcode-ninja']: + expected.append('FOO_LINK') + + # Check that CC, CXX and LD set target compiler + oldenv = os.environ.copy() + try: + os.environ['CC'] = 'python %s/my_cc.py FOO' % here + os.environ['CXX'] = 'python %s/my_cxx.py FOO' % here + os.environ['LINK'] = 'python %s/my_ld.py FOO_LINK' % here + + CheckCompiler(test, 'compiler-exe.gyp', expected, True) + finally: + os.environ.clear() + os.environ.update(oldenv) + + # Run the same tests once the eviron has been restored. The + # generated should have embedded all the settings in the + # project files so the results should be the same. + CheckCompiler(test, 'compiler-exe.gyp', expected, False) + + +def TestTargetOverideCompilerOnly(): + # Same test again but with that CC, CXX and not LD + oldenv = os.environ.copy() + try: + os.environ['CC'] = 'python %s/my_cc.py FOO' % here + os.environ['CXX'] = 'python %s/my_cxx.py FOO' % here + + CheckCompiler(test, 'compiler-exe.gyp', + ['my_cc.py', 'my_cxx.py', 'FOO'], + True) + finally: + os.environ.clear() + os.environ.update(oldenv) + + # Run the same tests once the eviron has been restored. The + # generated should have embedded all the settings in the + # project files so the results should be the same. + CheckCompiler(test, 'compiler-exe.gyp', + ['my_cc.py', 'my_cxx.py', 'FOO'], + False) + + +def TestHostOveride(): + expected = ['my_cc.py', 'my_cxx.py', 'HOST' ] + if test.format != 'ninja': # ninja just uses $CC / $CXX as linker. + expected.append('HOST_LINK') + + # Check that CC_host sets host compilee + oldenv = os.environ.copy() + try: + os.environ['CC_host'] = 'python %s/my_cc.py HOST' % here + os.environ['CXX_host'] = 'python %s/my_cxx.py HOST' % here + os.environ['LINK_host'] = 'python %s/my_ld.py HOST_LINK' % here + CheckCompiler(test, 'compiler-host.gyp', expected, True) + finally: + os.environ.clear() + os.environ.update(oldenv) + + # Run the same tests once the eviron has been restored. The + # generated should have embedded all the settings in the + # project files so the results should be the same. + CheckCompiler(test, 'compiler-host.gyp', expected, False) + + +TestTargetOveride() +TestTargetOverideCompilerOnly() + +test.pass_test() diff --git a/deps/gyp/test/compiler-override/gyptest-compiler-global-settings.py b/deps/gyp/test/compiler-override/gyptest-compiler-global-settings.py new file mode 100755 index 0000000000..d58fc7c2f9 --- /dev/null +++ b/deps/gyp/test/compiler-override/gyptest-compiler-global-settings.py @@ -0,0 +1,78 @@ +#!/usr/bin/env python +# 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. +""" +Verifies that make_global_settings can be used to override the +compiler settings. +""" + +import TestGyp +import os +import copy +import sys +from string import Template + + +if sys.platform == 'win32': + # cross compiling not support by ninja on windows + # and make not supported on windows at all. + sys.exit(0) + +test = TestGyp.TestGyp(formats=['ninja', 'make']) + +gypfile = 'compiler-global-settings.gyp' + +replacements = { 'PYTHON': '/usr/bin/python', 'PWD': os.getcwd()} + +# Process the .in gyp file to produce the final gyp file +# since we need to include absolute paths in the make_global_settings +# section. +replacements['TOOLSET'] = 'target' +s = Template(open(gypfile + '.in').read()) +output = open(gypfile, 'w') +output.write(s.substitute(replacements)) +output.close() + +old_env = dict(os.environ) +os.environ['GYP_CROSSCOMPILE'] = '1' +test.run_gyp(gypfile) +os.environ.clear() +os.environ.update(old_env) + +test.build(gypfile) +test.must_contain_all_lines(test.stdout(), ['my_cc.py', 'my_cxx.py', 'FOO']) + +# The xcode generator chokes on the 'host' toolset. Skip the rest of +# this test (cf. https://code.google.com/p/gyp/issues/detail?id=454). +if test.format == 'xcode-ninja': + test.pass_test() + +# Same again but with the host toolset. +replacements['TOOLSET'] = 'host' +s = Template(open(gypfile + '.in').read()) +output = open(gypfile, 'w') +output.write(s.substitute(replacements)) +output.close() + +old_env = dict(os.environ) +os.environ['GYP_CROSSCOMPILE'] = '1' +test.run_gyp(gypfile) +os.environ.clear() +os.environ.update(old_env) + +test.build(gypfile) +test.must_contain_all_lines(test.stdout(), ['my_cc.py', 'my_cxx.py', 'BAR']) + +# Check that CC_host overrides make_global_settings +old_env = dict(os.environ) +os.environ['CC_host'] = '%s %s/my_cc.py SECRET' % (replacements['PYTHON'], + replacements['PWD']) +test.run_gyp(gypfile) +os.environ.clear() +os.environ.update(old_env) + +test.build(gypfile) +test.must_contain_all_lines(test.stdout(), ['SECRET', 'my_cxx.py', 'BAR']) + +test.pass_test() diff --git a/deps/gyp/test/compiler-override/my_cc.py b/deps/gyp/test/compiler-override/my_cc.py new file mode 100755 index 0000000000..e2f0bdd51c --- /dev/null +++ b/deps/gyp/test/compiler-override/my_cc.py @@ -0,0 +1,6 @@ +#!/usr/bin/env python +# 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 sys +print sys.argv diff --git a/deps/gyp/test/compiler-override/my_cxx.py b/deps/gyp/test/compiler-override/my_cxx.py new file mode 100755 index 0000000000..e2f0bdd51c --- /dev/null +++ b/deps/gyp/test/compiler-override/my_cxx.py @@ -0,0 +1,6 @@ +#!/usr/bin/env python +# 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 sys +print sys.argv diff --git a/deps/gyp/test/compiler-override/my_ld.py b/deps/gyp/test/compiler-override/my_ld.py new file mode 100755 index 0000000000..e2f0bdd51c --- /dev/null +++ b/deps/gyp/test/compiler-override/my_ld.py @@ -0,0 +1,6 @@ +#!/usr/bin/env python +# 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 sys +print sys.argv diff --git a/deps/gyp/test/compiler-override/my_nm.py b/deps/gyp/test/compiler-override/my_nm.py new file mode 100755 index 0000000000..f0f1efcf73 --- /dev/null +++ b/deps/gyp/test/compiler-override/my_nm.py @@ -0,0 +1,8 @@ +#!/usr/bin/env python +# Copyright (c) 2014 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 sys +print sys.argv +with open('RAN_MY_NM', 'w') as f: + f.write('RAN_MY_NM') diff --git a/deps/gyp/test/compiler-override/my_readelf.py b/deps/gyp/test/compiler-override/my_readelf.py new file mode 100755 index 0000000000..40e303cd76 --- /dev/null +++ b/deps/gyp/test/compiler-override/my_readelf.py @@ -0,0 +1,8 @@ +#!/usr/bin/env python +# Copyright (c) 2014 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 sys +print sys.argv +with open('RAN_MY_READELF', 'w') as f: + f.write('RAN_MY_READELF') diff --git a/deps/gyp/test/compiler-override/test.c b/deps/gyp/test/compiler-override/test.c new file mode 100644 index 0000000000..517a353619 --- /dev/null +++ b/deps/gyp/test/compiler-override/test.c @@ -0,0 +1,7 @@ +// 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. + +// Deliberate C syntax error as this file should never be passed to +// the actual compiler +#error Should not be passed to a real compiler diff --git a/deps/gyp/test/conditions/elseif/elseif.gyp b/deps/gyp/test/conditions/elseif/elseif.gyp new file mode 100644 index 0000000000..6367ff7d7a --- /dev/null +++ b/deps/gyp/test/conditions/elseif/elseif.gyp @@ -0,0 +1,43 @@ +# Copyright (c) 2014 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +{ + 'targets': [ + { + 'variables': { 'test_var': 0 }, + 'target_name': 'program0', + 'type': 'executable', + 'sources': [ 'program.cc' ], + 'includes': [ 'elseif_conditions.gypi' ], + }, + { + 'variables': { 'test_var': 1 }, + 'target_name': 'program1', + 'type': 'executable', + 'sources': [ 'program.cc' ], + 'includes': [ 'elseif_conditions.gypi' ], + }, + { + 'variables': { 'test_var': 2 }, + 'target_name': 'program2', + 'type': 'executable', + 'sources': [ 'program.cc' ], + 'includes': [ 'elseif_conditions.gypi' ], + }, + { + 'variables': { 'test_var': 3 }, + 'target_name': 'program3', + 'type': 'executable', + 'sources': [ 'program.cc' ], + 'includes': [ 'elseif_conditions.gypi' ], + }, + { + 'variables': { 'test_var': 4 }, + 'target_name': 'program4', + 'type': 'executable', + 'sources': [ 'program.cc' ], + 'includes': [ 'elseif_conditions.gypi' ], + }, + ], +} diff --git a/deps/gyp/test/conditions/elseif/elseif_bad1.gyp b/deps/gyp/test/conditions/elseif/elseif_bad1.gyp new file mode 100644 index 0000000000..35c8455cca --- /dev/null +++ b/deps/gyp/test/conditions/elseif/elseif_bad1.gyp @@ -0,0 +1,20 @@ +# Copyright (c) 2014 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +# Trigger an error because of two consecutive string conditions. + +{ + 'targets': [ + { + 'variables': { 'test_var': 0 }, + 'target_name': 'program', + 'type': 'executable', + 'sources': [ 'program.cc' ], + 'conditions': [ + ['test_var==0', 'test_var==1', { + }], + ], + }, + ], +} diff --git a/deps/gyp/test/conditions/elseif/elseif_bad2.gyp b/deps/gyp/test/conditions/elseif/elseif_bad2.gyp new file mode 100644 index 0000000000..b529f292c0 --- /dev/null +++ b/deps/gyp/test/conditions/elseif/elseif_bad2.gyp @@ -0,0 +1,22 @@ +# Copyright (c) 2014 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +# Trigger an error because of two consecutive string conditions, even if the +# conditions are not actually evaluated. + +{ + 'targets': [ + { + 'variables': { 'test_var': 0 }, + 'target_name': 'program', + 'type': 'executable', + 'sources': [ 'program.cc' ], + 'conditions': [ + ['test_var==0', { + }, 'test_var==1', 'test_var==2', { + }], + ], + }, + ], +} diff --git a/deps/gyp/test/conditions/elseif/elseif_bad3.gyp b/deps/gyp/test/conditions/elseif/elseif_bad3.gyp new file mode 100644 index 0000000000..126e186053 --- /dev/null +++ b/deps/gyp/test/conditions/elseif/elseif_bad3.gyp @@ -0,0 +1,23 @@ +# Copyright (c) 2014 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +# Trigger an error because there are unexpected trailing items in a condition. + +{ + 'targets': [ + { + 'variables': { 'test_var': 0 }, + 'target_name': 'program', + 'type': 'executable', + 'sources': [ 'program.cc' ], + 'conditions': [ + ['test_var==0' { + }, 'test_var==1', { + }, { + }, 'test_var==2', { + }], + ], + }, + ], +} diff --git a/deps/gyp/test/conditions/elseif/elseif_conditions.gypi b/deps/gyp/test/conditions/elseif/elseif_conditions.gypi new file mode 100644 index 0000000000..4310ccc031 --- /dev/null +++ b/deps/gyp/test/conditions/elseif/elseif_conditions.gypi @@ -0,0 +1,15 @@ +{ + 'conditions': [ + ['test_var==0', { + 'defines': ['FOO="first_if"'], + }, 'test_var==1', { + 'defines': ['FOO="first_else_if"'], + }, 'test_var==2', { + 'defines': ['FOO="second_else_if"'], + }, 'test_var==3', { + 'defines': ['FOO="third_else_if"'], + }, { + 'defines': ['FOO="last_else"'], + }], + ], +} diff --git a/deps/gyp/test/conditions/elseif/gyptest_elseif.py b/deps/gyp/test/conditions/elseif/gyptest_elseif.py new file mode 100644 index 0000000000..9d030cf3fe --- /dev/null +++ b/deps/gyp/test/conditions/elseif/gyptest_elseif.py @@ -0,0 +1,33 @@ +#!/usr/bin/env python + +# Copyright (c) 2014 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. + +""" +Verify that "else-if" conditions work. +""" + +import TestGyp + +test = TestGyp.TestGyp() + +test.run_gyp('elseif.gyp') +test.build('elseif.gyp', test.ALL) +test.run_built_executable( + 'program0', stdout='first_if\n') +test.run_built_executable( + 'program1', stdout='first_else_if\n') +test.run_built_executable( + 'program2', stdout='second_else_if\n') +test.run_built_executable( + 'program3', stdout='third_else_if\n') +test.run_built_executable( + 'program4', stdout='last_else\n') + +# Verify that bad condition blocks fail at gyp time. +test.run_gyp('elseif_bad1.gyp', status=1, stderr=None) +test.run_gyp('elseif_bad2.gyp', status=1, stderr=None) +test.run_gyp('elseif_bad3.gyp', status=1, stderr=None) + +test.pass_test() diff --git a/deps/gyp/test/conditions/elseif/program.cc b/deps/gyp/test/conditions/elseif/program.cc new file mode 100644 index 0000000000..147fe2f75e --- /dev/null +++ b/deps/gyp/test/conditions/elseif/program.cc @@ -0,0 +1,10 @@ +// Copyright (c) 2014 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. + +#include <stdio.h> + +int main() { + printf("%s\n", FOO); + return 0; +} diff --git a/deps/gyp/test/configurations/basics/configurations.c b/deps/gyp/test/configurations/basics/configurations.c new file mode 100644 index 0000000000..39e13c9c83 --- /dev/null +++ b/deps/gyp/test/configurations/basics/configurations.c @@ -0,0 +1,15 @@ +#include <stdio.h> + +int main(void) +{ +#ifdef FOO + printf("Foo configuration\n"); +#endif +#ifdef DEBUG + printf("Debug configuration\n"); +#endif +#ifdef RELEASE + printf("Release configuration\n"); +#endif + return 0; +} diff --git a/deps/gyp/test/configurations/basics/configurations.gyp b/deps/gyp/test/configurations/basics/configurations.gyp new file mode 100644 index 0000000000..93f1d8d5c7 --- /dev/null +++ b/deps/gyp/test/configurations/basics/configurations.gyp @@ -0,0 +1,32 @@ +# Copyright (c) 2009 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. + +{ + 'targets': [ + { + 'target_name': 'configurations', + 'type': 'executable', + 'sources': [ + 'configurations.c', + ], + 'configurations': { + 'Debug': { + 'defines': [ + 'DEBUG', + ], + }, + 'Release': { + 'defines': [ + 'RELEASE', + ], + }, + 'Foo': { + 'defines': [ + 'FOO', + ], + }, + } + }, + ], +} diff --git a/deps/gyp/test/configurations/basics/gyptest-configurations.py b/deps/gyp/test/configurations/basics/gyptest-configurations.py new file mode 100755 index 0000000000..27cd2e87d2 --- /dev/null +++ b/deps/gyp/test/configurations/basics/gyptest-configurations.py @@ -0,0 +1,29 @@ +#!/usr/bin/env python + +# Copyright (c) 2009 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. + +""" +Verifies build of an executable in three different configurations. +""" + +import TestGyp + +test = TestGyp.TestGyp() + +test.run_gyp('configurations.gyp') + +test.set_configuration('Release') +test.build('configurations.gyp') +test.run_built_executable('configurations', stdout="Release configuration\n") + +test.set_configuration('Debug') +test.build('configurations.gyp') +test.run_built_executable('configurations', stdout="Debug configuration\n") + +test.set_configuration('Foo') +test.build('configurations.gyp') +test.run_built_executable('configurations', stdout="Foo configuration\n") + +test.pass_test() diff --git a/deps/gyp/test/configurations/inheritance/configurations.c b/deps/gyp/test/configurations/inheritance/configurations.c new file mode 100644 index 0000000000..ebb9f8450e --- /dev/null +++ b/deps/gyp/test/configurations/inheritance/configurations.c @@ -0,0 +1,21 @@ +#include <stdio.h> + +int main(void) +{ +#ifdef BASE + printf("Base configuration\n"); +#endif +#ifdef COMMON + printf("Common configuration\n"); +#endif +#ifdef COMMON2 + printf("Common2 configuration\n"); +#endif +#ifdef DEBUG + printf("Debug configuration\n"); +#endif +#ifdef RELEASE + printf("Release configuration\n"); +#endif + return 0; +} diff --git a/deps/gyp/test/configurations/inheritance/configurations.gyp b/deps/gyp/test/configurations/inheritance/configurations.gyp new file mode 100644 index 0000000000..9441376b4d --- /dev/null +++ b/deps/gyp/test/configurations/inheritance/configurations.gyp @@ -0,0 +1,40 @@ +# Copyright (c) 2009 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. + +{ + 'target_defaults': { + 'configurations': { + 'Base': { + 'abstract': 1, + 'defines': ['BASE'], + }, + 'Common': { + 'abstract': 1, + 'inherit_from': ['Base'], + 'defines': ['COMMON'], + }, + 'Common2': { + 'abstract': 1, + 'defines': ['COMMON2'], + }, + 'Debug': { + 'inherit_from': ['Common', 'Common2'], + 'defines': ['DEBUG'], + }, + 'Release': { + 'inherit_from': ['Common', 'Common2'], + 'defines': ['RELEASE'], + }, + }, + }, + 'targets': [ + { + 'target_name': 'configurations', + 'type': 'executable', + 'sources': [ + 'configurations.c', + ], + }, + ], +} diff --git a/deps/gyp/test/configurations/inheritance/duplicates.gyp b/deps/gyp/test/configurations/inheritance/duplicates.gyp new file mode 100644 index 0000000000..6930ce3b39 --- /dev/null +++ b/deps/gyp/test/configurations/inheritance/duplicates.gyp @@ -0,0 +1,27 @@ +# Copyright 2014 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. + +{ + 'target_defaults': { + 'default_configuration': 'A', + 'configurations': { + 'A': { + 'defines': ['SOMETHING'], + }, + 'B': { + 'inherit_from': ['A'], + }, + }, + 'cflags': ['-g'], + }, + 'targets': [ + { + 'target_name': 'configurations', + 'type': 'executable', + 'sources': [ + 'configurations.c', + ], + }, + ], +} diff --git a/deps/gyp/test/configurations/inheritance/duplicates.gypd.golden b/deps/gyp/test/configurations/inheritance/duplicates.gypd.golden new file mode 100644 index 0000000000..719b70861e --- /dev/null +++ b/deps/gyp/test/configurations/inheritance/duplicates.gypd.golden @@ -0,0 +1,12 @@ +{'_DEPTH': '.', + 'included_files': ['duplicates.gyp'], + 'targets': [{'configurations': {'A': {'cflags': ['-g'], + 'defines': ['SOMETHING']}, + 'B': {'cflags': ['-g'], + 'defines': ['SOMETHING'], + 'inherit_from': ['A']}}, + 'default_configuration': 'A', + 'sources': ['configurations.c'], + 'target_name': 'configurations', + 'toolset': 'target', + 'type': 'executable'}]} diff --git a/deps/gyp/test/configurations/inheritance/gyptest-duplicates.py b/deps/gyp/test/configurations/inheritance/gyptest-duplicates.py new file mode 100755 index 0000000000..46687b4549 --- /dev/null +++ b/deps/gyp/test/configurations/inheritance/gyptest-duplicates.py @@ -0,0 +1,34 @@ +#!/usr/bin/env python + +# Copyright 2014 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. + +""" +Verifies that configurations do not duplicate other settings. +""" + +import TestGyp + +test = TestGyp.TestGyp(format='gypd') + +test.run_gyp('duplicates.gyp') + +# Verify the duplicates.gypd against the checked-in expected contents. +# +# Normally, we should canonicalize line endings in the expected +# contents file setting the Subversion svn:eol-style to native, +# but that would still fail if multiple systems are sharing a single +# workspace on a network-mounted file system. Consequently, we +# massage the Windows line endings ('\r\n') in the output to the +# checked-in UNIX endings ('\n'). + +contents = test.read('duplicates.gypd').replace( + '\r', '').replace('\\\\', '/') +expect = test.read('duplicates.gypd.golden').replace('\r', '') +if not test.match(contents, expect): + print "Unexpected contents of `duplicates.gypd'" + test.diff(expect, contents, 'duplicates.gypd ') + test.fail_test() + +test.pass_test() diff --git a/deps/gyp/test/configurations/inheritance/gyptest-inheritance.py b/deps/gyp/test/configurations/inheritance/gyptest-inheritance.py new file mode 100755 index 0000000000..22c73a3754 --- /dev/null +++ b/deps/gyp/test/configurations/inheritance/gyptest-inheritance.py @@ -0,0 +1,33 @@ +#!/usr/bin/env python + +# Copyright (c) 2009 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. + +""" +Verifies build of an executable in three different configurations. +""" + +import TestGyp + +test = TestGyp.TestGyp() + +test.run_gyp('configurations.gyp') + +test.set_configuration('Release') +test.build('configurations.gyp') +test.run_built_executable('configurations', + stdout=('Base configuration\n' + 'Common configuration\n' + 'Common2 configuration\n' + 'Release configuration\n')) + +test.set_configuration('Debug') +test.build('configurations.gyp') +test.run_built_executable('configurations', + stdout=('Base configuration\n' + 'Common configuration\n' + 'Common2 configuration\n' + 'Debug configuration\n')) + +test.pass_test() diff --git a/deps/gyp/test/configurations/invalid/actions.gyp b/deps/gyp/test/configurations/invalid/actions.gyp new file mode 100644 index 0000000000..a6e42089eb --- /dev/null +++ b/deps/gyp/test/configurations/invalid/actions.gyp @@ -0,0 +1,18 @@ +# Copyright (c) 2010 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. + +{ + 'targets': [ + { + 'target_name': 'configurations', + 'type': 'none', + 'configurations': { + 'Debug': { + 'actions': [ + ], + }, + } + }, + ], +} diff --git a/deps/gyp/test/configurations/invalid/all_dependent_settings.gyp b/deps/gyp/test/configurations/invalid/all_dependent_settings.gyp new file mode 100644 index 0000000000..b16a245df5 --- /dev/null +++ b/deps/gyp/test/configurations/invalid/all_dependent_settings.gyp @@ -0,0 +1,18 @@ +# Copyright (c) 2010 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. + +{ + 'targets': [ + { + 'target_name': 'configurations', + 'type': 'none', + 'configurations': { + 'Debug': { + 'all_dependent_settings': [ + ], + }, + } + }, + ], +} diff --git a/deps/gyp/test/configurations/invalid/configurations.gyp b/deps/gyp/test/configurations/invalid/configurations.gyp new file mode 100644 index 0000000000..2cfc960049 --- /dev/null +++ b/deps/gyp/test/configurations/invalid/configurations.gyp @@ -0,0 +1,18 @@ +# Copyright (c) 2010 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. + +{ + 'targets': [ + { + 'target_name': 'configurations', + 'type': 'none', + 'configurations': { + 'Debug': { + 'configurations': [ + ], + }, + } + }, + ], +} diff --git a/deps/gyp/test/configurations/invalid/dependencies.gyp b/deps/gyp/test/configurations/invalid/dependencies.gyp new file mode 100644 index 0000000000..74633f3f11 --- /dev/null +++ b/deps/gyp/test/configurations/invalid/dependencies.gyp @@ -0,0 +1,18 @@ +# Copyright (c) 2010 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. + +{ + 'targets': [ + { + 'target_name': 'configurations', + 'type': 'none', + 'configurations': { + 'Debug': { + 'dependencies': [ + ], + }, + } + }, + ], +} diff --git a/deps/gyp/test/configurations/invalid/direct_dependent_settings.gyp b/deps/gyp/test/configurations/invalid/direct_dependent_settings.gyp new file mode 100644 index 0000000000..8a0f2e95ea --- /dev/null +++ b/deps/gyp/test/configurations/invalid/direct_dependent_settings.gyp @@ -0,0 +1,18 @@ +# Copyright (c) 2010 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. + +{ + 'targets': [ + { + 'target_name': 'configurations', + 'type': 'none', + 'configurations': { + 'Debug': { + 'direct_dependent_settings': [ + ], + }, + } + }, + ], +} diff --git a/deps/gyp/test/configurations/invalid/gyptest-configurations.py b/deps/gyp/test/configurations/invalid/gyptest-configurations.py new file mode 100755 index 0000000000..bd844b95dd --- /dev/null +++ b/deps/gyp/test/configurations/invalid/gyptest-configurations.py @@ -0,0 +1,36 @@ +#!/usr/bin/env python + +# Copyright (c) 2010 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. + +""" +Verifies build of an executable in three different configurations. +""" + +import TestGyp + +# Keys that do not belong inside a configuration dictionary. +invalid_configuration_keys = [ + 'actions', + 'all_dependent_settings', + 'configurations', + 'dependencies', + 'direct_dependent_settings', + 'libraries', + 'link_settings', + 'sources', + 'standalone_static_library', + 'target_name', + 'type', +] + +test = TestGyp.TestGyp() + +for test_key in invalid_configuration_keys: + test.run_gyp('%s.gyp' % test_key, status=1, stderr=None) + expect = ['%s not allowed in the Debug configuration, found in target ' + '%s.gyp:configurations#target' % (test_key, test_key)] + test.must_contain_all_lines(test.stderr(), expect) + +test.pass_test() diff --git a/deps/gyp/test/configurations/invalid/libraries.gyp b/deps/gyp/test/configurations/invalid/libraries.gyp new file mode 100644 index 0000000000..c4014ed406 --- /dev/null +++ b/deps/gyp/test/configurations/invalid/libraries.gyp @@ -0,0 +1,18 @@ +# Copyright (c) 2010 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. + +{ + 'targets': [ + { + 'target_name': 'configurations', + 'type': 'none', + 'configurations': { + 'Debug': { + 'libraries': [ + ], + }, + } + }, + ], +} diff --git a/deps/gyp/test/configurations/invalid/link_settings.gyp b/deps/gyp/test/configurations/invalid/link_settings.gyp new file mode 100644 index 0000000000..2f0e1c46f5 --- /dev/null +++ b/deps/gyp/test/configurations/invalid/link_settings.gyp @@ -0,0 +1,18 @@ +# Copyright (c) 2010 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. + +{ + 'targets': [ + { + 'target_name': 'configurations', + 'type': 'none', + 'configurations': { + 'Debug': { + 'link_settings': [ + ], + }, + } + }, + ], +} diff --git a/deps/gyp/test/configurations/invalid/sources.gyp b/deps/gyp/test/configurations/invalid/sources.gyp new file mode 100644 index 0000000000..b38cca0381 --- /dev/null +++ b/deps/gyp/test/configurations/invalid/sources.gyp @@ -0,0 +1,18 @@ +# Copyright (c) 2010 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. + +{ + 'targets': [ + { + 'target_name': 'configurations', + 'type': 'none', + 'configurations': { + 'Debug': { + 'sources': [ + ], + }, + } + }, + ], +} diff --git a/deps/gyp/test/configurations/invalid/standalone_static_library.gyp b/deps/gyp/test/configurations/invalid/standalone_static_library.gyp new file mode 100644 index 0000000000..2edb9febd6 --- /dev/null +++ b/deps/gyp/test/configurations/invalid/standalone_static_library.gyp @@ -0,0 +1,17 @@ +# 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. + +{ + 'targets': [ + { + 'target_name': 'configurations', + 'type': 'none', + 'configurations': { + 'Debug': { + 'standalone_static_library': 1, + }, + } + }, + ], +} diff --git a/deps/gyp/test/configurations/invalid/target_name.gyp b/deps/gyp/test/configurations/invalid/target_name.gyp new file mode 100644 index 0000000000..83baad95d6 --- /dev/null +++ b/deps/gyp/test/configurations/invalid/target_name.gyp @@ -0,0 +1,18 @@ +# Copyright (c) 2010 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. + +{ + 'targets': [ + { + 'target_name': 'configurations', + 'type': 'none', + 'configurations': { + 'Debug': { + 'target_name': [ + ], + }, + } + }, + ], +} diff --git a/deps/gyp/test/configurations/invalid/type.gyp b/deps/gyp/test/configurations/invalid/type.gyp new file mode 100644 index 0000000000..bc55898b89 --- /dev/null +++ b/deps/gyp/test/configurations/invalid/type.gyp @@ -0,0 +1,18 @@ +# Copyright (c) 2010 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. + +{ + 'targets': [ + { + 'target_name': 'configurations', + 'type': 'none', + 'configurations': { + 'Debug': { + 'type': [ + ], + }, + } + }, + ], +} diff --git a/deps/gyp/test/configurations/target_platform/configurations.gyp b/deps/gyp/test/configurations/target_platform/configurations.gyp new file mode 100644 index 0000000000..d15429f4e5 --- /dev/null +++ b/deps/gyp/test/configurations/target_platform/configurations.gyp @@ -0,0 +1,58 @@ +# Copyright (c) 2009 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. + +{ + 'target_defaults': { + 'configurations': { + 'Debug_Win32': { + 'msvs_configuration_platform': 'Win32', + }, + 'Debug_x64': { + 'msvs_configuration_platform': 'x64', + }, + }, + }, + 'targets': [ + { + 'target_name': 'left', + 'type': 'static_library', + 'sources': [ + 'left.c', + ], + 'configurations': { + 'Debug_Win32': { + 'msvs_target_platform': 'x64', + }, + }, + }, + { + 'target_name': 'right', + 'type': 'static_library', + 'sources': [ + 'right.c', + ], + }, + { + 'target_name': 'front_left', + 'type': 'executable', + 'dependencies': ['left'], + 'sources': [ + 'front.c', + ], + 'configurations': { + 'Debug_Win32': { + 'msvs_target_platform': 'x64', + }, + }, + }, + { + 'target_name': 'front_right', + 'type': 'executable', + 'dependencies': ['right'], + 'sources': [ + 'front.c', + ], + }, + ], +} diff --git a/deps/gyp/test/configurations/target_platform/front.c b/deps/gyp/test/configurations/target_platform/front.c new file mode 100644 index 0000000000..7a91689ff5 --- /dev/null +++ b/deps/gyp/test/configurations/target_platform/front.c @@ -0,0 +1,8 @@ +#include <stdio.h> + +const char *message(void); + +int main(void) { + printf("%s\n", message()); + return 0; +} diff --git a/deps/gyp/test/configurations/target_platform/gyptest-target_platform.py b/deps/gyp/test/configurations/target_platform/gyptest-target_platform.py new file mode 100755 index 0000000000..ae4e9e5a2d --- /dev/null +++ b/deps/gyp/test/configurations/target_platform/gyptest-target_platform.py @@ -0,0 +1,40 @@ +#!/usr/bin/env python + +# Copyright (c) 2009 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. + +""" +Tests the msvs specific msvs_target_platform option. +""" + +import TestGyp +import TestCommon + + +def RunX64(exe, stdout): + try: + test.run_built_executable(exe, stdout=stdout) + except WindowsError, e: + # Assume the exe is 64-bit if it can't load on 32-bit systems. + # Both versions of the error are required because different versions + # of python seem to return different errors for invalid exe type. + if e.errno != 193 and '[Error 193]' not in str(e): + raise + + +test = TestGyp.TestGyp(formats=['msvs']) + +test.run_gyp('configurations.gyp') + +test.set_configuration('Debug|x64') +test.build('configurations.gyp', rebuild=True) +RunX64('front_left', stdout=('left\n')) +RunX64('front_right', stdout=('right\n')) + +test.set_configuration('Debug|Win32') +test.build('configurations.gyp', rebuild=True) +RunX64('front_left', stdout=('left\n')) +test.run_built_executable('front_right', stdout=('right\n')) + +test.pass_test() diff --git a/deps/gyp/test/configurations/target_platform/left.c b/deps/gyp/test/configurations/target_platform/left.c new file mode 100644 index 0000000000..1ce2ea1227 --- /dev/null +++ b/deps/gyp/test/configurations/target_platform/left.c @@ -0,0 +1,3 @@ +const char *message(void) { + return "left"; +} diff --git a/deps/gyp/test/configurations/target_platform/right.c b/deps/gyp/test/configurations/target_platform/right.c new file mode 100644 index 0000000000..b1578492fe --- /dev/null +++ b/deps/gyp/test/configurations/target_platform/right.c @@ -0,0 +1,3 @@ +const char *message(void) { + return "right"; +} diff --git a/deps/gyp/test/configurations/x64/configurations.c b/deps/gyp/test/configurations/x64/configurations.c new file mode 100644 index 0000000000..37018438fc --- /dev/null +++ b/deps/gyp/test/configurations/x64/configurations.c @@ -0,0 +1,12 @@ +#include <stdio.h> + +int main(void) { + if (sizeof(void*) == 4) { + printf("Running Win32\n"); + } else if (sizeof(void*) == 8) { + printf("Running x64\n"); + } else { + printf("Unexpected platform\n"); + } + return 0; +} diff --git a/deps/gyp/test/configurations/x64/configurations.gyp b/deps/gyp/test/configurations/x64/configurations.gyp new file mode 100644 index 0000000000..8b0139f141 --- /dev/null +++ b/deps/gyp/test/configurations/x64/configurations.gyp @@ -0,0 +1,38 @@ +# Copyright (c) 2009 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. + +{ + 'target_defaults': { + 'configurations': { + 'Debug': { + 'msvs_configuration_platform': 'Win32', + }, + 'Debug_x64': { + 'inherit_from': ['Debug'], + 'msvs_configuration_platform': 'x64', + }, + }, + }, + 'targets': [ + { + 'target_name': 'configurations', + 'type': 'executable', + 'sources': [ + 'configurations.c', + ], + }, + { + 'target_name': 'configurations64', + 'type': 'executable', + 'sources': [ + 'configurations.c', + ], + 'configurations': { + 'Debug': { + 'msvs_target_platform': 'x64', + }, + }, + }, + ], +} diff --git a/deps/gyp/test/configurations/x64/gyptest-x86.py b/deps/gyp/test/configurations/x64/gyptest-x86.py new file mode 100755 index 0000000000..8675d8f7e7 --- /dev/null +++ b/deps/gyp/test/configurations/x64/gyptest-x86.py @@ -0,0 +1,31 @@ +#!/usr/bin/env python + +# 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. + +""" +Verifies build of an executable in three different configurations. +""" + +import TestGyp + +import sys + +formats = ['msvs'] +if sys.platform == 'win32': + formats += ['ninja'] +test = TestGyp.TestGyp(formats=formats) + +test.run_gyp('configurations.gyp') +test.set_configuration('Debug|Win32') +test.build('configurations.gyp', test.ALL) + +for machine, suffix in [('14C machine (x86)', ''), + ('8664 machine (x64)', '64')]: + output = test.run_dumpbin( + '/headers', test.built_file_path('configurations%s.exe' % suffix)) + if machine not in output: + test.fail_test() + +test.pass_test() diff --git a/deps/gyp/test/copies/gyptest-all.py b/deps/gyp/test/copies/gyptest-all.py new file mode 100755 index 0000000000..aeccf3324c --- /dev/null +++ b/deps/gyp/test/copies/gyptest-all.py @@ -0,0 +1,42 @@ +#!/usr/bin/env python + +# Copyright (c) 2009 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. + +""" +Verifies file copies using an explicit build target of 'all'. +""" + +import TestGyp + +test = TestGyp.TestGyp() + +test.run_gyp('copies.gyp', + '-G', 'xcode_ninja_target_pattern=^(?!copies_null)', + chdir='src') + +test.relocate('src', 'relocate/src') + +test.build('copies.gyp', test.ALL, chdir='relocate/src') + +test.must_match(['relocate', 'src', 'copies-out', 'file1'], 'file1 contents\n') + +test.built_file_must_match('copies-out/file2', + 'file2 contents\n', + chdir='relocate/src') + +test.built_file_must_match('copies-out/directory/file3', + 'file3 contents\n', + chdir='relocate/src') +test.built_file_must_match('copies-out/directory/file4', + 'file4 contents\n', + chdir='relocate/src') +test.built_file_must_match('copies-out/directory/subdir/file5', + 'file5 contents\n', + chdir='relocate/src') +test.built_file_must_match('copies-out/subdir/file6', + 'file6 contents\n', + chdir='relocate/src') + +test.pass_test() diff --git a/deps/gyp/test/copies/gyptest-attribs.py b/deps/gyp/test/copies/gyptest-attribs.py new file mode 100644 index 0000000000..70d717a45e --- /dev/null +++ b/deps/gyp/test/copies/gyptest-attribs.py @@ -0,0 +1,41 @@ +#!/usr/bin/env python + +# Copyright (c) 2013 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. + +""" +Verifies that copying files preserves file attributes. +""" + +import TestGyp + +import os +import stat +import sys + + +def check_attribs(path, expected_exec_bit): + out_path = test.built_file_path(path, chdir='src') + + in_stat = os.stat(os.path.join('src', path)) + out_stat = os.stat(out_path) + if out_stat.st_mode & stat.S_IXUSR != expected_exec_bit: + test.fail_test() + + +test = TestGyp.TestGyp() + +test.run_gyp('copies-attribs.gyp', chdir='src') + +test.build('copies-attribs.gyp', chdir='src') + +if sys.platform != 'win32': + out_path = test.built_file_path('executable-file.sh', chdir='src') + test.must_contain(out_path, + '#!/bin/bash\n' + '\n' + 'echo echo echo echo cho ho o o\n') + check_attribs('executable-file.sh', expected_exec_bit=stat.S_IXUSR) + +test.pass_test() diff --git a/deps/gyp/test/copies/gyptest-default.py b/deps/gyp/test/copies/gyptest-default.py new file mode 100755 index 0000000000..a916869f0d --- /dev/null +++ b/deps/gyp/test/copies/gyptest-default.py @@ -0,0 +1,42 @@ +#!/usr/bin/env python + +# Copyright (c) 2009 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. + +""" +Verifies file copies using the build tool default. +""" + +import TestGyp + +test = TestGyp.TestGyp() + +test.run_gyp('copies.gyp', + '-G', 'xcode_ninja_target_pattern=^(?!copies_null)', + chdir='src') + +test.relocate('src', 'relocate/src') + +test.build('copies.gyp', chdir='relocate/src') + +test.must_match(['relocate', 'src', 'copies-out', 'file1'], 'file1 contents\n') + +test.built_file_must_match('copies-out/file2', + 'file2 contents\n', + chdir='relocate/src') + +test.built_file_must_match('copies-out/directory/file3', + 'file3 contents\n', + chdir='relocate/src') +test.built_file_must_match('copies-out/directory/file4', + 'file4 contents\n', + chdir='relocate/src') +test.built_file_must_match('copies-out/directory/subdir/file5', + 'file5 contents\n', + chdir='relocate/src') +test.built_file_must_match('copies-out/subdir/file6', + 'file6 contents\n', + chdir='relocate/src') + +test.pass_test() diff --git a/deps/gyp/test/copies/gyptest-samedir.py b/deps/gyp/test/copies/gyptest-samedir.py new file mode 100755 index 0000000000..923ca61557 --- /dev/null +++ b/deps/gyp/test/copies/gyptest-samedir.py @@ -0,0 +1,28 @@ +#!/usr/bin/env python + +# Copyright (c) 2013 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. + +""" +Verifies file copies where two copies sections in the same target have the +same destination directory. +""" + +import TestGyp + +test = TestGyp.TestGyp() +test.run_gyp('copies-samedir.gyp', chdir='src') + +test.relocate('src', 'relocate/src') +test.build('copies-samedir.gyp', 'copies_samedir', chdir='relocate/src') + +test.built_file_must_match('copies-out-samedir/file1', + 'file1 contents\n', + chdir='relocate/src') + +test.built_file_must_match('copies-out-samedir/file2', + 'file2 contents\n', + chdir='relocate/src') + +test.pass_test() diff --git a/deps/gyp/test/copies/gyptest-slash.py b/deps/gyp/test/copies/gyptest-slash.py new file mode 100755 index 0000000000..f7a2e549eb --- /dev/null +++ b/deps/gyp/test/copies/gyptest-slash.py @@ -0,0 +1,39 @@ +#!/usr/bin/env python + +# Copyright (c) 2011 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. + +""" +Verifies file copies with a trailing slash in the destination directory. +""" + +import TestGyp + +test = TestGyp.TestGyp() +test.run_gyp('copies-slash.gyp', chdir='src') + +test.relocate('src', 'relocate/src') +test.build('copies-slash.gyp', chdir='relocate/src') + +test.built_file_must_match('copies-out-slash/directory/file3', + 'file3 contents\n', + chdir='relocate/src') +test.built_file_must_match('copies-out-slash/directory/file4', + 'file4 contents\n', + chdir='relocate/src') +test.built_file_must_match('copies-out-slash/directory/subdir/file5', + 'file5 contents\n', + chdir='relocate/src') + +test.built_file_must_match('copies-out-slash-2/directory/file3', + 'file3 contents\n', + chdir='relocate/src') +test.built_file_must_match('copies-out-slash-2/directory/file4', + 'file4 contents\n', + chdir='relocate/src') +test.built_file_must_match('copies-out-slash-2/directory/subdir/file5', + 'file5 contents\n', + chdir='relocate/src') + +test.pass_test() diff --git a/deps/gyp/test/copies/gyptest-updir.py b/deps/gyp/test/copies/gyptest-updir.py new file mode 100755 index 0000000000..a34ae70723 --- /dev/null +++ b/deps/gyp/test/copies/gyptest-updir.py @@ -0,0 +1,30 @@ +#!/usr/bin/env python + +# 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. + +""" +Verifies file copies where the destination is one level above an expansion that +yields a make variable. +""" + +import sys + +import TestGyp + +if sys.platform == 'darwin': + print "This test is currently disabled: https://crbug.com/483696." + sys.exit(0) + +test = TestGyp.TestGyp() +test.run_gyp('copies-updir.gyp', chdir='src') + +test.relocate('src', 'relocate/src') +test.build('copies-updir.gyp', 'copies_up', chdir='relocate/src') + +test.built_file_must_match('../copies-out-updir/file1', + 'file1 contents\n', + chdir='relocate/src') + +test.pass_test() diff --git a/deps/gyp/test/copies/src/copies-attribs.gyp b/deps/gyp/test/copies/src/copies-attribs.gyp new file mode 100644 index 0000000000..073e0d0cf6 --- /dev/null +++ b/deps/gyp/test/copies/src/copies-attribs.gyp @@ -0,0 +1,20 @@ +# Copyright (c) 2013 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. + +{ + 'targets': [ + { + 'target_name': 'copies1', + 'type': 'none', + 'copies': [ + { + 'destination': '<(PRODUCT_DIR)', + 'files': [ + 'executable-file.sh', + ], + }, + ], + }, + ], +} diff --git a/deps/gyp/test/copies/src/copies-samedir.gyp b/deps/gyp/test/copies/src/copies-samedir.gyp new file mode 100644 index 0000000000..2919ce503e --- /dev/null +++ b/deps/gyp/test/copies/src/copies-samedir.gyp @@ -0,0 +1,37 @@ +# Copyright (c) 2013 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. + +{ + 'targets': [ + { + 'target_name': 'copies_samedir', + 'type': 'none', + 'dependencies': [ + 'copies_samedir_dependency', + ], + 'copies': [ + { + 'destination': '<(PRODUCT_DIR)/copies-out-samedir', + 'files': [ + 'file1', + ], + }, + ], + }, + { + 'target_name': 'copies_samedir_dependency', + 'type': 'none', + 'direct_dependent_settings': { + 'copies': [ + { + 'destination': '<(PRODUCT_DIR)/copies-out-samedir', + 'files': [ + 'file2', + ], + }, + ], + }, + }, + ], +} diff --git a/deps/gyp/test/copies/src/copies-slash.gyp b/deps/gyp/test/copies/src/copies-slash.gyp new file mode 100644 index 0000000000..9bf54bd181 --- /dev/null +++ b/deps/gyp/test/copies/src/copies-slash.gyp @@ -0,0 +1,36 @@ +# Copyright (c) 2011 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. + +{ + 'targets': [ + # A trailing slash on the destination directory should be ignored. + { + 'target_name': 'copies_recursive_trailing_slash', + 'type': 'none', + 'copies': [ + { + 'destination': '<(PRODUCT_DIR)/copies-out-slash/', + 'files': [ + 'directory/', + ], + }, + ], + }, + # Even if the source directory is below <(PRODUCT_DIR). + { + 'target_name': 'copies_recursive_trailing_slash_in_product_dir', + 'type': 'none', + 'dependencies': [ ':copies_recursive_trailing_slash' ], + 'copies': [ + { + 'destination': '<(PRODUCT_DIR)/copies-out-slash-2/', + 'files': [ + '<(PRODUCT_DIR)/copies-out-slash/directory/', + ], + }, + ], + }, + ], +} + diff --git a/deps/gyp/test/copies/src/copies-updir.gyp b/deps/gyp/test/copies/src/copies-updir.gyp new file mode 100644 index 0000000000..bd3bfdd1d2 --- /dev/null +++ b/deps/gyp/test/copies/src/copies-updir.gyp @@ -0,0 +1,21 @@ +# 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. + +{ + 'targets': [ + { + 'target_name': 'copies_up', + 'type': 'none', + 'copies': [ + { + 'destination': '<(PRODUCT_DIR)/../copies-out-updir', + 'files': [ + 'file1', + ], + }, + ], + }, + ], +} + diff --git a/deps/gyp/test/copies/src/copies.gyp b/deps/gyp/test/copies/src/copies.gyp new file mode 100644 index 0000000000..ce2e0cabca --- /dev/null +++ b/deps/gyp/test/copies/src/copies.gyp @@ -0,0 +1,70 @@ +# Copyright (c) 2009 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. + +{ + 'targets': [ + { + 'target_name': 'copies1', + 'type': 'none', + 'copies': [ + { + 'destination': 'copies-out', + 'files': [ + 'file1', + ], + }, + ], + }, + { + 'target_name': 'copies2', + 'type': 'none', + 'copies': [ + { + 'destination': '<(PRODUCT_DIR)/copies-out', + 'files': [ + 'file2', + ], + }, + ], + }, + # Copy a directory tree. + { + 'target_name': 'copies_recursive', + 'type': 'none', + 'copies': [ + { + 'destination': '<(PRODUCT_DIR)/copies-out', + 'files': [ + 'directory/', + ], + }, + ], + }, + # Copy a directory from deeper in the tree (this should not reproduce the + # entire directory path in the destination, only the final directory). + { + 'target_name': 'copies_recursive_depth', + 'type': 'none', + 'copies': [ + { + 'destination': '<(PRODUCT_DIR)/copies-out', + 'files': [ + 'parentdir/subdir/', + ], + }, + ], + }, + # Verify that a null 'files' list doesn't gag the generators. + { + 'target_name': 'copies_null', + 'type': 'none', + 'copies': [ + { + 'destination': '<(PRODUCT_DIR)/copies-null', + 'files': [], + }, + ], + }, + ], +} diff --git a/deps/gyp/test/copies/src/directory/file3 b/deps/gyp/test/copies/src/directory/file3 new file mode 100644 index 0000000000..43f16f3522 --- /dev/null +++ b/deps/gyp/test/copies/src/directory/file3 @@ -0,0 +1 @@ +file3 contents diff --git a/deps/gyp/test/copies/src/directory/file4 b/deps/gyp/test/copies/src/directory/file4 new file mode 100644 index 0000000000..5f7270a084 --- /dev/null +++ b/deps/gyp/test/copies/src/directory/file4 @@ -0,0 +1 @@ +file4 contents diff --git a/deps/gyp/test/copies/src/directory/subdir/file5 b/deps/gyp/test/copies/src/directory/subdir/file5 new file mode 100644 index 0000000000..41f47186bd --- /dev/null +++ b/deps/gyp/test/copies/src/directory/subdir/file5 @@ -0,0 +1 @@ +file5 contents diff --git a/deps/gyp/test/copies/src/executable-file.sh b/deps/gyp/test/copies/src/executable-file.sh new file mode 100755 index 0000000000..796953a1a2 --- /dev/null +++ b/deps/gyp/test/copies/src/executable-file.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +echo echo echo echo cho ho o o diff --git a/deps/gyp/test/copies/src/file1 b/deps/gyp/test/copies/src/file1 new file mode 100644 index 0000000000..84d55c5759 --- /dev/null +++ b/deps/gyp/test/copies/src/file1 @@ -0,0 +1 @@ +file1 contents diff --git a/deps/gyp/test/copies/src/file2 b/deps/gyp/test/copies/src/file2 new file mode 100644 index 0000000000..af1b8ae35d --- /dev/null +++ b/deps/gyp/test/copies/src/file2 @@ -0,0 +1 @@ +file2 contents diff --git a/deps/gyp/test/copies/src/parentdir/subdir/file6 b/deps/gyp/test/copies/src/parentdir/subdir/file6 new file mode 100644 index 0000000000..f5d5757348 --- /dev/null +++ b/deps/gyp/test/copies/src/parentdir/subdir/file6 @@ -0,0 +1 @@ +file6 contents diff --git a/deps/gyp/test/custom-generator/gyptest-custom-generator.py b/deps/gyp/test/custom-generator/gyptest-custom-generator.py new file mode 100755 index 0000000000..85fd0724a1 --- /dev/null +++ b/deps/gyp/test/custom-generator/gyptest-custom-generator.py @@ -0,0 +1,18 @@ +#!/usr/bin/env python +# 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. + +"""Test that custom generators can be passed to --format +""" + +import TestGyp + +test = TestGyp.TestGypCustom(format='mygenerator.py') +test.run_gyp('test.gyp') + +# mygenerator.py should generate a file called MyBuildFile containing +# "Testing..." alongside the gyp file. +test.must_match('MyBuildFile', 'Testing...\n') + +test.pass_test() diff --git a/deps/gyp/test/custom-generator/mygenerator.py b/deps/gyp/test/custom-generator/mygenerator.py new file mode 100644 index 0000000000..8eb4c2de1b --- /dev/null +++ b/deps/gyp/test/custom-generator/mygenerator.py @@ -0,0 +1,14 @@ +# 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. + +"""Custom gyp generator that doesn't do much.""" + +import gyp.common + +generator_default_variables = {} + +def GenerateOutput(target_list, target_dicts, data, params): + f = open("MyBuildFile", "wb") + f.write("Testing...\n") + f.close() diff --git a/deps/gyp/test/custom-generator/test.gyp b/deps/gyp/test/custom-generator/test.gyp new file mode 100644 index 0000000000..aa5f864a3b --- /dev/null +++ b/deps/gyp/test/custom-generator/test.gyp @@ -0,0 +1,15 @@ +# Copyright (c) 2010 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. + +{ + 'targets': [ + { + 'target_name': 'exe', + 'type': 'executable', + 'sources': [ + 'main.c', + ], + }, + ], +} diff --git a/deps/gyp/test/cxxflags/cxxflags.cc b/deps/gyp/test/cxxflags/cxxflags.cc new file mode 100644 index 0000000000..e70e39dfd3 --- /dev/null +++ b/deps/gyp/test/cxxflags/cxxflags.cc @@ -0,0 +1,15 @@ +/* Copyright (c) 2010 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. */ + +#include <stdio.h> + +int main(void) +{ +#ifdef ABC + printf("With define\n"); +#else + printf("No define\n"); +#endif + return 0; +} diff --git a/deps/gyp/test/cxxflags/cxxflags.gyp b/deps/gyp/test/cxxflags/cxxflags.gyp new file mode 100644 index 0000000000..a082d49492 --- /dev/null +++ b/deps/gyp/test/cxxflags/cxxflags.gyp @@ -0,0 +1,15 @@ +# Copyright (c) 2010 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. + +{ + 'targets': [ + { + 'target_name': 'cxxflags', + 'type': 'executable', + 'sources': [ + 'cxxflags.cc', + ], + }, + ], +} diff --git a/deps/gyp/test/cxxflags/gyptest-cxxflags.py b/deps/gyp/test/cxxflags/gyptest-cxxflags.py new file mode 100755 index 0000000000..117a1800de --- /dev/null +++ b/deps/gyp/test/cxxflags/gyptest-cxxflags.py @@ -0,0 +1,45 @@ +#!/usr/bin/env python + +# 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. + +""" +Verifies the use of the environment during regeneration when the gyp file +changes, specifically via build of an executable with C++ flags specified by +CXXFLAGS. + +In this test, gyp happens within a local environment, but build outside of it. +""" + +import TestGyp + +FORMATS = ('ninja',) + +test = TestGyp.TestGyp(formats=FORMATS) + +# We reset the environ after calling gyp. When the auto-regeneration happens, +# the same define should be reused anyway. +with TestGyp.LocalEnv({'CXXFLAGS': ''}): + test.run_gyp('cxxflags.gyp') + +test.build('cxxflags.gyp') + +expect = """\ +No define +""" +test.run_built_executable('cxxflags', stdout=expect) + +test.sleep() + +with TestGyp.LocalEnv({'CXXFLAGS': '-DABC'}): + test.run_gyp('cxxflags.gyp') + +test.build('cxxflags.gyp') + +expect = """\ +With define +""" +test.run_built_executable('cxxflags', stdout=expect) + +test.pass_test() diff --git a/deps/gyp/test/defines-escaping/defines-escaping.c b/deps/gyp/test/defines-escaping/defines-escaping.c new file mode 100644 index 0000000000..a0aa4c286d --- /dev/null +++ b/deps/gyp/test/defines-escaping/defines-escaping.c @@ -0,0 +1,11 @@ +/* Copyright (c) 2010 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. */ + +#include <stdio.h> + +int main(void) +{ + printf(TEST_FORMAT, TEST_ARGS); + return 0; +} diff --git a/deps/gyp/test/defines-escaping/defines-escaping.gyp b/deps/gyp/test/defines-escaping/defines-escaping.gyp new file mode 100644 index 0000000000..6f0f3fde41 --- /dev/null +++ b/deps/gyp/test/defines-escaping/defines-escaping.gyp @@ -0,0 +1,19 @@ +# Copyright (c) 2009 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. + +{ + 'targets': [ + { + 'target_name': 'defines_escaping', + 'type': 'executable', + 'sources': [ + 'defines-escaping.c', + ], + 'defines': [ + 'TEST_FORMAT="<(test_format)"', + 'TEST_ARGS=<(test_args)', + ], + }, + ], +} diff --git a/deps/gyp/test/defines-escaping/gyptest-defines-escaping.py b/deps/gyp/test/defines-escaping/gyptest-defines-escaping.py new file mode 100755 index 0000000000..eb18a3d369 --- /dev/null +++ b/deps/gyp/test/defines-escaping/gyptest-defines-escaping.py @@ -0,0 +1,184 @@ +#!/usr/bin/env python + +# Copyright (c) 2010 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. + +""" +Verifies build of an executable with C++ define specified by a gyp define using +various special characters such as quotes, commas, etc. +""" + +import os +import TestGyp + +test = TestGyp.TestGyp() + +# Tests string literals, percents, and backslash escapes. +try: + os.environ['GYP_DEFINES'] = ( + r"""test_format='\n%s\n' """ + r"""test_args='"Simple test of %s with a literal"'""") + test.run_gyp('defines-escaping.gyp') +finally: + del os.environ['GYP_DEFINES'] + +test.build('defines-escaping.gyp') + +expect = """ +Simple test of %s with a literal +""" +test.run_built_executable('defines_escaping', stdout=expect) + + +# Test multiple comma-and-space-separated string literals. +try: + os.environ['GYP_DEFINES'] = \ + r"""test_format='\n%s and %s\n' test_args='"foo", "bar"'""" + test.run_gyp('defines-escaping.gyp') +finally: + del os.environ['GYP_DEFINES'] + +test.sleep() +test.touch('defines-escaping.c') +test.build('defines-escaping.gyp') + +expect = """ +foo and bar +""" +test.run_built_executable('defines_escaping', stdout=expect) + + +# Test string literals containing quotes. +try: + os.environ['GYP_DEFINES'] = ( + r"""test_format='\n%s %s %s %s %s\n' """ + r"""test_args='"\"These,\"",""" + r""" "\"words,\"",""" + r""" "\"are,\"",""" + r""" "\"in,\"",""" + r""" "\"quotes.\""'""") + test.run_gyp('defines-escaping.gyp') +finally: + del os.environ['GYP_DEFINES'] + +test.sleep() +test.touch('defines-escaping.c') +test.build('defines-escaping.gyp') + +expect = """ +"These," "words," "are," "in," "quotes." +""" +test.run_built_executable('defines_escaping', stdout=expect) + + +# Test string literals containing single quotes. +try: + os.environ['GYP_DEFINES'] = ( + r"""test_format='\n%s %s %s %s %s\n' """ + r"""test_args="\"'These,'\",""" + r""" \"'words,'\",""" + r""" \"'are,'\",""" + r""" \"'in,'\",""" + r""" \"'quotes.'\"" """) + test.run_gyp('defines-escaping.gyp') +finally: + del os.environ['GYP_DEFINES'] + +test.sleep() +test.touch('defines-escaping.c') +test.build('defines-escaping.gyp') + +expect = """ +'These,' 'words,' 'are,' 'in,' 'quotes.' +""" +test.run_built_executable('defines_escaping', stdout=expect) + + +# Test string literals containing different numbers of backslashes before quotes +# (to exercise Windows' quoting behaviour). +try: + os.environ['GYP_DEFINES'] = ( + r"""test_format='\n%s\n%s\n%s\n' """ + r"""test_args='"\\\"1 visible slash\\\"",""" + r""" "\\\\\"2 visible slashes\\\\\"",""" + r""" "\\\\\\\"3 visible slashes\\\\\\\""'""") + test.run_gyp('defines-escaping.gyp') +finally: + del os.environ['GYP_DEFINES'] + +test.sleep() +test.touch('defines-escaping.c') +test.build('defines-escaping.gyp') + +expect = r""" +\"1 visible slash\" +\\"2 visible slashes\\" +\\\"3 visible slashes\\\" +""" +test.run_built_executable('defines_escaping', stdout=expect) + + +# Test that various scary sequences are passed unfettered. +try: + os.environ['GYP_DEFINES'] = ( + r"""test_format='\n%s\n' """ + r"""test_args='"$foo, " `foo`;"'""") + test.run_gyp('defines-escaping.gyp') +finally: + del os.environ['GYP_DEFINES'] + +test.sleep() +test.touch('defines-escaping.c') +test.build('defines-escaping.gyp') + +expect = """ +$foo, " `foo`; +""" +test.run_built_executable('defines_escaping', stdout=expect) + + +# VisualStudio 2010 can't handle passing %PATH% +if not (test.format == 'msvs' and test.uses_msbuild): + try: + os.environ['GYP_DEFINES'] = ( + """test_format='%s' """ + """test_args='"%PATH%"'""") + test.run_gyp('defines-escaping.gyp') + finally: + del os.environ['GYP_DEFINES'] + + test.sleep() + test.touch('defines-escaping.c') + test.build('defines-escaping.gyp') + + expect = "%PATH%" + test.run_built_executable('defines_escaping', stdout=expect) + + +# Test commas and semi-colons preceded by backslashes (to exercise Windows' +# quoting behaviour). +try: + os.environ['GYP_DEFINES'] = ( + r"""test_format='\n%s\n%s\n' """ + r"""test_args='"\\, \\\\;",""" + # Same thing again, but enclosed in visible quotes. + r""" "\"\\, \\\\;\""'""") + test.run_gyp('defines-escaping.gyp') +finally: + del os.environ['GYP_DEFINES'] + +test.sleep() +test.touch('defines-escaping.c') +test.build('defines-escaping.gyp') + +expect = r""" +\, \\; +"\, \\;" +""" +test.run_built_executable('defines_escaping', stdout=expect) + +# We deliberately do not test having an odd number of quotes in a string +# literal because that isn't feasible in MSVS. + +test.pass_test() diff --git a/deps/gyp/test/defines/defines-env.gyp b/deps/gyp/test/defines/defines-env.gyp new file mode 100644 index 0000000000..1781546ae0 --- /dev/null +++ b/deps/gyp/test/defines/defines-env.gyp @@ -0,0 +1,22 @@ +# Copyright (c) 2009 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. + +{ + 'variables': { + 'value%': '5', + }, + 'targets': [ + { + 'target_name': 'defines', + 'type': 'executable', + 'sources': [ + 'defines.c', + ], + 'defines': [ + 'VALUE=<(value)', + ], + }, + ], +} + diff --git a/deps/gyp/test/defines/defines.c b/deps/gyp/test/defines/defines.c new file mode 100644 index 0000000000..dda139275d --- /dev/null +++ b/deps/gyp/test/defines/defines.c @@ -0,0 +1,23 @@ +/* Copyright (c) 2011 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. */ + +#include <stdio.h> + +int main(void) +{ +#ifdef FOO + printf("FOO is defined\n"); +#endif + printf("VALUE is %d\n", VALUE); + +#ifdef PAREN_VALUE + printf("2*PAREN_VALUE is %d\n", 2*PAREN_VALUE); +#endif + +#ifdef HASH_VALUE + printf("HASH_VALUE is %s\n", HASH_VALUE); +#endif + + return 0; +} diff --git a/deps/gyp/test/defines/defines.gyp b/deps/gyp/test/defines/defines.gyp new file mode 100644 index 0000000000..90a755eb84 --- /dev/null +++ b/deps/gyp/test/defines/defines.gyp @@ -0,0 +1,38 @@ +# Copyright (c) 2009 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. + +{ + 'targets': [ + { + 'target_name': 'defines', + 'type': 'executable', + 'sources': [ + 'defines.c', + ], + 'defines': [ + 'FOO', + 'VALUE=1', + 'PAREN_VALUE=(1+2+3)', + 'HASH_VALUE="a#1"', + ], + }, + ], + 'conditions': [ + ['OS=="fakeos"', { + 'targets': [ + { + 'target_name': 'fakeosprogram', + 'type': 'executable', + 'sources': [ + 'defines.c', + ], + 'defines': [ + 'FOO', + 'VALUE=1', + ], + }, + ], + }], + ], +} diff --git a/deps/gyp/test/defines/gyptest-define-override.py b/deps/gyp/test/defines/gyptest-define-override.py new file mode 100755 index 0000000000..9730455b67 --- /dev/null +++ b/deps/gyp/test/defines/gyptest-define-override.py @@ -0,0 +1,43 @@ +#!/usr/bin/env python + +# Copyright (c) 2009 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. + +""" +Verifies that a default gyp define can be overridden. +""" + +import os +import TestGyp + +test = TestGyp.TestGyp() + +# CMake loudly warns about passing '#' to the compiler and drops the define. +expect_stderr = '' +if test.format == 'cmake': + expect_stderr = ( +"""WARNING: Preprocessor definitions containing '#' may not be passed on the""" +""" compiler command line because many compilers do not support it.\n""" +"""CMake is dropping a preprocessor definition: HASH_VALUE="a#1"\n""" +"""Consider defining the macro in a (configured) header file.\n\n""") + +# Command-line define +test.run_gyp('defines.gyp', '-D', 'OS=fakeos') +test.build('defines.gyp', stderr=expect_stderr) +test.built_file_must_exist('fakeosprogram', type=test.EXECUTABLE) +# Clean up the exe so subsequent tests don't find an old exe. +os.remove(test.built_file_path('fakeosprogram', type=test.EXECUTABLE)) + +# Without "OS" override, fokeosprogram shouldn't be built. +test.run_gyp('defines.gyp') +test.build('defines.gyp', stderr=expect_stderr) +test.built_file_must_not_exist('fakeosprogram', type=test.EXECUTABLE) + +# Environment define +os.environ['GYP_DEFINES'] = 'OS=fakeos' +test.run_gyp('defines.gyp') +test.build('defines.gyp', stderr=expect_stderr) +test.built_file_must_exist('fakeosprogram', type=test.EXECUTABLE) + +test.pass_test() diff --git a/deps/gyp/test/defines/gyptest-defines-env-regyp.py b/deps/gyp/test/defines/gyptest-defines-env-regyp.py new file mode 100755 index 0000000000..f2d931c2f7 --- /dev/null +++ b/deps/gyp/test/defines/gyptest-defines-env-regyp.py @@ -0,0 +1,51 @@ +#!/usr/bin/env python + +# 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. + +""" +Verifies build of an executable with C++ define specified by a gyp define, and +the use of the environment during regeneration when the gyp file changes. +""" + +import os +import TestGyp + +# Regenerating build files when a gyp file changes is currently only supported +# by the make generator. +test = TestGyp.TestGyp(formats=['make']) + +try: + os.environ['GYP_DEFINES'] = 'value=50' + test.run_gyp('defines.gyp') +finally: + # We clear the environ after calling gyp. When the auto-regeneration happens, + # the same define should be reused anyway. Reset to empty string first in + # case the platform doesn't support unsetenv. + os.environ['GYP_DEFINES'] = '' + del os.environ['GYP_DEFINES'] + +test.build('defines.gyp') + +expect = """\ +FOO is defined +VALUE is 1 +2*PAREN_VALUE is 12 +HASH_VALUE is a#1 +""" +test.run_built_executable('defines', stdout=expect) + +# Sleep so that the changed gyp file will have a newer timestamp than the +# previously generated build files. +test.sleep() +test.write('defines.gyp', test.read('defines-env.gyp')) + +test.build('defines.gyp', test.ALL) + +expect = """\ +VALUE is 50 +""" +test.run_built_executable('defines', stdout=expect) + +test.pass_test() diff --git a/deps/gyp/test/defines/gyptest-defines-env.py b/deps/gyp/test/defines/gyptest-defines-env.py new file mode 100755 index 0000000000..6b4e7175a6 --- /dev/null +++ b/deps/gyp/test/defines/gyptest-defines-env.py @@ -0,0 +1,85 @@ +#!/usr/bin/env python + +# Copyright (c) 2009 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. + +""" +Verifies build of an executable with C++ define specified by a gyp define. +""" + +import os +import TestGyp + +test = TestGyp.TestGyp() + +# With the value only given in environment, it should be used. +try: + os.environ['GYP_DEFINES'] = 'value=10' + test.run_gyp('defines-env.gyp') +finally: + del os.environ['GYP_DEFINES'] + +test.build('defines-env.gyp') + +expect = """\ +VALUE is 10 +""" +test.run_built_executable('defines', stdout=expect) + + +# With the value given in both command line and environment, +# command line should take precedence. +try: + os.environ['GYP_DEFINES'] = 'value=20' + test.run_gyp('defines-env.gyp', '-Dvalue=25') +finally: + del os.environ['GYP_DEFINES'] + +test.sleep() +test.touch('defines.c') +test.build('defines-env.gyp') + +expect = """\ +VALUE is 25 +""" +test.run_built_executable('defines', stdout=expect) + + +# With the value only given in environment, it should be ignored if +# --ignore-environment is specified. +try: + os.environ['GYP_DEFINES'] = 'value=30' + test.run_gyp('defines-env.gyp', '--ignore-environment') +finally: + del os.environ['GYP_DEFINES'] + +test.sleep() +test.touch('defines.c') +test.build('defines-env.gyp') + +expect = """\ +VALUE is 5 +""" +test.run_built_executable('defines', stdout=expect) + + +# With the value given in both command line and environment, and +# --ignore-environment also specified, command line should still be used. +try: + os.environ['GYP_DEFINES'] = 'value=40' + test.run_gyp('defines-env.gyp', '--ignore-environment', '-Dvalue=45') +finally: + del os.environ['GYP_DEFINES'] + +test.sleep() +test.touch('defines.c') +test.build('defines-env.gyp') + +expect = """\ +VALUE is 45 +""" +test.run_built_executable('defines', stdout=expect) + + +test.pass_test() diff --git a/deps/gyp/test/defines/gyptest-defines.py b/deps/gyp/test/defines/gyptest-defines.py new file mode 100755 index 0000000000..77a3af53b9 --- /dev/null +++ b/deps/gyp/test/defines/gyptest-defines.py @@ -0,0 +1,39 @@ +#!/usr/bin/env python + +# Copyright (c) 2011 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. + +""" +Verifies build of an executable with C++ defines. +""" + +import TestGyp + +test = TestGyp.TestGyp() + +test.run_gyp('defines.gyp') + +expect = """\ +FOO is defined +VALUE is 1 +2*PAREN_VALUE is 12 +""" + +#CMake loudly warns about passing '#' to the compiler and drops the define. +expect_stderr = '' +if test.format == 'cmake': + expect_stderr = ( +"""WARNING: Preprocessor definitions containing '#' may not be passed on the""" +""" compiler command line because many compilers do not support it.\n""" +"""CMake is dropping a preprocessor definition: HASH_VALUE="a#1"\n""" +"""Consider defining the macro in a (configured) header file.\n\n""") +else: + expect += """HASH_VALUE is a#1 +""" + +test.build('defines.gyp', stderr=expect_stderr) + +test.run_built_executable('defines', stdout=expect) + +test.pass_test() diff --git a/deps/gyp/test/dependencies/a.c b/deps/gyp/test/dependencies/a.c new file mode 100755 index 0000000000..3bba111d24 --- /dev/null +++ b/deps/gyp/test/dependencies/a.c @@ -0,0 +1,9 @@ +/* Copyright (c) 2009 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. */ + +extern int funcB(); + +int funcA() { + return funcB(); +} diff --git a/deps/gyp/test/dependencies/adso/all_dependent_settings_order.gyp b/deps/gyp/test/dependencies/adso/all_dependent_settings_order.gyp new file mode 100644 index 0000000000..89817d6bbb --- /dev/null +++ b/deps/gyp/test/dependencies/adso/all_dependent_settings_order.gyp @@ -0,0 +1,45 @@ +{ + 'targets': [ + { + 'target_name': 'a', + 'type': 'none', + 'sources': ['a.cc'], + 'all_dependent_settings': {'sources': ['a.cc']}, + }, + { + 'target_name': 'b', + 'type': 'none', + 'sources': ['b.cc'], + 'all_dependent_settings': {'sources': ['b.cc']}, + 'dependencies': ['a'], + }, + + { + 'target_name': 'c', + 'type': 'none', + 'sources': ['c.cc'], + 'all_dependent_settings': {'sources': ['c.cc']}, + 'dependencies': ['b', 'a'], + }, + { + 'target_name': 'd', + 'type': 'none', + 'sources': ['d.cc'], + 'dependencies': ['c', 'a', 'b'], + 'actions': [ + { + 'action_name': 'write_sources', + 'inputs': ['write_args.py'], + 'outputs': ['<(PRODUCT_DIR)/out.txt'], + 'action': [ + 'python', + 'write_args.py', + '<(PRODUCT_DIR)/out.txt', + '>@(_sources)' + ], + 'msvs_cygwin_shell': 0, + }, + ], + }, + ], +} diff --git a/deps/gyp/test/dependencies/adso/write_args.py b/deps/gyp/test/dependencies/adso/write_args.py new file mode 100755 index 0000000000..cc87cf5192 --- /dev/null +++ b/deps/gyp/test/dependencies/adso/write_args.py @@ -0,0 +1,11 @@ +#!/usr/bin/env python + +# Copyright 2015 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 sys + +f = open(sys.argv[1], 'wb') +f.write(' '.join(sys.argv[2:])) +f.close() diff --git a/deps/gyp/test/dependencies/b/b.c b/deps/gyp/test/dependencies/b/b.c new file mode 100755 index 0000000000..b5e771bcc7 --- /dev/null +++ b/deps/gyp/test/dependencies/b/b.c @@ -0,0 +1,3 @@ +int funcB() { + return 2; +} diff --git a/deps/gyp/test/dependencies/b/b.gyp b/deps/gyp/test/dependencies/b/b.gyp new file mode 100755 index 0000000000..893dc64d65 --- /dev/null +++ b/deps/gyp/test/dependencies/b/b.gyp @@ -0,0 +1,22 @@ +# Copyright (c) 2009 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. + +{ + 'targets': [ + { + 'target_name': 'b', + 'type': 'static_library', + 'sources': [ + 'b.c', + ], + }, + { + 'target_name': 'b3', + 'type': 'static_library', + 'sources': [ + 'b3.c', + ], + }, + ], +} diff --git a/deps/gyp/test/dependencies/b/b3.c b/deps/gyp/test/dependencies/b/b3.c new file mode 100755 index 0000000000..287f67ff31 --- /dev/null +++ b/deps/gyp/test/dependencies/b/b3.c @@ -0,0 +1,9 @@ +/* + * Copyright (c) 2011 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. + */ + +int funcB() { + return 3; +} diff --git a/deps/gyp/test/dependencies/c/c.c b/deps/gyp/test/dependencies/c/c.c new file mode 100644 index 0000000000..4949daf3ee --- /dev/null +++ b/deps/gyp/test/dependencies/c/c.c @@ -0,0 +1,4 @@ +int funcC() { + return 3 + // Intentional syntax error. This file should never be compiled, so this + // shouldn't be a problem. diff --git a/deps/gyp/test/dependencies/c/c.gyp b/deps/gyp/test/dependencies/c/c.gyp new file mode 100644 index 0000000000..eabebea9ef --- /dev/null +++ b/deps/gyp/test/dependencies/c/c.gyp @@ -0,0 +1,22 @@ +# Copyright (c) 2009 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. + +{ + 'targets': [ + { + 'target_name': 'c_unused', + 'type': 'static_library', + 'sources': [ + 'c.c', + ], + }, + { + 'target_name': 'd', + 'type': 'static_library', + 'sources': [ + 'd.c', + ], + }, + ], +} diff --git a/deps/gyp/test/dependencies/c/d.c b/deps/gyp/test/dependencies/c/d.c new file mode 100644 index 0000000000..05465fc1af --- /dev/null +++ b/deps/gyp/test/dependencies/c/d.c @@ -0,0 +1,3 @@ +int funcD() { + return 4; +} diff --git a/deps/gyp/test/dependencies/double_dependency.gyp b/deps/gyp/test/dependencies/double_dependency.gyp new file mode 100644 index 0000000000..c4a2d00139 --- /dev/null +++ b/deps/gyp/test/dependencies/double_dependency.gyp @@ -0,0 +1,23 @@ +# 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. + +{ + 'targets': [ + { + 'target_name': 'double_dependency', + 'type': 'shared_library', + 'dependencies': [ + 'double_dependent.gyp:double_dependent', + ], + 'conditions': [ + ['1==1', { + 'dependencies': [ + 'double_dependent.gyp:*', + ], + }], + ], + }, + ], +} + diff --git a/deps/gyp/test/dependencies/double_dependent.gyp b/deps/gyp/test/dependencies/double_dependent.gyp new file mode 100644 index 0000000000..334caff723 --- /dev/null +++ b/deps/gyp/test/dependencies/double_dependent.gyp @@ -0,0 +1,12 @@ +# 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. + +{ + 'targets': [ + { + 'target_name': 'double_dependent', + 'type': 'none', + }, + ], +} diff --git a/deps/gyp/test/dependencies/extra_targets.gyp b/deps/gyp/test/dependencies/extra_targets.gyp new file mode 100644 index 0000000000..c1a26de422 --- /dev/null +++ b/deps/gyp/test/dependencies/extra_targets.gyp @@ -0,0 +1,18 @@ +# Copyright (c) 2009 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. + +{ + 'targets': [ + { + 'target_name': 'a', + 'type': 'static_library', + 'sources': [ + 'a.c', + ], + # This only depends on the "d" target; other targets in c.gyp + # should not become part of the build (unlike with 'c/c.gyp:*'). + 'dependencies': ['c/c.gyp:d'], + }, + ], +} diff --git a/deps/gyp/test/dependencies/gyptest-all-dependent-settings-order.py b/deps/gyp/test/dependencies/gyptest-all-dependent-settings-order.py new file mode 100644 index 0000000000..715f322f41 --- /dev/null +++ b/deps/gyp/test/dependencies/gyptest-all-dependent-settings-order.py @@ -0,0 +1,19 @@ +#!/usr/bin/env python + +# Copyright 2015 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. + +""" +Tests that all_dependent_settings are processed in topological order. +""" + +import TestGyp + +test = TestGyp.TestGyp() + +test.run_gyp('all_dependent_settings_order.gyp', chdir='adso') +test.build('all_dependent_settings_order.gyp', chdir='adso') +test.built_file_must_match('out.txt', 'd.cc a.cc b.cc c.cc', + chdir='adso') +test.pass_test() diff --git a/deps/gyp/test/dependencies/gyptest-double-dependency.py b/deps/gyp/test/dependencies/gyptest-double-dependency.py new file mode 100644 index 0000000000..7692740c54 --- /dev/null +++ b/deps/gyp/test/dependencies/gyptest-double-dependency.py @@ -0,0 +1,19 @@ +#!/usr/bin/env python + +# 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. + +""" +Verify that pulling in a dependency a second time in a conditional works for +shared_library targets. Regression test for http://crbug.com/122588 +""" + +import TestGyp + +test = TestGyp.TestGyp() + +test.run_gyp('double_dependency.gyp') + +# If running gyp worked, all is well. +test.pass_test() diff --git a/deps/gyp/test/dependencies/gyptest-extra-targets.py b/deps/gyp/test/dependencies/gyptest-extra-targets.py new file mode 100755 index 0000000000..09b00d958b --- /dev/null +++ b/deps/gyp/test/dependencies/gyptest-extra-targets.py @@ -0,0 +1,22 @@ +#!/usr/bin/env python + +# Copyright (c) 2009 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. + +""" +Verify that dependencies don't pull unused targets into the build. +""" + +import TestGyp + +test = TestGyp.TestGyp() + +test.run_gyp('extra_targets.gyp', + '-G', 'xcode_ninja_target_pattern=^a$') + +# This should fail if it tries to build 'c_unused' since 'c/c.c' has a syntax +# error and won't compile. +test.build('extra_targets.gyp', test.ALL) + +test.pass_test() diff --git a/deps/gyp/test/dependencies/gyptest-indirect-module-dependency.py b/deps/gyp/test/dependencies/gyptest-indirect-module-dependency.py new file mode 100644 index 0000000000..d001b57e7d --- /dev/null +++ b/deps/gyp/test/dependencies/gyptest-indirect-module-dependency.py @@ -0,0 +1,22 @@ +#!/usr/bin/env python + +# Copyright (c) 2015 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. + +""" +Make sure that we cause downstream modules to get built when we depend on the +parent targets. +""" + +import TestGyp + +test = TestGyp.TestGyp() + +CHDIR = 'module-dep' +test.run_gyp('indirect-module-dependency.gyp', chdir=CHDIR) +test.build('indirect-module-dependency.gyp', 'an_exe', chdir=CHDIR) +test.built_file_must_exist( + test.built_file_basename('a_module', test.LOADABLE_MODULE), chdir=CHDIR) + +test.pass_test() diff --git a/deps/gyp/test/dependencies/gyptest-lib-only.py b/deps/gyp/test/dependencies/gyptest-lib-only.py new file mode 100755 index 0000000000..3a99a7f4aa --- /dev/null +++ b/deps/gyp/test/dependencies/gyptest-lib-only.py @@ -0,0 +1,39 @@ +#!/usr/bin/env python + +# Copyright (c) 2011 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. + +""" +Verify that a link time only dependency will get pulled into the set of built +targets, even if no executable uses it. +""" + +import TestGyp + +import sys + +test = TestGyp.TestGyp() + +test.run_gyp('lib_only.gyp') + +test.build('lib_only.gyp', test.ALL) + +test.built_file_must_exist('a', type=test.STATIC_LIB) + +# TODO(bradnelson/mark): +# On linux and windows a library target will at least pull its link dependencies +# into the generated project, since not doing so confuses users. +# This is not currently implemented on mac, which has the opposite behavior. +if sys.platform == 'darwin': + if test.format == 'xcode': + test.built_file_must_not_exist('b', type=test.STATIC_LIB) + else: + assert test.format in ('make', 'ninja', 'xcode-ninja') + test.built_file_must_exist('b', type=test.STATIC_LIB) +else: + # Make puts the resulting library in a directory matching the input gyp file; + # for the 'b' library, that is in the 'b' subdirectory. + test.built_file_must_exist('b', type=test.STATIC_LIB, subdir='b') + +test.pass_test() diff --git a/deps/gyp/test/dependencies/gyptest-none-traversal.py b/deps/gyp/test/dependencies/gyptest-none-traversal.py new file mode 100755 index 0000000000..c09063dad3 --- /dev/null +++ b/deps/gyp/test/dependencies/gyptest-none-traversal.py @@ -0,0 +1,25 @@ +#!/usr/bin/env python + +# Copyright (c) 2011 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. + +""" +Verify that static library dependencies don't traverse none targets, unless +explicitly specified. +""" + +import TestGyp + +import sys + +test = TestGyp.TestGyp() + +test.run_gyp('none_traversal.gyp') + +test.build('none_traversal.gyp', test.ALL) + +test.run_built_executable('needs_chain', stdout="2\n") +test.run_built_executable('doesnt_need_chain', stdout="3\n") + +test.pass_test() diff --git a/deps/gyp/test/dependencies/gyptest-sharedlib-linksettings.py b/deps/gyp/test/dependencies/gyptest-sharedlib-linksettings.py new file mode 100644 index 0000000000..87428af459 --- /dev/null +++ b/deps/gyp/test/dependencies/gyptest-sharedlib-linksettings.py @@ -0,0 +1,21 @@ +#!/usr/bin/env python + +# Copyright (c) 2013 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. + +""" +Verify that link_settings in a shared_library are not propagated to targets +that depend on the shared_library, but are used in the shared_library itself. +""" + +import TestGyp +import sys + +CHDIR='sharedlib-linksettings' + +test = TestGyp.TestGyp() +test.run_gyp('test.gyp', chdir=CHDIR) +test.build('test.gyp', test.ALL, chdir=CHDIR) +test.run_built_executable('program', stdout="1\n2\n", chdir=CHDIR) +test.pass_test() diff --git a/deps/gyp/test/dependencies/lib_only.gyp b/deps/gyp/test/dependencies/lib_only.gyp new file mode 100755 index 0000000000..f6c84dea64 --- /dev/null +++ b/deps/gyp/test/dependencies/lib_only.gyp @@ -0,0 +1,16 @@ +# Copyright (c) 2009 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. + +{ + 'targets': [ + { + 'target_name': 'a', + 'type': 'static_library', + 'sources': [ + 'a.c', + ], + 'dependencies': ['b/b.gyp:b'], + }, + ], +} diff --git a/deps/gyp/test/dependencies/main.c b/deps/gyp/test/dependencies/main.c new file mode 100644 index 0000000000..185bd482f2 --- /dev/null +++ b/deps/gyp/test/dependencies/main.c @@ -0,0 +1,14 @@ +/* + * Copyright (c) 2011 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. + */ + +#include <stdio.h> + +extern int funcA(); + +int main() { + printf("%d\n", funcA()); + return 0; +} diff --git a/deps/gyp/test/dependencies/module-dep/a.cc b/deps/gyp/test/dependencies/module-dep/a.cc new file mode 100644 index 0000000000..231fc7a9df --- /dev/null +++ b/deps/gyp/test/dependencies/module-dep/a.cc @@ -0,0 +1,7 @@ +// Copyright (c) 2015 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. + +int some_function() { + return 0; +} diff --git a/deps/gyp/test/dependencies/module-dep/dll.cc b/deps/gyp/test/dependencies/module-dep/dll.cc new file mode 100644 index 0000000000..e1eea0205b --- /dev/null +++ b/deps/gyp/test/dependencies/module-dep/dll.cc @@ -0,0 +1,9 @@ +// Copyright (c) 2015 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. + +#if defined(_MSC_VER) +__declspec(dllexport) +#endif + void SomeFunction() { +} diff --git a/deps/gyp/test/dependencies/module-dep/exe.cc b/deps/gyp/test/dependencies/module-dep/exe.cc new file mode 100644 index 0000000000..b3039ace96 --- /dev/null +++ b/deps/gyp/test/dependencies/module-dep/exe.cc @@ -0,0 +1,7 @@ +// Copyright (c) 2015 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. + +int main() { + return 0; +} diff --git a/deps/gyp/test/dependencies/module-dep/indirect-module-dependency.gyp b/deps/gyp/test/dependencies/module-dep/indirect-module-dependency.gyp new file mode 100644 index 0000000000..f3fb5320fe --- /dev/null +++ b/deps/gyp/test/dependencies/module-dep/indirect-module-dependency.gyp @@ -0,0 +1,37 @@ +# Copyright (c) 2015 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. + +{ + 'targets': [ + { + 'target_name': 'an_exe', + 'type': 'executable', + 'sources': ['exe.cc'], + 'dependencies': [ + 'a_dll', + ], + }, + { + 'target_name': 'a_dll', + 'type': 'shared_library', + 'sources': ['dll.cc'], + 'dependencies': [ + 'a_lib', + ], + }, + { + 'target_name': 'a_lib', + 'type': 'static_library', + 'dependencies': [ + 'a_module', + ], + 'sources': ['a.cc'], + }, + { + 'target_name': 'a_module', + 'type': 'loadable_module', + 'sources': ['a.cc'], + }, + ] +} diff --git a/deps/gyp/test/dependencies/none_traversal.gyp b/deps/gyp/test/dependencies/none_traversal.gyp new file mode 100755 index 0000000000..3d8ab30aff --- /dev/null +++ b/deps/gyp/test/dependencies/none_traversal.gyp @@ -0,0 +1,46 @@ +# Copyright (c) 2009 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. + +{ + 'targets': [ + { + 'target_name': 'needs_chain', + 'type': 'executable', + 'sources': [ + 'a.c', + 'main.c', + ], + 'dependencies': ['chain'], + }, + { + 'target_name': 'chain', + 'type': 'none', + 'dependencies': ['b/b.gyp:b'], + }, + { + 'target_name': 'doesnt_need_chain', + 'type': 'executable', + 'sources': [ + 'main.c', + ], + 'dependencies': ['no_chain', 'other_chain'], + }, + { + 'target_name': 'no_chain', + 'type': 'none', + 'sources': [ + ], + 'dependencies': ['b/b.gyp:b'], + 'dependencies_traverse': 0, + }, + { + 'target_name': 'other_chain', + 'type': 'static_library', + 'sources': [ + 'a.c', + ], + 'dependencies': ['b/b.gyp:b3'], + }, + ], +} diff --git a/deps/gyp/test/dependencies/sharedlib-linksettings/program.c b/deps/gyp/test/dependencies/sharedlib-linksettings/program.c new file mode 100644 index 0000000000..b7c15edcd6 --- /dev/null +++ b/deps/gyp/test/dependencies/sharedlib-linksettings/program.c @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2013 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. + */ + +#include <stdio.h> + +/* + * This will fail to compile if TEST_DEFINE was propagated from sharedlib to + * program. + */ +#ifdef TEST_DEFINE +#error TEST_DEFINE is already defined! +#endif + +#define TEST_DEFINE 2 + +extern int staticLibFunc(); + +int main() { + printf("%d\n", staticLibFunc()); + printf("%d\n", TEST_DEFINE); + return 0; +} diff --git a/deps/gyp/test/dependencies/sharedlib-linksettings/sharedlib.c b/deps/gyp/test/dependencies/sharedlib-linksettings/sharedlib.c new file mode 100644 index 0000000000..3199bccd66 --- /dev/null +++ b/deps/gyp/test/dependencies/sharedlib-linksettings/sharedlib.c @@ -0,0 +1,16 @@ +/* + * Copyright (c) 2013 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. + */ + +#ifdef _WIN32 +__declspec(dllexport) +#endif +int sharedLibFunc() { + /* + * This will fail to compile if TEST_DEFINE was not obtained from sharedlib's + * link_settings. + */ + return TEST_DEFINE; +} diff --git a/deps/gyp/test/dependencies/sharedlib-linksettings/staticlib.c b/deps/gyp/test/dependencies/sharedlib-linksettings/staticlib.c new file mode 100644 index 0000000000..e889b419fd --- /dev/null +++ b/deps/gyp/test/dependencies/sharedlib-linksettings/staticlib.c @@ -0,0 +1,24 @@ +/* + * Copyright (c) 2013 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. + */ + +/* + * This will fail to compile if TEST_DEFINE was propagated from sharedlib to + * staticlib. + */ +#ifdef TEST_DEFINE +#error TEST_DEFINE is defined! +#endif + +#ifdef _WIN32 +__declspec(dllimport) +#else +extern +#endif +int sharedLibFunc(); + +int staticLibFunc() { + return sharedLibFunc(); +} diff --git a/deps/gyp/test/dependencies/sharedlib-linksettings/test.gyp b/deps/gyp/test/dependencies/sharedlib-linksettings/test.gyp new file mode 100644 index 0000000000..830ce3236d --- /dev/null +++ b/deps/gyp/test/dependencies/sharedlib-linksettings/test.gyp @@ -0,0 +1,37 @@ +# Copyright (c) 2013 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. + +{ + 'target_defaults': { + 'allow_sharedlib_linksettings_propagation': 0, + }, + 'targets': [ + { + 'target_name': 'sharedlib', + 'type': 'shared_library', + 'sources': [ 'sharedlib.c' ], + 'link_settings': { + 'defines': [ 'TEST_DEFINE=1' ], + }, + 'conditions': [ + ['OS=="linux"', { + # Support 64-bit shared libs (also works fine for 32-bit). + 'cflags': ['-fPIC'], + }], + ], + }, + { + 'target_name': 'staticlib', + 'type': 'static_library', + 'sources': [ 'staticlib.c' ], + 'dependencies': [ 'sharedlib' ], + }, + { + 'target_name': 'program', + 'type': 'executable', + 'sources': [ 'program.c' ], + 'dependencies': [ 'staticlib' ], + }, + ], +} diff --git a/deps/gyp/test/dependency-copy/gyptest-copy.py b/deps/gyp/test/dependency-copy/gyptest-copy.py new file mode 100755 index 0000000000..5ba7c73d41 --- /dev/null +++ b/deps/gyp/test/dependency-copy/gyptest-copy.py @@ -0,0 +1,26 @@ +#!/usr/bin/env python + +# Copyright (c) 2009 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. + +""" +Verifies dependencies do the copy step. +""" + +import TestGyp + +test = TestGyp.TestGyp() + +test.run_gyp('copies.gyp', chdir='src') + +test.build('copies.gyp', 'proj2', chdir='src') + +test.run_built_executable('proj1', + chdir='src', + stdout="Hello from file1.c\n") +test.run_built_executable('proj2', + chdir='src', + stdout="Hello from file2.c\n") + +test.pass_test() diff --git a/deps/gyp/test/dependency-copy/src/copies.gyp b/deps/gyp/test/dependency-copy/src/copies.gyp new file mode 100644 index 0000000000..4176b18787 --- /dev/null +++ b/deps/gyp/test/dependency-copy/src/copies.gyp @@ -0,0 +1,25 @@ +# Copyright (c) 2009 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. + +{ + 'targets': [ + { + 'target_name': 'proj1', + 'type': 'executable', + 'sources': [ + 'file1.c', + ], + }, + { + 'target_name': 'proj2', + 'type': 'executable', + 'sources': [ + 'file2.c', + ], + 'dependencies': [ + 'proj1', + ] + }, + ], +} diff --git a/deps/gyp/test/dependency-copy/src/file1.c b/deps/gyp/test/dependency-copy/src/file1.c new file mode 100644 index 0000000000..d7c3159186 --- /dev/null +++ b/deps/gyp/test/dependency-copy/src/file1.c @@ -0,0 +1,7 @@ +#include <stdio.h> + +int main(void) +{ + printf("Hello from file1.c\n"); + return 0; +} diff --git a/deps/gyp/test/dependency-copy/src/file2.c b/deps/gyp/test/dependency-copy/src/file2.c new file mode 100644 index 0000000000..cf40f57f94 --- /dev/null +++ b/deps/gyp/test/dependency-copy/src/file2.c @@ -0,0 +1,7 @@ +#include <stdio.h> + +int main(void) +{ + printf("Hello from file2.c\n"); + return 0; +} diff --git a/deps/gyp/test/empty-target/empty-target.gyp b/deps/gyp/test/empty-target/empty-target.gyp new file mode 100644 index 0000000000..feefa28058 --- /dev/null +++ b/deps/gyp/test/empty-target/empty-target.gyp @@ -0,0 +1,12 @@ +# Copyright (c) 2014 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. + +{ + 'targets': [ + { + 'target_name': 'empty_target', + 'type': 'none', + }, + ], +} diff --git a/deps/gyp/test/empty-target/gyptest-empty-target.py b/deps/gyp/test/empty-target/gyptest-empty-target.py new file mode 100644 index 0000000000..ecadd4a87f --- /dev/null +++ b/deps/gyp/test/empty-target/gyptest-empty-target.py @@ -0,0 +1,18 @@ +#!/usr/bin/env python + +# Copyright (c) 2014 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. + +""" +Verifies building a target with nothing succeeds. +""" + +import os +import sys +import TestGyp + +test = TestGyp.TestGyp() +test.run_gyp('empty-target.gyp') +test.build('empty-target.gyp', target='empty_target') +test.pass_test() diff --git a/deps/gyp/test/errors/dependency_cycle.gyp b/deps/gyp/test/errors/dependency_cycle.gyp new file mode 100644 index 0000000000..eef44bc9eb --- /dev/null +++ b/deps/gyp/test/errors/dependency_cycle.gyp @@ -0,0 +1,23 @@ +# Copyright 2014 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. + +{ + 'targets': [ + { + 'target_name': 'target0', + 'type': 'none', + 'dependencies': [ 'target1' ], + }, + { + 'target_name': 'target1', + 'type': 'none', + 'dependencies': [ 'target2' ], + }, + { + 'target_name': 'target2', + 'type': 'none', + 'dependencies': [ 'target0' ], + }, + ], +} diff --git a/deps/gyp/test/errors/duplicate_basenames.gyp b/deps/gyp/test/errors/duplicate_basenames.gyp new file mode 100644 index 0000000000..b3dceb3949 --- /dev/null +++ b/deps/gyp/test/errors/duplicate_basenames.gyp @@ -0,0 +1,13 @@ +# Copyright (c) 2009 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. + +{ + 'targets': [ + { + 'target_name': 'foo', + 'type': 'static_library', + 'sources': ['foo.c', 'foo.cc'], + }, + ] +} diff --git a/deps/gyp/test/errors/duplicate_node.gyp b/deps/gyp/test/errors/duplicate_node.gyp new file mode 100644 index 0000000000..d6096096bd --- /dev/null +++ b/deps/gyp/test/errors/duplicate_node.gyp @@ -0,0 +1,12 @@ +# Copyright (c) 2011 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. + +{ + 'targets': [ + { 'target_name' : 'foo', 'type': 'executable' }, + ], + 'targets': [ + { 'target_name' : 'bar', 'type': 'executable' }, + ] +} diff --git a/deps/gyp/test/errors/duplicate_rule.gyp b/deps/gyp/test/errors/duplicate_rule.gyp new file mode 100644 index 0000000000..dab98e96c2 --- /dev/null +++ b/deps/gyp/test/errors/duplicate_rule.gyp @@ -0,0 +1,22 @@ +# Copyright (c) 2011 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. + +{ + 'targets': [ + { + 'target_name': 'foo', + 'type': 'executable', + 'rules': [ + { + 'rule_name': 'bar', + 'extension': '', + }, + { + 'rule_name': 'bar', + 'extension': '', + }, + ], + }, + ], +} diff --git a/deps/gyp/test/errors/duplicate_targets.gyp b/deps/gyp/test/errors/duplicate_targets.gyp new file mode 100644 index 0000000000..aec470eefa --- /dev/null +++ b/deps/gyp/test/errors/duplicate_targets.gyp @@ -0,0 +1,14 @@ +# Copyright (c) 2009 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. + +{ + 'targets': [ + { + 'target_name': 'foo' + }, + { + 'target_name': 'foo' + }, + ] +} diff --git a/deps/gyp/test/errors/error_command.gyp b/deps/gyp/test/errors/error_command.gyp new file mode 100644 index 0000000000..1736fc9882 --- /dev/null +++ b/deps/gyp/test/errors/error_command.gyp @@ -0,0 +1,12 @@ +# Copyright (c) 2015 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. + +{ + 'targets': [ + { + 'target_name': 'foo', + 'type': '<!(["python", "-c", "import sys; sys.exit(3)"])', + }, + ] +} diff --git a/deps/gyp/test/errors/file_cycle0.gyp b/deps/gyp/test/errors/file_cycle0.gyp new file mode 100644 index 0000000000..3bfafb6cb3 --- /dev/null +++ b/deps/gyp/test/errors/file_cycle0.gyp @@ -0,0 +1,17 @@ +# Copyright 2014 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. + +{ + 'targets': [ + { + 'target_name': 'top', + 'type': 'none', + 'dependencies': [ 'file_cycle1.gyp:middle' ], + }, + { + 'target_name': 'bottom', + 'type': 'none', + }, + ], +} diff --git a/deps/gyp/test/errors/file_cycle1.gyp b/deps/gyp/test/errors/file_cycle1.gyp new file mode 100644 index 0000000000..fbd7a0d167 --- /dev/null +++ b/deps/gyp/test/errors/file_cycle1.gyp @@ -0,0 +1,13 @@ +# Copyright 2014 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. + +{ + 'targets': [ + { + 'target_name': 'middle', + 'type': 'none', + 'dependencies': [ 'file_cycle0.gyp:bottom' ], + }, + ], +} diff --git a/deps/gyp/test/errors/gyptest-errors.py b/deps/gyp/test/errors/gyptest-errors.py new file mode 100755 index 0000000000..0296f800f5 --- /dev/null +++ b/deps/gyp/test/errors/gyptest-errors.py @@ -0,0 +1,80 @@ +#!/usr/bin/env python + +# 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. + +""" +Test that two targets with the same name generates an error. +""" + +import os +import sys + +import TestGyp +import TestCmd + +# TODO(sbc): Remove the use of match_re below, done because scons +# error messages were not consistent with other generators. +# Also remove input.py:generator_wants_absolute_build_file_paths. + +test = TestGyp.TestGyp() + +stderr = ('gyp: Duplicate target definitions for ' + '.*duplicate_targets.gyp:foo#target\n') +test.run_gyp('duplicate_targets.gyp', status=1, stderr=stderr, + match=TestCmd.match_re) + +stderr = ('.*: Unable to find targets in build file .*missing_targets.gyp.*') +test.run_gyp('missing_targets.gyp', status=1, stderr=stderr, + match=TestCmd.match_re_dotall) + +stderr = ('gyp: rule bar exists in duplicate, target ' + '.*duplicate_rule.gyp:foo#target\n') +test.run_gyp('duplicate_rule.gyp', status=1, stderr=stderr, + match=TestCmd.match_re) + +stderr = ("gyp: Key 'targets' repeated at level 1 with key path '' while " + "reading .*duplicate_node.gyp.*") +test.run_gyp('duplicate_node.gyp', '--check', status=1, stderr=stderr, + match=TestCmd.match_re_dotall) + +stderr = (".*target0.*target1.*target2.*target0.*") +test.run_gyp('dependency_cycle.gyp', status=1, stderr=stderr, + match=TestCmd.match_re_dotall) + +stderr = (".*file_cycle0.*file_cycle1.*file_cycle0.*") +test.run_gyp('file_cycle0.gyp', status=1, stderr=stderr, + match=TestCmd.match_re_dotall) + +stderr = 'gyp: Duplicate basenames in sources section, see list above\n' +test.run_gyp('duplicate_basenames.gyp', status=1, stderr=stderr) + +# Check if '--no-duplicate-basename-check' works. +if ((test.format == 'make' and sys.platform == 'darwin') or + (test.format == 'msvs' and + int(os.environ.get('GYP_MSVS_VERSION', 2010)) < 2010)): + stderr = 'gyp: Duplicate basenames in sources section, see list above\n' + test.run_gyp('duplicate_basenames.gyp', '--no-duplicate-basename-check', + status=1, stderr=stderr) +else: + test.run_gyp('duplicate_basenames.gyp', '--no-duplicate-basename-check') + +stderr = ("gyp: Dependency '.*missing_dep.gyp:missing.gyp#target' not found " + "while trying to load target .*missing_dep.gyp:foo#target\n") +test.run_gyp('missing_dep.gyp', status=1, stderr=stderr, + match=TestCmd.match_re) + +# Make sure invalid <!() command invocations say what command it was and +# mention the gyp file name. Use a "random" command name to trigger an ENOENT. +stderr = (".*invalid-command-name-egtyevNif3.*netDurj9.*missing_command.gyp.*") +test.run_gyp('missing_command.gyp', status=1, stderr=stderr, + match=TestCmd.match_re_dotall) + +# Make sure <!() commands that error out result in a message that mentions +# the command and gyp file name +stderr = (".*python.*-c.*import sys.*sys.exit.*3.*error_command.gyp.*") +test.run_gyp('error_command.gyp', status=1, stderr=stderr, + match=TestCmd.match_re_dotall) + +test.pass_test() diff --git a/deps/gyp/test/errors/missing_command.gyp b/deps/gyp/test/errors/missing_command.gyp new file mode 100644 index 0000000000..c93d9542c6 --- /dev/null +++ b/deps/gyp/test/errors/missing_command.gyp @@ -0,0 +1,12 @@ +# Copyright (c) 2015 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. + +{ + 'targets': [ + { + 'target_name': 'foo', + 'type': '<!(["invalid-command-name-egtyevNif3", "netDurj9"])', + }, + ] +} diff --git a/deps/gyp/test/errors/missing_dep.gyp b/deps/gyp/test/errors/missing_dep.gyp new file mode 100644 index 0000000000..08746be3d7 --- /dev/null +++ b/deps/gyp/test/errors/missing_dep.gyp @@ -0,0 +1,15 @@ +# Copyright (c) 2011 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. + +{ + 'targets': [ + { + 'target_name': 'foo', + 'type': 'static_library', + 'dependencies': [ + 'missing.gyp' + ] + }, + ] +} diff --git a/deps/gyp/test/errors/missing_targets.gyp b/deps/gyp/test/errors/missing_targets.gyp new file mode 100644 index 0000000000..13d4f924c1 --- /dev/null +++ b/deps/gyp/test/errors/missing_targets.gyp @@ -0,0 +1,8 @@ +# Copyright (c) 2011 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. + +{ + 'target_defaults': { + }, +} diff --git a/deps/gyp/test/escaping/colon/test.gyp b/deps/gyp/test/escaping/colon/test.gyp new file mode 100644 index 0000000000..715f95490e --- /dev/null +++ b/deps/gyp/test/escaping/colon/test.gyp @@ -0,0 +1,21 @@ +# 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. +{ + 'targets': [ + { + 'target_name': 'colon', + 'type': 'executable', + 'sources': [ + 'a:b.c', + ], + 'copies': [ + { + 'destination': '<(PRODUCT_DIR)/', + # MSVS2008 gets confused if the same file is in 'sources' and 'copies' + 'files': [ 'a:b.c-d', ], + }, + ], + }, + ], +} diff --git a/deps/gyp/test/escaping/gyptest-colon.py b/deps/gyp/test/escaping/gyptest-colon.py new file mode 100644 index 0000000000..61a0e245f9 --- /dev/null +++ b/deps/gyp/test/escaping/gyptest-colon.py @@ -0,0 +1,49 @@ +#!/usr/bin/env python + +# 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. + +""" +Tests that filenames that contain colons are handled correctly. +(This is important for absolute paths on Windows.) +""" + +import os +import sys + +if sys.platform == 'win32': + print "This test is currently disabled: https://crbug.com/483696." + sys.exit(0) + + +import TestGyp + +# TODO: Make colons in filenames work with make, if required. +test = TestGyp.TestGyp(formats=['!make']) +CHDIR = 'colon' + +source_name = 'colon/a:b.c' +copies_name = 'colon/a:b.c-d' +if sys.platform == 'win32': + # Windows uses : as drive separator and doesn't allow it in regular filenames. + # Use abspath() to create a path that contains a colon instead. + abs_source = os.path.abspath('colon/file.c') + test.write('colon/test.gyp', + test.read('colon/test.gyp').replace("'a:b.c'", repr(abs_source))) + source_name = abs_source + + abs_copies = os.path.abspath('colon/file.txt') + test.write('colon/test.gyp', + test.read('colon/test.gyp').replace("'a:b.c-d'", repr(abs_copies))) + copies_name = abs_copies + +# Create the file dynamically, Windows is unhappy if a file with a colon in +# its name is checked in. +test.write(source_name, 'int main() {}') +test.write(copies_name, 'foo') + +test.run_gyp('test.gyp', chdir=CHDIR) +test.build('test.gyp', test.ALL, chdir=CHDIR) +test.built_file_must_exist(os.path.basename(copies_name), chdir=CHDIR) +test.pass_test() diff --git a/deps/gyp/test/exclusion/exclusion.gyp b/deps/gyp/test/exclusion/exclusion.gyp new file mode 100644 index 0000000000..1232dabaef --- /dev/null +++ b/deps/gyp/test/exclusion/exclusion.gyp @@ -0,0 +1,23 @@ +# Copyright (c) 2010 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. + +{ + 'targets': [ + { + 'target_name': 'hello', + 'type': 'executable', + 'sources': [ + 'hello.c', + 'bogus.c', + 'also/not/real.c', + 'also/not/real2.c', + ], + 'sources!': [ + 'bogus.c', + 'also/not/real.c', + 'also/not/real2.c', + ], + }, + ], +} diff --git a/deps/gyp/test/exclusion/gyptest-exclusion.py b/deps/gyp/test/exclusion/gyptest-exclusion.py new file mode 100755 index 0000000000..1fc32bf871 --- /dev/null +++ b/deps/gyp/test/exclusion/gyptest-exclusion.py @@ -0,0 +1,22 @@ +#!/usr/bin/env python + +# Copyright (c) 2010 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. + +""" +Verifies that exclusions (e.g. sources!) are respected. Excluded sources +that do not exist should not prevent the build from succeeding. +""" + +import TestGyp + +test = TestGyp.TestGyp() + +test.run_gyp('exclusion.gyp') +test.build('exclusion.gyp') + +# executables +test.built_file_must_exist('hello' + test._exe, test.EXECUTABLE, bare=True) + +test.pass_test() diff --git a/deps/gyp/test/exclusion/hello.c b/deps/gyp/test/exclusion/hello.c new file mode 100644 index 0000000000..6e7dc8e419 --- /dev/null +++ b/deps/gyp/test/exclusion/hello.c @@ -0,0 +1,15 @@ +/* Copyright (c) 2010 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. */ + +#include <stdio.h> + +int func1(void) { + return 42; +} + +int main(void) { + printf("Hello, world!\n"); + printf("%d\n", func1()); + return 0; +} diff --git a/deps/gyp/test/external-cross-compile/gyptest-cross.py b/deps/gyp/test/external-cross-compile/gyptest-cross.py new file mode 100755 index 0000000000..a837ec57dc --- /dev/null +++ b/deps/gyp/test/external-cross-compile/gyptest-cross.py @@ -0,0 +1,31 @@ +#!/usr/bin/env python + +# 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. + +""" +Verifies that actions can be + a source scanner can be used to implement, +cross-compiles (for Native Client at this point). +""" + +import TestGyp + +test = TestGyp.TestGyp() + +test.run_gyp('cross.gyp', chdir='src') + +test.relocate('src', 'relocate/src') + +test.build('cross.gyp', test.ALL, chdir='relocate/src') + +expect = """\ +From test1.cc +From test2.c +From test3.cc +From test4.c +""" +test.run_built_executable('program', chdir='relocate/src', stdout=expect) + + +test.pass_test() diff --git a/deps/gyp/test/external-cross-compile/src/bogus1.cc b/deps/gyp/test/external-cross-compile/src/bogus1.cc new file mode 100644 index 0000000000..1b8d01199b --- /dev/null +++ b/deps/gyp/test/external-cross-compile/src/bogus1.cc @@ -0,0 +1 @@ +From bogus1.cc diff --git a/deps/gyp/test/external-cross-compile/src/bogus2.c b/deps/gyp/test/external-cross-compile/src/bogus2.c new file mode 100644 index 0000000000..cbf4a123c4 --- /dev/null +++ b/deps/gyp/test/external-cross-compile/src/bogus2.c @@ -0,0 +1 @@ +From bogus2.c diff --git a/deps/gyp/test/external-cross-compile/src/cross.gyp b/deps/gyp/test/external-cross-compile/src/cross.gyp new file mode 100644 index 0000000000..aeda76b5bd --- /dev/null +++ b/deps/gyp/test/external-cross-compile/src/cross.gyp @@ -0,0 +1,83 @@ +# Copyright (c) 2009 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. + +{ + 'includes': ['cross_compile.gypi'], + 'target_defaults': { + 'variables': { + 'nix_lame%': 0, + }, + 'target_conditions': [ + ['nix_lame==1', { + 'sources/': [ + ['exclude', 'lame'], + ], + }], + ], + }, + 'targets': [ + { + 'target_name': 'program', + 'type': 'executable', + 'dependencies': [ + 'program_inc', + ], + 'include_dirs': [ + '<(SHARED_INTERMEDIATE_DIR)', + ], + 'sources': [ + 'program.cc', + ], + }, + { + 'target_name': 'program_inc', + 'type': 'none', + 'dependencies': ['cross_program'], + 'actions': [ + { + 'action_name': 'program_inc', + 'inputs': ['<(SHARED_INTERMEDIATE_DIR)/cross_program.fake'], + 'outputs': ['<(SHARED_INTERMEDIATE_DIR)/cross_program.h'], + 'action': ['python', 'tochar.py', '<@(_inputs)', '<@(_outputs)'], + }, + ], + # Allows the test to run without hermetic cygwin on windows. + 'msvs_cygwin_shell': 0, + }, + { + 'target_name': 'cross_program', + 'type': 'none', + 'variables': { + 'cross': 1, + 'nix_lame': 1, + }, + 'dependencies': ['cross_lib'], + 'sources': [ + 'test1.cc', + 'test2.c', + 'very_lame.cc', + '<(SHARED_INTERMEDIATE_DIR)/cross_lib.fake', + ], + }, + { + 'target_name': 'cross_lib', + 'type': 'none', + 'variables': { + 'cross': 1, + 'nix_lame': 1, + }, + 'sources': [ + 'test3.cc', + 'test4.c', + 'bogus1.cc', + 'bogus2.c', + 'sort_of_lame.cc', + ], + 'sources!': [ + 'bogus1.cc', + 'bogus2.c', + ], + }, + ], +} diff --git a/deps/gyp/test/external-cross-compile/src/cross_compile.gypi b/deps/gyp/test/external-cross-compile/src/cross_compile.gypi new file mode 100644 index 0000000000..36e651903f --- /dev/null +++ b/deps/gyp/test/external-cross-compile/src/cross_compile.gypi @@ -0,0 +1,23 @@ +{ + 'target_defaults': { + 'variables': { + 'cross%': 0, + }, + 'target_conditions': [ + ['cross==1', { + 'actions': [ + { + 'action_name': 'cross compile >(_target_name)', + 'inputs': ['^@(_sources)'], + 'outputs': ['<(SHARED_INTERMEDIATE_DIR)/>(_target_name).fake'], + 'action': [ + 'python', 'fake_cross.py', '>@(_outputs)', '^@(_sources)', + ], + # Allows the test to run without hermetic cygwin on windows. + 'msvs_cygwin_shell': 0, + }, + ], + }], + ], + }, +} diff --git a/deps/gyp/test/external-cross-compile/src/fake_cross.py b/deps/gyp/test/external-cross-compile/src/fake_cross.py new file mode 100644 index 0000000000..05eacc6a63 --- /dev/null +++ b/deps/gyp/test/external-cross-compile/src/fake_cross.py @@ -0,0 +1,18 @@ +#!/usr/bin/python +# 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 sys + +fh = open(sys.argv[1], 'w') + +filenames = sys.argv[2:] + +for filename in filenames: + subfile = open(filename) + data = subfile.read() + subfile.close() + fh.write(data) + +fh.close() diff --git a/deps/gyp/test/external-cross-compile/src/program.cc b/deps/gyp/test/external-cross-compile/src/program.cc new file mode 100644 index 0000000000..5172ae90fe --- /dev/null +++ b/deps/gyp/test/external-cross-compile/src/program.cc @@ -0,0 +1,16 @@ +/* + * 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. + */ + +#include <stdio.h> + +static char data[] = { +#include "cross_program.h" +}; + +int main(void) { + fwrite(data, 1, sizeof(data), stdout); + return 0; +} diff --git a/deps/gyp/test/external-cross-compile/src/test1.cc b/deps/gyp/test/external-cross-compile/src/test1.cc new file mode 100644 index 0000000000..b584c31d15 --- /dev/null +++ b/deps/gyp/test/external-cross-compile/src/test1.cc @@ -0,0 +1 @@ +From test1.cc diff --git a/deps/gyp/test/external-cross-compile/src/test2.c b/deps/gyp/test/external-cross-compile/src/test2.c new file mode 100644 index 0000000000..367ae19ea0 --- /dev/null +++ b/deps/gyp/test/external-cross-compile/src/test2.c @@ -0,0 +1 @@ +From test2.c diff --git a/deps/gyp/test/external-cross-compile/src/test3.cc b/deps/gyp/test/external-cross-compile/src/test3.cc new file mode 100644 index 0000000000..9eb64735b8 --- /dev/null +++ b/deps/gyp/test/external-cross-compile/src/test3.cc @@ -0,0 +1 @@ +From test3.cc diff --git a/deps/gyp/test/external-cross-compile/src/test4.c b/deps/gyp/test/external-cross-compile/src/test4.c new file mode 100644 index 0000000000..8ecc33ec16 --- /dev/null +++ b/deps/gyp/test/external-cross-compile/src/test4.c @@ -0,0 +1 @@ +From test4.c diff --git a/deps/gyp/test/external-cross-compile/src/tochar.py b/deps/gyp/test/external-cross-compile/src/tochar.py new file mode 100644 index 0000000000..c0780d984f --- /dev/null +++ b/deps/gyp/test/external-cross-compile/src/tochar.py @@ -0,0 +1,13 @@ +#!/usr/bin/python +# 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 sys + +src = open(sys.argv[1]) +dst = open(sys.argv[2], 'w') +for ch in src.read(): + dst.write('%d,\n' % ord(ch)) +src.close() +dst.close() diff --git a/deps/gyp/test/generator-output/actions/actions.gyp b/deps/gyp/test/generator-output/actions/actions.gyp new file mode 100644 index 0000000000..dded59aff3 --- /dev/null +++ b/deps/gyp/test/generator-output/actions/actions.gyp @@ -0,0 +1,16 @@ +# Copyright (c) 2009 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. + +{ + 'targets': [ + { + 'target_name': 'pull_in_all_actions', + 'type': 'none', + 'dependencies': [ + 'subdir1/executable.gyp:*', + 'subdir2/none.gyp:*', + ], + }, + ], +} diff --git a/deps/gyp/test/generator-output/actions/build/README.txt b/deps/gyp/test/generator-output/actions/build/README.txt new file mode 100644 index 0000000000..1b052c9a24 --- /dev/null +++ b/deps/gyp/test/generator-output/actions/build/README.txt @@ -0,0 +1,4 @@ +A place-holder for this Xcode build output directory, so that the
+test script can verify that .xcodeproj files are not created in
+their normal location by making the src/ read-only, and then
+selectively making this build directory writable.
diff --git a/deps/gyp/test/generator-output/actions/subdir1/actions-out/README.txt b/deps/gyp/test/generator-output/actions/subdir1/actions-out/README.txt new file mode 100644 index 0000000000..1b052c9a24 --- /dev/null +++ b/deps/gyp/test/generator-output/actions/subdir1/actions-out/README.txt @@ -0,0 +1,4 @@ +A place-holder for this Xcode build output directory, so that the
+test script can verify that .xcodeproj files are not created in
+their normal location by making the src/ read-only, and then
+selectively making this build directory writable.
diff --git a/deps/gyp/test/generator-output/actions/subdir1/build/README.txt b/deps/gyp/test/generator-output/actions/subdir1/build/README.txt new file mode 100644 index 0000000000..1b052c9a24 --- /dev/null +++ b/deps/gyp/test/generator-output/actions/subdir1/build/README.txt @@ -0,0 +1,4 @@ +A place-holder for this Xcode build output directory, so that the
+test script can verify that .xcodeproj files are not created in
+their normal location by making the src/ read-only, and then
+selectively making this build directory writable.
diff --git a/deps/gyp/test/generator-output/actions/subdir1/executable.gyp b/deps/gyp/test/generator-output/actions/subdir1/executable.gyp new file mode 100644 index 0000000000..6bdd60a1fb --- /dev/null +++ b/deps/gyp/test/generator-output/actions/subdir1/executable.gyp @@ -0,0 +1,44 @@ +# Copyright (c) 2009 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. + +{ + 'targets': [ + { + 'target_name': 'program', + 'type': 'executable', + 'msvs_cygwin_shell': 0, + 'sources': [ + 'program.c', + ], + 'actions': [ + { + 'action_name': 'make-prog1', + 'inputs': [ + 'make-prog1.py', + ], + 'outputs': [ + '<(INTERMEDIATE_DIR)/prog1.c', + ], + 'action': [ + 'python', '<(_inputs)', '<@(_outputs)', + ], + 'process_outputs_as_sources': 1, + }, + { + 'action_name': 'make-prog2', + 'inputs': [ + 'make-prog2.py', + ], + 'outputs': [ + 'actions-out/prog2.c', + ], + 'action': [ + 'python', '<(_inputs)', '<@(_outputs)', + ], + 'process_outputs_as_sources': 1, + }, + ], + }, + ], +} diff --git a/deps/gyp/test/generator-output/actions/subdir1/make-prog1.py b/deps/gyp/test/generator-output/actions/subdir1/make-prog1.py new file mode 100755 index 0000000000..7ea1d8a2d4 --- /dev/null +++ b/deps/gyp/test/generator-output/actions/subdir1/make-prog1.py @@ -0,0 +1,20 @@ +#!/usr/bin/env python + +# Copyright (c) 2009 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 sys + +contents = r""" +#include <stdio.h> + +void prog1(void) +{ + printf("Hello from make-prog1.py\n"); +} +""" + +open(sys.argv[1], 'w').write(contents) + +sys.exit(0) diff --git a/deps/gyp/test/generator-output/actions/subdir1/make-prog2.py b/deps/gyp/test/generator-output/actions/subdir1/make-prog2.py new file mode 100755 index 0000000000..0bfe4973c2 --- /dev/null +++ b/deps/gyp/test/generator-output/actions/subdir1/make-prog2.py @@ -0,0 +1,20 @@ +#!/usr/bin/env python + +# Copyright (c) 2009 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 sys + +contents = r""" +#include <stdio.h> + +void prog2(void) +{ + printf("Hello from make-prog2.py\n"); +} +""" + +open(sys.argv[1], 'w').write(contents) + +sys.exit(0) diff --git a/deps/gyp/test/generator-output/actions/subdir1/program.c b/deps/gyp/test/generator-output/actions/subdir1/program.c new file mode 100644 index 0000000000..c0931534eb --- /dev/null +++ b/deps/gyp/test/generator-output/actions/subdir1/program.c @@ -0,0 +1,12 @@ +#include <stdio.h>
+
+extern void prog1(void);
+extern void prog2(void);
+
+int main(void) +{
+ printf("Hello from program.c\n");
+ prog1();
+ prog2();
+ return 0;
+}
diff --git a/deps/gyp/test/generator-output/actions/subdir2/actions-out/README.txt b/deps/gyp/test/generator-output/actions/subdir2/actions-out/README.txt new file mode 100644 index 0000000000..1b052c9a24 --- /dev/null +++ b/deps/gyp/test/generator-output/actions/subdir2/actions-out/README.txt @@ -0,0 +1,4 @@ +A place-holder for this Xcode build output directory, so that the
+test script can verify that .xcodeproj files are not created in
+their normal location by making the src/ read-only, and then
+selectively making this build directory writable.
diff --git a/deps/gyp/test/generator-output/actions/subdir2/build/README.txt b/deps/gyp/test/generator-output/actions/subdir2/build/README.txt new file mode 100644 index 0000000000..1b052c9a24 --- /dev/null +++ b/deps/gyp/test/generator-output/actions/subdir2/build/README.txt @@ -0,0 +1,4 @@ +A place-holder for this Xcode build output directory, so that the
+test script can verify that .xcodeproj files are not created in
+their normal location by making the src/ read-only, and then
+selectively making this build directory writable.
diff --git a/deps/gyp/test/generator-output/actions/subdir2/make-file.py b/deps/gyp/test/generator-output/actions/subdir2/make-file.py new file mode 100755 index 0000000000..fff0653144 --- /dev/null +++ b/deps/gyp/test/generator-output/actions/subdir2/make-file.py @@ -0,0 +1,11 @@ +#!/usr/bin/env python + +# Copyright (c) 2009 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 sys + +contents = "Hello from make-file.py\n" + +open(sys.argv[1], 'wb').write(contents) diff --git a/deps/gyp/test/generator-output/actions/subdir2/none.gyp b/deps/gyp/test/generator-output/actions/subdir2/none.gyp new file mode 100644 index 0000000000..f98f52753d --- /dev/null +++ b/deps/gyp/test/generator-output/actions/subdir2/none.gyp @@ -0,0 +1,31 @@ +# Copyright (c) 2009 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. + +{ + 'targets': [ + { + 'target_name': 'file', + 'type': 'none', + 'msvs_cygwin_shell': 0, + 'actions': [ + { + 'action_name': 'make-file', + 'inputs': [ + 'make-file.py', + ], + 'outputs': [ + 'actions-out/file.out', + # TODO: enhance testing infrastructure to test this + # without having to hard-code the intermediate dir paths. + #'<(INTERMEDIATE_DIR)/file.out', + ], + 'action': [ + 'python', '<(_inputs)', '<@(_outputs)', + ], + 'process_outputs_as_sources': 1, + } + ], + }, + ], +} diff --git a/deps/gyp/test/generator-output/copies/build/README.txt b/deps/gyp/test/generator-output/copies/build/README.txt new file mode 100644 index 0000000000..90ef886193 --- /dev/null +++ b/deps/gyp/test/generator-output/copies/build/README.txt @@ -0,0 +1,4 @@ +A place-holder for this Xcode build output directory, so that the +test script can verify that .xcodeproj files are not created in +their normal location by making the src/ read-only, and then +selectively making this build directory writable. diff --git a/deps/gyp/test/generator-output/copies/copies-out/README.txt b/deps/gyp/test/generator-output/copies/copies-out/README.txt new file mode 100644 index 0000000000..90ef886193 --- /dev/null +++ b/deps/gyp/test/generator-output/copies/copies-out/README.txt @@ -0,0 +1,4 @@ +A place-holder for this Xcode build output directory, so that the +test script can verify that .xcodeproj files are not created in +their normal location by making the src/ read-only, and then +selectively making this build directory writable. diff --git a/deps/gyp/test/generator-output/copies/copies.gyp b/deps/gyp/test/generator-output/copies/copies.gyp new file mode 100644 index 0000000000..479a3d9b6e --- /dev/null +++ b/deps/gyp/test/generator-output/copies/copies.gyp @@ -0,0 +1,50 @@ +# Copyright (c) 2009 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. + +{ + 'targets': [ + { + 'target_name': 'pull_in_subdir', + 'type': 'none', + 'dependencies': [ + 'subdir/subdir.gyp:*', + ], + }, + { + 'target_name': 'copies1', + 'type': 'none', + 'copies': [ + { + 'destination': 'copies-out', + 'files': [ + 'file1', + ], + }, + ], + }, + { + 'target_name': 'copies2', + 'type': 'none', + 'copies': [ + { + 'destination': '<(PRODUCT_DIR)/copies-out', + 'files': [ + 'file2', + ], + }, + ], + }, + # Verify that a null 'files' list doesn't gag the generators. + { + 'target_name': 'copies_null', + 'type': 'none', + 'copies': [ + { + 'destination': '<(PRODUCT_DIR)/copies-null', + 'files': [], + }, + ], + }, + ], +} diff --git a/deps/gyp/test/generator-output/copies/file1 b/deps/gyp/test/generator-output/copies/file1 new file mode 100644 index 0000000000..84d55c5759 --- /dev/null +++ b/deps/gyp/test/generator-output/copies/file1 @@ -0,0 +1 @@ +file1 contents diff --git a/deps/gyp/test/generator-output/copies/file2 b/deps/gyp/test/generator-output/copies/file2 new file mode 100644 index 0000000000..af1b8ae35d --- /dev/null +++ b/deps/gyp/test/generator-output/copies/file2 @@ -0,0 +1 @@ +file2 contents diff --git a/deps/gyp/test/generator-output/copies/subdir/build/README.txt b/deps/gyp/test/generator-output/copies/subdir/build/README.txt new file mode 100644 index 0000000000..90ef886193 --- /dev/null +++ b/deps/gyp/test/generator-output/copies/subdir/build/README.txt @@ -0,0 +1,4 @@ +A place-holder for this Xcode build output directory, so that the +test script can verify that .xcodeproj files are not created in +their normal location by making the src/ read-only, and then +selectively making this build directory writable. diff --git a/deps/gyp/test/generator-output/copies/subdir/copies-out/README.txt b/deps/gyp/test/generator-output/copies/subdir/copies-out/README.txt new file mode 100644 index 0000000000..90ef886193 --- /dev/null +++ b/deps/gyp/test/generator-output/copies/subdir/copies-out/README.txt @@ -0,0 +1,4 @@ +A place-holder for this Xcode build output directory, so that the +test script can verify that .xcodeproj files are not created in +their normal location by making the src/ read-only, and then +selectively making this build directory writable. diff --git a/deps/gyp/test/generator-output/copies/subdir/file3 b/deps/gyp/test/generator-output/copies/subdir/file3 new file mode 100644 index 0000000000..43f16f3522 --- /dev/null +++ b/deps/gyp/test/generator-output/copies/subdir/file3 @@ -0,0 +1 @@ +file3 contents diff --git a/deps/gyp/test/generator-output/copies/subdir/file4 b/deps/gyp/test/generator-output/copies/subdir/file4 new file mode 100644 index 0000000000..5f7270a084 --- /dev/null +++ b/deps/gyp/test/generator-output/copies/subdir/file4 @@ -0,0 +1 @@ +file4 contents diff --git a/deps/gyp/test/generator-output/copies/subdir/subdir.gyp b/deps/gyp/test/generator-output/copies/subdir/subdir.gyp new file mode 100644 index 0000000000..af031d283a --- /dev/null +++ b/deps/gyp/test/generator-output/copies/subdir/subdir.gyp @@ -0,0 +1,32 @@ +# Copyright (c) 2009 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. + +{ + 'targets': [ + { + 'target_name': 'copies3', + 'type': 'none', + 'copies': [ + { + 'destination': 'copies-out', + 'files': [ + 'file3', + ], + }, + ], + }, + { + 'target_name': 'copies4', + 'type': 'none', + 'copies': [ + { + 'destination': '<(PRODUCT_DIR)/copies-out', + 'files': [ + 'file4', + ], + }, + ], + }, + ], +} diff --git a/deps/gyp/test/generator-output/gyptest-actions.py b/deps/gyp/test/generator-output/gyptest-actions.py new file mode 100755 index 0000000000..47121d0770 --- /dev/null +++ b/deps/gyp/test/generator-output/gyptest-actions.py @@ -0,0 +1,57 @@ +#!/usr/bin/env python + +# 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. + +""" +Verifies --generator-output= behavior when using actions. +""" + +import TestGyp + +test = TestGyp.TestGyp() + +# All the generated files should go under 'gypfiles'. The source directory +# ('actions') should be untouched. +test.writable(test.workpath('actions'), False) +test.run_gyp('actions.gyp', + '--generator-output=' + test.workpath('gypfiles'), + chdir='actions') + +test.writable(test.workpath('actions'), True) + +test.relocate('actions', 'relocate/actions') +test.relocate('gypfiles', 'relocate/gypfiles') + +test.writable(test.workpath('relocate/actions'), False) + +# Some of the action outputs use "pure" relative paths (i.e. without prefixes +# like <(INTERMEDIATE_DIR) or <(PROGRAM_DIR)). Even though we are building under +# 'gypfiles', such outputs will still be created relative to the original .gyp +# sources. Projects probably wouldn't normally do this, since it kind of defeats +# the purpose of '--generator-output', but it is supported behaviour. +test.writable(test.workpath('relocate/actions/build'), True) +test.writable(test.workpath('relocate/actions/subdir1/build'), True) +test.writable(test.workpath('relocate/actions/subdir1/actions-out'), True) +test.writable(test.workpath('relocate/actions/subdir2/build'), True) +test.writable(test.workpath('relocate/actions/subdir2/actions-out'), True) + +test.build('actions.gyp', test.ALL, chdir='relocate/gypfiles') + +expect = """\ +Hello from program.c +Hello from make-prog1.py +Hello from make-prog2.py +""" + +if test.format == 'xcode': + chdir = 'relocate/actions/subdir1' +else: + chdir = 'relocate/gypfiles' +test.run_built_executable('program', chdir=chdir, stdout=expect) + +test.must_match('relocate/actions/subdir2/actions-out/file.out', + "Hello from make-file.py\n") + +test.pass_test() diff --git a/deps/gyp/test/generator-output/gyptest-copies.py b/deps/gyp/test/generator-output/gyptest-copies.py new file mode 100755 index 0000000000..262dfc30fa --- /dev/null +++ b/deps/gyp/test/generator-output/gyptest-copies.py @@ -0,0 +1,59 @@ +#!/usr/bin/env python + +# 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. + +""" +Verifies file copies with --generator-output using an explicit build +target of 'all'. +""" + +import TestGyp + +test = TestGyp.TestGyp() + +test.writable(test.workpath('copies'), False) + +test.run_gyp('copies.gyp', + '--generator-output=' + test.workpath('gypfiles'), + '-G', 'xcode_ninja_target_pattern=^(?!copies_null)', + chdir='copies') + +test.writable(test.workpath('copies'), True) + +test.relocate('copies', 'relocate/copies') +test.relocate('gypfiles', 'relocate/gypfiles') + +test.writable(test.workpath('relocate/copies'), False) + +test.writable(test.workpath('relocate/copies/build'), True) +test.writable(test.workpath('relocate/copies/copies-out'), True) +test.writable(test.workpath('relocate/copies/subdir/build'), True) +test.writable(test.workpath('relocate/copies/subdir/copies-out'), True) + +test.build('copies.gyp', test.ALL, chdir='relocate/gypfiles') + +test.must_match(['relocate', 'copies', 'copies-out', 'file1'], + "file1 contents\n") + +if test.format == 'xcode': + chdir = 'relocate/copies/build' +elif test.format in ['make', 'ninja', 'xcode-ninja', 'cmake']: + chdir = 'relocate/gypfiles/out' +else: + chdir = 'relocate/gypfiles' +test.must_match([chdir, 'Default', 'copies-out', 'file2'], "file2 contents\n") + +test.must_match(['relocate', 'copies', 'subdir', 'copies-out', 'file3'], + "file3 contents\n") + +if test.format == 'xcode': + chdir = 'relocate/copies/subdir/build' +elif test.format in ['make', 'ninja', 'xcode-ninja', 'cmake']: + chdir = 'relocate/gypfiles/out' +else: + chdir = 'relocate/gypfiles' +test.must_match([chdir, 'Default', 'copies-out', 'file4'], "file4 contents\n") + +test.pass_test() diff --git a/deps/gyp/test/generator-output/gyptest-depth.py b/deps/gyp/test/generator-output/gyptest-depth.py new file mode 100755 index 0000000000..ee59a11f04 --- /dev/null +++ b/deps/gyp/test/generator-output/gyptest-depth.py @@ -0,0 +1,58 @@ +#!/usr/bin/env python + +# Copyright 2014 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. + +""" +Verifies building a project hierarchy created when the --generator-output= +and --depth= options is used to put the build configuration files in a separate +directory tree. +""" + +import TestGyp +import os + +# This is a regression test for the make generator only. +test = TestGyp.TestGyp(formats=['make']) + +test.writable(test.workpath('src'), False) + +toplevel_dir = os.path.basename(test.workpath()) + +test.run_gyp(os.path.join(toplevel_dir, 'src', 'prog1.gyp'), + '-Dset_symroot=1', + '--generator-output=gypfiles', + depth=toplevel_dir, + chdir='..') + +test.writable(test.workpath('src/build'), True) +test.writable(test.workpath('src/subdir2/build'), True) +test.writable(test.workpath('src/subdir3/build'), True) + +test.build('prog1.gyp', test.ALL, chdir='gypfiles') + +chdir = 'gypfiles' + +expect = """\ +Hello from %s +Hello from inc.h +Hello from inc1/include1.h +Hello from inc2/include2.h +Hello from inc3/include3.h +Hello from subdir2/deeper/deeper.h +""" + +if test.format == 'xcode': + chdir = 'src' +test.run_built_executable('prog1', chdir=chdir, stdout=expect % 'prog1.c') + +if test.format == 'xcode': + chdir = 'src/subdir2' +test.run_built_executable('prog2', chdir=chdir, stdout=expect % 'prog2.c') + +if test.format == 'xcode': + chdir = 'src/subdir3' +test.run_built_executable('prog3', chdir=chdir, stdout=expect % 'prog3.c') + +test.pass_test() diff --git a/deps/gyp/test/generator-output/gyptest-mac-bundle.py b/deps/gyp/test/generator-output/gyptest-mac-bundle.py new file mode 100644 index 0000000000..8d19eedbed --- /dev/null +++ b/deps/gyp/test/generator-output/gyptest-mac-bundle.py @@ -0,0 +1,31 @@ +#!/usr/bin/env python + +# 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. + +""" +Verifies mac bundles work with --generator-output. +""" + +import TestGyp + +import sys + +if sys.platform == 'darwin': + print "This test is currently disabled: https://crbug.com/483696." + sys.exit(0) + + test = TestGyp.TestGyp(formats=[]) + + MAC_BUNDLE_DIR = 'mac-bundle' + GYPFILES_DIR = 'gypfiles' + test.writable(test.workpath(MAC_BUNDLE_DIR), False) + test.run_gyp('test.gyp', + '--generator-output=' + test.workpath(GYPFILES_DIR), + chdir=MAC_BUNDLE_DIR) + test.writable(test.workpath(MAC_BUNDLE_DIR), True) + + test.build('test.gyp', test.ALL, chdir=GYPFILES_DIR) + + test.pass_test() diff --git a/deps/gyp/test/generator-output/gyptest-relocate.py b/deps/gyp/test/generator-output/gyptest-relocate.py new file mode 100755 index 0000000000..b867a6cffb --- /dev/null +++ b/deps/gyp/test/generator-output/gyptest-relocate.py @@ -0,0 +1,59 @@ +#!/usr/bin/env python + +# 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. + +""" +Verifies that a project hierarchy created with the --generator-output= +option can be built even when it's relocated to a different path. +""" + +import TestGyp + +test = TestGyp.TestGyp() + +test.writable(test.workpath('src'), False) + +test.run_gyp('prog1.gyp', + '-Dset_symroot=1', + '--generator-output=' + test.workpath('gypfiles'), + chdir='src') + +test.writable(test.workpath('src'), True) + +test.relocate('src', 'relocate/src') +test.relocate('gypfiles', 'relocate/gypfiles') + +test.writable(test.workpath('relocate/src'), False) + +test.writable(test.workpath('relocate/src/build'), True) +test.writable(test.workpath('relocate/src/subdir2/build'), True) +test.writable(test.workpath('relocate/src/subdir3/build'), True) + +test.build('prog1.gyp', test.ALL, chdir='relocate/gypfiles') + +chdir = 'relocate/gypfiles' + +expect = """\ +Hello from %s +Hello from inc.h +Hello from inc1/include1.h +Hello from inc2/include2.h +Hello from inc3/include3.h +Hello from subdir2/deeper/deeper.h +""" + +if test.format == 'xcode': + chdir = 'relocate/src' +test.run_built_executable('prog1', chdir=chdir, stdout=expect % 'prog1.c') + +if test.format == 'xcode': + chdir = 'relocate/src/subdir2' +test.run_built_executable('prog2', chdir=chdir, stdout=expect % 'prog2.c') + +if test.format == 'xcode': + chdir = 'relocate/src/subdir3' +test.run_built_executable('prog3', chdir=chdir, stdout=expect % 'prog3.c') + +test.pass_test() diff --git a/deps/gyp/test/generator-output/gyptest-rules.py b/deps/gyp/test/generator-output/gyptest-rules.py new file mode 100755 index 0000000000..a3ff8bd858 --- /dev/null +++ b/deps/gyp/test/generator-output/gyptest-rules.py @@ -0,0 +1,58 @@ +#!/usr/bin/env python + +# 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. + +""" +Verifies --generator-output= behavior when using rules. +""" + +import TestGyp + +test = TestGyp.TestGyp() + +test.writable(test.workpath('rules'), False) + +test.run_gyp('rules.gyp', + '--generator-output=' + test.workpath('gypfiles'), + chdir='rules') + +test.writable(test.workpath('rules'), True) + +test.relocate('rules', 'relocate/rules') +test.relocate('gypfiles', 'relocate/gypfiles') + +test.writable(test.workpath('relocate/rules'), False) + +test.writable(test.workpath('relocate/rules/build'), True) +test.writable(test.workpath('relocate/rules/subdir1/build'), True) +test.writable(test.workpath('relocate/rules/subdir2/build'), True) +test.writable(test.workpath('relocate/rules/subdir2/rules-out'), True) + +test.build('rules.gyp', test.ALL, chdir='relocate/gypfiles') + +expect = """\ +Hello from program.c +Hello from function1.in1 +Hello from function2.in1 +Hello from define3.in0 +Hello from define4.in0 +""" + +if test.format == 'xcode': + chdir = 'relocate/rules/subdir1' +else: + chdir = 'relocate/gypfiles' +test.run_built_executable('program', chdir=chdir, stdout=expect) + +test.must_match('relocate/rules/subdir2/rules-out/file1.out', + "Hello from file1.in0\n") +test.must_match('relocate/rules/subdir2/rules-out/file2.out', + "Hello from file2.in0\n") +test.must_match('relocate/rules/subdir2/rules-out/file3.out', + "Hello from file3.in1\n") +test.must_match('relocate/rules/subdir2/rules-out/file4.out', + "Hello from file4.in1\n") + +test.pass_test() diff --git a/deps/gyp/test/generator-output/gyptest-subdir2-deep.py b/deps/gyp/test/generator-output/gyptest-subdir2-deep.py new file mode 100755 index 0000000000..ec7862ddd9 --- /dev/null +++ b/deps/gyp/test/generator-output/gyptest-subdir2-deep.py @@ -0,0 +1,36 @@ +#!/usr/bin/env python + +# 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. + +""" +Verifies building a target from a .gyp file a few subdirectories +deep when the --generator-output= option is used to put the build +configuration files in a separate directory tree. +""" + +import TestGyp + +test = TestGyp.TestGyp() + +test.writable(test.workpath('src'), False) + +test.writable(test.workpath('src/subdir2/deeper/build'), True) + +test.run_gyp('deeper.gyp', + '-Dset_symroot=1', + '--generator-output=' + test.workpath('gypfiles'), + chdir='src/subdir2/deeper') + +test.build('deeper.gyp', test.ALL, chdir='gypfiles') + +chdir = 'gypfiles' + +if test.format == 'xcode': + chdir = 'src/subdir2/deeper' +test.run_built_executable('deeper', + chdir=chdir, + stdout="Hello from deeper.c\n") + +test.pass_test() diff --git a/deps/gyp/test/generator-output/gyptest-symlink.py b/deps/gyp/test/generator-output/gyptest-symlink.py new file mode 100755 index 0000000000..8b29b348c2 --- /dev/null +++ b/deps/gyp/test/generator-output/gyptest-symlink.py @@ -0,0 +1,42 @@ +#!/usr/bin/env python + +# 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. + +""" +Verifies building a target when the --generator-output= option is used to put +the build configuration files in a separate directory tree referenced by a +symlink. +""" + +import TestGyp +import os + +test = TestGyp.TestGyp() +if not hasattr(os, 'symlink'): + test.skip_test('Missing os.symlink -- skipping test.\n') + +test.writable(test.workpath('src'), False) + +test.writable(test.workpath('src/subdir2/deeper/build'), True) + +test.subdir(test.workpath('build')) +test.subdir(test.workpath('build/deeper')) +test.symlink('build/deeper', test.workpath('symlink')) + +test.writable(test.workpath('build/deeper'), True) +test.run_gyp('deeper.gyp', + '-Dset_symroot=2', + '--generator-output=' + test.workpath('symlink'), + chdir='src/subdir2/deeper') + +chdir = 'symlink' +test.build('deeper.gyp', test.ALL, chdir=chdir) + +if test.format == 'xcode': + chdir = 'src/subdir2/deeper' +test.run_built_executable('deeper', + chdir=chdir, + stdout="Hello from deeper.c\n") +test.pass_test() diff --git a/deps/gyp/test/generator-output/gyptest-top-all.py b/deps/gyp/test/generator-output/gyptest-top-all.py new file mode 100755 index 0000000000..b1776776ea --- /dev/null +++ b/deps/gyp/test/generator-output/gyptest-top-all.py @@ -0,0 +1,53 @@ +#!/usr/bin/env python + +# 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. + +""" +Verifies building a project hierarchy created when the --generator-output= +option is used to put the build configuration files in a separate +directory tree. +""" + +import TestGyp + +test = TestGyp.TestGyp() + +test.writable(test.workpath('src'), False) + +test.run_gyp('prog1.gyp', + '-Dset_symroot=1', + '--generator-output=' + test.workpath('gypfiles'), + chdir='src') + +test.writable(test.workpath('src/build'), True) +test.writable(test.workpath('src/subdir2/build'), True) +test.writable(test.workpath('src/subdir3/build'), True) + +test.build('prog1.gyp', test.ALL, chdir='gypfiles') + +chdir = 'gypfiles' + +expect = """\ +Hello from %s +Hello from inc.h +Hello from inc1/include1.h +Hello from inc2/include2.h +Hello from inc3/include3.h +Hello from subdir2/deeper/deeper.h +""" + +if test.format == 'xcode': + chdir = 'src' +test.run_built_executable('prog1', chdir=chdir, stdout=expect % 'prog1.c') + +if test.format == 'xcode': + chdir = 'src/subdir2' +test.run_built_executable('prog2', chdir=chdir, stdout=expect % 'prog2.c') + +if test.format == 'xcode': + chdir = 'src/subdir3' +test.run_built_executable('prog3', chdir=chdir, stdout=expect % 'prog3.c') + +test.pass_test() diff --git a/deps/gyp/test/generator-output/mac-bundle/Info.plist b/deps/gyp/test/generator-output/mac-bundle/Info.plist new file mode 100644 index 0000000000..8cb142e9f5 --- /dev/null +++ b/deps/gyp/test/generator-output/mac-bundle/Info.plist @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> +<plist version="1.0"> +<dict> + <key>CFBundleDevelopmentRegion</key> + <string>English</string> + <key>CFBundleExecutable</key> + <string>${EXECUTABLE_NAME}</string> + <key>CFBundleIconFile</key> + <string></string> + <key>CFBundleIdentifier</key> + <string>com.google.${PRODUCT_NAME}</string> + <key>CFBundleInfoDictionaryVersion</key> + <string>6.0</string> + <key>CFBundleName</key> + <string>${PRODUCT_NAME}</string> + <key>CFBundlePackageType</key> + <string>APPL</string> + <key>CFBundleShortVersionString</key> + <string>1.0</string> + <key>CFBundleSignature</key> + <string>ause</string> + <key>CFBundleVersion</key> + <string>1</string> + <key>LSMinimumSystemVersion</key> + <string>${MACOSX_DEPLOYMENT_TARGET}</string> + <key>NSMainNibFile</key> + <string>MainMenu</string> + <key>NSPrincipalClass</key> + <string>NSApplication</string> +</dict> +</plist> diff --git a/deps/gyp/test/generator-output/mac-bundle/app.order b/deps/gyp/test/generator-output/mac-bundle/app.order new file mode 100644 index 0000000000..4eb9e89d39 --- /dev/null +++ b/deps/gyp/test/generator-output/mac-bundle/app.order @@ -0,0 +1 @@ +_main diff --git a/deps/gyp/test/generator-output/mac-bundle/header.h b/deps/gyp/test/generator-output/mac-bundle/header.h new file mode 100644 index 0000000000..7ed7775122 --- /dev/null +++ b/deps/gyp/test/generator-output/mac-bundle/header.h @@ -0,0 +1 @@ +int f(); diff --git a/deps/gyp/test/generator-output/mac-bundle/main.c b/deps/gyp/test/generator-output/mac-bundle/main.c new file mode 100644 index 0000000000..237c8ce181 --- /dev/null +++ b/deps/gyp/test/generator-output/mac-bundle/main.c @@ -0,0 +1 @@ +int main() {} diff --git a/deps/gyp/test/generator-output/mac-bundle/resource.sb b/deps/gyp/test/generator-output/mac-bundle/resource.sb new file mode 100644 index 0000000000..731befc457 --- /dev/null +++ b/deps/gyp/test/generator-output/mac-bundle/resource.sb @@ -0,0 +1 @@ +A text file. diff --git a/deps/gyp/test/generator-output/mac-bundle/test.gyp b/deps/gyp/test/generator-output/mac-bundle/test.gyp new file mode 100644 index 0000000000..35ac674f6d --- /dev/null +++ b/deps/gyp/test/generator-output/mac-bundle/test.gyp @@ -0,0 +1,25 @@ +# 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. +{ + 'targets': [ + { + 'target_name': 'test_app', + 'product_name': 'Test App Gyp', + 'type': 'executable', + 'mac_bundle': 1, + 'sources': [ + 'main.c', + ], + 'mac_bundle_resources': [ + 'resource.sb', + ], + 'xcode_settings': { + 'INFOPLIST_FILE': 'Info.plist', + 'ORDER_FILE': 'app.order', + 'GCC_PREFIX_HEADER': 'header.h', + 'GCC_PRECOMPILE_PREFIX_HEADER': 'YES', + }, + }, + ], +} diff --git a/deps/gyp/test/generator-output/rules/build/README.txt b/deps/gyp/test/generator-output/rules/build/README.txt new file mode 100644 index 0000000000..1b052c9a24 --- /dev/null +++ b/deps/gyp/test/generator-output/rules/build/README.txt @@ -0,0 +1,4 @@ +A place-holder for this Xcode build output directory, so that the
+test script can verify that .xcodeproj files are not created in
+their normal location by making the src/ read-only, and then
+selectively making this build directory writable.
diff --git a/deps/gyp/test/generator-output/rules/copy-file.py b/deps/gyp/test/generator-output/rules/copy-file.py new file mode 100755 index 0000000000..938c336adb --- /dev/null +++ b/deps/gyp/test/generator-output/rules/copy-file.py @@ -0,0 +1,12 @@ +#!/usr/bin/env python + +# Copyright (c) 2009 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 sys + +contents = open(sys.argv[1], 'r').read() +open(sys.argv[2], 'wb').write(contents) + +sys.exit(0) diff --git a/deps/gyp/test/generator-output/rules/rules.gyp b/deps/gyp/test/generator-output/rules/rules.gyp new file mode 100644 index 0000000000..dded59aff3 --- /dev/null +++ b/deps/gyp/test/generator-output/rules/rules.gyp @@ -0,0 +1,16 @@ +# Copyright (c) 2009 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. + +{ + 'targets': [ + { + 'target_name': 'pull_in_all_actions', + 'type': 'none', + 'dependencies': [ + 'subdir1/executable.gyp:*', + 'subdir2/none.gyp:*', + ], + }, + ], +} diff --git a/deps/gyp/test/generator-output/rules/subdir1/build/README.txt b/deps/gyp/test/generator-output/rules/subdir1/build/README.txt new file mode 100644 index 0000000000..1b052c9a24 --- /dev/null +++ b/deps/gyp/test/generator-output/rules/subdir1/build/README.txt @@ -0,0 +1,4 @@ +A place-holder for this Xcode build output directory, so that the
+test script can verify that .xcodeproj files are not created in
+their normal location by making the src/ read-only, and then
+selectively making this build directory writable.
diff --git a/deps/gyp/test/generator-output/rules/subdir1/define3.in0 b/deps/gyp/test/generator-output/rules/subdir1/define3.in0 new file mode 100644 index 0000000000..cc29c643f3 --- /dev/null +++ b/deps/gyp/test/generator-output/rules/subdir1/define3.in0 @@ -0,0 +1 @@ +#define STRING3 "Hello from define3.in0\n" diff --git a/deps/gyp/test/generator-output/rules/subdir1/define4.in0 b/deps/gyp/test/generator-output/rules/subdir1/define4.in0 new file mode 100644 index 0000000000..c9b0467b32 --- /dev/null +++ b/deps/gyp/test/generator-output/rules/subdir1/define4.in0 @@ -0,0 +1 @@ +#define STRING4 "Hello from define4.in0\n" diff --git a/deps/gyp/test/generator-output/rules/subdir1/executable.gyp b/deps/gyp/test/generator-output/rules/subdir1/executable.gyp new file mode 100644 index 0000000000..42bee4d746 --- /dev/null +++ b/deps/gyp/test/generator-output/rules/subdir1/executable.gyp @@ -0,0 +1,59 @@ +# Copyright (c) 2009 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. + +{ + 'targets': [ + { + 'target_name': 'program', + 'type': 'executable', + 'msvs_cygwin_shell': 0, + 'sources': [ + 'program.c', + 'function1.in1', + 'function2.in1', + 'define3.in0', + 'define4.in0', + ], + 'include_dirs': [ + '<(INTERMEDIATE_DIR)', + ], + 'rules': [ + { + 'rule_name': 'copy_file_0', + 'extension': 'in0', + 'inputs': [ + '../copy-file.py', + ], + 'outputs': [ + # TODO: fix Make to support generated files not + # in a variable-named path like <(INTERMEDIATE_DIR) + #'<(RULE_INPUT_ROOT).c', + '<(INTERMEDIATE_DIR)/<(RULE_INPUT_ROOT).h', + ], + 'action': [ + 'python', '<(_inputs)', '<(RULE_INPUT_PATH)', '<@(_outputs)', + ], + 'process_outputs_as_sources': 0, + }, + { + 'rule_name': 'copy_file_1', + 'extension': 'in1', + 'inputs': [ + '../copy-file.py', + ], + 'outputs': [ + # TODO: fix Make to support generated files not + # in a variable-named path like <(INTERMEDIATE_DIR) + #'<(RULE_INPUT_ROOT).c', + '<(INTERMEDIATE_DIR)/<(RULE_INPUT_ROOT).c', + ], + 'action': [ + 'python', '<(_inputs)', '<(RULE_INPUT_PATH)', '<@(_outputs)', + ], + 'process_outputs_as_sources': 1, + }, + ], + }, + ], +} diff --git a/deps/gyp/test/generator-output/rules/subdir1/function1.in1 b/deps/gyp/test/generator-output/rules/subdir1/function1.in1 new file mode 100644 index 0000000000..545e7ca16b --- /dev/null +++ b/deps/gyp/test/generator-output/rules/subdir1/function1.in1 @@ -0,0 +1,6 @@ +#include <stdio.h> + +void function1(void) +{ + printf("Hello from function1.in1\n"); +} diff --git a/deps/gyp/test/generator-output/rules/subdir1/function2.in1 b/deps/gyp/test/generator-output/rules/subdir1/function2.in1 new file mode 100644 index 0000000000..6bad43f9cf --- /dev/null +++ b/deps/gyp/test/generator-output/rules/subdir1/function2.in1 @@ -0,0 +1,6 @@ +#include <stdio.h> + +void function2(void) +{ + printf("Hello from function2.in1\n"); +} diff --git a/deps/gyp/test/generator-output/rules/subdir1/program.c b/deps/gyp/test/generator-output/rules/subdir1/program.c new file mode 100644 index 0000000000..56b320632a --- /dev/null +++ b/deps/gyp/test/generator-output/rules/subdir1/program.c @@ -0,0 +1,18 @@ +#include <stdio.h> +#include "define3.h" +#include "define4.h" + +extern void function1(void); +extern void function2(void); +extern void function3(void); +extern void function4(void); + +int main(void) +{ + printf("Hello from program.c\n"); + function1(); + function2(); + printf("%s", STRING3); + printf("%s", STRING4); + return 0; +} diff --git a/deps/gyp/test/generator-output/rules/subdir2/build/README.txt b/deps/gyp/test/generator-output/rules/subdir2/build/README.txt new file mode 100644 index 0000000000..1b052c9a24 --- /dev/null +++ b/deps/gyp/test/generator-output/rules/subdir2/build/README.txt @@ -0,0 +1,4 @@ +A place-holder for this Xcode build output directory, so that the
+test script can verify that .xcodeproj files are not created in
+their normal location by making the src/ read-only, and then
+selectively making this build directory writable.
diff --git a/deps/gyp/test/generator-output/rules/subdir2/file1.in0 b/deps/gyp/test/generator-output/rules/subdir2/file1.in0 new file mode 100644 index 0000000000..7aca64f4ce --- /dev/null +++ b/deps/gyp/test/generator-output/rules/subdir2/file1.in0 @@ -0,0 +1 @@ +Hello from file1.in0 diff --git a/deps/gyp/test/generator-output/rules/subdir2/file2.in0 b/deps/gyp/test/generator-output/rules/subdir2/file2.in0 new file mode 100644 index 0000000000..80a281a2a9 --- /dev/null +++ b/deps/gyp/test/generator-output/rules/subdir2/file2.in0 @@ -0,0 +1 @@ +Hello from file2.in0 diff --git a/deps/gyp/test/generator-output/rules/subdir2/file3.in1 b/deps/gyp/test/generator-output/rules/subdir2/file3.in1 new file mode 100644 index 0000000000..60ae2e7931 --- /dev/null +++ b/deps/gyp/test/generator-output/rules/subdir2/file3.in1 @@ -0,0 +1 @@ +Hello from file3.in1 diff --git a/deps/gyp/test/generator-output/rules/subdir2/file4.in1 b/deps/gyp/test/generator-output/rules/subdir2/file4.in1 new file mode 100644 index 0000000000..5a3c30720e --- /dev/null +++ b/deps/gyp/test/generator-output/rules/subdir2/file4.in1 @@ -0,0 +1 @@ +Hello from file4.in1 diff --git a/deps/gyp/test/generator-output/rules/subdir2/none.gyp b/deps/gyp/test/generator-output/rules/subdir2/none.gyp new file mode 100644 index 0000000000..664cbd9cb7 --- /dev/null +++ b/deps/gyp/test/generator-output/rules/subdir2/none.gyp @@ -0,0 +1,49 @@ +# Copyright (c) 2009 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. + +{ + 'targets': [ + { + 'target_name': 'files', + 'type': 'none', + 'msvs_cygwin_shell': 0, + 'sources': [ + 'file1.in0', + 'file2.in0', + 'file3.in1', + 'file4.in1', + ], + 'rules': [ + { + 'rule_name': 'copy_file_0', + 'extension': 'in0', + 'inputs': [ + '../copy-file.py', + ], + 'outputs': [ + 'rules-out/<(RULE_INPUT_ROOT).out', + ], + 'action': [ + 'python', '<(_inputs)', '<(RULE_INPUT_PATH)', '<@(_outputs)', + ], + 'process_outputs_as_sources': 0, + }, + { + 'rule_name': 'copy_file_1', + 'extension': 'in1', + 'inputs': [ + '../copy-file.py', + ], + 'outputs': [ + 'rules-out/<(RULE_INPUT_ROOT).out', + ], + 'action': [ + 'python', '<(_inputs)', '<(RULE_INPUT_PATH)', '<@(_outputs)', + ], + 'process_outputs_as_sources': 1, + }, + ], + }, + ], +} diff --git a/deps/gyp/test/generator-output/rules/subdir2/rules-out/README.txt b/deps/gyp/test/generator-output/rules/subdir2/rules-out/README.txt new file mode 100644 index 0000000000..1b052c9a24 --- /dev/null +++ b/deps/gyp/test/generator-output/rules/subdir2/rules-out/README.txt @@ -0,0 +1,4 @@ +A place-holder for this Xcode build output directory, so that the
+test script can verify that .xcodeproj files are not created in
+their normal location by making the src/ read-only, and then
+selectively making this build directory writable.
diff --git a/deps/gyp/test/generator-output/src/build/README.txt b/deps/gyp/test/generator-output/src/build/README.txt new file mode 100644 index 0000000000..90ef886193 --- /dev/null +++ b/deps/gyp/test/generator-output/src/build/README.txt @@ -0,0 +1,4 @@ +A place-holder for this Xcode build output directory, so that the +test script can verify that .xcodeproj files are not created in +their normal location by making the src/ read-only, and then +selectively making this build directory writable. diff --git a/deps/gyp/test/generator-output/src/inc.h b/deps/gyp/test/generator-output/src/inc.h new file mode 100644 index 0000000000..57aa1a5a74 --- /dev/null +++ b/deps/gyp/test/generator-output/src/inc.h @@ -0,0 +1 @@ +#define INC_STRING "inc.h" diff --git a/deps/gyp/test/generator-output/src/inc1/include1.h b/deps/gyp/test/generator-output/src/inc1/include1.h new file mode 100644 index 0000000000..1d59065fc9 --- /dev/null +++ b/deps/gyp/test/generator-output/src/inc1/include1.h @@ -0,0 +1 @@ +#define INCLUDE1_STRING "inc1/include1.h" diff --git a/deps/gyp/test/generator-output/src/prog1.c b/deps/gyp/test/generator-output/src/prog1.c new file mode 100644 index 0000000000..bf7c2a17bd --- /dev/null +++ b/deps/gyp/test/generator-output/src/prog1.c @@ -0,0 +1,18 @@ +#include <stdio.h> + +#include "inc.h" +#include "include1.h" +#include "include2.h" +#include "include3.h" +#include "deeper.h" + +int main(void) +{ + printf("Hello from prog1.c\n"); + printf("Hello from %s\n", INC_STRING); + printf("Hello from %s\n", INCLUDE1_STRING); + printf("Hello from %s\n", INCLUDE2_STRING); + printf("Hello from %s\n", INCLUDE3_STRING); + printf("Hello from %s\n", DEEPER_STRING); + return 0; +} diff --git a/deps/gyp/test/generator-output/src/prog1.gyp b/deps/gyp/test/generator-output/src/prog1.gyp new file mode 100644 index 0000000000..d50e6fb0a7 --- /dev/null +++ b/deps/gyp/test/generator-output/src/prog1.gyp @@ -0,0 +1,28 @@ +# Copyright (c) 2009 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. + +{ + 'includes': [ + 'symroot.gypi', + ], + 'targets': [ + { + 'target_name': 'prog1', + 'type': 'executable', + 'dependencies': [ + 'subdir2/prog2.gyp:prog2', + ], + 'include_dirs': [ + '.', + 'inc1', + 'subdir2/inc2', + 'subdir3/inc3', + 'subdir2/deeper', + ], + 'sources': [ + 'prog1.c', + ], + }, + ], +} diff --git a/deps/gyp/test/generator-output/src/subdir2/build/README.txt b/deps/gyp/test/generator-output/src/subdir2/build/README.txt new file mode 100644 index 0000000000..90ef886193 --- /dev/null +++ b/deps/gyp/test/generator-output/src/subdir2/build/README.txt @@ -0,0 +1,4 @@ +A place-holder for this Xcode build output directory, so that the +test script can verify that .xcodeproj files are not created in +their normal location by making the src/ read-only, and then +selectively making this build directory writable. diff --git a/deps/gyp/test/generator-output/src/subdir2/deeper/build/README.txt b/deps/gyp/test/generator-output/src/subdir2/deeper/build/README.txt new file mode 100644 index 0000000000..90ef886193 --- /dev/null +++ b/deps/gyp/test/generator-output/src/subdir2/deeper/build/README.txt @@ -0,0 +1,4 @@ +A place-holder for this Xcode build output directory, so that the +test script can verify that .xcodeproj files are not created in +their normal location by making the src/ read-only, and then +selectively making this build directory writable. diff --git a/deps/gyp/test/generator-output/src/subdir2/deeper/deeper.c b/deps/gyp/test/generator-output/src/subdir2/deeper/deeper.c new file mode 100644 index 0000000000..843505cd11 --- /dev/null +++ b/deps/gyp/test/generator-output/src/subdir2/deeper/deeper.c @@ -0,0 +1,7 @@ +#include <stdio.h> + +int main(void) +{ + printf("Hello from deeper.c\n"); + return 0; +} diff --git a/deps/gyp/test/generator-output/src/subdir2/deeper/deeper.gyp b/deps/gyp/test/generator-output/src/subdir2/deeper/deeper.gyp new file mode 100644 index 0000000000..8648770872 --- /dev/null +++ b/deps/gyp/test/generator-output/src/subdir2/deeper/deeper.gyp @@ -0,0 +1,18 @@ +# Copyright (c) 2009 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. + +{ + 'includes': [ + '../../symroot.gypi', + ], + 'targets': [ + { + 'target_name': 'deeper', + 'type': 'executable', + 'sources': [ + 'deeper.c', + ], + }, + ], +} diff --git a/deps/gyp/test/generator-output/src/subdir2/deeper/deeper.h b/deps/gyp/test/generator-output/src/subdir2/deeper/deeper.h new file mode 100644 index 0000000000..f6484a0fe5 --- /dev/null +++ b/deps/gyp/test/generator-output/src/subdir2/deeper/deeper.h @@ -0,0 +1 @@ +#define DEEPER_STRING "subdir2/deeper/deeper.h" diff --git a/deps/gyp/test/generator-output/src/subdir2/inc2/include2.h b/deps/gyp/test/generator-output/src/subdir2/inc2/include2.h new file mode 100644 index 0000000000..1ccfa5dea7 --- /dev/null +++ b/deps/gyp/test/generator-output/src/subdir2/inc2/include2.h @@ -0,0 +1 @@ +#define INCLUDE2_STRING "inc2/include2.h" diff --git a/deps/gyp/test/generator-output/src/subdir2/prog2.c b/deps/gyp/test/generator-output/src/subdir2/prog2.c new file mode 100644 index 0000000000..d80d871984 --- /dev/null +++ b/deps/gyp/test/generator-output/src/subdir2/prog2.c @@ -0,0 +1,18 @@ +#include <stdio.h> + +#include "inc.h" +#include "include1.h" +#include "include2.h" +#include "include3.h" +#include "deeper.h" + +int main(void) +{ + printf("Hello from prog2.c\n"); + printf("Hello from %s\n", INC_STRING); + printf("Hello from %s\n", INCLUDE1_STRING); + printf("Hello from %s\n", INCLUDE2_STRING); + printf("Hello from %s\n", INCLUDE3_STRING); + printf("Hello from %s\n", DEEPER_STRING); + return 0; +} diff --git a/deps/gyp/test/generator-output/src/subdir2/prog2.gyp b/deps/gyp/test/generator-output/src/subdir2/prog2.gyp new file mode 100644 index 0000000000..7176ed8be7 --- /dev/null +++ b/deps/gyp/test/generator-output/src/subdir2/prog2.gyp @@ -0,0 +1,28 @@ +# Copyright (c) 2009 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. + +{ + 'includes': [ + '../symroot.gypi', + ], + 'targets': [ + { + 'target_name': 'prog2', + 'type': 'executable', + 'include_dirs': [ + '..', + '../inc1', + 'inc2', + '../subdir3/inc3', + 'deeper', + ], + 'dependencies': [ + '../subdir3/prog3.gyp:prog3', + ], + 'sources': [ + 'prog2.c', + ], + }, + ], +} diff --git a/deps/gyp/test/generator-output/src/subdir3/build/README.txt b/deps/gyp/test/generator-output/src/subdir3/build/README.txt new file mode 100644 index 0000000000..90ef886193 --- /dev/null +++ b/deps/gyp/test/generator-output/src/subdir3/build/README.txt @@ -0,0 +1,4 @@ +A place-holder for this Xcode build output directory, so that the +test script can verify that .xcodeproj files are not created in +their normal location by making the src/ read-only, and then +selectively making this build directory writable. diff --git a/deps/gyp/test/generator-output/src/subdir3/inc3/include3.h b/deps/gyp/test/generator-output/src/subdir3/inc3/include3.h new file mode 100644 index 0000000000..bf53bf1f00 --- /dev/null +++ b/deps/gyp/test/generator-output/src/subdir3/inc3/include3.h @@ -0,0 +1 @@ +#define INCLUDE3_STRING "inc3/include3.h" diff --git a/deps/gyp/test/generator-output/src/subdir3/prog3.c b/deps/gyp/test/generator-output/src/subdir3/prog3.c new file mode 100644 index 0000000000..c72233da19 --- /dev/null +++ b/deps/gyp/test/generator-output/src/subdir3/prog3.c @@ -0,0 +1,18 @@ +#include <stdio.h> + +#include "inc.h" +#include "include1.h" +#include "include2.h" +#include "include3.h" +#include "deeper.h" + +int main(void) +{ + printf("Hello from prog3.c\n"); + printf("Hello from %s\n", INC_STRING); + printf("Hello from %s\n", INCLUDE1_STRING); + printf("Hello from %s\n", INCLUDE2_STRING); + printf("Hello from %s\n", INCLUDE3_STRING); + printf("Hello from %s\n", DEEPER_STRING); + return 0; +} diff --git a/deps/gyp/test/generator-output/src/subdir3/prog3.gyp b/deps/gyp/test/generator-output/src/subdir3/prog3.gyp new file mode 100644 index 0000000000..46c5e000a2 --- /dev/null +++ b/deps/gyp/test/generator-output/src/subdir3/prog3.gyp @@ -0,0 +1,25 @@ +# Copyright (c) 2009 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. + +{ + 'includes': [ + '../symroot.gypi', + ], + 'targets': [ + { + 'target_name': 'prog3', + 'type': 'executable', + 'include_dirs': [ + '..', + '../inc1', + '../subdir2/inc2', + 'inc3', + '../subdir2/deeper', + ], + 'sources': [ + 'prog3.c', + ], + }, + ], +} diff --git a/deps/gyp/test/generator-output/src/symroot.gypi b/deps/gyp/test/generator-output/src/symroot.gypi new file mode 100644 index 0000000000..519916427c --- /dev/null +++ b/deps/gyp/test/generator-output/src/symroot.gypi @@ -0,0 +1,16 @@ +# Copyright (c) 2009 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. + +{ + 'variables': { + 'set_symroot%': 0, + }, + 'conditions': [ + ['set_symroot == 1', { + 'xcode_settings': { + 'SYMROOT': '<(DEPTH)/build', + }, + }], + ], +} diff --git a/deps/gyp/test/gyp-defines/defines.gyp b/deps/gyp/test/gyp-defines/defines.gyp new file mode 100644 index 0000000000..f59bbd20d2 --- /dev/null +++ b/deps/gyp/test/gyp-defines/defines.gyp @@ -0,0 +1,26 @@ +# 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. + +{ + 'targets': [ + { + 'target_name': 'test_target', + 'type': 'none', + 'actions': [ + { + 'action_name': 'test_action', + 'inputs': [], + 'outputs': [ 'action.txt' ], + 'action': [ + 'python', + 'echo.py', + '<(key)', + '<(_outputs)', + ], + 'msvs_cygwin_shell': 0, + } + ], + }, + ], +} diff --git a/deps/gyp/test/gyp-defines/echo.py b/deps/gyp/test/gyp-defines/echo.py new file mode 100644 index 0000000000..b85add12f6 --- /dev/null +++ b/deps/gyp/test/gyp-defines/echo.py @@ -0,0 +1,11 @@ +#!/usr/bin/env python + +# 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 sys + +f = open(sys.argv[2], 'w+') +f.write(sys.argv[1]) +f.close() diff --git a/deps/gyp/test/gyp-defines/gyptest-multiple-values.py b/deps/gyp/test/gyp-defines/gyptest-multiple-values.py new file mode 100644 index 0000000000..67735cce6a --- /dev/null +++ b/deps/gyp/test/gyp-defines/gyptest-multiple-values.py @@ -0,0 +1,36 @@ +#!/usr/bin/env python + +# 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. + +""" +Verifies that when multiple values are supplied for a gyp define, the last one +is used. +""" + +import os +import TestGyp + +test = TestGyp.TestGyp() + +os.environ['GYP_DEFINES'] = 'key=value1 key=value2 key=value3' +test.run_gyp('defines.gyp') + +test.build('defines.gyp') +test.must_contain('action.txt', 'value3') + +# The last occurrence of a repeated set should take precedence over other +# values. +os.environ['GYP_DEFINES'] = 'key=repeated_value key=value1 key=repeated_value' +test.run_gyp('defines.gyp') + +if test.format == 'msvs' and not test.uses_msbuild: + # msvs versions before 2010 don't detect build rule changes not reflected + # in file system timestamps. Rebuild to see differences. + test.build('defines.gyp', rebuild=True) +else: + test.build('defines.gyp') +test.must_contain('action.txt', 'repeated_value') + +test.pass_test() diff --git a/deps/gyp/test/gyp-defines/gyptest-regyp.py b/deps/gyp/test/gyp-defines/gyptest-regyp.py new file mode 100644 index 0000000000..0895d81d4f --- /dev/null +++ b/deps/gyp/test/gyp-defines/gyptest-regyp.py @@ -0,0 +1,40 @@ +#!/usr/bin/env python + +# 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. + +""" +Verifies that when the same value is repeated for a gyp define, duplicates are +stripped from the regeneration rule. +""" + +import os +import TestGyp + +# Regenerating build files when a gyp file changes is currently only supported +# by the make generator. +test = TestGyp.TestGyp(formats=['make']) + +os.environ['GYP_DEFINES'] = 'key=repeated_value key=value1 key=repeated_value' +test.run_gyp('defines.gyp') +test.build('defines.gyp') + +# The last occurrence of a repeated set should take precedence over other +# values. See gyptest-multiple-values.py. +test.must_contain('action.txt', 'repeated_value') + +# So the regeneration rule needs to use the correct order. +test.must_not_contain( + 'Makefile', '"-Dkey=repeated_value" "-Dkey=value1" "-Dkey=repeated_value"') +test.must_contain('Makefile', '"-Dkey=value1" "-Dkey=repeated_value"') + +# Sleep so that the changed gyp file will have a newer timestamp than the +# previously generated build files. +test.sleep() +os.utime("defines.gyp", None) + +test.build('defines.gyp') +test.must_contain('action.txt', 'repeated_value') + +test.pass_test() diff --git a/deps/gyp/test/hard_dependency/gyptest-exported-hard-dependency.py b/deps/gyp/test/hard_dependency/gyptest-exported-hard-dependency.py new file mode 100755 index 0000000000..ba51528800 --- /dev/null +++ b/deps/gyp/test/hard_dependency/gyptest-exported-hard-dependency.py @@ -0,0 +1,37 @@ +#!/usr/bin/env python + +# Copyright (c) 2009 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. + +""" +Verify that a hard_dependency that is exported is pulled in as a dependency +for a target if the target is a static library and if the generator will +remove dependencies between static libraries. +""" + +import TestGyp + +test = TestGyp.TestGyp() + +if test.format == 'dump_dependency_json': + test.skip_test('Skipping test; dependency JSON does not adjust ' \ + 'static libraries.\n') + +test.run_gyp('hard_dependency.gyp', chdir='src') + +chdir = 'relocate/src' +test.relocate('src', chdir) + +test.build('hard_dependency.gyp', 'c', chdir=chdir) + +# The 'a' static library should be built, as it has actions with side-effects +# that are necessary to compile 'c'. Even though 'c' does not directly depend +# on 'a', because 'a' is a hard_dependency that 'b' exports, 'c' should import +# it as a hard_dependency and ensure it is built before building 'c'. +test.built_file_must_exist('a', type=test.STATIC_LIB, chdir=chdir) +test.built_file_must_not_exist('b', type=test.STATIC_LIB, chdir=chdir) +test.built_file_must_exist('c', type=test.STATIC_LIB, chdir=chdir) +test.built_file_must_not_exist('d', type=test.STATIC_LIB, chdir=chdir) + +test.pass_test() diff --git a/deps/gyp/test/hard_dependency/gyptest-no-exported-hard-dependency.py b/deps/gyp/test/hard_dependency/gyptest-no-exported-hard-dependency.py new file mode 100755 index 0000000000..10774ca2a0 --- /dev/null +++ b/deps/gyp/test/hard_dependency/gyptest-no-exported-hard-dependency.py @@ -0,0 +1,36 @@ +#!/usr/bin/env python + +# Copyright (c) 2009 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. + +""" +Verify that a hard_dependency that is not exported is not pulled in as a +dependency for a target if the target does not explicitly specify a dependency +and none of its dependencies export the hard_dependency. +""" + +import TestGyp + +test = TestGyp.TestGyp() + +if test.format == 'dump_dependency_json': + test.skip_test('Skipping test; dependency JSON does not adjust ' \ + 'static libaries.\n') + +test.run_gyp('hard_dependency.gyp', chdir='src') + +chdir = 'relocate/src' +test.relocate('src', chdir) + +test.build('hard_dependency.gyp', 'd', chdir=chdir) + +# Because 'c' does not export a hard_dependency, only the target 'd' should +# be built. This is because the 'd' target does not need the generated headers +# in order to be compiled. +test.built_file_must_not_exist('a', type=test.STATIC_LIB, chdir=chdir) +test.built_file_must_not_exist('b', type=test.STATIC_LIB, chdir=chdir) +test.built_file_must_not_exist('c', type=test.STATIC_LIB, chdir=chdir) +test.built_file_must_exist('d', type=test.STATIC_LIB, chdir=chdir) + +test.pass_test() diff --git a/deps/gyp/test/hard_dependency/src/a.c b/deps/gyp/test/hard_dependency/src/a.c new file mode 100644 index 0000000000..0fa0223c97 --- /dev/null +++ b/deps/gyp/test/hard_dependency/src/a.c @@ -0,0 +1,9 @@ +/* Copyright (c) 2011 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. */ + +#include "a.h" + +int funcA() { + return 42; +} diff --git a/deps/gyp/test/hard_dependency/src/a.h b/deps/gyp/test/hard_dependency/src/a.h new file mode 100644 index 0000000000..854a06504a --- /dev/null +++ b/deps/gyp/test/hard_dependency/src/a.h @@ -0,0 +1,12 @@ +/* Copyright (c) 2009 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. */ + +#ifndef A_H_ +#define A_H_ + +#include "generated.h" + +int funcA(); + +#endif // A_H_ diff --git a/deps/gyp/test/hard_dependency/src/b.c b/deps/gyp/test/hard_dependency/src/b.c new file mode 100644 index 0000000000..0baace929e --- /dev/null +++ b/deps/gyp/test/hard_dependency/src/b.c @@ -0,0 +1,9 @@ +/* Copyright (c) 2011 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. */ + +#include "a.h" + +int funcB() { + return funcA(); +} diff --git a/deps/gyp/test/hard_dependency/src/b.h b/deps/gyp/test/hard_dependency/src/b.h new file mode 100644 index 0000000000..22b48cefe2 --- /dev/null +++ b/deps/gyp/test/hard_dependency/src/b.h @@ -0,0 +1,12 @@ +/* Copyright (c) 2011 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. */ + +#ifndef B_H_ +#define B_H_ + +#include "a.h" + +int funcB(); + +#endif // B_H_ diff --git a/deps/gyp/test/hard_dependency/src/c.c b/deps/gyp/test/hard_dependency/src/c.c new file mode 100644 index 0000000000..7d0068208e --- /dev/null +++ b/deps/gyp/test/hard_dependency/src/c.c @@ -0,0 +1,10 @@ +/* Copyright (c) 2011 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. */ + +#include "b.h" +#include "c.h" + +int funcC() { + return funcB(); +} diff --git a/deps/gyp/test/hard_dependency/src/c.h b/deps/gyp/test/hard_dependency/src/c.h new file mode 100644 index 0000000000..f4ea7fefa2 --- /dev/null +++ b/deps/gyp/test/hard_dependency/src/c.h @@ -0,0 +1,10 @@ +/* Copyright (c) 2011 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. */ + +#ifndef C_H_ +#define C_H_ + +int funcC(); + +#endif // C_H_ diff --git a/deps/gyp/test/hard_dependency/src/d.c b/deps/gyp/test/hard_dependency/src/d.c new file mode 100644 index 0000000000..d016c3ce71 --- /dev/null +++ b/deps/gyp/test/hard_dependency/src/d.c @@ -0,0 +1,9 @@ +/* Copyright (c) 2009 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. */ + +#include "c.h" + +int funcD() { + return funcC(); +} diff --git a/deps/gyp/test/hard_dependency/src/emit.py b/deps/gyp/test/hard_dependency/src/emit.py new file mode 100755 index 0000000000..2df74b79a1 --- /dev/null +++ b/deps/gyp/test/hard_dependency/src/emit.py @@ -0,0 +1,11 @@ +#!/usr/bin/env python + +# Copyright (c) 2011 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 sys + +f = open(sys.argv[1], 'wb') +f.write('/* Hello World */\n') +f.close() diff --git a/deps/gyp/test/hard_dependency/src/hard_dependency.gyp b/deps/gyp/test/hard_dependency/src/hard_dependency.gyp new file mode 100644 index 0000000000..4479c5f045 --- /dev/null +++ b/deps/gyp/test/hard_dependency/src/hard_dependency.gyp @@ -0,0 +1,78 @@ +# Copyright (c) 2011 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. + +{ + 'targets': [ + { + 'target_name': 'a', + 'type': 'static_library', + 'sources': [ + 'a.c', + 'a.h', + ], + 'hard_dependency': 1, + 'actions': [ + { + 'action_name': 'generate_headers', + 'inputs': [ + 'emit.py' + ], + 'outputs': [ + '<(SHARED_INTERMEDIATE_DIR)/generated.h' + ], + 'action': [ + 'python', + 'emit.py', + '<(SHARED_INTERMEDIATE_DIR)/generated.h', + ], + # Allows the test to run without hermetic cygwin on windows. + 'msvs_cygwin_shell': 0, + }, + ], + 'include_dirs': [ + '<(SHARED_INTERMEDIATE_DIR)', + ], + 'direct_dependent_settings': { + 'include_dirs': [ + '<(SHARED_INTERMEDIATE_DIR)', + ], + }, + }, + { + 'target_name': 'b', + 'type': 'static_library', + 'sources': [ + 'b.c', + 'b.h', + ], + 'dependencies': [ + 'a', + ], + 'export_dependent_settings': [ + 'a', + ], + }, + { + 'target_name': 'c', + 'type': 'static_library', + 'sources': [ + 'c.c', + 'c.h', + ], + 'dependencies': [ + 'b', + ], + }, + { + 'target_name': 'd', + 'type': 'static_library', + 'sources': [ + 'd.c', + ], + 'dependencies': [ + 'c', + ], + } + ], +} diff --git a/deps/gyp/test/hello/gyptest-all.py b/deps/gyp/test/hello/gyptest-all.py new file mode 100755 index 0000000000..1739b6886e --- /dev/null +++ b/deps/gyp/test/hello/gyptest-all.py @@ -0,0 +1,24 @@ +#!/usr/bin/env python + +# Copyright (c) 2009 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. + +""" +Verifies simplest-possible build of a "Hello, world!" program +using an explicit build target of 'all'. +""" + +import TestGyp + +test = TestGyp.TestGyp(workdir='workarea_all') + +test.run_gyp('hello.gyp') + +test.build('hello.gyp', test.ALL) + +test.run_built_executable('hello', stdout="Hello, world!\n") + +test.up_to_date('hello.gyp', test.ALL) + +test.pass_test() diff --git a/deps/gyp/test/hello/gyptest-default.py b/deps/gyp/test/hello/gyptest-default.py new file mode 100755 index 0000000000..22377e7ac5 --- /dev/null +++ b/deps/gyp/test/hello/gyptest-default.py @@ -0,0 +1,24 @@ +#!/usr/bin/env python + +# Copyright (c) 2009 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. + +""" +Verifies simplest-possible build of a "Hello, world!" program +using the default build target. +""" + +import TestGyp + +test = TestGyp.TestGyp(workdir='workarea_default') + +test.run_gyp('hello.gyp') + +test.build('hello.gyp') + +test.run_built_executable('hello', stdout="Hello, world!\n") + +test.up_to_date('hello.gyp', test.DEFAULT) + +test.pass_test() diff --git a/deps/gyp/test/hello/gyptest-disable-regyp.py b/deps/gyp/test/hello/gyptest-disable-regyp.py new file mode 100755 index 0000000000..1e4b306674 --- /dev/null +++ b/deps/gyp/test/hello/gyptest-disable-regyp.py @@ -0,0 +1,32 @@ +#!/usr/bin/env python + +# Copyright (c) 2009 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. + +""" +Verifies that Makefiles don't get rebuilt when a source gyp file changes and +the disable_regeneration generator flag is set. +""" + +import TestGyp + +test = TestGyp.TestGyp() + +test.run_gyp('hello.gyp', '-Gauto_regeneration=0') + +test.build('hello.gyp', test.ALL) + +test.run_built_executable('hello', stdout="Hello, world!\n") + +# Sleep so that the changed gyp file will have a newer timestamp than the +# previously generated build files. +test.sleep() +test.write('hello.gyp', test.read('hello2.gyp')) + +test.build('hello.gyp', test.ALL) + +# Should still be the old executable, as regeneration was disabled. +test.run_built_executable('hello', stdout="Hello, world!\n") + +test.pass_test() diff --git a/deps/gyp/test/hello/gyptest-regyp-output.py b/deps/gyp/test/hello/gyptest-regyp-output.py new file mode 100644 index 0000000000..fd88a85503 --- /dev/null +++ b/deps/gyp/test/hello/gyptest-regyp-output.py @@ -0,0 +1,36 @@ +#!/usr/bin/env python + +# Copyright (c) 2013 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. + +""" +Verifies that Makefiles get rebuilt when a source gyp file changes and +--generator-output is used. +""" + +import TestGyp + +# Regenerating build files when a gyp file changes is currently only supported +# by the make generator, and --generator-output is not supported by ninja, so we +# can only test for make. +test = TestGyp.TestGyp(formats=['make']) + +CHDIR='generator-output' + +test.run_gyp('hello.gyp', '--generator-output=%s' % CHDIR) + +test.build('hello.gyp', test.ALL, chdir=CHDIR) + +test.run_built_executable('hello', stdout="Hello, world!\n", chdir=CHDIR) + +# Sleep so that the changed gyp file will have a newer timestamp than the +# previously generated build files. +test.sleep() +test.write('hello.gyp', test.read('hello2.gyp')) + +test.build('hello.gyp', test.ALL, chdir=CHDIR) + +test.run_built_executable('hello', stdout="Hello, two!\n", chdir=CHDIR) + +test.pass_test() diff --git a/deps/gyp/test/hello/gyptest-regyp.py b/deps/gyp/test/hello/gyptest-regyp.py new file mode 100755 index 0000000000..b513edcd07 --- /dev/null +++ b/deps/gyp/test/hello/gyptest-regyp.py @@ -0,0 +1,32 @@ +#!/usr/bin/env python + +# 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. + +""" +Verifies that Makefiles get rebuilt when a source gyp file changes. +""" + +import TestGyp + +# Regenerating build files when a gyp file changes is currently only supported +# by the make generator. +test = TestGyp.TestGyp(formats=['make']) + +test.run_gyp('hello.gyp') + +test.build('hello.gyp', test.ALL) + +test.run_built_executable('hello', stdout="Hello, world!\n") + +# Sleep so that the changed gyp file will have a newer timestamp than the +# previously generated build files. +test.sleep() +test.write('hello.gyp', test.read('hello2.gyp')) + +test.build('hello.gyp', test.ALL) + +test.run_built_executable('hello', stdout="Hello, two!\n") + +test.pass_test() diff --git a/deps/gyp/test/hello/gyptest-target.py b/deps/gyp/test/hello/gyptest-target.py new file mode 100755 index 0000000000..1abaf7057b --- /dev/null +++ b/deps/gyp/test/hello/gyptest-target.py @@ -0,0 +1,24 @@ +#!/usr/bin/env python + +# Copyright (c) 2009 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. + +""" +Verifies simplest-possible build of a "Hello, world!" program +using an explicit build target of 'hello'. +""" + +import TestGyp + +test = TestGyp.TestGyp(workdir='workarea_target') + +test.run_gyp('hello.gyp') + +test.build('hello.gyp', 'hello') + +test.run_built_executable('hello', stdout="Hello, world!\n") + +test.up_to_date('hello.gyp', 'hello') + +test.pass_test() diff --git a/deps/gyp/test/hello/hello.c b/deps/gyp/test/hello/hello.c new file mode 100644 index 0000000000..0a4c806019 --- /dev/null +++ b/deps/gyp/test/hello/hello.c @@ -0,0 +1,11 @@ +/* Copyright (c) 2009 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. */ + +#include <stdio.h> + +int main(void) +{ + printf("Hello, world!\n"); + return 0; +} diff --git a/deps/gyp/test/hello/hello.gyp b/deps/gyp/test/hello/hello.gyp new file mode 100644 index 0000000000..1974d51ccd --- /dev/null +++ b/deps/gyp/test/hello/hello.gyp @@ -0,0 +1,15 @@ +# Copyright (c) 2009 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. + +{ + 'targets': [ + { + 'target_name': 'hello', + 'type': 'executable', + 'sources': [ + 'hello.c', + ], + }, + ], +} diff --git a/deps/gyp/test/hello/hello2.c b/deps/gyp/test/hello/hello2.c new file mode 100644 index 0000000000..b14299cae0 --- /dev/null +++ b/deps/gyp/test/hello/hello2.c @@ -0,0 +1,11 @@ +/* Copyright (c) 2009 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. */ + +#include <stdio.h> + +int main(void) +{ + printf("Hello, two!\n"); + return 0; +} diff --git a/deps/gyp/test/hello/hello2.gyp b/deps/gyp/test/hello/hello2.gyp new file mode 100644 index 0000000000..25b08caf3c --- /dev/null +++ b/deps/gyp/test/hello/hello2.gyp @@ -0,0 +1,15 @@ +# Copyright (c) 2009 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. + +{ + 'targets': [ + { + 'target_name': 'hello', + 'type': 'executable', + 'sources': [ + 'hello2.c', + ], + }, + ], +} diff --git a/deps/gyp/test/home_dot_gyp/gyptest-home-includes-config-arg.py b/deps/gyp/test/home_dot_gyp/gyptest-home-includes-config-arg.py new file mode 100755 index 0000000000..82e39f9d07 --- /dev/null +++ b/deps/gyp/test/home_dot_gyp/gyptest-home-includes-config-arg.py @@ -0,0 +1,31 @@ +#!/usr/bin/env python + +# Copyright (c) 2013 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. + +""" +Verifies inclusion of $HOME/.gyp/include.gypi works when --config-dir is +specified. +""" + +import os +import TestGyp + +test = TestGyp.TestGyp() + +os.environ['HOME'] = os.path.abspath('home2') + +test.run_gyp('all.gyp', '--config-dir=~/.gyp_new', chdir='src') + +# After relocating, we should still be able to build (build file shouldn't +# contain relative reference to ~/.gyp/include.gypi) +test.relocate('src', 'relocate/src') + +test.build('all.gyp', test.ALL, chdir='relocate/src') + +test.run_built_executable('printfoo', + chdir='relocate/src', + stdout='FOO is fromhome3\n') + +test.pass_test() diff --git a/deps/gyp/test/home_dot_gyp/gyptest-home-includes-config-env.py b/deps/gyp/test/home_dot_gyp/gyptest-home-includes-config-env.py new file mode 100755 index 0000000000..6f4b299ede --- /dev/null +++ b/deps/gyp/test/home_dot_gyp/gyptest-home-includes-config-env.py @@ -0,0 +1,33 @@ +#!/usr/bin/env python + +# Copyright (c) 2013 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. + +""" +Verifies inclusion of $HOME/.gyp_new/include.gypi works when GYP_CONFIG_DIR +is set. +""" + +import os +import TestGyp + +test = TestGyp.TestGyp() + +os.environ['HOME'] = os.path.abspath('home') +os.environ['GYP_CONFIG_DIR'] = os.path.join(os.path.abspath('home2'), + '.gyp_new') + +test.run_gyp('all.gyp', chdir='src') + +# After relocating, we should still be able to build (build file shouldn't +# contain relative reference to ~/.gyp_new/include.gypi) +test.relocate('src', 'relocate/src') + +test.build('all.gyp', test.ALL, chdir='relocate/src') + +test.run_built_executable('printfoo', + chdir='relocate/src', + stdout='FOO is fromhome3\n') + +test.pass_test() diff --git a/deps/gyp/test/home_dot_gyp/gyptest-home-includes-regyp.py b/deps/gyp/test/home_dot_gyp/gyptest-home-includes-regyp.py new file mode 100755 index 0000000000..fdf8b14464 --- /dev/null +++ b/deps/gyp/test/home_dot_gyp/gyptest-home-includes-regyp.py @@ -0,0 +1,44 @@ +#!/usr/bin/env python + +# 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. + +""" +Verifies inclusion of $HOME/.gyp/include.gypi works properly with relocation +and with regeneration. +""" + +import os +import TestGyp + +# Regenerating build files when a gyp file changes is currently only supported +# by the make generator. +test = TestGyp.TestGyp(formats=['make']) + +os.environ['HOME'] = os.path.abspath('home') + +test.run_gyp('all.gyp', chdir='src') + +# After relocating, we should still be able to build (build file shouldn't +# contain relative reference to ~/.gyp/include.gypi) +test.relocate('src', 'relocate/src') + +test.build('all.gyp', test.ALL, chdir='relocate/src') + +test.run_built_executable('printfoo', + chdir='relocate/src', + stdout='FOO is fromhome\n') + +# Building should notice any changes to ~/.gyp/include.gypi and regyp. +test.sleep() + +test.write('home/.gyp/include.gypi', test.read('home2/.gyp/include.gypi')) + +test.build('all.gyp', test.ALL, chdir='relocate/src') + +test.run_built_executable('printfoo', + chdir='relocate/src', + stdout='FOO is fromhome2\n') + +test.pass_test() diff --git a/deps/gyp/test/home_dot_gyp/gyptest-home-includes.py b/deps/gyp/test/home_dot_gyp/gyptest-home-includes.py new file mode 100755 index 0000000000..8ad52556be --- /dev/null +++ b/deps/gyp/test/home_dot_gyp/gyptest-home-includes.py @@ -0,0 +1,30 @@ +#!/usr/bin/env python + +# Copyright (c) 2011 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. + +""" +Verifies inclusion of $HOME/.gyp/include.gypi works. +""" + +import os +import TestGyp + +test = TestGyp.TestGyp() + +os.environ['HOME'] = os.path.abspath('home') + +test.run_gyp('all.gyp', chdir='src') + +# After relocating, we should still be able to build (build file shouldn't +# contain relative reference to ~/.gyp/include.gypi) +test.relocate('src', 'relocate/src') + +test.build('all.gyp', test.ALL, chdir='relocate/src') + +test.run_built_executable('printfoo', + chdir='relocate/src', + stdout='FOO is fromhome\n') + +test.pass_test() diff --git a/deps/gyp/test/home_dot_gyp/home/.gyp/include.gypi b/deps/gyp/test/home_dot_gyp/home/.gyp/include.gypi new file mode 100644 index 0000000000..fcfb39befd --- /dev/null +++ b/deps/gyp/test/home_dot_gyp/home/.gyp/include.gypi @@ -0,0 +1,5 @@ +{ + 'variables': { + 'foo': '"fromhome"', + }, +} diff --git a/deps/gyp/test/home_dot_gyp/home2/.gyp/include.gypi b/deps/gyp/test/home_dot_gyp/home2/.gyp/include.gypi new file mode 100644 index 0000000000..f0d84b31ad --- /dev/null +++ b/deps/gyp/test/home_dot_gyp/home2/.gyp/include.gypi @@ -0,0 +1,5 @@ +{ + 'variables': { + 'foo': '"fromhome2"', + }, +} diff --git a/deps/gyp/test/home_dot_gyp/home2/.gyp_new/include.gypi b/deps/gyp/test/home_dot_gyp/home2/.gyp_new/include.gypi new file mode 100644 index 0000000000..4094dfd2f8 --- /dev/null +++ b/deps/gyp/test/home_dot_gyp/home2/.gyp_new/include.gypi @@ -0,0 +1,5 @@ +{ + 'variables': { + 'foo': '"fromhome3"', + }, +} diff --git a/deps/gyp/test/home_dot_gyp/src/all.gyp b/deps/gyp/test/home_dot_gyp/src/all.gyp new file mode 100644 index 0000000000..14b6aea285 --- /dev/null +++ b/deps/gyp/test/home_dot_gyp/src/all.gyp @@ -0,0 +1,22 @@ +# Copyright (c) 2009 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. + +{ + 'variables': { + 'foo%': '"fromdefault"', + }, + 'targets': [ + { + 'target_name': 'printfoo', + 'type': 'executable', + 'sources': [ + 'printfoo.c', + ], + 'defines': [ + 'FOO=<(foo)', + ], + }, + ], +} + diff --git a/deps/gyp/test/home_dot_gyp/src/printfoo.c b/deps/gyp/test/home_dot_gyp/src/printfoo.c new file mode 100644 index 0000000000..9bb67181b9 --- /dev/null +++ b/deps/gyp/test/home_dot_gyp/src/printfoo.c @@ -0,0 +1,7 @@ +#include <stdio.h> + +int main(void) +{ + printf("FOO is %s\n", FOO); + return 0; +} diff --git a/deps/gyp/test/include_dirs/gyptest-all.py b/deps/gyp/test/include_dirs/gyptest-all.py new file mode 100755 index 0000000000..d64bc6a9ca --- /dev/null +++ b/deps/gyp/test/include_dirs/gyptest-all.py @@ -0,0 +1,43 @@ +#!/usr/bin/env python + +# Copyright (c) 2009 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. + +""" +Verifies use of include_dirs when using an explicit build target of 'all'. +""" + +import TestGyp + +test = TestGyp.TestGyp() + +test.run_gyp('includes.gyp', chdir='src') + +test.relocate('src', 'relocate/src') + +test.build('includes.gyp', test.ALL, chdir='relocate/src') + +expect = """\ +Hello from includes.c +Hello from inc.h +Hello from include1.h +Hello from subdir/inc2/include2.h +Hello from shadow2/shadow.h +""" +test.run_built_executable('includes', stdout=expect, chdir='relocate/src') + +if test.format == 'xcode': + chdir='relocate/src/subdir' +else: + chdir='relocate/src' + +expect = """\ +Hello from subdir/subdir_includes.c +Hello from subdir/inc.h +Hello from include1.h +Hello from subdir/inc2/include2.h +""" +test.run_built_executable('subdir_includes', stdout=expect, chdir=chdir) + +test.pass_test() diff --git a/deps/gyp/test/include_dirs/gyptest-default.py b/deps/gyp/test/include_dirs/gyptest-default.py new file mode 100755 index 0000000000..fc6141587e --- /dev/null +++ b/deps/gyp/test/include_dirs/gyptest-default.py @@ -0,0 +1,43 @@ +#!/usr/bin/env python + +# Copyright (c) 2009 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. + +""" +Verifies use of include_dirs when using the default build target. +""" + +import TestGyp + +test = TestGyp.TestGyp() + +test.run_gyp('includes.gyp', chdir='src') + +test.relocate('src', 'relocate/src') + +test.build('includes.gyp', test.ALL, chdir='relocate/src') + +expect = """\ +Hello from includes.c +Hello from inc.h +Hello from include1.h +Hello from subdir/inc2/include2.h +Hello from shadow2/shadow.h +""" +test.run_built_executable('includes', stdout=expect, chdir='relocate/src') + +if test.format == 'xcode': + chdir='relocate/src/subdir' +else: + chdir='relocate/src' + +expect = """\ +Hello from subdir/subdir_includes.c +Hello from subdir/inc.h +Hello from include1.h +Hello from subdir/inc2/include2.h +""" +test.run_built_executable('subdir_includes', stdout=expect, chdir=chdir) + +test.pass_test() diff --git a/deps/gyp/test/include_dirs/src/inc.h b/deps/gyp/test/include_dirs/src/inc.h new file mode 100644 index 0000000000..0398d6915f --- /dev/null +++ b/deps/gyp/test/include_dirs/src/inc.h @@ -0,0 +1 @@ +#define INC_STRING "inc.h" diff --git a/deps/gyp/test/include_dirs/src/inc1/include1.h b/deps/gyp/test/include_dirs/src/inc1/include1.h new file mode 100644 index 0000000000..43356b5f47 --- /dev/null +++ b/deps/gyp/test/include_dirs/src/inc1/include1.h @@ -0,0 +1 @@ +#define INCLUDE1_STRING "include1.h" diff --git a/deps/gyp/test/include_dirs/src/includes.c b/deps/gyp/test/include_dirs/src/includes.c new file mode 100644 index 0000000000..6e2a23cdff --- /dev/null +++ b/deps/gyp/test/include_dirs/src/includes.c @@ -0,0 +1,19 @@ +#include <stdio.h> + +#include "inc.h" +#include "include1.h" +#include "include2.h" +#include "shadow.h" + +int main(void) +{ + printf("Hello from includes.c\n"); + printf("Hello from %s\n", INC_STRING); + printf("Hello from %s\n", INCLUDE1_STRING); + printf("Hello from %s\n", INCLUDE2_STRING); + /* Test that include_dirs happen first: The gyp file has a -Ishadow1 + cflag and an include_dir of shadow2. Including shadow.h should get + the shadow.h from the include_dir. */ + printf("Hello from %s\n", SHADOW_STRING); + return 0; +} diff --git a/deps/gyp/test/include_dirs/src/includes.gyp b/deps/gyp/test/include_dirs/src/includes.gyp new file mode 100644 index 0000000000..3592690208 --- /dev/null +++ b/deps/gyp/test/include_dirs/src/includes.gyp @@ -0,0 +1,27 @@ +# Copyright (c) 2009 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. + +{ + 'targets': [ + { + 'target_name': 'includes', + 'type': 'executable', + 'dependencies': [ + 'subdir/subdir_includes.gyp:subdir_includes', + ], + 'cflags': [ + '-Ishadow1', + ], + 'include_dirs': [ + '.', + 'inc1', + 'shadow2', + 'subdir/inc2', + ], + 'sources': [ + 'includes.c', + ], + }, + ], +} diff --git a/deps/gyp/test/include_dirs/src/shadow1/shadow.h b/deps/gyp/test/include_dirs/src/shadow1/shadow.h new file mode 100644 index 0000000000..80f6de20b8 --- /dev/null +++ b/deps/gyp/test/include_dirs/src/shadow1/shadow.h @@ -0,0 +1 @@ +#define SHADOW_STRING "shadow1/shadow.h" diff --git a/deps/gyp/test/include_dirs/src/shadow2/shadow.h b/deps/gyp/test/include_dirs/src/shadow2/shadow.h new file mode 100644 index 0000000000..fad5ccd085 --- /dev/null +++ b/deps/gyp/test/include_dirs/src/shadow2/shadow.h @@ -0,0 +1 @@ +#define SHADOW_STRING "shadow2/shadow.h" diff --git a/deps/gyp/test/include_dirs/src/subdir/inc.h b/deps/gyp/test/include_dirs/src/subdir/inc.h new file mode 100644 index 0000000000..0a68d7b36a --- /dev/null +++ b/deps/gyp/test/include_dirs/src/subdir/inc.h @@ -0,0 +1 @@ +#define INC_STRING "subdir/inc.h" diff --git a/deps/gyp/test/include_dirs/src/subdir/inc2/include2.h b/deps/gyp/test/include_dirs/src/subdir/inc2/include2.h new file mode 100644 index 0000000000..721577effb --- /dev/null +++ b/deps/gyp/test/include_dirs/src/subdir/inc2/include2.h @@ -0,0 +1 @@ +#define INCLUDE2_STRING "subdir/inc2/include2.h" diff --git a/deps/gyp/test/include_dirs/src/subdir/subdir_includes.c b/deps/gyp/test/include_dirs/src/subdir/subdir_includes.c new file mode 100644 index 0000000000..4623543c43 --- /dev/null +++ b/deps/gyp/test/include_dirs/src/subdir/subdir_includes.c @@ -0,0 +1,14 @@ +#include <stdio.h> + +#include "inc.h" +#include "include1.h" +#include "include2.h" + +int main(void) +{ + printf("Hello from subdir/subdir_includes.c\n"); + printf("Hello from %s\n", INC_STRING); + printf("Hello from %s\n", INCLUDE1_STRING); + printf("Hello from %s\n", INCLUDE2_STRING); + return 0; +} diff --git a/deps/gyp/test/include_dirs/src/subdir/subdir_includes.gyp b/deps/gyp/test/include_dirs/src/subdir/subdir_includes.gyp new file mode 100644 index 0000000000..257d052c3c --- /dev/null +++ b/deps/gyp/test/include_dirs/src/subdir/subdir_includes.gyp @@ -0,0 +1,20 @@ +# Copyright (c) 2009 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. + +{ + 'targets': [ + { + 'target_name': 'subdir_includes', + 'type': 'executable', + 'include_dirs': [ + '.', + '../inc1', + 'inc2', + ], + 'sources': [ + 'subdir_includes.c', + ], + }, + ], +} diff --git a/deps/gyp/test/intermediate_dir/gyptest-intermediate-dir.py b/deps/gyp/test/intermediate_dir/gyptest-intermediate-dir.py new file mode 100755 index 0000000000..bf4b91a2fc --- /dev/null +++ b/deps/gyp/test/intermediate_dir/gyptest-intermediate-dir.py @@ -0,0 +1,44 @@ +#!/usr/bin/env python + +# 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. + +""" +Verifies that targets have independent INTERMEDIATE_DIRs. +""" + +import TestGyp + +test = TestGyp.TestGyp() + +test.run_gyp('test.gyp', chdir='src') + +test.build('test.gyp', 'target1', chdir='src') +# Check stuff exists. +intermediate_file1 = test.read('src/outfile.txt') +test.must_contain(intermediate_file1, 'target1') + +shared_intermediate_file1 = test.read('src/shared_outfile.txt') +test.must_contain(shared_intermediate_file1, 'shared_target1') + +test.run_gyp('test2.gyp', chdir='src') + +# Force the shared intermediate to be rebuilt. +test.sleep() +test.touch('src/shared_infile.txt') +test.build('test2.gyp', 'target2', chdir='src') +# Check INTERMEDIATE_DIR file didn't get overwritten but SHARED_INTERMEDIATE_DIR +# file did. +intermediate_file2 = test.read('src/outfile.txt') +test.must_contain(intermediate_file1, 'target1') +test.must_contain(intermediate_file2, 'target2') + +shared_intermediate_file2 = test.read('src/shared_outfile.txt') +if shared_intermediate_file1 != shared_intermediate_file2: + test.fail_test(shared_intermediate_file1 + ' != ' + shared_intermediate_file2) + +test.must_contain(shared_intermediate_file1, 'shared_target2') +test.must_contain(shared_intermediate_file2, 'shared_target2') + +test.pass_test() diff --git a/deps/gyp/test/intermediate_dir/src/script.py b/deps/gyp/test/intermediate_dir/src/script.py new file mode 100755 index 0000000000..7abc7ee145 --- /dev/null +++ b/deps/gyp/test/intermediate_dir/src/script.py @@ -0,0 +1,24 @@ +#!/usr/bin/env python +# 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. + +# Takes 3 arguments. Writes the 1st argument to the file in the 2nd argument, +# and writes the absolute path to the file in the 2nd argument to the file in +# the 3rd argument. + +import os +import shlex +import sys + +if len(sys.argv) == 3 and ' ' in sys.argv[2]: + sys.argv[2], fourth = shlex.split(sys.argv[2].replace('\\', '\\\\')) + sys.argv.append(fourth) + +#print >>sys.stderr, sys.argv + +with open(sys.argv[2], 'w') as f: + f.write(sys.argv[1]) + +with open(sys.argv[3], 'w') as f: + f.write(os.path.abspath(sys.argv[2])) diff --git a/deps/gyp/test/intermediate_dir/src/shared_infile.txt b/deps/gyp/test/intermediate_dir/src/shared_infile.txt new file mode 100644 index 0000000000..e2aba15d04 --- /dev/null +++ b/deps/gyp/test/intermediate_dir/src/shared_infile.txt @@ -0,0 +1 @@ +dummy input diff --git a/deps/gyp/test/intermediate_dir/src/test.gyp b/deps/gyp/test/intermediate_dir/src/test.gyp new file mode 100644 index 0000000000..b61e7e8ea5 --- /dev/null +++ b/deps/gyp/test/intermediate_dir/src/test.gyp @@ -0,0 +1,42 @@ +# Copyright (c) 2011 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. + +{ + 'targets': [ + { + 'target_name': 'target1', + 'type': 'none', + 'actions': [ + { + 'action_name': 'intermediate', + 'inputs': [], + 'outputs': [ + '<(INTERMEDIATE_DIR)/intermediate_out.txt', + 'outfile.txt', + ], + 'action': [ + 'python', 'script.py', 'target1', '<(_outputs)', + ], + # Allows the test to run without hermetic cygwin on windows. + 'msvs_cygwin_shell': 0, + }, + { + 'action_name': 'shared_intermediate', + 'inputs': [ + 'shared_infile.txt', + ], + 'outputs': [ + '<(SHARED_INTERMEDIATE_DIR)/intermediate_out.txt', + 'shared_outfile.txt', + ], + 'action': [ + 'python', 'script.py', 'shared_target1', '<(_outputs)', + ], + # Allows the test to run without hermetic cygwin on windows. + 'msvs_cygwin_shell': 0, + }, + ], + }, + ], +} diff --git a/deps/gyp/test/intermediate_dir/src/test2.gyp b/deps/gyp/test/intermediate_dir/src/test2.gyp new file mode 100644 index 0000000000..41f5564663 --- /dev/null +++ b/deps/gyp/test/intermediate_dir/src/test2.gyp @@ -0,0 +1,42 @@ +# Copyright (c) 2011 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. + +{ + 'targets': [ + { + 'target_name': 'target2', + 'type': 'none', + 'actions': [ + { + 'action_name': 'intermediate', + 'inputs': [], + 'outputs': [ + '<(INTERMEDIATE_DIR)/intermediate_out.txt', + 'outfile.txt', + ], + 'action': [ + 'python', 'script.py', 'target2', '<(_outputs)', + ], + # Allows the test to run without hermetic cygwin on windows. + 'msvs_cygwin_shell': 0, + }, + { + 'action_name': 'shared_intermediate', + 'inputs': [ + 'shared_infile.txt', + ], + 'outputs': [ + '<(SHARED_INTERMEDIATE_DIR)/intermediate_out.txt', + 'shared_outfile.txt', + ], + 'action': [ + 'python', 'script.py', 'shared_target2', '<(_outputs)', + ], + # Allows the test to run without hermetic cygwin on windows. + 'msvs_cygwin_shell': 0, + }, + ], + }, + ], +} diff --git a/deps/gyp/test/ios/app-bundle/TestApp/English.lproj/InfoPlist-error.strings b/deps/gyp/test/ios/app-bundle/TestApp/English.lproj/InfoPlist-error.strings new file mode 100644 index 0000000000..452e7fabf9 --- /dev/null +++ b/deps/gyp/test/ios/app-bundle/TestApp/English.lproj/InfoPlist-error.strings @@ -0,0 +1,3 @@ +/* Localized versions of Info.plist keys */ + +NSHumanReadableCopyright = "Copyright ©2011 Google Inc." diff --git a/deps/gyp/test/ios/app-bundle/TestApp/English.lproj/InfoPlist.strings b/deps/gyp/test/ios/app-bundle/TestApp/English.lproj/InfoPlist.strings new file mode 100644 index 0000000000..35bd33a96e --- /dev/null +++ b/deps/gyp/test/ios/app-bundle/TestApp/English.lproj/InfoPlist.strings @@ -0,0 +1,3 @@ +/* Localized versions of Info.plist keys */ + +NSHumanReadableCopyright = "Copyright ©2011 Google Inc."; diff --git a/deps/gyp/test/ios/app-bundle/TestApp/English.lproj/MainMenu.xib b/deps/gyp/test/ios/app-bundle/TestApp/English.lproj/MainMenu.xib new file mode 100644 index 0000000000..4524596787 --- /dev/null +++ b/deps/gyp/test/ios/app-bundle/TestApp/English.lproj/MainMenu.xib @@ -0,0 +1,4119 @@ +<?xml version="1.0" encoding="UTF-8"?> +<archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="7.10"> + <data> + <int key="IBDocument.SystemTarget">1060</int> + <string key="IBDocument.SystemVersion">10A324</string> + <string key="IBDocument.InterfaceBuilderVersion">719</string> + <string key="IBDocument.AppKitVersion">1015</string> + <string key="IBDocument.HIToolboxVersion">418.00</string> + <object class="NSMutableDictionary" key="IBDocument.PluginVersions"> + <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="NS.object.0">719</string> + </object> + <object class="NSMutableArray" key="IBDocument.EditedObjectIDs"> + <bool key="EncodedWithXMLCoder">YES</bool> + <integer value="371"/> + <integer value="29"/> + </object> + <object class="NSArray" key="IBDocument.PluginDependencies"> + <bool key="EncodedWithXMLCoder">YES</bool> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + </object> + <object class="NSMutableDictionary" key="IBDocument.Metadata"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSArray" key="dict.sortedKeys" id="0"> + <bool key="EncodedWithXMLCoder">YES</bool> + </object> + <object class="NSMutableArray" key="dict.values"> + <bool key="EncodedWithXMLCoder">YES</bool> + </object> + </object> + <object class="NSMutableArray" key="IBDocument.RootObjects" id="1048"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSCustomObject" id="1021"> + <string key="NSClassName">NSApplication</string> + </object> + <object class="NSCustomObject" id="1014"> + <string key="NSClassName">FirstResponder</string> + </object> + <object class="NSCustomObject" id="1050"> + <string key="NSClassName">NSApplication</string> + </object> + <object class="NSMenu" id="649796088"> + <string key="NSTitle">AMainMenu</string> + <object class="NSMutableArray" key="NSMenuItems"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSMenuItem" id="694149608"> + <reference key="NSMenu" ref="649796088"/> + <string key="NSTitle">TestApp</string> + <string key="NSKeyEquiv"/> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <object class="NSCustomResource" key="NSOnImage" id="35465992"> + <string key="NSClassName">NSImage</string> + <string key="NSResourceName">NSMenuCheckmark</string> + </object> + <object class="NSCustomResource" key="NSMixedImage" id="502551668"> + <string key="NSClassName">NSImage</string> + <string key="NSResourceName">NSMenuMixedState</string> + </object> + <string key="NSAction">submenuAction:</string> + <object class="NSMenu" key="NSSubmenu" id="110575045"> + <string key="NSTitle">TestApp</string> + <object class="NSMutableArray" key="NSMenuItems"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSMenuItem" id="238522557"> + <reference key="NSMenu" ref="110575045"/> + <string key="NSTitle">About TestApp</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="304266470"> + <reference key="NSMenu" ref="110575045"/> + <bool key="NSIsDisabled">YES</bool> + <bool key="NSIsSeparator">YES</bool> + <string key="NSTitle"/> + <string key="NSKeyEquiv"/> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="609285721"> + <reference key="NSMenu" ref="110575045"/> + <string key="NSTitle">Preferences…</string> + <string key="NSKeyEquiv">,</string> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="481834944"> + <reference key="NSMenu" ref="110575045"/> + <bool key="NSIsDisabled">YES</bool> + <bool key="NSIsSeparator">YES</bool> + <string key="NSTitle"/> + <string key="NSKeyEquiv"/> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="1046388886"> + <reference key="NSMenu" ref="110575045"/> + <string key="NSTitle">Services</string> + <string key="NSKeyEquiv"/> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + <string key="NSAction">submenuAction:</string> + <object class="NSMenu" key="NSSubmenu" id="752062318"> + <string key="NSTitle">Services</string> + <object class="NSMutableArray" key="NSMenuItems"> + <bool key="EncodedWithXMLCoder">YES</bool> + </object> + <string key="NSName">_NSServicesMenu</string> + </object> + </object> + <object class="NSMenuItem" id="646227648"> + <reference key="NSMenu" ref="110575045"/> + <bool key="NSIsDisabled">YES</bool> + <bool key="NSIsSeparator">YES</bool> + <string key="NSTitle"/> + <string key="NSKeyEquiv"/> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="755159360"> + <reference key="NSMenu" ref="110575045"/> + <string key="NSTitle">Hide TestApp</string> + <string key="NSKeyEquiv">h</string> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="342932134"> + <reference key="NSMenu" ref="110575045"/> + <string key="NSTitle">Hide Others</string> + <string key="NSKeyEquiv">h</string> + <int key="NSKeyEquivModMask">1572864</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="908899353"> + <reference key="NSMenu" ref="110575045"/> + <string key="NSTitle">Show All</string> + <string key="NSKeyEquiv"/> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="1056857174"> + <reference key="NSMenu" ref="110575045"/> + <bool key="NSIsDisabled">YES</bool> + <bool key="NSIsSeparator">YES</bool> + <string key="NSTitle"/> + <string key="NSKeyEquiv"/> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="632727374"> + <reference key="NSMenu" ref="110575045"/> + <string key="NSTitle">Quit TestApp</string> + <string key="NSKeyEquiv">q</string> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + </object> + <string key="NSName">_NSAppleMenu</string> + </object> + </object> + <object class="NSMenuItem" id="379814623"> + <reference key="NSMenu" ref="649796088"/> + <string key="NSTitle">File</string> + <string key="NSKeyEquiv"/> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + <string key="NSAction">submenuAction:</string> + <object class="NSMenu" key="NSSubmenu" id="720053764"> + <string key="NSTitle">File</string> + <object class="NSMutableArray" key="NSMenuItems"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSMenuItem" id="705341025"> + <reference key="NSMenu" ref="720053764"/> + <string key="NSTitle">New</string> + <string key="NSKeyEquiv">n</string> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="722745758"> + <reference key="NSMenu" ref="720053764"/> + <string key="NSTitle">Open…</string> + <string key="NSKeyEquiv">o</string> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="1025936716"> + <reference key="NSMenu" ref="720053764"/> + <string key="NSTitle">Open Recent</string> + <string key="NSKeyEquiv"/> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + <string key="NSAction">submenuAction:</string> + <object class="NSMenu" key="NSSubmenu" id="1065607017"> + <string key="NSTitle">Open Recent</string> + <object class="NSMutableArray" key="NSMenuItems"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSMenuItem" id="759406840"> + <reference key="NSMenu" ref="1065607017"/> + <string key="NSTitle">Clear Menu</string> + <string key="NSKeyEquiv"/> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + </object> + <string key="NSName">_NSRecentDocumentsMenu</string> + </object> + </object> + <object class="NSMenuItem" id="425164168"> + <reference key="NSMenu" ref="720053764"/> + <bool key="NSIsDisabled">YES</bool> + <bool key="NSIsSeparator">YES</bool> + <string key="NSTitle"/> + <string key="NSKeyEquiv"/> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="776162233"> + <reference key="NSMenu" ref="720053764"/> + <string key="NSTitle">Close</string> + <string key="NSKeyEquiv">w</string> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="1023925487"> + <reference key="NSMenu" ref="720053764"/> + <string key="NSTitle">Save</string> + <string key="NSKeyEquiv">s</string> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="117038363"> + <reference key="NSMenu" ref="720053764"/> + <string key="NSTitle">Save As…</string> + <string key="NSKeyEquiv">S</string> + <int key="NSKeyEquivModMask">1179648</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="579971712"> + <reference key="NSMenu" ref="720053764"/> + <string key="NSTitle">Revert to Saved</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="1010469920"> + <reference key="NSMenu" ref="720053764"/> + <bool key="NSIsDisabled">YES</bool> + <bool key="NSIsSeparator">YES</bool> + <string key="NSTitle"/> + <string key="NSKeyEquiv"/> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="294629803"> + <reference key="NSMenu" ref="720053764"/> + <string key="NSTitle">Page Setup...</string> + <string key="NSKeyEquiv">P</string> + <int key="NSKeyEquivModMask">1179648</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + <string key="NSToolTip"/> + </object> + <object class="NSMenuItem" id="49223823"> + <reference key="NSMenu" ref="720053764"/> + <string key="NSTitle">Print…</string> + <string key="NSKeyEquiv">p</string> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + </object> + </object> + </object> + <object class="NSMenuItem" id="952259628"> + <reference key="NSMenu" ref="649796088"/> + <string key="NSTitle">Edit</string> + <string key="NSKeyEquiv"/> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + <string key="NSAction">submenuAction:</string> + <object class="NSMenu" key="NSSubmenu" id="789758025"> + <string key="NSTitle">Edit</string> + <object class="NSMutableArray" key="NSMenuItems"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSMenuItem" id="1058277027"> + <reference key="NSMenu" ref="789758025"/> + <string key="NSTitle">Undo</string> + <string key="NSKeyEquiv">z</string> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="790794224"> + <reference key="NSMenu" ref="789758025"/> + <string key="NSTitle">Redo</string> + <string key="NSKeyEquiv">Z</string> + <int key="NSKeyEquivModMask">1179648</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="1040322652"> + <reference key="NSMenu" ref="789758025"/> + <bool key="NSIsDisabled">YES</bool> + <bool key="NSIsSeparator">YES</bool> + <string key="NSTitle"/> + <string key="NSKeyEquiv"/> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="296257095"> + <reference key="NSMenu" ref="789758025"/> + <string key="NSTitle">Cut</string> + <string key="NSKeyEquiv">x</string> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="860595796"> + <reference key="NSMenu" ref="789758025"/> + <string key="NSTitle">Copy</string> + <string key="NSKeyEquiv">c</string> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="29853731"> + <reference key="NSMenu" ref="789758025"/> + <string key="NSTitle">Paste</string> + <string key="NSKeyEquiv">v</string> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="82994268"> + <reference key="NSMenu" ref="789758025"/> + <string key="NSTitle">Paste and Match Style</string> + <string key="NSKeyEquiv">V</string> + <int key="NSKeyEquivModMask">1572864</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="437104165"> + <reference key="NSMenu" ref="789758025"/> + <string key="NSTitle">Delete</string> + <string key="NSKeyEquiv"/> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="583158037"> + <reference key="NSMenu" ref="789758025"/> + <string key="NSTitle">Select All</string> + <string key="NSKeyEquiv">a</string> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="212016141"> + <reference key="NSMenu" ref="789758025"/> + <bool key="NSIsDisabled">YES</bool> + <bool key="NSIsSeparator">YES</bool> + <string key="NSTitle"/> + <string key="NSKeyEquiv"/> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="892235320"> + <reference key="NSMenu" ref="789758025"/> + <string key="NSTitle">Find</string> + <string key="NSKeyEquiv"/> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + <string key="NSAction">submenuAction:</string> + <object class="NSMenu" key="NSSubmenu" id="963351320"> + <string key="NSTitle">Find</string> + <object class="NSMutableArray" key="NSMenuItems"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSMenuItem" id="447796847"> + <reference key="NSMenu" ref="963351320"/> + <string key="NSTitle">Find…</string> + <string key="NSKeyEquiv">f</string> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + <int key="NSTag">1</int> + </object> + <object class="NSMenuItem" id="326711663"> + <reference key="NSMenu" ref="963351320"/> + <string key="NSTitle">Find Next</string> + <string key="NSKeyEquiv">g</string> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + <int key="NSTag">2</int> + </object> + <object class="NSMenuItem" id="270902937"> + <reference key="NSMenu" ref="963351320"/> + <string key="NSTitle">Find Previous</string> + <string key="NSKeyEquiv">G</string> + <int key="NSKeyEquivModMask">1179648</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + <int key="NSTag">3</int> + </object> + <object class="NSMenuItem" id="159080638"> + <reference key="NSMenu" ref="963351320"/> + <string key="NSTitle">Use Selection for Find</string> + <string key="NSKeyEquiv">e</string> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + <int key="NSTag">7</int> + </object> + <object class="NSMenuItem" id="88285865"> + <reference key="NSMenu" ref="963351320"/> + <string key="NSTitle">Jump to Selection</string> + <string key="NSKeyEquiv">j</string> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + </object> + </object> + </object> + <object class="NSMenuItem" id="972420730"> + <reference key="NSMenu" ref="789758025"/> + <string key="NSTitle">Spelling and Grammar</string> + <string key="NSKeyEquiv"/> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + <string key="NSAction">submenuAction:</string> + <object class="NSMenu" key="NSSubmenu" id="769623530"> + <string key="NSTitle">Spelling and Grammar</string> + <object class="NSMutableArray" key="NSMenuItems"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSMenuItem" id="679648819"> + <reference key="NSMenu" ref="769623530"/> + <string key="NSTitle">Show Spelling and Grammar</string> + <string key="NSKeyEquiv">:</string> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="96193923"> + <reference key="NSMenu" ref="769623530"/> + <string key="NSTitle">Check Document Now</string> + <string key="NSKeyEquiv">;</string> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="859480356"> + <reference key="NSMenu" ref="769623530"/> + <bool key="NSIsDisabled">YES</bool> + <bool key="NSIsSeparator">YES</bool> + <string key="NSTitle"/> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="948374510"> + <reference key="NSMenu" ref="769623530"/> + <string key="NSTitle">Check Spelling While Typing</string> + <string key="NSKeyEquiv"/> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="967646866"> + <reference key="NSMenu" ref="769623530"/> + <string key="NSTitle">Check Grammar With Spelling</string> + <string key="NSKeyEquiv"/> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="795346622"> + <reference key="NSMenu" ref="769623530"/> + <string key="NSTitle">Correct Spelling Automatically</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + </object> + </object> + </object> + <object class="NSMenuItem" id="507821607"> + <reference key="NSMenu" ref="789758025"/> + <string key="NSTitle">Substitutions</string> + <string key="NSKeyEquiv"/> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + <string key="NSAction">submenuAction:</string> + <object class="NSMenu" key="NSSubmenu" id="698887838"> + <string key="NSTitle">Substitutions</string> + <object class="NSMutableArray" key="NSMenuItems"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSMenuItem" id="65139061"> + <reference key="NSMenu" ref="698887838"/> + <string key="NSTitle">Show Substitutions</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="19036812"> + <reference key="NSMenu" ref="698887838"/> + <bool key="NSIsDisabled">YES</bool> + <bool key="NSIsSeparator">YES</bool> + <string key="NSTitle"/> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="605118523"> + <reference key="NSMenu" ref="698887838"/> + <string key="NSTitle">Smart Copy/Paste</string> + <string key="NSKeyEquiv">f</string> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + <int key="NSTag">1</int> + </object> + <object class="NSMenuItem" id="197661976"> + <reference key="NSMenu" ref="698887838"/> + <string key="NSTitle">Smart Quotes</string> + <string key="NSKeyEquiv">g</string> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + <int key="NSTag">2</int> + </object> + <object class="NSMenuItem" id="672708820"> + <reference key="NSMenu" ref="698887838"/> + <string key="NSTitle">Smart Dashes</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="708854459"> + <reference key="NSMenu" ref="698887838"/> + <string key="NSTitle">Smart Links</string> + <string key="NSKeyEquiv">G</string> + <int key="NSKeyEquivModMask">1179648</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + <int key="NSTag">3</int> + </object> + <object class="NSMenuItem" id="537092702"> + <reference key="NSMenu" ref="698887838"/> + <string key="NSTitle">Text Replacement</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + </object> + </object> + </object> + <object class="NSMenuItem" id="288088188"> + <reference key="NSMenu" ref="789758025"/> + <string key="NSTitle">Transformations</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + <string key="NSAction">submenuAction:</string> + <object class="NSMenu" key="NSSubmenu" id="579392910"> + <string key="NSTitle">Transformations</string> + <object class="NSMutableArray" key="NSMenuItems"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSMenuItem" id="1060694897"> + <reference key="NSMenu" ref="579392910"/> + <string key="NSTitle">Make Upper Case</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="879586729"> + <reference key="NSMenu" ref="579392910"/> + <string key="NSTitle">Make Lower Case</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="56570060"> + <reference key="NSMenu" ref="579392910"/> + <string key="NSTitle">Capitalize</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + </object> + </object> + </object> + <object class="NSMenuItem" id="676164635"> + <reference key="NSMenu" ref="789758025"/> + <string key="NSTitle">Speech</string> + <string key="NSKeyEquiv"/> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + <string key="NSAction">submenuAction:</string> + <object class="NSMenu" key="NSSubmenu" id="785027613"> + <string key="NSTitle">Speech</string> + <object class="NSMutableArray" key="NSMenuItems"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSMenuItem" id="731782645"> + <reference key="NSMenu" ref="785027613"/> + <string key="NSTitle">Start Speaking</string> + <string key="NSKeyEquiv"/> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="680220178"> + <reference key="NSMenu" ref="785027613"/> + <string key="NSTitle">Stop Speaking</string> + <string key="NSKeyEquiv"/> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + </object> + </object> + </object> + </object> + </object> + </object> + <object class="NSMenuItem" id="302598603"> + <reference key="NSMenu" ref="649796088"/> + <string key="NSTitle">Format</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + <string key="NSAction">submenuAction:</string> + <object class="NSMenu" key="NSSubmenu" id="941447902"> + <string key="NSTitle">Format</string> + <object class="NSMutableArray" key="NSMenuItems"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSMenuItem" id="792887677"> + <reference key="NSMenu" ref="941447902"/> + <string key="NSTitle">Font</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + <string key="NSAction">submenuAction:</string> + <object class="NSMenu" key="NSSubmenu" id="786677654"> + <string key="NSTitle">Font</string> + <object class="NSMutableArray" key="NSMenuItems"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSMenuItem" id="159677712"> + <reference key="NSMenu" ref="786677654"/> + <string key="NSTitle">Show Fonts</string> + <string key="NSKeyEquiv">t</string> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="305399458"> + <reference key="NSMenu" ref="786677654"/> + <string key="NSTitle">Bold</string> + <string key="NSKeyEquiv">b</string> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + <int key="NSTag">2</int> + </object> + <object class="NSMenuItem" id="814362025"> + <reference key="NSMenu" ref="786677654"/> + <string key="NSTitle">Italic</string> + <string key="NSKeyEquiv">i</string> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + <int key="NSTag">1</int> + </object> + <object class="NSMenuItem" id="330926929"> + <reference key="NSMenu" ref="786677654"/> + <string key="NSTitle">Underline</string> + <string key="NSKeyEquiv">u</string> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="533507878"> + <reference key="NSMenu" ref="786677654"/> + <bool key="NSIsDisabled">YES</bool> + <bool key="NSIsSeparator">YES</bool> + <string key="NSTitle"/> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="158063935"> + <reference key="NSMenu" ref="786677654"/> + <string key="NSTitle">Bigger</string> + <string key="NSKeyEquiv">+</string> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + <int key="NSTag">3</int> + </object> + <object class="NSMenuItem" id="885547335"> + <reference key="NSMenu" ref="786677654"/> + <string key="NSTitle">Smaller</string> + <string key="NSKeyEquiv">-</string> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + <int key="NSTag">4</int> + </object> + <object class="NSMenuItem" id="901062459"> + <reference key="NSMenu" ref="786677654"/> + <bool key="NSIsDisabled">YES</bool> + <bool key="NSIsSeparator">YES</bool> + <string key="NSTitle"/> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="767671776"> + <reference key="NSMenu" ref="786677654"/> + <string key="NSTitle">Kern</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + <string key="NSAction">submenuAction:</string> + <object class="NSMenu" key="NSSubmenu" id="175441468"> + <string key="NSTitle">Kern</string> + <object class="NSMutableArray" key="NSMenuItems"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSMenuItem" id="252969304"> + <reference key="NSMenu" ref="175441468"/> + <string key="NSTitle">Use Default</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="766922938"> + <reference key="NSMenu" ref="175441468"/> + <string key="NSTitle">Use None</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="677519740"> + <reference key="NSMenu" ref="175441468"/> + <string key="NSTitle">Tighten</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="238351151"> + <reference key="NSMenu" ref="175441468"/> + <string key="NSTitle">Loosen</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + </object> + </object> + </object> + <object class="NSMenuItem" id="691570813"> + <reference key="NSMenu" ref="786677654"/> + <string key="NSTitle">Ligature</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + <string key="NSAction">submenuAction:</string> + <object class="NSMenu" key="NSSubmenu" id="1058217995"> + <string key="NSTitle">Ligature</string> + <object class="NSMutableArray" key="NSMenuItems"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSMenuItem" id="706297211"> + <reference key="NSMenu" ref="1058217995"/> + <string key="NSTitle">Use Default</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="568384683"> + <reference key="NSMenu" ref="1058217995"/> + <string key="NSTitle">Use None</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="663508465"> + <reference key="NSMenu" ref="1058217995"/> + <string key="NSTitle">Use All</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + </object> + </object> + </object> + <object class="NSMenuItem" id="769124883"> + <reference key="NSMenu" ref="786677654"/> + <string key="NSTitle">Baseline</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + <string key="NSAction">submenuAction:</string> + <object class="NSMenu" key="NSSubmenu" id="18263474"> + <string key="NSTitle">Baseline</string> + <object class="NSMutableArray" key="NSMenuItems"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSMenuItem" id="257962622"> + <reference key="NSMenu" ref="18263474"/> + <string key="NSTitle">Use Default</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="644725453"> + <reference key="NSMenu" ref="18263474"/> + <string key="NSTitle">Superscript</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="1037576581"> + <reference key="NSMenu" ref="18263474"/> + <string key="NSTitle">Subscript</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="941806246"> + <reference key="NSMenu" ref="18263474"/> + <string key="NSTitle">Raise</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="1045724900"> + <reference key="NSMenu" ref="18263474"/> + <string key="NSTitle">Lower</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + </object> + </object> + </object> + <object class="NSMenuItem" id="739652853"> + <reference key="NSMenu" ref="786677654"/> + <bool key="NSIsDisabled">YES</bool> + <bool key="NSIsSeparator">YES</bool> + <string key="NSTitle"/> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="1012600125"> + <reference key="NSMenu" ref="786677654"/> + <string key="NSTitle">Show Colors</string> + <string key="NSKeyEquiv">C</string> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="214559597"> + <reference key="NSMenu" ref="786677654"/> + <bool key="NSIsDisabled">YES</bool> + <bool key="NSIsSeparator">YES</bool> + <string key="NSTitle"/> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="596732606"> + <reference key="NSMenu" ref="786677654"/> + <string key="NSTitle">Copy Style</string> + <string key="NSKeyEquiv">c</string> + <int key="NSKeyEquivModMask">1572864</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="393423671"> + <reference key="NSMenu" ref="786677654"/> + <string key="NSTitle">Paste Style</string> + <string key="NSKeyEquiv">v</string> + <int key="NSKeyEquivModMask">1572864</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + </object> + <string key="NSName">_NSFontMenu</string> + </object> + </object> + <object class="NSMenuItem" id="215659978"> + <reference key="NSMenu" ref="941447902"/> + <string key="NSTitle">Text</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + <string key="NSAction">submenuAction:</string> + <object class="NSMenu" key="NSSubmenu" id="446991534"> + <string key="NSTitle">Text</string> + <object class="NSMutableArray" key="NSMenuItems"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSMenuItem" id="875092757"> + <reference key="NSMenu" ref="446991534"/> + <string key="NSTitle">Align Left</string> + <string key="NSKeyEquiv">{</string> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="630155264"> + <reference key="NSMenu" ref="446991534"/> + <string key="NSTitle">Center</string> + <string key="NSKeyEquiv">|</string> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="945678886"> + <reference key="NSMenu" ref="446991534"/> + <string key="NSTitle">Justify</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="512868991"> + <reference key="NSMenu" ref="446991534"/> + <string key="NSTitle">Align Right</string> + <string key="NSKeyEquiv">}</string> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="163117631"> + <reference key="NSMenu" ref="446991534"/> + <bool key="NSIsDisabled">YES</bool> + <bool key="NSIsSeparator">YES</bool> + <string key="NSTitle"/> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="31516759"> + <reference key="NSMenu" ref="446991534"/> + <string key="NSTitle">Writing Direction</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + <string key="NSAction">submenuAction:</string> + <object class="NSMenu" key="NSSubmenu" id="956096989"> + <string key="NSTitle">Writing Direction</string> + <object class="NSMutableArray" key="NSMenuItems"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSMenuItem" id="257099033"> + <reference key="NSMenu" ref="956096989"/> + <bool key="NSIsDisabled">YES</bool> + <string key="NSTitle">Paragraph</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="551969625"> + <reference key="NSMenu" ref="956096989"/> + <string type="base64-UTF8" key="NSTitle">CURlZmF1bHQ</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="249532473"> + <reference key="NSMenu" ref="956096989"/> + <string type="base64-UTF8" key="NSTitle">CUxlZnQgdG8gUmlnaHQ</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="607364498"> + <reference key="NSMenu" ref="956096989"/> + <string type="base64-UTF8" key="NSTitle">CVJpZ2h0IHRvIExlZnQ</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="508151438"> + <reference key="NSMenu" ref="956096989"/> + <bool key="NSIsDisabled">YES</bool> + <bool key="NSIsSeparator">YES</bool> + <string key="NSTitle"/> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="981751889"> + <reference key="NSMenu" ref="956096989"/> + <bool key="NSIsDisabled">YES</bool> + <string key="NSTitle">Selection</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="380031999"> + <reference key="NSMenu" ref="956096989"/> + <string type="base64-UTF8" key="NSTitle">CURlZmF1bHQ</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="825984362"> + <reference key="NSMenu" ref="956096989"/> + <string type="base64-UTF8" key="NSTitle">CUxlZnQgdG8gUmlnaHQ</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="560145579"> + <reference key="NSMenu" ref="956096989"/> + <string type="base64-UTF8" key="NSTitle">CVJpZ2h0IHRvIExlZnQ</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + </object> + </object> + </object> + <object class="NSMenuItem" id="908105787"> + <reference key="NSMenu" ref="446991534"/> + <bool key="NSIsDisabled">YES</bool> + <bool key="NSIsSeparator">YES</bool> + <string key="NSTitle"/> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="644046920"> + <reference key="NSMenu" ref="446991534"/> + <string key="NSTitle">Show Ruler</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="231811626"> + <reference key="NSMenu" ref="446991534"/> + <string key="NSTitle">Copy Ruler</string> + <string key="NSKeyEquiv">c</string> + <int key="NSKeyEquivModMask">1310720</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="883618387"> + <reference key="NSMenu" ref="446991534"/> + <string key="NSTitle">Paste Ruler</string> + <string key="NSKeyEquiv">v</string> + <int key="NSKeyEquivModMask">1310720</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + </object> + </object> + </object> + </object> + </object> + </object> + <object class="NSMenuItem" id="586577488"> + <reference key="NSMenu" ref="649796088"/> + <string key="NSTitle">View</string> + <string key="NSKeyEquiv"/> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + <string key="NSAction">submenuAction:</string> + <object class="NSMenu" key="NSSubmenu" id="466310130"> + <string key="NSTitle">View</string> + <object class="NSMutableArray" key="NSMenuItems"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSMenuItem" id="102151532"> + <reference key="NSMenu" ref="466310130"/> + <string key="NSTitle">Show Toolbar</string> + <string key="NSKeyEquiv">t</string> + <int key="NSKeyEquivModMask">1572864</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="237841660"> + <reference key="NSMenu" ref="466310130"/> + <string key="NSTitle">Customize Toolbar…</string> + <string key="NSKeyEquiv"/> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + </object> + </object> + </object> + <object class="NSMenuItem" id="713487014"> + <reference key="NSMenu" ref="649796088"/> + <string key="NSTitle">Window</string> + <string key="NSKeyEquiv"/> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + <string key="NSAction">submenuAction:</string> + <object class="NSMenu" key="NSSubmenu" id="835318025"> + <string key="NSTitle">Window</string> + <object class="NSMutableArray" key="NSMenuItems"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSMenuItem" id="1011231497"> + <reference key="NSMenu" ref="835318025"/> + <string key="NSTitle">Minimize</string> + <string key="NSKeyEquiv">m</string> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="575023229"> + <reference key="NSMenu" ref="835318025"/> + <string key="NSTitle">Zoom</string> + <string key="NSKeyEquiv"/> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="299356726"> + <reference key="NSMenu" ref="835318025"/> + <bool key="NSIsDisabled">YES</bool> + <bool key="NSIsSeparator">YES</bool> + <string key="NSTitle"/> + <string key="NSKeyEquiv"/> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="625202149"> + <reference key="NSMenu" ref="835318025"/> + <string key="NSTitle">Bring All to Front</string> + <string key="NSKeyEquiv"/> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + </object> + <string key="NSName">_NSWindowsMenu</string> + </object> + </object> + <object class="NSMenuItem" id="448692316"> + <reference key="NSMenu" ref="649796088"/> + <string key="NSTitle">Help</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + <string key="NSAction">submenuAction:</string> + <object class="NSMenu" key="NSSubmenu" id="992780483"> + <string key="NSTitle">Help</string> + <object class="NSMutableArray" key="NSMenuItems"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSMenuItem" id="105068016"> + <reference key="NSMenu" ref="992780483"/> + <string key="NSTitle">TestApp Help</string> + <string key="NSKeyEquiv">?</string> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + </object> + <string key="NSName">_NSHelpMenu</string> + </object> + </object> + </object> + <string key="NSName">_NSMainMenu</string> + </object> + <object class="NSWindowTemplate" id="972006081"> + <int key="NSWindowStyleMask">15</int> + <int key="NSWindowBacking">2</int> + <string key="NSWindowRect">{{335, 390}, {480, 360}}</string> + <int key="NSWTFlags">1954021376</int> + <string key="NSWindowTitle">TestApp</string> + <string key="NSWindowClass">NSWindow</string> + <nil key="NSViewClass"/> + <string key="NSWindowContentMaxSize">{1.79769e+308, 1.79769e+308}</string> + <object class="NSView" key="NSWindowView" id="439893737"> + <reference key="NSNextResponder"/> + <int key="NSvFlags">256</int> + <string key="NSFrameSize">{480, 360}</string> + <reference key="NSSuperview"/> + </object> + <string key="NSScreenRect">{{0, 0}, {1920, 1178}}</string> + <string key="NSMaxSize">{1.79769e+308, 1.79769e+308}</string> + </object> + <object class="NSCustomObject" id="976324537"> + <string key="NSClassName">TestAppAppDelegate</string> + </object> + <object class="NSCustomObject" id="755631768"> + <string key="NSClassName">NSFontManager</string> + </object> + </object> + <object class="IBObjectContainer" key="IBDocument.Objects"> + <object class="NSMutableArray" key="connectionRecords"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">performMiniaturize:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="1011231497"/> + </object> + <int key="connectionID">37</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">arrangeInFront:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="625202149"/> + </object> + <int key="connectionID">39</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">print:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="49223823"/> + </object> + <int key="connectionID">86</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">runPageLayout:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="294629803"/> + </object> + <int key="connectionID">87</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">clearRecentDocuments:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="759406840"/> + </object> + <int key="connectionID">127</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">orderFrontStandardAboutPanel:</string> + <reference key="source" ref="1021"/> + <reference key="destination" ref="238522557"/> + </object> + <int key="connectionID">142</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">performClose:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="776162233"/> + </object> + <int key="connectionID">193</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">toggleContinuousSpellChecking:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="948374510"/> + </object> + <int key="connectionID">222</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">undo:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="1058277027"/> + </object> + <int key="connectionID">223</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">copy:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="860595796"/> + </object> + <int key="connectionID">224</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">checkSpelling:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="96193923"/> + </object> + <int key="connectionID">225</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">paste:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="29853731"/> + </object> + <int key="connectionID">226</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">stopSpeaking:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="680220178"/> + </object> + <int key="connectionID">227</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">cut:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="296257095"/> + </object> + <int key="connectionID">228</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">showGuessPanel:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="679648819"/> + </object> + <int key="connectionID">230</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">redo:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="790794224"/> + </object> + <int key="connectionID">231</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">selectAll:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="583158037"/> + </object> + <int key="connectionID">232</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">startSpeaking:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="731782645"/> + </object> + <int key="connectionID">233</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">delete:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="437104165"/> + </object> + <int key="connectionID">235</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">performZoom:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="575023229"/> + </object> + <int key="connectionID">240</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">performFindPanelAction:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="447796847"/> + </object> + <int key="connectionID">241</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">centerSelectionInVisibleArea:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="88285865"/> + </object> + <int key="connectionID">245</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">toggleGrammarChecking:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="967646866"/> + </object> + <int key="connectionID">347</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">toggleSmartInsertDelete:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="605118523"/> + </object> + <int key="connectionID">355</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">toggleAutomaticQuoteSubstitution:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="197661976"/> + </object> + <int key="connectionID">356</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">toggleAutomaticLinkDetection:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="708854459"/> + </object> + <int key="connectionID">357</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">saveDocument:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="1023925487"/> + </object> + <int key="connectionID">362</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">saveDocumentAs:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="117038363"/> + </object> + <int key="connectionID">363</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">revertDocumentToSaved:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="579971712"/> + </object> + <int key="connectionID">364</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">runToolbarCustomizationPalette:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="237841660"/> + </object> + <int key="connectionID">365</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">toggleToolbarShown:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="102151532"/> + </object> + <int key="connectionID">366</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">hide:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="755159360"/> + </object> + <int key="connectionID">367</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">hideOtherApplications:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="342932134"/> + </object> + <int key="connectionID">368</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">unhideAllApplications:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="908899353"/> + </object> + <int key="connectionID">370</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">newDocument:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="705341025"/> + </object> + <int key="connectionID">373</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">openDocument:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="722745758"/> + </object> + <int key="connectionID">374</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">addFontTrait:</string> + <reference key="source" ref="755631768"/> + <reference key="destination" ref="305399458"/> + </object> + <int key="connectionID">421</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">addFontTrait:</string> + <reference key="source" ref="755631768"/> + <reference key="destination" ref="814362025"/> + </object> + <int key="connectionID">422</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">modifyFont:</string> + <reference key="source" ref="755631768"/> + <reference key="destination" ref="885547335"/> + </object> + <int key="connectionID">423</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">orderFrontFontPanel:</string> + <reference key="source" ref="755631768"/> + <reference key="destination" ref="159677712"/> + </object> + <int key="connectionID">424</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">modifyFont:</string> + <reference key="source" ref="755631768"/> + <reference key="destination" ref="158063935"/> + </object> + <int key="connectionID">425</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">raiseBaseline:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="941806246"/> + </object> + <int key="connectionID">426</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">lowerBaseline:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="1045724900"/> + </object> + <int key="connectionID">427</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">copyFont:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="596732606"/> + </object> + <int key="connectionID">428</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">subscript:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="1037576581"/> + </object> + <int key="connectionID">429</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">superscript:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="644725453"/> + </object> + <int key="connectionID">430</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">tightenKerning:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="677519740"/> + </object> + <int key="connectionID">431</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">underline:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="330926929"/> + </object> + <int key="connectionID">432</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">orderFrontColorPanel:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="1012600125"/> + </object> + <int key="connectionID">433</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">useAllLigatures:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="663508465"/> + </object> + <int key="connectionID">434</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">loosenKerning:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="238351151"/> + </object> + <int key="connectionID">435</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">pasteFont:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="393423671"/> + </object> + <int key="connectionID">436</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">unscript:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="257962622"/> + </object> + <int key="connectionID">437</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">useStandardKerning:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="252969304"/> + </object> + <int key="connectionID">438</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">useStandardLigatures:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="706297211"/> + </object> + <int key="connectionID">439</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">turnOffLigatures:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="568384683"/> + </object> + <int key="connectionID">440</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">turnOffKerning:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="766922938"/> + </object> + <int key="connectionID">441</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">terminate:</string> + <reference key="source" ref="1050"/> + <reference key="destination" ref="632727374"/> + </object> + <int key="connectionID">449</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">toggleAutomaticSpellingCorrection:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="795346622"/> + </object> + <int key="connectionID">456</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">orderFrontSubstitutionsPanel:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="65139061"/> + </object> + <int key="connectionID">458</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">toggleAutomaticDashSubstitution:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="672708820"/> + </object> + <int key="connectionID">461</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">toggleAutomaticTextReplacement:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="537092702"/> + </object> + <int key="connectionID">463</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">uppercaseWord:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="1060694897"/> + </object> + <int key="connectionID">464</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">capitalizeWord:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="56570060"/> + </object> + <int key="connectionID">467</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">lowercaseWord:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="879586729"/> + </object> + <int key="connectionID">468</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">pasteAsPlainText:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="82994268"/> + </object> + <int key="connectionID">486</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">performFindPanelAction:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="326711663"/> + </object> + <int key="connectionID">487</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">performFindPanelAction:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="270902937"/> + </object> + <int key="connectionID">488</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">performFindPanelAction:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="159080638"/> + </object> + <int key="connectionID">489</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">showHelp:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="105068016"/> + </object> + <int key="connectionID">493</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBOutletConnection" key="connection"> + <string key="label">delegate</string> + <reference key="source" ref="1021"/> + <reference key="destination" ref="976324537"/> + </object> + <int key="connectionID">495</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">alignCenter:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="630155264"/> + </object> + <int key="connectionID">518</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">pasteRuler:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="883618387"/> + </object> + <int key="connectionID">519</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">toggleRuler:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="644046920"/> + </object> + <int key="connectionID">520</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">alignRight:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="512868991"/> + </object> + <int key="connectionID">521</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">copyRuler:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="231811626"/> + </object> + <int key="connectionID">522</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">alignJustified:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="945678886"/> + </object> + <int key="connectionID">523</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">alignLeft:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="875092757"/> + </object> + <int key="connectionID">524</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">makeBaseWritingDirectionNatural:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="551969625"/> + </object> + <int key="connectionID">525</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">makeBaseWritingDirectionLeftToRight:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="249532473"/> + </object> + <int key="connectionID">526</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">makeBaseWritingDirectionRightToLeft:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="607364498"/> + </object> + <int key="connectionID">527</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">makeTextWritingDirectionNatural:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="380031999"/> + </object> + <int key="connectionID">528</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">makeTextWritingDirectionLeftToRight:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="825984362"/> + </object> + <int key="connectionID">529</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">makeTextWritingDirectionRightToLeft:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="560145579"/> + </object> + <int key="connectionID">530</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBOutletConnection" key="connection"> + <string key="label">window</string> + <reference key="source" ref="976324537"/> + <reference key="destination" ref="972006081"/> + </object> + <int key="connectionID">532</int> + </object> + </object> + <object class="IBMutableOrderedSet" key="objectRecords"> + <object class="NSArray" key="orderedObjects"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="IBObjectRecord"> + <int key="objectID">0</int> + <reference key="object" ref="0"/> + <reference key="children" ref="1048"/> + <nil key="parent"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">-2</int> + <reference key="object" ref="1021"/> + <reference key="parent" ref="0"/> + <string key="objectName">File's Owner</string> + </object> + <object class="IBObjectRecord"> + <int key="objectID">-1</int> + <reference key="object" ref="1014"/> + <reference key="parent" ref="0"/> + <string key="objectName">First Responder</string> + </object> + <object class="IBObjectRecord"> + <int key="objectID">-3</int> + <reference key="object" ref="1050"/> + <reference key="parent" ref="0"/> + <string key="objectName">Application</string> + </object> + <object class="IBObjectRecord"> + <int key="objectID">29</int> + <reference key="object" ref="649796088"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="713487014"/> + <reference ref="694149608"/> + <reference ref="952259628"/> + <reference ref="379814623"/> + <reference ref="586577488"/> + <reference ref="302598603"/> + <reference ref="448692316"/> + </object> + <reference key="parent" ref="0"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">19</int> + <reference key="object" ref="713487014"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="835318025"/> + </object> + <reference key="parent" ref="649796088"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">56</int> + <reference key="object" ref="694149608"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="110575045"/> + </object> + <reference key="parent" ref="649796088"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">217</int> + <reference key="object" ref="952259628"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="789758025"/> + </object> + <reference key="parent" ref="649796088"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">83</int> + <reference key="object" ref="379814623"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="720053764"/> + </object> + <reference key="parent" ref="649796088"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">81</int> + <reference key="object" ref="720053764"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="1023925487"/> + <reference ref="117038363"/> + <reference ref="49223823"/> + <reference ref="722745758"/> + <reference ref="705341025"/> + <reference ref="1025936716"/> + <reference ref="294629803"/> + <reference ref="776162233"/> + <reference ref="425164168"/> + <reference ref="579971712"/> + <reference ref="1010469920"/> + </object> + <reference key="parent" ref="379814623"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">75</int> + <reference key="object" ref="1023925487"/> + <reference key="parent" ref="720053764"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">80</int> + <reference key="object" ref="117038363"/> + <reference key="parent" ref="720053764"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">78</int> + <reference key="object" ref="49223823"/> + <reference key="parent" ref="720053764"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">72</int> + <reference key="object" ref="722745758"/> + <reference key="parent" ref="720053764"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">82</int> + <reference key="object" ref="705341025"/> + <reference key="parent" ref="720053764"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">124</int> + <reference key="object" ref="1025936716"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="1065607017"/> + </object> + <reference key="parent" ref="720053764"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">77</int> + <reference key="object" ref="294629803"/> + <reference key="parent" ref="720053764"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">73</int> + <reference key="object" ref="776162233"/> + <reference key="parent" ref="720053764"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">79</int> + <reference key="object" ref="425164168"/> + <reference key="parent" ref="720053764"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">112</int> + <reference key="object" ref="579971712"/> + <reference key="parent" ref="720053764"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">74</int> + <reference key="object" ref="1010469920"/> + <reference key="parent" ref="720053764"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">125</int> + <reference key="object" ref="1065607017"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="759406840"/> + </object> + <reference key="parent" ref="1025936716"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">126</int> + <reference key="object" ref="759406840"/> + <reference key="parent" ref="1065607017"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">205</int> + <reference key="object" ref="789758025"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="437104165"/> + <reference ref="583158037"/> + <reference ref="1058277027"/> + <reference ref="212016141"/> + <reference ref="296257095"/> + <reference ref="29853731"/> + <reference ref="860595796"/> + <reference ref="1040322652"/> + <reference ref="790794224"/> + <reference ref="892235320"/> + <reference ref="972420730"/> + <reference ref="676164635"/> + <reference ref="507821607"/> + <reference ref="288088188"/> + <reference ref="82994268"/> + </object> + <reference key="parent" ref="952259628"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">202</int> + <reference key="object" ref="437104165"/> + <reference key="parent" ref="789758025"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">198</int> + <reference key="object" ref="583158037"/> + <reference key="parent" ref="789758025"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">207</int> + <reference key="object" ref="1058277027"/> + <reference key="parent" ref="789758025"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">214</int> + <reference key="object" ref="212016141"/> + <reference key="parent" ref="789758025"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">199</int> + <reference key="object" ref="296257095"/> + <reference key="parent" ref="789758025"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">203</int> + <reference key="object" ref="29853731"/> + <reference key="parent" ref="789758025"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">197</int> + <reference key="object" ref="860595796"/> + <reference key="parent" ref="789758025"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">206</int> + <reference key="object" ref="1040322652"/> + <reference key="parent" ref="789758025"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">215</int> + <reference key="object" ref="790794224"/> + <reference key="parent" ref="789758025"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">218</int> + <reference key="object" ref="892235320"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="963351320"/> + </object> + <reference key="parent" ref="789758025"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">216</int> + <reference key="object" ref="972420730"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="769623530"/> + </object> + <reference key="parent" ref="789758025"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">200</int> + <reference key="object" ref="769623530"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="948374510"/> + <reference ref="96193923"/> + <reference ref="679648819"/> + <reference ref="967646866"/> + <reference ref="859480356"/> + <reference ref="795346622"/> + </object> + <reference key="parent" ref="972420730"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">219</int> + <reference key="object" ref="948374510"/> + <reference key="parent" ref="769623530"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">201</int> + <reference key="object" ref="96193923"/> + <reference key="parent" ref="769623530"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">204</int> + <reference key="object" ref="679648819"/> + <reference key="parent" ref="769623530"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">220</int> + <reference key="object" ref="963351320"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="270902937"/> + <reference ref="88285865"/> + <reference ref="159080638"/> + <reference ref="326711663"/> + <reference ref="447796847"/> + </object> + <reference key="parent" ref="892235320"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">213</int> + <reference key="object" ref="270902937"/> + <reference key="parent" ref="963351320"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">210</int> + <reference key="object" ref="88285865"/> + <reference key="parent" ref="963351320"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">221</int> + <reference key="object" ref="159080638"/> + <reference key="parent" ref="963351320"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">208</int> + <reference key="object" ref="326711663"/> + <reference key="parent" ref="963351320"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">209</int> + <reference key="object" ref="447796847"/> + <reference key="parent" ref="963351320"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">57</int> + <reference key="object" ref="110575045"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="238522557"/> + <reference ref="755159360"/> + <reference ref="908899353"/> + <reference ref="632727374"/> + <reference ref="646227648"/> + <reference ref="609285721"/> + <reference ref="481834944"/> + <reference ref="304266470"/> + <reference ref="1046388886"/> + <reference ref="1056857174"/> + <reference ref="342932134"/> + </object> + <reference key="parent" ref="694149608"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">58</int> + <reference key="object" ref="238522557"/> + <reference key="parent" ref="110575045"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">134</int> + <reference key="object" ref="755159360"/> + <reference key="parent" ref="110575045"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">150</int> + <reference key="object" ref="908899353"/> + <reference key="parent" ref="110575045"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">136</int> + <reference key="object" ref="632727374"/> + <reference key="parent" ref="110575045"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">144</int> + <reference key="object" ref="646227648"/> + <reference key="parent" ref="110575045"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">129</int> + <reference key="object" ref="609285721"/> + <reference key="parent" ref="110575045"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">143</int> + <reference key="object" ref="481834944"/> + <reference key="parent" ref="110575045"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">236</int> + <reference key="object" ref="304266470"/> + <reference key="parent" ref="110575045"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">131</int> + <reference key="object" ref="1046388886"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="752062318"/> + </object> + <reference key="parent" ref="110575045"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">149</int> + <reference key="object" ref="1056857174"/> + <reference key="parent" ref="110575045"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">145</int> + <reference key="object" ref="342932134"/> + <reference key="parent" ref="110575045"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">130</int> + <reference key="object" ref="752062318"/> + <reference key="parent" ref="1046388886"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">24</int> + <reference key="object" ref="835318025"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="299356726"/> + <reference ref="625202149"/> + <reference ref="575023229"/> + <reference ref="1011231497"/> + </object> + <reference key="parent" ref="713487014"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">92</int> + <reference key="object" ref="299356726"/> + <reference key="parent" ref="835318025"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5</int> + <reference key="object" ref="625202149"/> + <reference key="parent" ref="835318025"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">239</int> + <reference key="object" ref="575023229"/> + <reference key="parent" ref="835318025"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">23</int> + <reference key="object" ref="1011231497"/> + <reference key="parent" ref="835318025"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">295</int> + <reference key="object" ref="586577488"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="466310130"/> + </object> + <reference key="parent" ref="649796088"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">296</int> + <reference key="object" ref="466310130"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="102151532"/> + <reference ref="237841660"/> + </object> + <reference key="parent" ref="586577488"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">297</int> + <reference key="object" ref="102151532"/> + <reference key="parent" ref="466310130"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">298</int> + <reference key="object" ref="237841660"/> + <reference key="parent" ref="466310130"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">211</int> + <reference key="object" ref="676164635"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="785027613"/> + </object> + <reference key="parent" ref="789758025"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">212</int> + <reference key="object" ref="785027613"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="680220178"/> + <reference ref="731782645"/> + </object> + <reference key="parent" ref="676164635"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">195</int> + <reference key="object" ref="680220178"/> + <reference key="parent" ref="785027613"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">196</int> + <reference key="object" ref="731782645"/> + <reference key="parent" ref="785027613"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">346</int> + <reference key="object" ref="967646866"/> + <reference key="parent" ref="769623530"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">348</int> + <reference key="object" ref="507821607"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="698887838"/> + </object> + <reference key="parent" ref="789758025"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">349</int> + <reference key="object" ref="698887838"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="605118523"/> + <reference ref="197661976"/> + <reference ref="708854459"/> + <reference ref="65139061"/> + <reference ref="19036812"/> + <reference ref="672708820"/> + <reference ref="537092702"/> + </object> + <reference key="parent" ref="507821607"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">350</int> + <reference key="object" ref="605118523"/> + <reference key="parent" ref="698887838"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">351</int> + <reference key="object" ref="197661976"/> + <reference key="parent" ref="698887838"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">354</int> + <reference key="object" ref="708854459"/> + <reference key="parent" ref="698887838"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">371</int> + <reference key="object" ref="972006081"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="439893737"/> + </object> + <reference key="parent" ref="0"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">372</int> + <reference key="object" ref="439893737"/> + <reference key="parent" ref="972006081"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">375</int> + <reference key="object" ref="302598603"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="941447902"/> + </object> + <reference key="parent" ref="649796088"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">376</int> + <reference key="object" ref="941447902"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="792887677"/> + <reference ref="215659978"/> + </object> + <reference key="parent" ref="302598603"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">377</int> + <reference key="object" ref="792887677"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="786677654"/> + </object> + <reference key="parent" ref="941447902"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">388</int> + <reference key="object" ref="786677654"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="159677712"/> + <reference ref="305399458"/> + <reference ref="814362025"/> + <reference ref="330926929"/> + <reference ref="533507878"/> + <reference ref="158063935"/> + <reference ref="885547335"/> + <reference ref="901062459"/> + <reference ref="767671776"/> + <reference ref="691570813"/> + <reference ref="769124883"/> + <reference ref="739652853"/> + <reference ref="1012600125"/> + <reference ref="214559597"/> + <reference ref="596732606"/> + <reference ref="393423671"/> + </object> + <reference key="parent" ref="792887677"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">389</int> + <reference key="object" ref="159677712"/> + <reference key="parent" ref="786677654"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">390</int> + <reference key="object" ref="305399458"/> + <reference key="parent" ref="786677654"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">391</int> + <reference key="object" ref="814362025"/> + <reference key="parent" ref="786677654"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">392</int> + <reference key="object" ref="330926929"/> + <reference key="parent" ref="786677654"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">393</int> + <reference key="object" ref="533507878"/> + <reference key="parent" ref="786677654"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">394</int> + <reference key="object" ref="158063935"/> + <reference key="parent" ref="786677654"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">395</int> + <reference key="object" ref="885547335"/> + <reference key="parent" ref="786677654"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">396</int> + <reference key="object" ref="901062459"/> + <reference key="parent" ref="786677654"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">397</int> + <reference key="object" ref="767671776"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="175441468"/> + </object> + <reference key="parent" ref="786677654"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">398</int> + <reference key="object" ref="691570813"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="1058217995"/> + </object> + <reference key="parent" ref="786677654"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">399</int> + <reference key="object" ref="769124883"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="18263474"/> + </object> + <reference key="parent" ref="786677654"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">400</int> + <reference key="object" ref="739652853"/> + <reference key="parent" ref="786677654"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">401</int> + <reference key="object" ref="1012600125"/> + <reference key="parent" ref="786677654"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">402</int> + <reference key="object" ref="214559597"/> + <reference key="parent" ref="786677654"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">403</int> + <reference key="object" ref="596732606"/> + <reference key="parent" ref="786677654"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">404</int> + <reference key="object" ref="393423671"/> + <reference key="parent" ref="786677654"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">405</int> + <reference key="object" ref="18263474"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="257962622"/> + <reference ref="644725453"/> + <reference ref="1037576581"/> + <reference ref="941806246"/> + <reference ref="1045724900"/> + </object> + <reference key="parent" ref="769124883"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">406</int> + <reference key="object" ref="257962622"/> + <reference key="parent" ref="18263474"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">407</int> + <reference key="object" ref="644725453"/> + <reference key="parent" ref="18263474"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">408</int> + <reference key="object" ref="1037576581"/> + <reference key="parent" ref="18263474"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">409</int> + <reference key="object" ref="941806246"/> + <reference key="parent" ref="18263474"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">410</int> + <reference key="object" ref="1045724900"/> + <reference key="parent" ref="18263474"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">411</int> + <reference key="object" ref="1058217995"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="706297211"/> + <reference ref="568384683"/> + <reference ref="663508465"/> + </object> + <reference key="parent" ref="691570813"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">412</int> + <reference key="object" ref="706297211"/> + <reference key="parent" ref="1058217995"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">413</int> + <reference key="object" ref="568384683"/> + <reference key="parent" ref="1058217995"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">414</int> + <reference key="object" ref="663508465"/> + <reference key="parent" ref="1058217995"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">415</int> + <reference key="object" ref="175441468"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="252969304"/> + <reference ref="766922938"/> + <reference ref="677519740"/> + <reference ref="238351151"/> + </object> + <reference key="parent" ref="767671776"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">416</int> + <reference key="object" ref="252969304"/> + <reference key="parent" ref="175441468"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">417</int> + <reference key="object" ref="766922938"/> + <reference key="parent" ref="175441468"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">418</int> + <reference key="object" ref="677519740"/> + <reference key="parent" ref="175441468"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">419</int> + <reference key="object" ref="238351151"/> + <reference key="parent" ref="175441468"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">420</int> + <reference key="object" ref="755631768"/> + <reference key="parent" ref="0"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">450</int> + <reference key="object" ref="288088188"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="579392910"/> + </object> + <reference key="parent" ref="789758025"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">451</int> + <reference key="object" ref="579392910"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="1060694897"/> + <reference ref="879586729"/> + <reference ref="56570060"/> + </object> + <reference key="parent" ref="288088188"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">452</int> + <reference key="object" ref="1060694897"/> + <reference key="parent" ref="579392910"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">453</int> + <reference key="object" ref="859480356"/> + <reference key="parent" ref="769623530"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">454</int> + <reference key="object" ref="795346622"/> + <reference key="parent" ref="769623530"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">457</int> + <reference key="object" ref="65139061"/> + <reference key="parent" ref="698887838"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">459</int> + <reference key="object" ref="19036812"/> + <reference key="parent" ref="698887838"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">460</int> + <reference key="object" ref="672708820"/> + <reference key="parent" ref="698887838"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">462</int> + <reference key="object" ref="537092702"/> + <reference key="parent" ref="698887838"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">465</int> + <reference key="object" ref="879586729"/> + <reference key="parent" ref="579392910"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">466</int> + <reference key="object" ref="56570060"/> + <reference key="parent" ref="579392910"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">485</int> + <reference key="object" ref="82994268"/> + <reference key="parent" ref="789758025"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">490</int> + <reference key="object" ref="448692316"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="992780483"/> + </object> + <reference key="parent" ref="649796088"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">491</int> + <reference key="object" ref="992780483"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="105068016"/> + </object> + <reference key="parent" ref="448692316"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">492</int> + <reference key="object" ref="105068016"/> + <reference key="parent" ref="992780483"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">494</int> + <reference key="object" ref="976324537"/> + <reference key="parent" ref="0"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">496</int> + <reference key="object" ref="215659978"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="446991534"/> + </object> + <reference key="parent" ref="941447902"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">497</int> + <reference key="object" ref="446991534"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="875092757"/> + <reference ref="630155264"/> + <reference ref="945678886"/> + <reference ref="512868991"/> + <reference ref="163117631"/> + <reference ref="31516759"/> + <reference ref="908105787"/> + <reference ref="644046920"/> + <reference ref="231811626"/> + <reference ref="883618387"/> + </object> + <reference key="parent" ref="215659978"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">498</int> + <reference key="object" ref="875092757"/> + <reference key="parent" ref="446991534"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">499</int> + <reference key="object" ref="630155264"/> + <reference key="parent" ref="446991534"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">500</int> + <reference key="object" ref="945678886"/> + <reference key="parent" ref="446991534"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">501</int> + <reference key="object" ref="512868991"/> + <reference key="parent" ref="446991534"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">502</int> + <reference key="object" ref="163117631"/> + <reference key="parent" ref="446991534"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">503</int> + <reference key="object" ref="31516759"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="956096989"/> + </object> + <reference key="parent" ref="446991534"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">504</int> + <reference key="object" ref="908105787"/> + <reference key="parent" ref="446991534"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">505</int> + <reference key="object" ref="644046920"/> + <reference key="parent" ref="446991534"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">506</int> + <reference key="object" ref="231811626"/> + <reference key="parent" ref="446991534"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">507</int> + <reference key="object" ref="883618387"/> + <reference key="parent" ref="446991534"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">508</int> + <reference key="object" ref="956096989"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="257099033"/> + <reference ref="551969625"/> + <reference ref="249532473"/> + <reference ref="607364498"/> + <reference ref="508151438"/> + <reference ref="981751889"/> + <reference ref="380031999"/> + <reference ref="825984362"/> + <reference ref="560145579"/> + </object> + <reference key="parent" ref="31516759"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">509</int> + <reference key="object" ref="257099033"/> + <reference key="parent" ref="956096989"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">510</int> + <reference key="object" ref="551969625"/> + <reference key="parent" ref="956096989"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">511</int> + <reference key="object" ref="249532473"/> + <reference key="parent" ref="956096989"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">512</int> + <reference key="object" ref="607364498"/> + <reference key="parent" ref="956096989"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">513</int> + <reference key="object" ref="508151438"/> + <reference key="parent" ref="956096989"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">514</int> + <reference key="object" ref="981751889"/> + <reference key="parent" ref="956096989"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">515</int> + <reference key="object" ref="380031999"/> + <reference key="parent" ref="956096989"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">516</int> + <reference key="object" ref="825984362"/> + <reference key="parent" ref="956096989"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">517</int> + <reference key="object" ref="560145579"/> + <reference key="parent" ref="956096989"/> + </object> + </object> + </object> + <object class="NSMutableDictionary" key="flattenedProperties"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSArray" key="dict.sortedKeys"> + <bool key="EncodedWithXMLCoder">YES</bool> + <string>-3.IBPluginDependency</string> + <string>112.IBPluginDependency</string> + <string>112.ImportedFromIB2</string> + <string>124.IBPluginDependency</string> + <string>124.ImportedFromIB2</string> + <string>125.IBPluginDependency</string> + <string>125.ImportedFromIB2</string> + <string>125.editorWindowContentRectSynchronizationRect</string> + <string>126.IBPluginDependency</string> + <string>126.ImportedFromIB2</string> + <string>129.IBPluginDependency</string> + <string>129.ImportedFromIB2</string> + <string>130.IBPluginDependency</string> + <string>130.ImportedFromIB2</string> + <string>130.editorWindowContentRectSynchronizationRect</string> + <string>131.IBPluginDependency</string> + <string>131.ImportedFromIB2</string> + <string>134.IBPluginDependency</string> + <string>134.ImportedFromIB2</string> + <string>136.IBPluginDependency</string> + <string>136.ImportedFromIB2</string> + <string>143.IBPluginDependency</string> + <string>143.ImportedFromIB2</string> + <string>144.IBPluginDependency</string> + <string>144.ImportedFromIB2</string> + <string>145.IBPluginDependency</string> + <string>145.ImportedFromIB2</string> + <string>149.IBPluginDependency</string> + <string>149.ImportedFromIB2</string> + <string>150.IBPluginDependency</string> + <string>150.ImportedFromIB2</string> + <string>19.IBPluginDependency</string> + <string>19.ImportedFromIB2</string> + <string>195.IBPluginDependency</string> + <string>195.ImportedFromIB2</string> + <string>196.IBPluginDependency</string> + <string>196.ImportedFromIB2</string> + <string>197.IBPluginDependency</string> + <string>197.ImportedFromIB2</string> + <string>198.IBPluginDependency</string> + <string>198.ImportedFromIB2</string> + <string>199.IBPluginDependency</string> + <string>199.ImportedFromIB2</string> + <string>200.IBEditorWindowLastContentRect</string> + <string>200.IBPluginDependency</string> + <string>200.ImportedFromIB2</string> + <string>200.editorWindowContentRectSynchronizationRect</string> + <string>201.IBPluginDependency</string> + <string>201.ImportedFromIB2</string> + <string>202.IBPluginDependency</string> + <string>202.ImportedFromIB2</string> + <string>203.IBPluginDependency</string> + <string>203.ImportedFromIB2</string> + <string>204.IBPluginDependency</string> + <string>204.ImportedFromIB2</string> + <string>205.IBEditorWindowLastContentRect</string> + <string>205.IBPluginDependency</string> + <string>205.ImportedFromIB2</string> + <string>205.editorWindowContentRectSynchronizationRect</string> + <string>206.IBPluginDependency</string> + <string>206.ImportedFromIB2</string> + <string>207.IBPluginDependency</string> + <string>207.ImportedFromIB2</string> + <string>208.IBPluginDependency</string> + <string>208.ImportedFromIB2</string> + <string>209.IBPluginDependency</string> + <string>209.ImportedFromIB2</string> + <string>210.IBPluginDependency</string> + <string>210.ImportedFromIB2</string> + <string>211.IBPluginDependency</string> + <string>211.ImportedFromIB2</string> + <string>212.IBPluginDependency</string> + <string>212.ImportedFromIB2</string> + <string>212.editorWindowContentRectSynchronizationRect</string> + <string>213.IBPluginDependency</string> + <string>213.ImportedFromIB2</string> + <string>214.IBPluginDependency</string> + <string>214.ImportedFromIB2</string> + <string>215.IBPluginDependency</string> + <string>215.ImportedFromIB2</string> + <string>216.IBPluginDependency</string> + <string>216.ImportedFromIB2</string> + <string>217.IBPluginDependency</string> + <string>217.ImportedFromIB2</string> + <string>218.IBPluginDependency</string> + <string>218.ImportedFromIB2</string> + <string>219.IBPluginDependency</string> + <string>219.ImportedFromIB2</string> + <string>220.IBEditorWindowLastContentRect</string> + <string>220.IBPluginDependency</string> + <string>220.ImportedFromIB2</string> + <string>220.editorWindowContentRectSynchronizationRect</string> + <string>221.IBPluginDependency</string> + <string>221.ImportedFromIB2</string> + <string>23.IBPluginDependency</string> + <string>23.ImportedFromIB2</string> + <string>236.IBPluginDependency</string> + <string>236.ImportedFromIB2</string> + <string>239.IBPluginDependency</string> + <string>239.ImportedFromIB2</string> + <string>24.IBEditorWindowLastContentRect</string> + <string>24.IBPluginDependency</string> + <string>24.ImportedFromIB2</string> + <string>24.editorWindowContentRectSynchronizationRect</string> + <string>29.IBEditorWindowLastContentRect</string> + <string>29.IBPluginDependency</string> + <string>29.ImportedFromIB2</string> + <string>29.WindowOrigin</string> + <string>29.editorWindowContentRectSynchronizationRect</string> + <string>295.IBPluginDependency</string> + <string>296.IBEditorWindowLastContentRect</string> + <string>296.IBPluginDependency</string> + <string>296.editorWindowContentRectSynchronizationRect</string> + <string>297.IBPluginDependency</string> + <string>298.IBPluginDependency</string> + <string>346.IBPluginDependency</string> + <string>346.ImportedFromIB2</string> + <string>348.IBPluginDependency</string> + <string>348.ImportedFromIB2</string> + <string>349.IBEditorWindowLastContentRect</string> + <string>349.IBPluginDependency</string> + <string>349.ImportedFromIB2</string> + <string>349.editorWindowContentRectSynchronizationRect</string> + <string>350.IBPluginDependency</string> + <string>350.ImportedFromIB2</string> + <string>351.IBPluginDependency</string> + <string>351.ImportedFromIB2</string> + <string>354.IBPluginDependency</string> + <string>354.ImportedFromIB2</string> + <string>371.IBEditorWindowLastContentRect</string> + <string>371.IBPluginDependency</string> + <string>371.IBWindowTemplateEditedContentRect</string> + <string>371.NSWindowTemplate.visibleAtLaunch</string> + <string>371.editorWindowContentRectSynchronizationRect</string> + <string>371.windowTemplate.maxSize</string> + <string>372.IBPluginDependency</string> + <string>375.IBPluginDependency</string> + <string>376.IBEditorWindowLastContentRect</string> + <string>376.IBPluginDependency</string> + <string>377.IBPluginDependency</string> + <string>388.IBEditorWindowLastContentRect</string> + <string>388.IBPluginDependency</string> + <string>389.IBPluginDependency</string> + <string>390.IBPluginDependency</string> + <string>391.IBPluginDependency</string> + <string>392.IBPluginDependency</string> + <string>393.IBPluginDependency</string> + <string>394.IBPluginDependency</string> + <string>395.IBPluginDependency</string> + <string>396.IBPluginDependency</string> + <string>397.IBPluginDependency</string> + <string>398.IBPluginDependency</string> + <string>399.IBPluginDependency</string> + <string>400.IBPluginDependency</string> + <string>401.IBPluginDependency</string> + <string>402.IBPluginDependency</string> + <string>403.IBPluginDependency</string> + <string>404.IBPluginDependency</string> + <string>405.IBPluginDependency</string> + <string>406.IBPluginDependency</string> + <string>407.IBPluginDependency</string> + <string>408.IBPluginDependency</string> + <string>409.IBPluginDependency</string> + <string>410.IBPluginDependency</string> + <string>411.IBPluginDependency</string> + <string>412.IBPluginDependency</string> + <string>413.IBPluginDependency</string> + <string>414.IBPluginDependency</string> + <string>415.IBPluginDependency</string> + <string>416.IBPluginDependency</string> + <string>417.IBPluginDependency</string> + <string>418.IBPluginDependency</string> + <string>419.IBPluginDependency</string> + <string>450.IBPluginDependency</string> + <string>451.IBEditorWindowLastContentRect</string> + <string>451.IBPluginDependency</string> + <string>452.IBPluginDependency</string> + <string>453.IBPluginDependency</string> + <string>454.IBPluginDependency</string> + <string>457.IBPluginDependency</string> + <string>459.IBPluginDependency</string> + <string>460.IBPluginDependency</string> + <string>462.IBPluginDependency</string> + <string>465.IBPluginDependency</string> + <string>466.IBPluginDependency</string> + <string>485.IBPluginDependency</string> + <string>490.IBPluginDependency</string> + <string>491.IBEditorWindowLastContentRect</string> + <string>491.IBPluginDependency</string> + <string>492.IBPluginDependency</string> + <string>496.IBPluginDependency</string> + <string>497.IBEditorWindowLastContentRect</string> + <string>497.IBPluginDependency</string> + <string>498.IBPluginDependency</string> + <string>499.IBPluginDependency</string> + <string>5.IBPluginDependency</string> + <string>5.ImportedFromIB2</string> + <string>500.IBPluginDependency</string> + <string>501.IBPluginDependency</string> + <string>502.IBPluginDependency</string> + <string>503.IBPluginDependency</string> + <string>504.IBPluginDependency</string> + <string>505.IBPluginDependency</string> + <string>506.IBPluginDependency</string> + <string>507.IBPluginDependency</string> + <string>508.IBEditorWindowLastContentRect</string> + <string>508.IBPluginDependency</string> + <string>509.IBPluginDependency</string> + <string>510.IBPluginDependency</string> + <string>511.IBPluginDependency</string> + <string>512.IBPluginDependency</string> + <string>513.IBPluginDependency</string> + <string>514.IBPluginDependency</string> + <string>515.IBPluginDependency</string> + <string>516.IBPluginDependency</string> + <string>517.IBPluginDependency</string> + <string>56.IBPluginDependency</string> + <string>56.ImportedFromIB2</string> + <string>57.IBEditorWindowLastContentRect</string> + <string>57.IBPluginDependency</string> + <string>57.ImportedFromIB2</string> + <string>57.editorWindowContentRectSynchronizationRect</string> + <string>58.IBPluginDependency</string> + <string>58.ImportedFromIB2</string> + <string>72.IBPluginDependency</string> + <string>72.ImportedFromIB2</string> + <string>73.IBPluginDependency</string> + <string>73.ImportedFromIB2</string> + <string>74.IBPluginDependency</string> + <string>74.ImportedFromIB2</string> + <string>75.IBPluginDependency</string> + <string>75.ImportedFromIB2</string> + <string>77.IBPluginDependency</string> + <string>77.ImportedFromIB2</string> + <string>78.IBPluginDependency</string> + <string>78.ImportedFromIB2</string> + <string>79.IBPluginDependency</string> + <string>79.ImportedFromIB2</string> + <string>80.IBPluginDependency</string> + <string>80.ImportedFromIB2</string> + <string>81.IBEditorWindowLastContentRect</string> + <string>81.IBPluginDependency</string> + <string>81.ImportedFromIB2</string> + <string>81.editorWindowContentRectSynchronizationRect</string> + <string>82.IBPluginDependency</string> + <string>82.ImportedFromIB2</string> + <string>83.IBPluginDependency</string> + <string>83.ImportedFromIB2</string> + <string>92.IBPluginDependency</string> + <string>92.ImportedFromIB2</string> + </object> + <object class="NSMutableArray" key="dict.values"> + <bool key="EncodedWithXMLCoder">YES</bool> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <integer value="1"/> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <integer value="1"/> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <integer value="1"/> + <string>{{522, 812}, {146, 23}}</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <integer value="1"/> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <integer value="1"/> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <integer value="1"/> + <string>{{436, 809}, {64, 6}}</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <integer value="1"/> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <integer value="1"/> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <integer value="1"/> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <integer value="1"/> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <integer value="1"/> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <integer value="1"/> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <integer value="1"/> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <integer value="1"/> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <integer value="1"/> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <integer value="1"/> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <integer value="1"/> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <integer value="1"/> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <integer value="1"/> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <integer value="1"/> + <string>{{753, 187}, {275, 113}}</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <integer value="1"/> + <string>{{608, 612}, {275, 83}}</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <integer value="1"/> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <integer value="1"/> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <integer value="1"/> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <integer value="1"/> + <string>{{547, 180}, {254, 283}}</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <integer value="1"/> + <string>{{187, 434}, {243, 243}}</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <integer value="1"/> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <integer value="1"/> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <integer value="1"/> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <integer value="1"/> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <integer value="1"/> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <integer value="1"/> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <integer value="1"/> + <string>{{608, 612}, {167, 43}}</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <integer value="1"/> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <integer value="1"/> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <integer value="1"/> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <integer value="1"/> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <integer value="1"/> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <integer value="1"/> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <integer value="1"/> + <string>{{753, 217}, {238, 103}}</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <integer value="1"/> + <string>{{608, 612}, {241, 103}}</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <integer value="1"/> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <integer value="1"/> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <integer value="1"/> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <integer value="1"/> + <string>{{654, 239}, {194, 73}}</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <integer value="1"/> + <string>{{525, 802}, {197, 73}}</string> + <string>{{380, 836}, {512, 20}}</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <integer value="1"/> + <string>{74, 862}</string> + <string>{{6, 978}, {478, 20}}</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>{{604, 269}, {231, 43}}</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>{{475, 832}, {234, 43}}</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <integer value="1"/> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <integer value="1"/> + <string>{{746, 287}, {220, 133}}</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <integer value="1"/> + <string>{{608, 612}, {215, 63}}</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <integer value="1"/> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <integer value="1"/> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <integer value="1"/> + <string>{{380, 496}, {480, 360}}</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>{{380, 496}, {480, 360}}</string> + <integer value="1"/> + <string>{{33, 99}, {480, 360}}</string> + <string>{3.40282e+38, 3.40282e+38}</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>{{591, 420}, {83, 43}}</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>{{523, 2}, {178, 283}}</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>{{753, 197}, {170, 63}}</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>{{725, 289}, {246, 23}}</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>{{674, 260}, {204, 183}}</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <integer value="1"/> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>{{878, 180}, {164, 173}}</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <integer value="1"/> + <string>{{286, 129}, {275, 183}}</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <integer value="1"/> + <string>{{23, 794}, {245, 183}}</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <integer value="1"/> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <integer value="1"/> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <integer value="1"/> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <integer value="1"/> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <integer value="1"/> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <integer value="1"/> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <integer value="1"/> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <integer value="1"/> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <integer value="1"/> + <string>{{452, 109}, {196, 203}}</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <integer value="1"/> + <string>{{145, 474}, {199, 203}}</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <integer value="1"/> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <integer value="1"/> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <integer value="1"/> + </object> + </object> + <object class="NSMutableDictionary" key="unlocalizedProperties"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference key="dict.sortedKeys" ref="0"/> + <object class="NSMutableArray" key="dict.values"> + <bool key="EncodedWithXMLCoder">YES</bool> + </object> + </object> + <nil key="activeLocalization"/> + <object class="NSMutableDictionary" key="localizations"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference key="dict.sortedKeys" ref="0"/> + <object class="NSMutableArray" key="dict.values"> + <bool key="EncodedWithXMLCoder">YES</bool> + </object> + </object> + <nil key="sourceID"/> + <int key="maxID">532</int> + </object> + <object class="IBClassDescriber" key="IBDocument.Classes"> + <object class="NSMutableArray" key="referencedPartialClassDescriptions"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="IBPartialClassDescription"> + <string key="className">TestAppAppDelegate</string> + <string key="superclassName">NSObject</string> + <object class="NSMutableDictionary" key="outlets"> + <string key="NS.key.0">window</string> + <string key="NS.object.0">NSWindow</string> + </object> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBProjectSource</string> + <string key="minorKey">TestAppAppDelegate.h</string> + </object> + </object> + </object> + <object class="NSMutableArray" key="referencedPartialClassDescriptionsV3.2+"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="IBPartialClassDescription"> + <string key="className">NSApplication</string> + <string key="superclassName">NSResponder</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier" id="822405504"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSApplication.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSApplication</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier" id="850738725"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSApplicationScripting.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSApplication</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier" id="624831158"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSColorPanel.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSApplication</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSHelpManager.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSApplication</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSPageLayout.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSApplication</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSUserInterfaceItemSearching.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSBrowser</string> + <string key="superclassName">NSControl</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSBrowser.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSControl</string> + <string key="superclassName">NSView</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier" id="310914472"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSControl.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSDocument</string> + <string key="superclassName">NSObject</string> + <object class="NSMutableDictionary" key="actions"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSArray" key="dict.sortedKeys"> + <bool key="EncodedWithXMLCoder">YES</bool> + <string>printDocument:</string> + <string>revertDocumentToSaved:</string> + <string>runPageLayout:</string> + <string>saveDocument:</string> + <string>saveDocumentAs:</string> + <string>saveDocumentTo:</string> + </object> + <object class="NSMutableArray" key="dict.values"> + <bool key="EncodedWithXMLCoder">YES</bool> + <string>id</string> + <string>id</string> + <string>id</string> + <string>id</string> + <string>id</string> + <string>id</string> + </object> + </object> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSDocument.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSDocument</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSDocumentScripting.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSDocumentController</string> + <string key="superclassName">NSObject</string> + <object class="NSMutableDictionary" key="actions"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSArray" key="dict.sortedKeys"> + <bool key="EncodedWithXMLCoder">YES</bool> + <string>clearRecentDocuments:</string> + <string>newDocument:</string> + <string>openDocument:</string> + <string>saveAllDocuments:</string> + </object> + <object class="NSMutableArray" key="dict.values"> + <bool key="EncodedWithXMLCoder">YES</bool> + <string>id</string> + <string>id</string> + <string>id</string> + <string>id</string> + </object> + </object> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSDocumentController.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSFontManager</string> + <string key="superclassName">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier" id="946436764"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSFontManager.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSFormatter</string> + <string key="superclassName">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">Foundation.framework/Headers/NSFormatter.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSMatrix</string> + <string key="superclassName">NSControl</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSMatrix.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSMenu</string> + <string key="superclassName">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier" id="1056362899"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSMenu.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSMenuItem</string> + <string key="superclassName">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier" id="472958451"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSMenuItem.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSMovieView</string> + <string key="superclassName">NSView</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSMovieView.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSAccessibility.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <reference key="sourceIdentifier" ref="822405504"/> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <reference key="sourceIdentifier" ref="850738725"/> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <reference key="sourceIdentifier" ref="624831158"/> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <reference key="sourceIdentifier" ref="310914472"/> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSDictionaryController.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSDragging.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <reference key="sourceIdentifier" ref="946436764"/> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSFontPanel.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSKeyValueBinding.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <reference key="sourceIdentifier" ref="1056362899"/> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSNibLoading.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSOutlineView.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSPasteboard.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSSavePanel.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier" id="809545482"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSTableView.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSToolbarItem.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier" id="260078765"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSView.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">Foundation.framework/Headers/NSArchiver.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">Foundation.framework/Headers/NSClassDescription.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">Foundation.framework/Headers/NSError.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">Foundation.framework/Headers/NSFileManager.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">Foundation.framework/Headers/NSKeyValueCoding.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">Foundation.framework/Headers/NSKeyValueObserving.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">Foundation.framework/Headers/NSKeyedArchiver.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">Foundation.framework/Headers/NSObject.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">Foundation.framework/Headers/NSObjectScripting.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">Foundation.framework/Headers/NSPortCoder.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">Foundation.framework/Headers/NSRunLoop.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">Foundation.framework/Headers/NSScriptClassDescription.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">Foundation.framework/Headers/NSScriptKeyValueCoding.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">Foundation.framework/Headers/NSScriptObjectSpecifiers.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">Foundation.framework/Headers/NSScriptWhoseTests.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">Foundation.framework/Headers/NSThread.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">Foundation.framework/Headers/NSURL.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">Foundation.framework/Headers/NSURLConnection.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">Foundation.framework/Headers/NSURLDownload.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSResponder</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSInterfaceStyle.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSResponder</string> + <string key="superclassName">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSResponder.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSTableView</string> + <string key="superclassName">NSControl</string> + <reference key="sourceIdentifier" ref="809545482"/> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSText</string> + <string key="superclassName">NSView</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSText.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSTextView</string> + <string key="superclassName">NSText</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSTextView.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSView</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSClipView.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSView</string> + <reference key="sourceIdentifier" ref="472958451"/> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSView</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSRulerView.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSView</string> + <string key="superclassName">NSResponder</string> + <reference key="sourceIdentifier" ref="260078765"/> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSWindow</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSDrawer.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSWindow</string> + <string key="superclassName">NSResponder</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSWindow.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSWindow</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSWindowScripting.h</string> + </object> + </object> + </object> + </object> + <int key="IBDocument.localizationMode">0</int> + <object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDependencyDefaults"> + <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin.macosx</string> + <integer value="1060" key="NS.object.0"/> + </object> + <object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDevelopmentDependencies"> + <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3</string> + <integer value="3000" key="NS.object.0"/> + </object> + <bool key="IBDocument.PluginDeclaredDependenciesTrackSystemTargetVersion">YES</bool> + <string key="IBDocument.LastKnownRelativeProjectPath">../TestApp.xcodeproj</string> + <int key="IBDocument.defaultPropertyAccessControl">3</int> + </data> +</archive> diff --git a/deps/gyp/test/ios/app-bundle/TestApp/English.lproj/Main_iPhone.storyboard b/deps/gyp/test/ios/app-bundle/TestApp/English.lproj/Main_iPhone.storyboard new file mode 100644 index 0000000000..723bc85122 --- /dev/null +++ b/deps/gyp/test/ios/app-bundle/TestApp/English.lproj/Main_iPhone.storyboard @@ -0,0 +1,27 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="1.0" toolsVersion="1906" systemVersion="11A511" targetRuntime="iOS.CocoaTouch" nextObjectID="6" propertyAccessControl="none" initialViewController="2"> + <dependencies> + <development defaultVersion="4200" identifier="xcode"/> + <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="902"/> + </dependencies> + <scenes> + <scene sceneID="5"> + <objects> + <placeholder placeholderIdentifier="IBFirstResponder" id="4" sceneMemberID="firstResponder"/> + <viewController id="2" customClass="ViewController" sceneMemberID="viewController"> + <view key="view" contentMode="scaleToFill" id="3"> + <rect key="frame" x="0.0" y="20" width="320" height="460"/> + <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/> + <subviews/> + <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/> + </view> + </viewController> + </objects> + </scene> + </scenes> + <simulatedMetricsContainer key="defaultSimulatedMetrics"> + <simulatedStatusBarMetrics key="statusBar"/> + <simulatedOrientationMetrics key="orientation"/> + <simulatedScreenMetrics key="destination"/> + </simulatedMetricsContainer> +</document> diff --git a/deps/gyp/test/ios/app-bundle/TestApp/Images.xcassets/AppIcon.appiconset/Contents.json b/deps/gyp/test/ios/app-bundle/TestApp/Images.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000000..2db2b1c7c6 --- /dev/null +++ b/deps/gyp/test/ios/app-bundle/TestApp/Images.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,58 @@ +{ + "images" : [ + { + "idiom" : "mac", + "size" : "16x16", + "scale" : "1x" + }, + { + "idiom" : "mac", + "size" : "16x16", + "scale" : "2x" + }, + { + "idiom" : "mac", + "size" : "32x32", + "scale" : "1x" + }, + { + "idiom" : "mac", + "size" : "32x32", + "scale" : "2x" + }, + { + "idiom" : "mac", + "size" : "128x128", + "scale" : "1x" + }, + { + "idiom" : "mac", + "size" : "128x128", + "scale" : "2x" + }, + { + "idiom" : "mac", + "size" : "256x256", + "scale" : "1x" + }, + { + "idiom" : "mac", + "size" : "256x256", + "scale" : "2x" + }, + { + "idiom" : "mac", + "size" : "512x512", + "scale" : "1x" + }, + { + "idiom" : "mac", + "size" : "512x512", + "scale" : "2x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +}
\ No newline at end of file diff --git a/deps/gyp/test/ios/app-bundle/TestApp/Images.xcassets/image.imageset/Contents.json b/deps/gyp/test/ios/app-bundle/TestApp/Images.xcassets/image.imageset/Contents.json new file mode 100644 index 0000000000..0a87b6edc6 --- /dev/null +++ b/deps/gyp/test/ios/app-bundle/TestApp/Images.xcassets/image.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x", + "filename" : "super_sylvain.png" + }, + { + "idiom" : "universal", + "scale" : "2x", + "filename" : "super_sylvain@2x.png" + }, + { + "idiom" : "universal", + "scale" : "3x", + "filename" : "super_sylvain@3x.png" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +}
\ No newline at end of file diff --git a/deps/gyp/test/ios/app-bundle/TestApp/Images.xcassets/image.imageset/super_sylvain.png b/deps/gyp/test/ios/app-bundle/TestApp/Images.xcassets/image.imageset/super_sylvain.png Binary files differnew file mode 100644 index 0000000000..0ba769182f --- /dev/null +++ b/deps/gyp/test/ios/app-bundle/TestApp/Images.xcassets/image.imageset/super_sylvain.png diff --git a/deps/gyp/test/ios/app-bundle/TestApp/Images.xcassets/image.imageset/super_sylvain@2x.png b/deps/gyp/test/ios/app-bundle/TestApp/Images.xcassets/image.imageset/super_sylvain@2x.png Binary files differnew file mode 100644 index 0000000000..edfa6a5682 --- /dev/null +++ b/deps/gyp/test/ios/app-bundle/TestApp/Images.xcassets/image.imageset/super_sylvain@2x.png diff --git a/deps/gyp/test/ios/app-bundle/TestApp/Images.xcassets/image.imageset/super_sylvain@3x.png b/deps/gyp/test/ios/app-bundle/TestApp/Images.xcassets/image.imageset/super_sylvain@3x.png Binary files differnew file mode 100644 index 0000000000..e0652efc72 --- /dev/null +++ b/deps/gyp/test/ios/app-bundle/TestApp/Images.xcassets/image.imageset/super_sylvain@3x.png diff --git a/deps/gyp/test/ios/app-bundle/TestApp/TestApp-Info.plist b/deps/gyp/test/ios/app-bundle/TestApp/TestApp-Info.plist new file mode 100644 index 0000000000..8cb142e9f5 --- /dev/null +++ b/deps/gyp/test/ios/app-bundle/TestApp/TestApp-Info.plist @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> +<plist version="1.0"> +<dict> + <key>CFBundleDevelopmentRegion</key> + <string>English</string> + <key>CFBundleExecutable</key> + <string>${EXECUTABLE_NAME}</string> + <key>CFBundleIconFile</key> + <string></string> + <key>CFBundleIdentifier</key> + <string>com.google.${PRODUCT_NAME}</string> + <key>CFBundleInfoDictionaryVersion</key> + <string>6.0</string> + <key>CFBundleName</key> + <string>${PRODUCT_NAME}</string> + <key>CFBundlePackageType</key> + <string>APPL</string> + <key>CFBundleShortVersionString</key> + <string>1.0</string> + <key>CFBundleSignature</key> + <string>ause</string> + <key>CFBundleVersion</key> + <string>1</string> + <key>LSMinimumSystemVersion</key> + <string>${MACOSX_DEPLOYMENT_TARGET}</string> + <key>NSMainNibFile</key> + <string>MainMenu</string> + <key>NSPrincipalClass</key> + <string>NSApplication</string> +</dict> +</plist> diff --git a/deps/gyp/test/ios/app-bundle/TestApp/check_no_signature.py b/deps/gyp/test/ios/app-bundle/TestApp/check_no_signature.py new file mode 100644 index 0000000000..4f6e340072 --- /dev/null +++ b/deps/gyp/test/ios/app-bundle/TestApp/check_no_signature.py @@ -0,0 +1,13 @@ +#!/usr/bin/python + +import os +import subprocess +import sys + +p = os.path.join(os.environ['BUILT_PRODUCTS_DIR'],os.environ['EXECUTABLE_PATH']) +proc = subprocess.Popen(['codesign', '-v', p], + stderr=subprocess.STDOUT, stdout=subprocess.PIPE) +o = proc.communicate()[0].strip() +if "code object is not signed at all" not in o: + sys.stderr.write('File should not already be signed.') + sys.exit(1) diff --git a/deps/gyp/test/ios/app-bundle/TestApp/main.m b/deps/gyp/test/ios/app-bundle/TestApp/main.m new file mode 100644 index 0000000000..ec93e0e237 --- /dev/null +++ b/deps/gyp/test/ios/app-bundle/TestApp/main.m @@ -0,0 +1,13 @@ +// Copyright (c) 2011 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 <UIKit/UIKit.h> + +int main(int argc, char *argv[]) +{ + NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init]; + int retVal = UIApplicationMain(argc, argv, nil, nil); + [pool release]; + return retVal; +} diff --git a/deps/gyp/test/ios/app-bundle/TestApp/only-compile-in-32-bits.m b/deps/gyp/test/ios/app-bundle/TestApp/only-compile-in-32-bits.m new file mode 100644 index 0000000000..28bb117788 --- /dev/null +++ b/deps/gyp/test/ios/app-bundle/TestApp/only-compile-in-32-bits.m @@ -0,0 +1,7 @@ +// Copyright (c) 2013 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. + +#if defined(__LP64__) +# error 64-bit build +#endif diff --git a/deps/gyp/test/ios/app-bundle/TestApp/only-compile-in-64-bits.m b/deps/gyp/test/ios/app-bundle/TestApp/only-compile-in-64-bits.m new file mode 100644 index 0000000000..e6d2558418 --- /dev/null +++ b/deps/gyp/test/ios/app-bundle/TestApp/only-compile-in-64-bits.m @@ -0,0 +1,7 @@ +// Copyright (c) 2013 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. + +#if !defined(__LP64__) +# error 32-bit build +#endif diff --git a/deps/gyp/test/ios/app-bundle/test-archs.gyp b/deps/gyp/test/ios/app-bundle/test-archs.gyp new file mode 100644 index 0000000000..b1558c94be --- /dev/null +++ b/deps/gyp/test/ios/app-bundle/test-archs.gyp @@ -0,0 +1,110 @@ +# Copyright (c) 2013 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. +{ + 'make_global_settings': [ + ['CC', '/usr/bin/clang'], + ], + 'target_defaults': { + 'product_extension': 'bundle', + 'mac_bundle_resources': [ + 'TestApp/English.lproj/InfoPlist.strings', + 'TestApp/English.lproj/MainMenu.xib', + ], + 'link_settings': { + 'libraries': [ + '$(SDKROOT)/System/Library/Frameworks/Foundation.framework', + '$(SDKROOT)/System/Library/Frameworks/UIKit.framework', + ], + }, + 'xcode_settings': { + 'OTHER_CFLAGS': [ + '-fobjc-abi-version=2', + ], + 'CODE_SIGNING_REQUIRED': 'NO', + 'SDKROOT': 'iphonesimulator', # -isysroot + 'TARGETED_DEVICE_FAMILY': '1,2', + 'INFOPLIST_FILE': 'TestApp/TestApp-Info.plist', + 'IPHONEOS_DEPLOYMENT_TARGET': '7.0', + 'CONFIGURATION_BUILD_DIR':'build/Default', + }, + }, + 'targets': [ + { + 'target_name': 'TestNoArchs', + 'product_name': 'TestNoArchs', + 'type': 'executable', + 'mac_bundle': 1, + 'sources': [ + 'TestApp/main.m', + 'TestApp/only-compile-in-32-bits.m', + ], + 'xcode_settings': { + 'VALID_ARCHS': [ + 'i386', + 'x86_64', + 'arm64', + 'armv7', + ], + } + }, + { + 'target_name': 'TestArch32Bits', + 'product_name': 'TestArch32Bits', + 'type': 'executable', + 'mac_bundle': 1, + 'sources': [ + 'TestApp/main.m', + 'TestApp/only-compile-in-32-bits.m', + ], + 'xcode_settings': { + 'ARCHS': [ + '$(ARCHS_STANDARD)', + ], + 'VALID_ARCHS': [ + 'i386', + 'armv7', + ], + }, + }, + { + 'target_name': 'TestArch64Bits', + 'product_name': 'TestArch64Bits', + 'type': 'executable', + 'mac_bundle': 1, + 'sources': [ + 'TestApp/main.m', + 'TestApp/only-compile-in-64-bits.m', + ], + 'xcode_settings': { + 'ARCHS': [ + '$(ARCHS_STANDARD_INCLUDING_64_BIT)', + ], + 'VALID_ARCHS': [ + 'x86_64', + 'arm64', + ], + }, + }, + { + 'target_name': 'TestMultiArchs', + 'product_name': 'TestMultiArchs', + 'type': 'executable', + 'mac_bundle': 1, + 'sources': [ + 'TestApp/main.m', + ], + 'xcode_settings': { + 'ARCHS': [ + '$(ARCHS_STANDARD_INCLUDING_64_BIT)', + ], + 'VALID_ARCHS': [ + 'x86_64', + 'i386', + 'arm64', + 'armv7', + ], + } + }, + ], +} diff --git a/deps/gyp/test/ios/app-bundle/test-assets-catalog.gyp b/deps/gyp/test/ios/app-bundle/test-assets-catalog.gyp new file mode 100644 index 0000000000..9a12d07af7 --- /dev/null +++ b/deps/gyp/test/ios/app-bundle/test-assets-catalog.gyp @@ -0,0 +1,45 @@ +# Copyright (c) 2011 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. +{ + 'conditions': [ + ['"<(GENERATOR)"=="ninja"', { + 'make_global_settings': [ + ['CC', '/usr/bin/clang'], + ['CXX', '/usr/bin/clang++'], + ], + }], + ], + 'targets': [ + { + 'target_name': 'test_app', + 'product_name': 'Test App Assets Catalog Gyp', + 'type': 'executable', + 'mac_bundle': 1, + 'sources': [ + 'TestApp/main.m', + ], + 'mac_bundle_resources': [ + 'TestApp/English.lproj/InfoPlist.strings', + 'TestApp/English.lproj/MainMenu.xib', + 'TestApp/English.lproj/Main_iPhone.storyboard', + 'TestApp/Images.xcassets', + ], + 'link_settings': { + 'libraries': [ + '$(SDKROOT)/System/Library/Frameworks/Foundation.framework', + '$(SDKROOT)/System/Library/Frameworks/UIKit.framework', + ], + }, + 'xcode_settings': { + 'OTHER_CFLAGS': [ + '-fobjc-abi-version=2', + ], + 'INFOPLIST_FILE': 'TestApp/TestApp-Info.plist', + 'SDKROOT': 'iphonesimulator', # -isysroot + 'IPHONEOS_DEPLOYMENT_TARGET': '7.0', + 'CONFIGURATION_BUILD_DIR':'build/Default', + }, + }, + ], +} diff --git a/deps/gyp/test/ios/app-bundle/test-crosscompile.gyp b/deps/gyp/test/ios/app-bundle/test-crosscompile.gyp new file mode 100644 index 0000000000..d9049588ba --- /dev/null +++ b/deps/gyp/test/ios/app-bundle/test-crosscompile.gyp @@ -0,0 +1,47 @@ +# Copyright (c) 2014 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. +{ + 'make_global_settings': [ + ['CC', '/usr/bin/clang'], + ], + 'targets': [ + # This target will not be built, but is here so that ninja Xcode emulation + # understand this is a multi-platform (ios + mac) build. + { + 'target_name': 'TestDummy', + 'product_name': 'TestDummy', + 'toolsets': ['target'], + 'type': 'executable', + 'mac_bundle': 1, + 'sources': [ + 'tool_main.cc', + ], + 'xcode_settings': { + 'SDKROOT': 'iphonesimulator', # -isysroot + 'TARGETED_DEVICE_FAMILY': '1,2', + 'IPHONEOS_DEPLOYMENT_TARGET': '7.0', + }, + }, + { + 'target_name': 'TestHost', + 'product_name': 'TestHost', + 'toolsets': ['host'], + 'type': 'executable', + 'mac_bundle': 0, + 'sources': [ + 'tool_main.cc', + ], + 'xcode_settings': { + 'SDKROOT': 'macosx', + 'ARCHS': [ + '$(ARCHS_STANDARD)', + 'x86_64', + ], + 'VALID_ARCHS': [ + 'x86_64', + ], + } + } + ], +} diff --git a/deps/gyp/test/ios/app-bundle/test-device.gyp b/deps/gyp/test/ios/app-bundle/test-device.gyp new file mode 100644 index 0000000000..28cdbb3af5 --- /dev/null +++ b/deps/gyp/test/ios/app-bundle/test-device.gyp @@ -0,0 +1,79 @@ +# Copyright (c) 2011 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. +{ + 'make_global_settings': [ + ['CC', '/usr/bin/clang'], + ], + 'targets': [ + { + 'target_name': 'test_app', + 'product_name': 'Test App Gyp', + 'type': 'executable', + 'product_extension': 'bundle', + 'mac_bundle': 1, + 'sources': [ + 'TestApp/main.m', + ], + 'mac_bundle_resources': [ + 'TestApp/English.lproj/InfoPlist.strings', + 'TestApp/English.lproj/MainMenu.xib', + ], + 'link_settings': { + 'libraries': [ + '$(SDKROOT)/System/Library/Frameworks/Foundation.framework', + '$(SDKROOT)/System/Library/Frameworks/UIKit.framework', + ], + }, + 'xcode_settings': { + 'OTHER_CFLAGS': [ + '-fobjc-abi-version=2', + ], + 'SDKROOT': 'iphonesimulator', # -isysroot + 'TARGETED_DEVICE_FAMILY': '1,2', + 'INFOPLIST_FILE': 'TestApp/TestApp-Info.plist', + 'IPHONEOS_DEPLOYMENT_TARGET': '4.2', + 'CONFIGURATION_BUILD_DIR':'build/Default', + }, + }, + { + 'target_name': 'sig_test', + 'product_name': 'sig_test', + 'type': 'executable', + 'product_extension': 'bundle', + 'mac_bundle': 1, + 'sources': [ + 'TestApp/main.m', + ], + 'mac_bundle_resources': [ + 'TestApp/English.lproj/InfoPlist.strings', + 'TestApp/English.lproj/MainMenu.xib', + ], + 'link_settings': { + 'libraries': [ + '$(SDKROOT)/System/Library/Frameworks/Foundation.framework', + '$(SDKROOT)/System/Library/Frameworks/UIKit.framework', + ], + }, + 'postbuilds': [ + { + 'postbuild_name': 'Verify no signature', + 'action': [ + 'python', + 'TestApp/check_no_signature.py' + ], + }, + ], + 'xcode_settings': { + 'OTHER_CFLAGS': [ + '-fobjc-abi-version=2', + ], + 'SDKROOT': 'iphonesimulator', # -isysroot + 'CODE_SIGN_IDENTITY[sdk=iphoneos*]': 'iPhone Developer', + 'INFOPLIST_FILE': 'TestApp/TestApp-Info.plist', + 'IPHONEOS_DEPLOYMENT_TARGET': '4.2', + 'CONFIGURATION_BUILD_DIR':'buildsig/Default', + }, + }, + ], +} diff --git a/deps/gyp/test/ios/app-bundle/test.gyp b/deps/gyp/test/ios/app-bundle/test.gyp new file mode 100644 index 0000000000..b60474df8a --- /dev/null +++ b/deps/gyp/test/ios/app-bundle/test.gyp @@ -0,0 +1,74 @@ +# Copyright (c) 2011 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. +{ + 'conditions': [ + ['"<(GENERATOR)"=="ninja"', { + 'make_global_settings': [ + ['CC', '/usr/bin/clang'], + ['CXX', '/usr/bin/clang++'], + ], + }], + ], + 'targets': [ + { + 'target_name': 'test_app', + 'product_name': 'Test App Gyp', + 'type': 'executable', + 'mac_bundle': 1, + 'sources': [ + 'TestApp/main.m', + ], + 'mac_bundle_resources': [ + 'TestApp/English.lproj/InfoPlist.strings', + 'TestApp/English.lproj/MainMenu.xib', + 'TestApp/English.lproj/Main_iPhone.storyboard', + ], + 'link_settings': { + 'libraries': [ + '$(SDKROOT)/System/Library/Frameworks/Foundation.framework', + '$(SDKROOT)/System/Library/Frameworks/UIKit.framework', + ], + }, + 'xcode_settings': { + 'OTHER_CFLAGS': [ + '-fobjc-abi-version=2', + ], + 'INFOPLIST_FILE': 'TestApp/TestApp-Info.plist', + 'SDKROOT': 'iphonesimulator', # -isysroot + 'IPHONEOS_DEPLOYMENT_TARGET': '5.0', + 'CONFIGURATION_BUILD_DIR':'build/Default', + }, + }, + { + 'target_name': 'test_app_xml', + 'product_name': 'Test App Gyp XML', + 'type': 'executable', + 'mac_bundle': 1, + 'sources': [ + 'TestApp/main.m', + ], + 'mac_bundle_resources': [ + 'TestApp/English.lproj/InfoPlist.strings', + 'TestApp/English.lproj/MainMenu.xib', + 'TestApp/English.lproj/Main_iPhone.storyboard', + ], + 'link_settings': { + 'libraries': [ + '$(SDKROOT)/System/Library/Frameworks/Foundation.framework', + '$(SDKROOT)/System/Library/Frameworks/UIKit.framework', + ], + }, + 'xcode_settings': { + 'OTHER_CFLAGS': [ + '-fobjc-abi-version=2', + ], + 'INFOPLIST_FILE': 'TestApp/TestApp-Info.plist', + 'INFOPLIST_OUTPUT_FORMAT':'xml', + 'SDKROOT': 'iphonesimulator', # -isysroot + 'IPHONEOS_DEPLOYMENT_TARGET': '5.0', + 'CONFIGURATION_BUILD_DIR':'build/Default', + }, + }, + ], +} diff --git a/deps/gyp/test/ios/app-bundle/tool_main.cc b/deps/gyp/test/ios/app-bundle/tool_main.cc new file mode 100644 index 0000000000..9dc3c94f34 --- /dev/null +++ b/deps/gyp/test/ios/app-bundle/tool_main.cc @@ -0,0 +1,7 @@ +// Copyright (c) 2014 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. + +int main() { + return 0; +} diff --git a/deps/gyp/test/ios/deployment-target/check-version-min.c b/deps/gyp/test/ios/deployment-target/check-version-min.c new file mode 100644 index 0000000000..761c529085 --- /dev/null +++ b/deps/gyp/test/ios/deployment-target/check-version-min.c @@ -0,0 +1,33 @@ +/* Copyright (c) 2013 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. */ + +#include <Availability.h> + +/* GYPTEST_MAC_VERSION_MIN: should be set to the corresponding value of + * xcode setting 'MACOSX_DEPLOYMENT_TARGET', otherwise both should be + * left undefined. + * + * GYPTEST_IOS_VERSION_MIN: should be set to the corresponding value of + * xcode setting 'IPHONEOS_DEPLOYMENT_TARGET', otherwise both should be + * left undefined. + */ + +#if defined(GYPTEST_MAC_VERSION_MIN) +# if GYPTEST_MAC_VERSION_MIN != __MAC_OS_X_VERSION_MIN_REQUIRED +# error __MAC_OS_X_VERSION_MIN_REQUIRED has wrong value +# endif +#elif defined(__MAC_OS_X_VERSION_MIN_REQUIRED) +# error __MAC_OS_X_VERSION_MIN_REQUIRED should be undefined +#endif + +#if defined(GYPTEST_IOS_VERSION_MIN) +# if GYPTEST_IOS_VERSION_MIN != __IPHONE_OS_VERSION_MIN_REQUIRED +# error __IPHONE_OS_VERSION_MIN_REQUIRED has wrong value +# endif +#elif defined(__IPHONE_OS_VERSION_MIN_REQUIRED) +# error __IPHONE_OS_VERSION_MIN_REQUIRED should be undefined +#endif + +int main() { return 0; } + diff --git a/deps/gyp/test/ios/deployment-target/deployment-target.gyp b/deps/gyp/test/ios/deployment-target/deployment-target.gyp new file mode 100644 index 0000000000..e272276b19 --- /dev/null +++ b/deps/gyp/test/ios/deployment-target/deployment-target.gyp @@ -0,0 +1,58 @@ +# Copyright (c) 2013 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. +{ + 'make_global_settings': [ + ['CC', '/usr/bin/clang'], + ['CXX', '/usr/bin/clang++'], + ], + 'targets': [ + { + 'target_name': 'iphoneos-version-min-4.3', + 'type': 'static_library', + 'sources': [ 'check-version-min.c', ], + 'defines': [ 'GYPTEST_IOS_VERSION_MIN=40300', ], + 'xcode_settings': { + 'GCC_VERSION': 'com.apple.compilers.llvm.clang.1_0', + 'ARCHS': [ 'armv7' ], + 'SDKROOT': 'iphoneos', + 'IPHONEOS_DEPLOYMENT_TARGET': '4.3', + }, + }, + { + 'target_name': 'iphoneos-version-min-5.0', + 'type': 'static_library', + 'sources': [ 'check-version-min.c', ], + 'defines': [ 'GYPTEST_IOS_VERSION_MIN=50000', ], + 'xcode_settings': { + 'GCC_VERSION': 'com.apple.compilers.llvm.clang.1_0', + 'ARCHS': [ 'armv7' ], + 'SDKROOT': 'iphoneos', + 'IPHONEOS_DEPLOYMENT_TARGET': '5.0', + }, + }, + { + 'target_name': 'iphonesimulator-version-min-4.3', + 'type': 'static_library', + 'sources': [ 'check-version-min.c', ], + 'defines': [ 'GYPTEST_IOS_VERSION_MIN=40300', ], + 'xcode_settings': { + 'GCC_VERSION': 'com.apple.compilers.llvm.clang.1_0', + 'SDKROOT': 'iphonesimulator', + 'IPHONEOS_DEPLOYMENT_TARGET': '4.3', + }, + }, + { + 'target_name': 'iphonesimulator-version-min-5.0', + 'type': 'static_library', + 'sources': [ 'check-version-min.c', ], + 'defines': [ 'GYPTEST_IOS_VERSION_MIN=50000', ], + 'xcode_settings': { + 'GCC_VERSION': 'com.apple.compilers.llvm.clang.1_0', + 'SDKROOT': 'iphonesimulator', + 'IPHONEOS_DEPLOYMENT_TARGET': '5.0', + }, + }, + ], +} + diff --git a/deps/gyp/test/ios/extension/ActionExtension/ActionViewController.h b/deps/gyp/test/ios/extension/ActionExtension/ActionViewController.h new file mode 100644 index 0000000000..1c92509029 --- /dev/null +++ b/deps/gyp/test/ios/extension/ActionExtension/ActionViewController.h @@ -0,0 +1,9 @@ +// Copyright (c) 2014 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 <UIKit/UIKit.h> + +@interface ActionViewController : UIViewController + +@end diff --git a/deps/gyp/test/ios/extension/ActionExtension/ActionViewController.m b/deps/gyp/test/ios/extension/ActionExtension/ActionViewController.m new file mode 100644 index 0000000000..d37bacdae1 --- /dev/null +++ b/deps/gyp/test/ios/extension/ActionExtension/ActionViewController.m @@ -0,0 +1,31 @@ +// Copyright (c) 2014 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 "ActionViewController.h" +#import <MobileCoreServices/MobileCoreServices.h> + +@interface ActionViewController () + +@end + +@implementation ActionViewController + +- (void)viewDidLoad { + [super viewDidLoad]; +} + +- (void)didReceiveMemoryWarning { + [super didReceiveMemoryWarning]; + // Dispose of any resources that can be recreated. +} + +- (IBAction)done { + // Return any edited content to the host app. + // This template doesn't do anything, so we just echo the passed in items. + [self.extensionContext + completeRequestReturningItems:self.extensionContext.inputItems + completionHandler:nil]; +} + +@end diff --git a/deps/gyp/test/ios/extension/ActionExtension/Info.plist b/deps/gyp/test/ios/extension/ActionExtension/Info.plist new file mode 100644 index 0000000000..f89cd790bc --- /dev/null +++ b/deps/gyp/test/ios/extension/ActionExtension/Info.plist @@ -0,0 +1,42 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> +<plist version="1.0"> +<dict> + <key>CFBundleDevelopmentRegion</key> + <string>en</string> + <key>CFBundleDisplayName</key> + <string>ActionExtension</string> + <key>CFBundleExecutable</key> + <string>${EXECUTABLE_NAME}</string> + <key>CFBundleIdentifier</key> + <string>com.google.gyptest.extension.ActionExtension</string> + <key>CFBundleInfoDictionaryVersion</key> + <string>6.0</string> + <key>CFBundleName</key> + <string>${PRODUCT_NAME}</string> + <key>CFBundlePackageType</key> + <string>XPC!</string> + <key>CFBundleShortVersionString</key> + <string>1.0</string> + <key>CFBundleSignature</key> + <string>????</string> + <key>CFBundleVersion</key> + <string>1</string> + <key>NSExtension</key> + <dict> + <key>NSExtensionAttributes</key> + <dict> + <key>NSExtensionActivationRule</key> + <string>TRUEPREDICATE</string> + <key>NSExtensionPointName</key> + <string>com.apple.ui-services</string> + <key>NSExtensionPointVersion</key> + <string>1.0</string> + </dict> + <key>NSExtensionMainStoryboard</key> + <string>MainInterface</string> + <key>NSExtensionPointIdentifier</key> + <string>com.apple.ui-services</string> + </dict> +</dict> +</plist> diff --git a/deps/gyp/test/ios/extension/ActionExtension/MainInterface.storyboard b/deps/gyp/test/ios/extension/ActionExtension/MainInterface.storyboard new file mode 100644 index 0000000000..5aa58184e8 --- /dev/null +++ b/deps/gyp/test/ios/extension/ActionExtension/MainInterface.storyboard @@ -0,0 +1,63 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="6148" systemVersion="14A229a" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" initialViewController="ObA-dk-sSI"> + <dependencies> + <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="6147"/> + </dependencies> + <scenes> + <!--Action View Controller - Image--> + <scene sceneID="7MM-of-jgj"> + <objects> + <viewController title="Image" id="ObA-dk-sSI" customClass="ActionViewController" customModuleProvider="" sceneMemberID="viewController"> + <layoutGuides> + <viewControllerLayoutGuide type="top" id="qkL-Od-lgU"/> + <viewControllerLayoutGuide type="bottom" id="n38-gi-rB5"/> + </layoutGuides> + <view key="view" contentMode="scaleToFill" id="zMn-AG-sqS"> + <rect key="frame" x="0.0" y="0.0" width="320" height="528"/> + <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> + <subviews> + <imageView userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="9ga-4F-77Z"> + <rect key="frame" x="0.0" y="64" width="320" height="464"/> + </imageView> + <navigationBar contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="NOA-Dm-cuz"> + <rect key="frame" x="0.0" y="20" width="320" height="44"/> + <items> + <navigationItem id="3HJ-uW-3hn"> + <barButtonItem key="leftBarButtonItem" title="Done" style="done" id="WYi-yp-eM6"> + <connections> + <action selector="done" destination="ObA-dk-sSI" id="Qdu-qn-U6V"/> + </connections> + </barButtonItem> + </navigationItem> + </items> + </navigationBar> + </subviews> + <color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/> + <constraints> + <constraint firstAttribute="trailing" secondItem="NOA-Dm-cuz" secondAttribute="trailing" id="A05-Pj-hrr"/> + <constraint firstItem="9ga-4F-77Z" firstAttribute="top" secondItem="NOA-Dm-cuz" secondAttribute="bottom" id="Fps-3D-QQW"/> + <constraint firstItem="NOA-Dm-cuz" firstAttribute="leading" secondItem="zMn-AG-sqS" secondAttribute="leading" id="HxO-8t-aoh"/> + <constraint firstAttribute="trailing" secondItem="9ga-4F-77Z" secondAttribute="trailing" id="Ozw-Hg-0yh"/> + <constraint firstItem="9ga-4F-77Z" firstAttribute="leading" secondItem="zMn-AG-sqS" secondAttribute="leading" id="XH5-ld-ONA"/> + <constraint firstItem="n38-gi-rB5" firstAttribute="top" secondItem="9ga-4F-77Z" secondAttribute="bottom" id="eQg-nn-Zy4"/> + <constraint firstItem="NOA-Dm-cuz" firstAttribute="top" secondItem="qkL-Od-lgU" secondAttribute="bottom" id="we0-1t-bgp"/> + </constraints> + </view> + <freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/> + <size key="freeformSize" width="320" height="528"/> + <connections> + <outlet property="imageView" destination="9ga-4F-77Z" id="5y6-5w-9QO"/> + <outlet property="view" destination="zMn-AG-sqS" id="Qma-de-2ek"/> + </connections> + </viewController> + <placeholder placeholderIdentifier="IBFirstResponder" id="X47-rx-isc" userLabel="First Responder" sceneMemberID="firstResponder"/> + </objects> + <point key="canvasLocation" x="252" y="-124"/> + </scene> + </scenes> + <simulatedMetricsContainer key="defaultSimulatedMetrics"> + <simulatedStatusBarMetrics key="statusBar"/> + <simulatedOrientationMetrics key="orientation"/> + <simulatedScreenMetrics key="destination" type="retina4"/> + </simulatedMetricsContainer> +</document> diff --git a/deps/gyp/test/ios/extension/ExtensionContainer/AppDelegate.h b/deps/gyp/test/ios/extension/ExtensionContainer/AppDelegate.h new file mode 100644 index 0000000000..510e2300b1 --- /dev/null +++ b/deps/gyp/test/ios/extension/ExtensionContainer/AppDelegate.h @@ -0,0 +1,12 @@ +// Copyright (c) 2014 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 <UIKit/UIKit.h> + +@interface AppDelegate : UIResponder <UIApplicationDelegate> + +@property (strong, nonatomic) UIWindow *window; + +@end + diff --git a/deps/gyp/test/ios/extension/ExtensionContainer/AppDelegate.m b/deps/gyp/test/ios/extension/ExtensionContainer/AppDelegate.m new file mode 100644 index 0000000000..1197bc1bbc --- /dev/null +++ b/deps/gyp/test/ios/extension/ExtensionContainer/AppDelegate.m @@ -0,0 +1,19 @@ +// Copyright (c) 2014 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 "AppDelegate.h" + +@interface AppDelegate () + +@end + +@implementation AppDelegate + +- (BOOL)application:(UIApplication*)application + didFinishLaunchingWithOptions:(NSDictionary*)launchOptions { + // Override point for customization after application launch. + return YES; +} + +@end diff --git a/deps/gyp/test/ios/extension/ExtensionContainer/Base.lproj/Main.storyboard b/deps/gyp/test/ios/extension/ExtensionContainer/Base.lproj/Main.storyboard new file mode 100644 index 0000000000..e8f3cfb40c --- /dev/null +++ b/deps/gyp/test/ios/extension/ExtensionContainer/Base.lproj/Main.storyboard @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="6162" systemVersion="14A238h" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" initialViewController="BYZ-38-t0r"> + <dependencies> + <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="6160"/> + </dependencies> + <scenes> + <!--View Controller--> + <scene sceneID="tne-QT-ifu"> + <objects> + <viewController id="BYZ-38-t0r" customClass="ViewController" customModuleProvider="" sceneMemberID="viewController"> + <layoutGuides> + <viewControllerLayoutGuide type="top" id="y3c-jy-aDJ"/> + <viewControllerLayoutGuide type="bottom" id="wfy-db-euE"/> + </layoutGuides> + <view key="view" contentMode="scaleToFill" id="8bC-Xf-vdC"> + <rect key="frame" x="0.0" y="0.0" width="480" height="480"/> + <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> + <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/> + </view> + </viewController> + <placeholder placeholderIdentifier="IBFirstResponder" id="dkx-z0-nzr" sceneMemberID="firstResponder"/> + </objects> + </scene> + </scenes> +</document> diff --git a/deps/gyp/test/ios/extension/ExtensionContainer/Images.xcassets/AppIcon.appiconset/Contents.json b/deps/gyp/test/ios/extension/ExtensionContainer/Images.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000000..f697f61f4a --- /dev/null +++ b/deps/gyp/test/ios/extension/ExtensionContainer/Images.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,53 @@ +{ + "images" : [ + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "60x60", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "29x29", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "29x29", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "40x40", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "40x40", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "76x76", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "76x76", + "scale" : "2x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/deps/gyp/test/ios/extension/ExtensionContainer/Images.xcassets/LaunchImage.launchimage/Contents.json b/deps/gyp/test/ios/extension/ExtensionContainer/Images.xcassets/LaunchImage.launchimage/Contents.json new file mode 100644 index 0000000000..4458b40c05 --- /dev/null +++ b/deps/gyp/test/ios/extension/ExtensionContainer/Images.xcassets/LaunchImage.launchimage/Contents.json @@ -0,0 +1,51 @@ +{ + "images" : [ + { + "orientation" : "portrait", + "idiom" : "iphone", + "extent" : "full-screen", + "minimum-system-version" : "7.0", + "scale" : "2x" + }, + { + "orientation" : "portrait", + "idiom" : "iphone", + "subtype" : "retina4", + "extent" : "full-screen", + "minimum-system-version" : "7.0", + "scale" : "2x" + }, + { + "orientation" : "portrait", + "idiom" : "ipad", + "extent" : "full-screen", + "minimum-system-version" : "7.0", + "scale" : "1x" + }, + { + "orientation" : "landscape", + "idiom" : "ipad", + "extent" : "full-screen", + "minimum-system-version" : "7.0", + "scale" : "1x" + }, + { + "orientation" : "portrait", + "idiom" : "ipad", + "extent" : "full-screen", + "minimum-system-version" : "7.0", + "scale" : "2x" + }, + { + "orientation" : "landscape", + "idiom" : "ipad", + "extent" : "full-screen", + "minimum-system-version" : "7.0", + "scale" : "2x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/deps/gyp/test/ios/extension/ExtensionContainer/Info.plist b/deps/gyp/test/ios/extension/ExtensionContainer/Info.plist new file mode 100644 index 0000000000..31ccf4cc82 --- /dev/null +++ b/deps/gyp/test/ios/extension/ExtensionContainer/Info.plist @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> +<plist version="1.0"> +<dict> + <key>CFBundleDevelopmentRegion</key> + <string>en</string> + <key>CFBundleExecutable</key> + <string>ExtensionContainer</string> + <key>CFBundleIdentifier</key> + <string>com.google.gyptest.extension</string> + <key>CFBundleInfoDictionaryVersion</key> + <string>6.0</string> + <key>CFBundleName</key> + <string>${PRODUCT_NAME}</string> + <key>CFBundlePackageType</key> + <string>APPL</string> + <key>CFBundleShortVersionString</key> + <string>1.0</string> + <key>CFBundleSignature</key> + <string>????</string> + <key>CFBundleVersion</key> + <string>1</string> + <key>LSRequiresIPhoneOS</key> + <true/> + <key>UIMainStoryboardFile</key> + <string>Main</string> + <key>UIRequiredDeviceCapabilities</key> + <array> + <string>armv7</string> + </array> +</dict> +</plist> diff --git a/deps/gyp/test/ios/extension/ExtensionContainer/ViewController.h b/deps/gyp/test/ios/extension/ExtensionContainer/ViewController.h new file mode 100644 index 0000000000..fad7754714 --- /dev/null +++ b/deps/gyp/test/ios/extension/ExtensionContainer/ViewController.h @@ -0,0 +1,11 @@ +// Copyright (c) 2014 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 <UIKit/UIKit.h> + +@interface ViewController : UIViewController + + +@end + diff --git a/deps/gyp/test/ios/extension/ExtensionContainer/ViewController.m b/deps/gyp/test/ios/extension/ExtensionContainer/ViewController.m new file mode 100644 index 0000000000..3810fa9cba --- /dev/null +++ b/deps/gyp/test/ios/extension/ExtensionContainer/ViewController.m @@ -0,0 +1,24 @@ +// Copyright (c) 2014 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 "ViewController.h" + +@interface ViewController () + + +@end + +@implementation ViewController + +- (void)viewDidLoad { + [super viewDidLoad]; + // Do any additional setup after loading the view, typically from a nib. +} + +- (void)didReceiveMemoryWarning { + [super didReceiveMemoryWarning]; + // Dispose of any resources that can be recreated. +} + +@end diff --git a/deps/gyp/test/ios/extension/ExtensionContainer/main.m b/deps/gyp/test/ios/extension/ExtensionContainer/main.m new file mode 100644 index 0000000000..47aecb5148 --- /dev/null +++ b/deps/gyp/test/ios/extension/ExtensionContainer/main.m @@ -0,0 +1,13 @@ +// Copyright (c) 2014 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 <UIKit/UIKit.h> +#import "AppDelegate.h" + +int main(int argc, char* argv[]) { + @autoreleasepool { + return UIApplicationMain(argc, argv, nil, + NSStringFromClass([AppDelegate class])); + } +} diff --git a/deps/gyp/test/ios/extension/extension.gyp b/deps/gyp/test/ios/extension/extension.gyp new file mode 100644 index 0000000000..cf17d82dc4 --- /dev/null +++ b/deps/gyp/test/ios/extension/extension.gyp @@ -0,0 +1,85 @@ +# Copyright (c) 2014 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. + +{ + 'make_global_settings': [ + ['CC', '/usr/bin/clang'], + ['CXX', '/usr/bin/clang++'], + ], + 'targets': [ + { + 'target_name': 'ExtensionContainer', + 'product_name': 'ExtensionContainer', + 'type': 'executable', + 'mac_bundle': 1, + 'mac_bundle_resources': [ + 'ExtensionContainer/Base.lproj/Main.storyboard', + ], + 'sources': [ + 'ExtensionContainer/AppDelegate.h', + 'ExtensionContainer/AppDelegate.m', + 'ExtensionContainer/ViewController.h', + 'ExtensionContainer/ViewController.m', + 'ExtensionContainer/main.m', + ], + 'copies': [ + { + 'destination': '<(PRODUCT_DIR)/ExtensionContainer.app/PlugIns', + 'files': [ + '<(PRODUCT_DIR)/ActionExtension.appex', + ]}], + 'dependencies': [ + 'ActionExtension' + ], + + 'link_settings': { + 'libraries': [ + '$(SDKROOT)/System/Library/Frameworks/Foundation.framework', + '$(SDKROOT)/System/Library/Frameworks/UIKit.framework', + ], + }, + 'xcode_settings': { + 'OTHER_CFLAGS': [ + '-fobjc-abi-version=2', + ], + 'INFOPLIST_FILE': 'ExtensionContainer/Info.plist', + 'GCC_VERSION': 'com.apple.compilers.llvm.clang.1_0', + 'ARCHS': [ 'armv7' ], + 'SDKROOT': 'iphoneos', + 'IPHONEOS_DEPLOYMENT_TARGET': '7.0', + 'CODE_SIGN_IDENTITY[sdk=iphoneos*]': 'iPhone Developer', + }, + }, + { + 'target_name': 'ActionExtension', + 'product_name': 'ActionExtension', + 'type': 'executable', + 'mac_bundle': 1, + 'ios_app_extension': 1, + 'sources': [ + 'ActionExtension/ActionViewController.h', + 'ActionExtension/ActionViewController.m', + ], + 'link_settings': { + 'libraries': [ + '$(SDKROOT)/System/Library/Frameworks/Foundation.framework', + '$(SDKROOT)/System/Library/Frameworks/UIKit.framework', + '$(SDKROOT)/System/Library/Frameworks/MobileCoreServices.framework', + ], + }, + 'xcode_settings': { + 'OTHER_CFLAGS': [ + '-fobjc-abi-version=2', + ], + 'INFOPLIST_FILE': 'ActionExtension/Info.plist', + 'GCC_VERSION': 'com.apple.compilers.llvm.clang.1_0', + 'ARCHS': [ 'armv7' ], + 'SDKROOT': 'iphoneos', + 'IPHONEOS_DEPLOYMENT_TARGET': '7.0', + 'CODE_SIGN_IDENTITY[sdk=iphoneos*]': 'iPhone Developer', + }, + }, + ], +} + diff --git a/deps/gyp/test/ios/gyptest-app-ios-assets-catalog.py b/deps/gyp/test/ios/gyptest-app-ios-assets-catalog.py new file mode 100755 index 0000000000..efd96ac752 --- /dev/null +++ b/deps/gyp/test/ios/gyptest-app-ios-assets-catalog.py @@ -0,0 +1,57 @@ +#!/usr/bin/env python + +# 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. + +""" +Verifies that ios app bundles are built correctly. +""" + +import TestGyp +import TestMac + +import os.path +import sys + +# Xcode supports for assets catalog was introduced in Xcode 6.0 +if sys.platform == 'darwin' and TestMac.Xcode.Version() >= '0600': + test_gyp_path = 'test-assets-catalog.gyp' + test_app_path = 'Test App Assets Catalog Gyp.app' + + test = TestGyp.TestGyp(formats=['xcode', 'ninja']) + test.run_gyp(test_gyp_path, chdir='app-bundle') + test.build(test_gyp_path, test.ALL, chdir='app-bundle') + + # Test that the extension is .bundle + test.built_file_must_exist( + os.path.join(test_app_path, 'Test App Assets Catalog Gyp'), + chdir='app-bundle') + + # Info.plist + info_plist = test.built_file_path( + os.path.join(test_app_path, 'Info.plist'), + chdir='app-bundle') + # Resources + test.built_file_must_exist( + os.path.join(test_app_path, 'English.lproj/InfoPlist.strings'), + chdir='app-bundle') + test.built_file_must_exist( + os.path.join(test_app_path, 'English.lproj/MainMenu.nib'), + chdir='app-bundle') + test.built_file_must_exist( + os.path.join(test_app_path, 'English.lproj/Main_iPhone.storyboardc'), + chdir='app-bundle') + test.built_file_must_exist( + os.path.join(test_app_path, 'Assets.car'), + chdir='app-bundle') + + # Packaging + test.built_file_must_exist( + os.path.join(test_app_path, 'PkgInfo'), + chdir='app-bundle') + test.built_file_must_match( + os.path.join(test_app_path, 'PkgInfo'), 'APPLause', + chdir='app-bundle') + + test.pass_test() diff --git a/deps/gyp/test/ios/gyptest-app-ios.py b/deps/gyp/test/ios/gyptest-app-ios.py new file mode 100755 index 0000000000..f5fd5f93f7 --- /dev/null +++ b/deps/gyp/test/ios/gyptest-app-ios.py @@ -0,0 +1,71 @@ +#!/usr/bin/env python + +# 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. + +""" +Verifies that ios app bundles are built correctly. +""" + +import TestGyp + +import subprocess +import sys + +def CheckFileXMLPropertyList(file): + output = subprocess.check_output(['file', file]) + # The double space after XML is intentional. + if not 'XML document text' in output: + print 'File: Expected XML document text, got %s' % output + test.fail_test() + +def CheckFileBinaryPropertyList(file): + output = subprocess.check_output(['file', file]) + if not 'Apple binary property list' in output: + print 'File: Expected Apple binary property list, got %s' % output + test.fail_test() + +if sys.platform == 'darwin': + test = TestGyp.TestGyp(formats=['xcode', 'ninja']) + + test.run_gyp('test.gyp', chdir='app-bundle') + + test.build('test.gyp', test.ALL, chdir='app-bundle') + + # Test that the extension is .bundle + test.built_file_must_exist('Test App Gyp.app/Test App Gyp', + chdir='app-bundle') + + # Info.plist + info_plist = test.built_file_path('Test App Gyp.app/Info.plist', + chdir='app-bundle') + test.built_file_must_exist(info_plist) + CheckFileBinaryPropertyList(info_plist) + + # XML Info.plist + info_plist = test.built_file_path('Test App Gyp XML.app/Info.plist', + chdir='app-bundle') + CheckFileXMLPropertyList(info_plist) + + # Resources + strings_file = test.built_file_path( + 'Test App Gyp.app/English.lproj/InfoPlist.strings', + chdir='app-bundle') + test.built_file_must_exist(strings_file) + CheckFileBinaryPropertyList(strings_file) + + test.built_file_must_exist( + 'Test App Gyp.app/English.lproj/MainMenu.nib', + chdir='app-bundle') + test.built_file_must_exist( + 'Test App Gyp.app/English.lproj/Main_iPhone.storyboardc', + chdir='app-bundle') + + # Packaging + test.built_file_must_exist('Test App Gyp.app/PkgInfo', + chdir='app-bundle') + test.built_file_must_match('Test App Gyp.app/PkgInfo', 'APPLause', + chdir='app-bundle') + + test.pass_test() diff --git a/deps/gyp/test/ios/gyptest-archs.py b/deps/gyp/test/ios/gyptest-archs.py new file mode 100644 index 0000000000..38c5c61fd8 --- /dev/null +++ b/deps/gyp/test/ios/gyptest-archs.py @@ -0,0 +1,58 @@ +#!/usr/bin/env python + +# Copyright (c) 2013 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. + +""" +Verifies that device and simulator bundles are built correctly. +""" + +import TestGyp +import TestMac + +import collections +import sys + + +if sys.platform == 'darwin': + test = TestGyp.TestGyp(formats=['ninja', 'xcode']) + + test_cases = [ + ('Default', 'TestArch32Bits', ['i386']), + ('Default-iphoneos', 'TestArch32Bits', ['armv7']), + ] + + if TestMac.Xcode.Version() < '0510': + test_cases.extend([ + ('Default', 'TestNoArchs', ['i386']), + ('Default-iphoneos', 'TestNoArchs', ['armv7'])]) + + if TestMac.Xcode.Version() >= '0500': + test_cases.extend([ + ('Default', 'TestArch64Bits', ['x86_64']), + ('Default', 'TestMultiArchs', ['i386', 'x86_64']), + ('Default-iphoneos', 'TestArch64Bits', ['arm64']), + ('Default-iphoneos', 'TestMultiArchs', ['armv7', 'arm64'])]) + + test.run_gyp('test-archs.gyp', chdir='app-bundle') + for configuration, target, archs in test_cases: + is_device_build = configuration.endswith('-iphoneos') + + kwds = collections.defaultdict(list) + if test.format == 'xcode': + if is_device_build: + configuration, sdk = configuration.split('-') + kwds['arguments'].extend(['-sdk', sdk]) + if TestMac.Xcode.Version() < '0500': + kwds['arguments'].extend(['-arch', archs[0]]) + + test.set_configuration(configuration) + filename = '%s.bundle/%s' % (target, target) + test.build('test-archs.gyp', target, chdir='app-bundle', **kwds) + result_file = test.built_file_path(filename, chdir='app-bundle') + + test.must_exist(result_file) + TestMac.CheckFileType(test, result_file, archs) + + test.pass_test() diff --git a/deps/gyp/test/ios/gyptest-crosscompile.py b/deps/gyp/test/ios/gyptest-crosscompile.py new file mode 100644 index 0000000000..a0816836e5 --- /dev/null +++ b/deps/gyp/test/ios/gyptest-crosscompile.py @@ -0,0 +1,34 @@ +#!/usr/bin/env python + +# Copyright (c) 2014 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. + +""" +Verifies that tools are built correctly. +""" + +import TestGyp +import TestMac + +import sys +import os + +if sys.platform == 'darwin': + test = TestGyp.TestGyp(formats=['ninja', 'xcode']) + + oldenv = os.environ.copy() + try: + os.environ['GYP_CROSSCOMPILE'] = '1' + test.run_gyp('test-crosscompile.gyp', chdir='app-bundle') + finally: + os.environ.clear() + os.environ.update(oldenv) + + test.set_configuration('Default') + test.build('test-crosscompile.gyp', 'TestHost', chdir='app-bundle') + result_file = test.built_file_path('TestHost', chdir='app-bundle') + test.must_exist(result_file) + TestMac.CheckFileType(test, result_file, ['x86_64']) + + test.pass_test() diff --git a/deps/gyp/test/ios/gyptest-deployment-target.py b/deps/gyp/test/ios/gyptest-deployment-target.py new file mode 100644 index 0000000000..6c09d9dc04 --- /dev/null +++ b/deps/gyp/test/ios/gyptest-deployment-target.py @@ -0,0 +1,23 @@ +#!/usr/bin/env python + +# Copyright (c) 2013 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. + +""" +Verifies that IPHONEOS_DEPLOYMENT_TARGET works. +""" + +import TestGyp + +import sys + +if sys.platform == 'darwin': + test = TestGyp.TestGyp(formats=['make', 'ninja', 'xcode']) + + test.run_gyp('deployment-target.gyp', chdir='deployment-target') + + test.build('deployment-target.gyp', test.ALL, chdir='deployment-target') + + test.pass_test() + diff --git a/deps/gyp/test/ios/gyptest-extension.py b/deps/gyp/test/ios/gyptest-extension.py new file mode 100755 index 0000000000..81c019c05e --- /dev/null +++ b/deps/gyp/test/ios/gyptest-extension.py @@ -0,0 +1,31 @@ +#!/usr/bin/env python + +# Copyright (c) 2014 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. + +""" +Verifies that ios app extensions are built correctly. +""" + +import TestGyp +import TestMac + +import sys +if sys.platform == 'darwin' and TestMac.Xcode.Version()>="0600": + print "This test is currently disabled: https://crbug.com/483696." + sys.exit(0) + + test = TestGyp.TestGyp(formats=['ninja', 'xcode']) + + test.run_gyp('extension.gyp', chdir='extension') + + test.build('extension.gyp', 'ExtensionContainer', chdir='extension') + + # Test that the extension is .appex + test.built_file_must_exist( + 'ExtensionContainer.app/PlugIns/ActionExtension.appex', + chdir='extension') + + test.pass_test() + diff --git a/deps/gyp/test/ios/gyptest-per-config-settings.py b/deps/gyp/test/ios/gyptest-per-config-settings.py new file mode 100644 index 0000000000..63e9044f99 --- /dev/null +++ b/deps/gyp/test/ios/gyptest-per-config-settings.py @@ -0,0 +1,151 @@ +#!/usr/bin/env python + +# 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. + +""" +Verifies that device and simulator bundles are built correctly. +""" + +import plistlib +import TestGyp +import os +import struct +import subprocess +import sys +import tempfile + +if sys.platform == 'darwin': + print "This test is currently disabled: https://crbug.com/483696." + sys.exit(0) + + +def CheckFileType(file, expected): + proc = subprocess.Popen(['lipo', '-info', file], stdout=subprocess.PIPE) + o = proc.communicate()[0].strip() + assert not proc.returncode + if not expected in o: + print 'File: Expected %s, got %s' % (expected, o) + test.fail_test() + +def HasCerts(): + # Because the bots do not have certs, don't check them if there are no + # certs available. + proc = subprocess.Popen(['security','find-identity','-p', 'codesigning', + '-v'], stdout=subprocess.PIPE) + return "0 valid identities found" not in proc.communicate()[0].strip() + +def CheckSignature(file): + proc = subprocess.Popen(['codesign', '-v', file], stdout=subprocess.PIPE) + o = proc.communicate()[0].strip() + assert not proc.returncode + if "code object is not signed at all" in o: + print 'File %s not properly signed.' % (file) + test.fail_test() + +def CheckEntitlements(file, expected_entitlements): + with tempfile.NamedTemporaryFile() as temp: + proc = subprocess.Popen(['codesign', '--display', '--entitlements', + temp.name, file], stdout=subprocess.PIPE) + o = proc.communicate()[0].strip() + assert not proc.returncode + data = temp.read() + entitlements = ParseEntitlements(data) + if not entitlements: + print 'No valid entitlements found in %s.' % (file) + test.fail_test() + if entitlements != expected_entitlements: + print 'Unexpected entitlements found in %s.' % (file) + test.fail_test() + +def ParseEntitlements(data): + if len(data) < 8: + return None + magic, length = struct.unpack('>II', data[:8]) + if magic != 0xfade7171 or length != len(data): + return None + return data[8:] + +def GetProductVersion(): + args = ['xcodebuild','-version','-sdk','iphoneos','ProductVersion'] + job = subprocess.Popen(args, stdout=subprocess.PIPE) + return job.communicate()[0].strip() + +def CheckPlistvalue(plist, key, expected): + if key not in plist: + print '%s not set in plist' % key + test.fail_test() + return + actual = plist[key] + if actual != expected: + print 'File: Expected %s, got %s for %s' % (expected, actual, key) + test.fail_test() + +def CheckPlistNotSet(plist, key): + if key in plist: + print '%s should not be set in plist' % key + test.fail_test() + return + +def ConvertBinaryPlistToXML(path): + proc = subprocess.call(['plutil', '-convert', 'xml1', path], + stdout=subprocess.PIPE) + +if sys.platform == 'darwin': + test = TestGyp.TestGyp(formats=['ninja', 'xcode']) + + test.run_gyp('test-device.gyp', chdir='app-bundle') + + test_configs = ['Default-iphoneos', 'Default'] + # TODO(justincohen): Disabling 'Default-iphoneos' for xcode until bots are + # configured with signing certs. + if test.format == 'xcode': + test_configs.remove('Default-iphoneos') + + for configuration in test_configs: + test.set_configuration(configuration) + test.build('test-device.gyp', 'test_app', chdir='app-bundle') + result_file = test.built_file_path('Test App Gyp.bundle/Test App Gyp', + chdir='app-bundle') + test.must_exist(result_file) + + info_plist = test.built_file_path('Test App Gyp.bundle/Info.plist', + chdir='app-bundle') + + # plistlib doesn't support binary plists, but that's what Xcode creates. + if test.format == 'xcode': + ConvertBinaryPlistToXML(info_plist) + plist = plistlib.readPlist(info_plist) + + CheckPlistvalue(plist, 'UIDeviceFamily', [1, 2]) + + if configuration == 'Default-iphoneos': + CheckFileType(result_file, 'armv7') + CheckPlistvalue(plist, 'DTPlatformVersion', GetProductVersion()) + CheckPlistvalue(plist, 'CFBundleSupportedPlatforms', ['iPhoneOS']) + CheckPlistvalue(plist, 'DTPlatformName', 'iphoneos') + else: + CheckFileType(result_file, 'i386') + CheckPlistNotSet(plist, 'DTPlatformVersion') + CheckPlistvalue(plist, 'CFBundleSupportedPlatforms', ['iPhoneSimulator']) + CheckPlistvalue(plist, 'DTPlatformName', 'iphonesimulator') + + if HasCerts() and configuration == 'Default-iphoneos': + test.build('test-device.gyp', 'sig_test', chdir='app-bundle') + result_file = test.built_file_path('sig_test.bundle/sig_test', + chdir='app-bundle') + CheckSignature(result_file) + info_plist = test.built_file_path('sig_test.bundle/Info.plist', + chdir='app-bundle') + + plist = plistlib.readPlist(info_plist) + CheckPlistvalue(plist, 'UIDeviceFamily', [1]) + + entitlements_file = test.built_file_path('sig_test.xcent', + chdir='app-bundle') + if os.path.isfile(entitlements_file): + expected_entitlements = open(entitlements_file).read() + CheckEntitlements(result_file, expected_entitlements) + + test.pass_test() diff --git a/deps/gyp/test/ios/gyptest-watch.py b/deps/gyp/test/ios/gyptest-watch.py new file mode 100755 index 0000000000..f5c4601d81 --- /dev/null +++ b/deps/gyp/test/ios/gyptest-watch.py @@ -0,0 +1,42 @@ +#!/usr/bin/env python + +# Copyright (c) 2014 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. + +""" +Verifies that ios watch extensions and apps are built correctly. +""" + +import TestGyp +import TestMac + +import sys + +if sys.platform == 'darwin': + print "This test is currently disabled: https://crbug.com/483696." + sys.exit(0) + + +if sys.platform == 'darwin' and TestMac.Xcode.Version() >= "0620": + test = TestGyp.TestGyp(formats=['ninja', 'xcode']) + + test.run_gyp('watch.gyp', chdir='watch') + + test.build( + 'watch.gyp', + 'WatchContainer', + chdir='watch') + + # Test that the extension exists + test.built_file_must_exist( + 'WatchContainer.app/PlugIns/WatchKitExtension.appex', + chdir='watch') + + # Test that the watch app exists + test.built_file_must_exist( + 'WatchContainer.app/PlugIns/WatchKitExtension.appex/WatchApp.app', + chdir='watch') + + test.pass_test() + diff --git a/deps/gyp/test/ios/gyptest-xcode-ninja.py b/deps/gyp/test/ios/gyptest-xcode-ninja.py new file mode 100644 index 0000000000..609db8c98f --- /dev/null +++ b/deps/gyp/test/ios/gyptest-xcode-ninja.py @@ -0,0 +1,25 @@ +#!/usr/bin/env python + +# 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. + +""" +Verify that the xcode-ninja GYP_GENERATOR runs and builds correctly. +""" + +import TestGyp + +import os +import sys + +if sys.platform == 'darwin': + test = TestGyp.TestGyp(formats=['xcode']) + + # Run ninja and xcode-ninja + test.formats = ['ninja', 'xcode-ninja'] + test.run_gyp('test.gyp', chdir='app-bundle') + + # If it builds the target, it works. + test.build('test.ninja.gyp', chdir='app-bundle') + test.pass_test() diff --git a/deps/gyp/test/ios/watch/WatchApp/Images.xcassets/AppIcon.appiconset/Contents.json b/deps/gyp/test/ios/watch/WatchApp/Images.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000000..562c5eff97 --- /dev/null +++ b/deps/gyp/test/ios/watch/WatchApp/Images.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,62 @@ +{ + "images" : [ + { + "size" : "14.5x14.5", + "idiom" : "watch", + "scale" : "2x", + "role" : "notificationCenter", + "subtype" : "38mm" + }, + { + "size" : "18x18", + "idiom" : "watch", + "scale" : "2x", + "role" : "notificationCenter", + "subtype" : "42mm" + }, + { + "size" : "29x29", + "idiom" : "watch", + "role" : "companionSettings", + "scale" : "2x" + }, + { + "size" : "29.3x29.3", + "idiom" : "watch", + "role" : "companionSettings", + "scale" : "3x" + }, + { + "size" : "40x40", + "idiom" : "watch", + "scale" : "2x", + "role" : "appLauncher", + "subtype" : "38mm" + }, + { + "size" : "44x44", + "idiom" : "watch", + "scale" : "2x", + "role" : "appLauncher", + "subtype" : "42mm" + }, + { + "size" : "86x86", + "idiom" : "watch", + "scale" : "2x", + "role" : "quickLook", + "subtype" : "38mm" + }, + { + "size" : "98x98", + "idiom" : "watch", + "scale" : "2x", + "role" : "quickLook", + "subtype" : "42mm" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/deps/gyp/test/ios/watch/WatchApp/Images.xcassets/LaunchImage.launchimage/Contents.json b/deps/gyp/test/ios/watch/WatchApp/Images.xcassets/LaunchImage.launchimage/Contents.json new file mode 100644 index 0000000000..ed123feff6 --- /dev/null +++ b/deps/gyp/test/ios/watch/WatchApp/Images.xcassets/LaunchImage.launchimage/Contents.json @@ -0,0 +1,24 @@ +{ + "images" : [ + { + "orientation" : "portrait", + "idiom" : "watch", + "extent" : "full-screen", + "minimum-system-version" : "8.0", + "subtype" : "38mm", + "scale" : "2x" + }, + { + "orientation" : "portrait", + "idiom" : "watch", + "extent" : "full-screen", + "minimum-system-version" : "8.0", + "subtype" : "42mm", + "scale" : "2x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/deps/gyp/test/ios/watch/WatchApp/Info.plist b/deps/gyp/test/ios/watch/WatchApp/Info.plist new file mode 100644 index 0000000000..3cf65b8285 --- /dev/null +++ b/deps/gyp/test/ios/watch/WatchApp/Info.plist @@ -0,0 +1,35 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> +<plist version="1.0"> +<dict> + <key>CFBundleDevelopmentRegion</key> + <string>en</string> + <key>CFBundleDisplayName</key> + <string>WatchApp</string> + <key>CFBundleExecutable</key> + <string>$(EXECUTABLE_NAME)</string> + <key>CFBundleIdentifier</key> + <string>com.google.gyptest.watch.watchapp</string> + <key>CFBundleInfoDictionaryVersion</key> + <string>6.0</string> + <key>CFBundleName</key> + <string>$(PRODUCT_NAME)</string> + <key>CFBundlePackageType</key> + <string>APPL</string> + <key>CFBundleShortVersionString</key> + <string>1.0</string> + <key>CFBundleSignature</key> + <string>????</string> + <key>CFBundleVersion</key> + <string>1</string> + <key>UISupportedInterfaceOrientations</key> + <array> + <string>UIInterfaceOrientationPortrait</string> + <string>UIInterfaceOrientationPortraitUpsideDown</string> + </array> + <key>WKCompanionAppBundleIdentifier</key> + <string>com.google.gyptest.watch</string> + <key>WKWatchKitApp</key> + <true/> +</dict> +</plist> diff --git a/deps/gyp/test/ios/watch/WatchApp/Interface.storyboard b/deps/gyp/test/ios/watch/WatchApp/Interface.storyboard new file mode 100644 index 0000000000..5f52cb6c90 --- /dev/null +++ b/deps/gyp/test/ios/watch/WatchApp/Interface.storyboard @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<document type="com.apple.InterfaceBuilder.WatchKit.Storyboard" version="3.0" toolsVersion="6221" systemVersion="13E28" targetRuntime="watchKit" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" initialViewController="AgC-eL-Hgc"> + <dependencies> + <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="6213"/> + <plugIn identifier="com.apple.InterfaceBuilder.IBWatchKitPlugin" version="3733"/> + </dependencies> + <scenes> + <!--Interface Controller--> + <scene sceneID="aou-V4-d1y"> + <objects> + <controller id="AgC-eL-Hgc" customClass="InterfaceController" customModuleProvider=""/> + </objects> + </scene> + </scenes> +</document> diff --git a/deps/gyp/test/ios/watch/WatchContainer/AppDelegate.h b/deps/gyp/test/ios/watch/WatchContainer/AppDelegate.h new file mode 100644 index 0000000000..510e2300b1 --- /dev/null +++ b/deps/gyp/test/ios/watch/WatchContainer/AppDelegate.h @@ -0,0 +1,12 @@ +// Copyright (c) 2014 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 <UIKit/UIKit.h> + +@interface AppDelegate : UIResponder <UIApplicationDelegate> + +@property (strong, nonatomic) UIWindow *window; + +@end + diff --git a/deps/gyp/test/ios/watch/WatchContainer/AppDelegate.m b/deps/gyp/test/ios/watch/WatchContainer/AppDelegate.m new file mode 100644 index 0000000000..1197bc1bbc --- /dev/null +++ b/deps/gyp/test/ios/watch/WatchContainer/AppDelegate.m @@ -0,0 +1,19 @@ +// Copyright (c) 2014 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 "AppDelegate.h" + +@interface AppDelegate () + +@end + +@implementation AppDelegate + +- (BOOL)application:(UIApplication*)application + didFinishLaunchingWithOptions:(NSDictionary*)launchOptions { + // Override point for customization after application launch. + return YES; +} + +@end diff --git a/deps/gyp/test/ios/watch/WatchContainer/Base.lproj/Main.storyboard b/deps/gyp/test/ios/watch/WatchContainer/Base.lproj/Main.storyboard new file mode 100644 index 0000000000..e8f3cfb40c --- /dev/null +++ b/deps/gyp/test/ios/watch/WatchContainer/Base.lproj/Main.storyboard @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="6162" systemVersion="14A238h" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" initialViewController="BYZ-38-t0r"> + <dependencies> + <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="6160"/> + </dependencies> + <scenes> + <!--View Controller--> + <scene sceneID="tne-QT-ifu"> + <objects> + <viewController id="BYZ-38-t0r" customClass="ViewController" customModuleProvider="" sceneMemberID="viewController"> + <layoutGuides> + <viewControllerLayoutGuide type="top" id="y3c-jy-aDJ"/> + <viewControllerLayoutGuide type="bottom" id="wfy-db-euE"/> + </layoutGuides> + <view key="view" contentMode="scaleToFill" id="8bC-Xf-vdC"> + <rect key="frame" x="0.0" y="0.0" width="480" height="480"/> + <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> + <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/> + </view> + </viewController> + <placeholder placeholderIdentifier="IBFirstResponder" id="dkx-z0-nzr" sceneMemberID="firstResponder"/> + </objects> + </scene> + </scenes> +</document> diff --git a/deps/gyp/test/ios/watch/WatchContainer/Images.xcassets/AppIcon.appiconset/Contents.json b/deps/gyp/test/ios/watch/WatchContainer/Images.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000000..f697f61f4a --- /dev/null +++ b/deps/gyp/test/ios/watch/WatchContainer/Images.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,53 @@ +{ + "images" : [ + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "60x60", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "29x29", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "29x29", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "40x40", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "40x40", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "76x76", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "76x76", + "scale" : "2x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/deps/gyp/test/ios/watch/WatchContainer/Images.xcassets/LaunchImage.launchimage/Contents.json b/deps/gyp/test/ios/watch/WatchContainer/Images.xcassets/LaunchImage.launchimage/Contents.json new file mode 100644 index 0000000000..4458b40c05 --- /dev/null +++ b/deps/gyp/test/ios/watch/WatchContainer/Images.xcassets/LaunchImage.launchimage/Contents.json @@ -0,0 +1,51 @@ +{ + "images" : [ + { + "orientation" : "portrait", + "idiom" : "iphone", + "extent" : "full-screen", + "minimum-system-version" : "7.0", + "scale" : "2x" + }, + { + "orientation" : "portrait", + "idiom" : "iphone", + "subtype" : "retina4", + "extent" : "full-screen", + "minimum-system-version" : "7.0", + "scale" : "2x" + }, + { + "orientation" : "portrait", + "idiom" : "ipad", + "extent" : "full-screen", + "minimum-system-version" : "7.0", + "scale" : "1x" + }, + { + "orientation" : "landscape", + "idiom" : "ipad", + "extent" : "full-screen", + "minimum-system-version" : "7.0", + "scale" : "1x" + }, + { + "orientation" : "portrait", + "idiom" : "ipad", + "extent" : "full-screen", + "minimum-system-version" : "7.0", + "scale" : "2x" + }, + { + "orientation" : "landscape", + "idiom" : "ipad", + "extent" : "full-screen", + "minimum-system-version" : "7.0", + "scale" : "2x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/deps/gyp/test/ios/watch/WatchContainer/Info.plist b/deps/gyp/test/ios/watch/WatchContainer/Info.plist new file mode 100644 index 0000000000..a40319c78e --- /dev/null +++ b/deps/gyp/test/ios/watch/WatchContainer/Info.plist @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> +<plist version="1.0"> +<dict> + <key>CFBundleDevelopmentRegion</key> + <string>en</string> + <key>CFBundleExecutable</key> + <string>WatchContainer</string> + <key>CFBundleIdentifier</key> + <string>com.google.gyptest.watch</string> + <key>CFBundleInfoDictionaryVersion</key> + <string>6.0</string> + <key>CFBundleName</key> + <string>${PRODUCT_NAME}</string> + <key>CFBundlePackageType</key> + <string>APPL</string> + <key>CFBundleShortVersionString</key> + <string>1.0</string> + <key>CFBundleSignature</key> + <string>????</string> + <key>CFBundleVersion</key> + <string>1</string> + <key>LSRequiresIPhoneOS</key> + <true/> + <key>UIMainStoryboardFile</key> + <string>Main</string> + <key>UIRequiredDeviceCapabilities</key> + <array> + <string>armv7</string> + </array> +</dict> +</plist> diff --git a/deps/gyp/test/ios/watch/WatchContainer/ViewController.h b/deps/gyp/test/ios/watch/WatchContainer/ViewController.h new file mode 100644 index 0000000000..fad7754714 --- /dev/null +++ b/deps/gyp/test/ios/watch/WatchContainer/ViewController.h @@ -0,0 +1,11 @@ +// Copyright (c) 2014 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 <UIKit/UIKit.h> + +@interface ViewController : UIViewController + + +@end + diff --git a/deps/gyp/test/ios/watch/WatchContainer/ViewController.m b/deps/gyp/test/ios/watch/WatchContainer/ViewController.m new file mode 100644 index 0000000000..3810fa9cba --- /dev/null +++ b/deps/gyp/test/ios/watch/WatchContainer/ViewController.m @@ -0,0 +1,24 @@ +// Copyright (c) 2014 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 "ViewController.h" + +@interface ViewController () + + +@end + +@implementation ViewController + +- (void)viewDidLoad { + [super viewDidLoad]; + // Do any additional setup after loading the view, typically from a nib. +} + +- (void)didReceiveMemoryWarning { + [super didReceiveMemoryWarning]; + // Dispose of any resources that can be recreated. +} + +@end diff --git a/deps/gyp/test/ios/watch/WatchContainer/main.m b/deps/gyp/test/ios/watch/WatchContainer/main.m new file mode 100644 index 0000000000..47aecb5148 --- /dev/null +++ b/deps/gyp/test/ios/watch/WatchContainer/main.m @@ -0,0 +1,13 @@ +// Copyright (c) 2014 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 <UIKit/UIKit.h> +#import "AppDelegate.h" + +int main(int argc, char* argv[]) { + @autoreleasepool { + return UIApplicationMain(argc, argv, nil, + NSStringFromClass([AppDelegate class])); + } +} diff --git a/deps/gyp/test/ios/watch/WatchKitExtension/Images.xcassets/MyImage.imageset/Contents.json b/deps/gyp/test/ios/watch/WatchKitExtension/Images.xcassets/MyImage.imageset/Contents.json new file mode 100644 index 0000000000..f80d950868 --- /dev/null +++ b/deps/gyp/test/ios/watch/WatchKitExtension/Images.xcassets/MyImage.imageset/Contents.json @@ -0,0 +1,20 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/deps/gyp/test/ios/watch/WatchKitExtension/Info.plist b/deps/gyp/test/ios/watch/WatchKitExtension/Info.plist new file mode 100644 index 0000000000..7a354643ef --- /dev/null +++ b/deps/gyp/test/ios/watch/WatchKitExtension/Info.plist @@ -0,0 +1,38 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> +<plist version="1.0"> +<dict> + <key>CFBundleDevelopmentRegion</key> + <string>en</string> + <key>CFBundleDisplayName</key> + <string>WatchContainer WatchKit Extension</string> + <key>CFBundleExecutable</key> + <string>$(EXECUTABLE_NAME)</string> + <key>CFBundleIdentifier</key> + <string>com.google.gyptest.watch.watchkitextension</string> + <key>CFBundleInfoDictionaryVersion</key> + <string>6.0</string> + <key>CFBundleName</key> + <string>$(PRODUCT_NAME)</string> + <key>CFBundlePackageType</key> + <string>XPC!</string> + <key>CFBundleShortVersionString</key> + <string>1.0</string> + <key>CFBundleSignature</key> + <string>????</string> + <key>CFBundleVersion</key> + <string>1.0</string> + <key>NSExtension</key> + <dict> + <key>NSExtensionAttributes</key> + <dict> + <key>WKAppBundleIdentifier</key> + <string>com.google.gyptest.watch.watchapp</string> + </dict> + <key>NSExtensionPointIdentifier</key> + <string>com.apple.watchkit</string> + </dict> + <key>RemoteInterfacePrincipalClass</key> + <string>InterfaceController</string> +</dict> +</plist> diff --git a/deps/gyp/test/ios/watch/WatchKitExtension/InterfaceController.h b/deps/gyp/test/ios/watch/WatchKitExtension/InterfaceController.h new file mode 100644 index 0000000000..c3395eb484 --- /dev/null +++ b/deps/gyp/test/ios/watch/WatchKitExtension/InterfaceController.h @@ -0,0 +1,10 @@ +// Copyright (c) 2014 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 <Foundation/Foundation.h> +#import <WatchKit/WatchKit.h> + +@interface InterfaceController : WKInterfaceController +@end + diff --git a/deps/gyp/test/ios/watch/WatchKitExtension/InterfaceController.m b/deps/gyp/test/ios/watch/WatchKitExtension/InterfaceController.m new file mode 100644 index 0000000000..564b7d1da5 --- /dev/null +++ b/deps/gyp/test/ios/watch/WatchKitExtension/InterfaceController.m @@ -0,0 +1,25 @@ +// Copyright (c) 2014 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 "InterfaceController.h" + +@implementation InterfaceController + +- (instancetype)initWithContext:(id)context { + if ((self = [super initWithContext:context])) { + // -initWithContext: + } + return self; +} + +- (void)willActivate { + // -willActivate +} + +- (void)didDeactivate { + // -didDeactivate +} + +@end + diff --git a/deps/gyp/test/ios/watch/WatchKitExtension/MainInterface.storyboard b/deps/gyp/test/ios/watch/WatchKitExtension/MainInterface.storyboard new file mode 100644 index 0000000000..5aa58184e8 --- /dev/null +++ b/deps/gyp/test/ios/watch/WatchKitExtension/MainInterface.storyboard @@ -0,0 +1,63 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="6148" systemVersion="14A229a" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" initialViewController="ObA-dk-sSI"> + <dependencies> + <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="6147"/> + </dependencies> + <scenes> + <!--Action View Controller - Image--> + <scene sceneID="7MM-of-jgj"> + <objects> + <viewController title="Image" id="ObA-dk-sSI" customClass="ActionViewController" customModuleProvider="" sceneMemberID="viewController"> + <layoutGuides> + <viewControllerLayoutGuide type="top" id="qkL-Od-lgU"/> + <viewControllerLayoutGuide type="bottom" id="n38-gi-rB5"/> + </layoutGuides> + <view key="view" contentMode="scaleToFill" id="zMn-AG-sqS"> + <rect key="frame" x="0.0" y="0.0" width="320" height="528"/> + <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> + <subviews> + <imageView userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="9ga-4F-77Z"> + <rect key="frame" x="0.0" y="64" width="320" height="464"/> + </imageView> + <navigationBar contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="NOA-Dm-cuz"> + <rect key="frame" x="0.0" y="20" width="320" height="44"/> + <items> + <navigationItem id="3HJ-uW-3hn"> + <barButtonItem key="leftBarButtonItem" title="Done" style="done" id="WYi-yp-eM6"> + <connections> + <action selector="done" destination="ObA-dk-sSI" id="Qdu-qn-U6V"/> + </connections> + </barButtonItem> + </navigationItem> + </items> + </navigationBar> + </subviews> + <color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/> + <constraints> + <constraint firstAttribute="trailing" secondItem="NOA-Dm-cuz" secondAttribute="trailing" id="A05-Pj-hrr"/> + <constraint firstItem="9ga-4F-77Z" firstAttribute="top" secondItem="NOA-Dm-cuz" secondAttribute="bottom" id="Fps-3D-QQW"/> + <constraint firstItem="NOA-Dm-cuz" firstAttribute="leading" secondItem="zMn-AG-sqS" secondAttribute="leading" id="HxO-8t-aoh"/> + <constraint firstAttribute="trailing" secondItem="9ga-4F-77Z" secondAttribute="trailing" id="Ozw-Hg-0yh"/> + <constraint firstItem="9ga-4F-77Z" firstAttribute="leading" secondItem="zMn-AG-sqS" secondAttribute="leading" id="XH5-ld-ONA"/> + <constraint firstItem="n38-gi-rB5" firstAttribute="top" secondItem="9ga-4F-77Z" secondAttribute="bottom" id="eQg-nn-Zy4"/> + <constraint firstItem="NOA-Dm-cuz" firstAttribute="top" secondItem="qkL-Od-lgU" secondAttribute="bottom" id="we0-1t-bgp"/> + </constraints> + </view> + <freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/> + <size key="freeformSize" width="320" height="528"/> + <connections> + <outlet property="imageView" destination="9ga-4F-77Z" id="5y6-5w-9QO"/> + <outlet property="view" destination="zMn-AG-sqS" id="Qma-de-2ek"/> + </connections> + </viewController> + <placeholder placeholderIdentifier="IBFirstResponder" id="X47-rx-isc" userLabel="First Responder" sceneMemberID="firstResponder"/> + </objects> + <point key="canvasLocation" x="252" y="-124"/> + </scene> + </scenes> + <simulatedMetricsContainer key="defaultSimulatedMetrics"> + <simulatedStatusBarMetrics key="statusBar"/> + <simulatedOrientationMetrics key="orientation"/> + <simulatedScreenMetrics key="destination" type="retina4"/> + </simulatedMetricsContainer> +</document> diff --git a/deps/gyp/test/ios/watch/watch.gyp b/deps/gyp/test/ios/watch/watch.gyp new file mode 100644 index 0000000000..49be5554ee --- /dev/null +++ b/deps/gyp/test/ios/watch/watch.gyp @@ -0,0 +1,105 @@ +# Copyright (c) 2014 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. + +{ + 'make_global_settings': [ + ['CC', '/usr/bin/clang'], + ['CXX', '/usr/bin/clang++'], + ], + 'target_defaults': { + 'xcode_settings': { + 'OTHER_CFLAGS': [ + '-fobjc-abi-version=2', + ], + 'GCC_VERSION': 'com.apple.compilers.llvm.clang.1_0', + 'SDKROOT': 'iphoneos', + 'IPHONEOS_DEPLOYMENT_TARGET': '8.2', + 'CODE_SIGN_IDENTITY[sdk=iphoneos*]': 'iPhone Developer', + } + }, + 'targets': [ + { + 'target_name': 'WatchContainer', + 'product_name': 'WatchContainer', + 'type': 'executable', + 'mac_bundle': 1, + 'mac_bundle_resources': [ + 'WatchContainer/Base.lproj/Main.storyboard', + ], + 'sources': [ + 'WatchContainer/AppDelegate.h', + 'WatchContainer/AppDelegate.m', + 'WatchContainer/ViewController.h', + 'WatchContainer/ViewController.m', + 'WatchContainer/main.m', + ], + 'copies': [ + { + 'destination': '<(PRODUCT_DIR)/WatchContainer.app/PlugIns', + 'files': [ + '<(PRODUCT_DIR)/WatchKitExtension.appex', + ]}], + 'dependencies': [ + 'WatchKitExtension' + ], + 'link_settings': { + 'libraries': [ + '$(SDKROOT)/System/Library/Frameworks/Foundation.framework', + '$(SDKROOT)/System/Library/Frameworks/UIKit.framework', + ], + }, + 'xcode_settings': { + 'INFOPLIST_FILE': 'WatchContainer/Info.plist', + }, + }, + { + 'target_name': 'WatchKitExtension', + 'product_name': 'WatchKitExtension', + 'type': 'executable', + 'mac_bundle': 1, + 'ios_watchkit_extension': 1, + 'sources': [ + 'WatchKitExtension/InterfaceController.h', + 'WatchKitExtension/InterfaceController.m', + ], + 'mac_bundle_resources': [ + 'WatchKitExtension/Images.xcassets', + '<(PRODUCT_DIR)/WatchApp.app', + ], + 'dependencies': [ + 'WatchApp' + ], + 'link_settings': { + 'libraries': [ + '$(SDKROOT)/System/Library/Frameworks/Foundation.framework', + '$(SDKROOT)/System/Library/Frameworks/WatchKit.framework', + ], + }, + 'xcode_settings': { + 'INFOPLIST_FILE': 'WatchKitExtension/Info.plist', + 'SKIP_INSTALL': 'YES', + 'COPY_PHASE_STRIP': 'NO', + }, + }, + { + 'target_name': 'WatchApp', + 'product_name': 'WatchApp', + 'type': 'executable', + 'mac_bundle': 1, + 'ios_watch_app': 1, + 'mac_bundle_resources': [ + 'WatchApp/Images.xcassets', + 'WatchApp/Interface.storyboard', + ], + 'xcode_settings': { + 'INFOPLIST_FILE': 'WatchApp/Info.plist', + 'SKIP_INSTALL': 'YES', + 'COPY_PHASE_STRIP': 'NO', + 'TARGETED_DEVICE_FAMILY': '4', + 'TARGETED_DEVICE_FAMILY[sdk=iphonesimulator*]': '1,4', + }, + }, + ], +} + diff --git a/deps/gyp/test/lib/README.txt b/deps/gyp/test/lib/README.txt new file mode 100644 index 0000000000..b3d724574e --- /dev/null +++ b/deps/gyp/test/lib/README.txt @@ -0,0 +1,17 @@ +Supporting modules for GYP testing. + + TestCmd.py + TestCommon.py + + Modules for generic testing of command-line utilities, + specifically including the ability to copy a test configuration + to temporary directories (with default cleanup on exit) as part + of running test scripts that invoke commands, compare actual + against expected output, etc. + + Our copies of these come from the SCons project, + http://www.scons.org/. + + TestGyp.py + + Modules for GYP-specific tests, of course. diff --git a/deps/gyp/test/lib/TestCmd.py b/deps/gyp/test/lib/TestCmd.py new file mode 100644 index 0000000000..71403614b9 --- /dev/null +++ b/deps/gyp/test/lib/TestCmd.py @@ -0,0 +1,1597 @@ +""" +TestCmd.py: a testing framework for commands and scripts. + +The TestCmd module provides a framework for portable automated testing +of executable commands and scripts (in any language, not just Python), +especially commands and scripts that require file system interaction. + +In addition to running tests and evaluating conditions, the TestCmd +module manages and cleans up one or more temporary workspace +directories, and provides methods for creating files and directories in +those workspace directories from in-line data, here-documents), allowing +tests to be completely self-contained. + +A TestCmd environment object is created via the usual invocation: + + import TestCmd + test = TestCmd.TestCmd() + +There are a bunch of keyword arguments available at instantiation: + + test = TestCmd.TestCmd(description = 'string', + program = 'program_or_script_to_test', + interpreter = 'script_interpreter', + workdir = 'prefix', + subdir = 'subdir', + verbose = Boolean, + match = default_match_function, + diff = default_diff_function, + combine = Boolean) + +There are a bunch of methods that let you do different things: + + test.verbose_set(1) + + test.description_set('string') + + test.program_set('program_or_script_to_test') + + test.interpreter_set('script_interpreter') + test.interpreter_set(['script_interpreter', 'arg']) + + test.workdir_set('prefix') + test.workdir_set('') + + test.workpath('file') + test.workpath('subdir', 'file') + + test.subdir('subdir', ...) + + test.rmdir('subdir', ...) + + test.write('file', "contents\n") + test.write(['subdir', 'file'], "contents\n") + + test.read('file') + test.read(['subdir', 'file']) + test.read('file', mode) + test.read(['subdir', 'file'], mode) + + test.writable('dir', 1) + test.writable('dir', None) + + test.preserve(condition, ...) + + test.cleanup(condition) + + test.command_args(program = 'program_or_script_to_run', + interpreter = 'script_interpreter', + arguments = 'arguments to pass to program') + + test.run(program = 'program_or_script_to_run', + interpreter = 'script_interpreter', + arguments = 'arguments to pass to program', + chdir = 'directory_to_chdir_to', + stdin = 'input to feed to the program\n') + universal_newlines = True) + + p = test.start(program = 'program_or_script_to_run', + interpreter = 'script_interpreter', + arguments = 'arguments to pass to program', + universal_newlines = None) + + test.finish(self, p) + + test.pass_test() + test.pass_test(condition) + test.pass_test(condition, function) + + test.fail_test() + test.fail_test(condition) + test.fail_test(condition, function) + test.fail_test(condition, function, skip) + + test.no_result() + test.no_result(condition) + test.no_result(condition, function) + test.no_result(condition, function, skip) + + test.stdout() + test.stdout(run) + + test.stderr() + test.stderr(run) + + test.symlink(target, link) + + test.banner(string) + test.banner(string, width) + + test.diff(actual, expected) + + test.match(actual, expected) + + test.match_exact("actual 1\nactual 2\n", "expected 1\nexpected 2\n") + test.match_exact(["actual 1\n", "actual 2\n"], + ["expected 1\n", "expected 2\n"]) + + test.match_re("actual 1\nactual 2\n", regex_string) + test.match_re(["actual 1\n", "actual 2\n"], list_of_regexes) + + test.match_re_dotall("actual 1\nactual 2\n", regex_string) + test.match_re_dotall(["actual 1\n", "actual 2\n"], list_of_regexes) + + test.tempdir() + test.tempdir('temporary-directory') + + test.sleep() + test.sleep(seconds) + + test.where_is('foo') + test.where_is('foo', 'PATH1:PATH2') + test.where_is('foo', 'PATH1;PATH2', '.suffix3;.suffix4') + + test.unlink('file') + test.unlink('subdir', 'file') + +The TestCmd module provides pass_test(), fail_test(), and no_result() +unbound functions that report test results for use with the Aegis change +management system. These methods terminate the test immediately, +reporting PASSED, FAILED, or NO RESULT respectively, and exiting with +status 0 (success), 1 or 2 respectively. This allows for a distinction +between an actual failed test and a test that could not be properly +evaluated because of an external condition (such as a full file system +or incorrect permissions). + + import TestCmd + + TestCmd.pass_test() + TestCmd.pass_test(condition) + TestCmd.pass_test(condition, function) + + TestCmd.fail_test() + TestCmd.fail_test(condition) + TestCmd.fail_test(condition, function) + TestCmd.fail_test(condition, function, skip) + + TestCmd.no_result() + TestCmd.no_result(condition) + TestCmd.no_result(condition, function) + TestCmd.no_result(condition, function, skip) + +The TestCmd module also provides unbound functions that handle matching +in the same way as the match_*() methods described above. + + import TestCmd + + test = TestCmd.TestCmd(match = TestCmd.match_exact) + + test = TestCmd.TestCmd(match = TestCmd.match_re) + + test = TestCmd.TestCmd(match = TestCmd.match_re_dotall) + +The TestCmd module provides unbound functions that can be used for the +"diff" argument to TestCmd.TestCmd instantiation: + + import TestCmd + + test = TestCmd.TestCmd(match = TestCmd.match_re, + diff = TestCmd.diff_re) + + test = TestCmd.TestCmd(diff = TestCmd.simple_diff) + +The "diff" argument can also be used with standard difflib functions: + + import difflib + + test = TestCmd.TestCmd(diff = difflib.context_diff) + + test = TestCmd.TestCmd(diff = difflib.unified_diff) + +Lastly, the where_is() method also exists in an unbound function +version. + + import TestCmd + + TestCmd.where_is('foo') + TestCmd.where_is('foo', 'PATH1:PATH2') + TestCmd.where_is('foo', 'PATH1;PATH2', '.suffix3;.suffix4') +""" + +# Copyright 2000-2010 Steven Knight +# This module is free software, and you may redistribute it and/or modify +# it under the same terms as Python itself, so long as this copyright message +# and disclaimer are retained in their original form. +# +# IN NO EVENT SHALL THE AUTHOR BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, +# SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OF +# THIS CODE, EVEN IF THE AUTHOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +# DAMAGE. +# +# THE AUTHOR SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +# PARTICULAR PURPOSE. THE CODE PROVIDED HEREUNDER IS ON AN "AS IS" BASIS, +# AND THERE IS NO OBLIGATION WHATSOEVER TO PROVIDE MAINTENANCE, +# SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + +__author__ = "Steven Knight <knight at baldmt dot com>" +__revision__ = "TestCmd.py 0.37.D001 2010/01/11 16:55:50 knight" +__version__ = "0.37" + +import errno +import os +import os.path +import re +import shutil +import stat +import string +import sys +import tempfile +import time +import traceback +import types +import UserList + +__all__ = [ + 'diff_re', + 'fail_test', + 'no_result', + 'pass_test', + 'match_exact', + 'match_re', + 'match_re_dotall', + 'python_executable', + 'TestCmd' +] + +try: + import difflib +except ImportError: + __all__.append('simple_diff') + +def is_List(e): + return type(e) is types.ListType \ + or isinstance(e, UserList.UserList) + +try: + from UserString import UserString +except ImportError: + class UserString: + pass + +if hasattr(types, 'UnicodeType'): + def is_String(e): + return type(e) is types.StringType \ + or type(e) is types.UnicodeType \ + or isinstance(e, UserString) +else: + def is_String(e): + return type(e) is types.StringType or isinstance(e, UserString) + +tempfile.template = 'testcmd.' +if os.name in ('posix', 'nt'): + tempfile.template = 'testcmd.' + str(os.getpid()) + '.' +else: + tempfile.template = 'testcmd.' + +re_space = re.compile('\s') + +_Cleanup = [] + +_chain_to_exitfunc = None + +def _clean(): + global _Cleanup + cleanlist = filter(None, _Cleanup) + del _Cleanup[:] + cleanlist.reverse() + for test in cleanlist: + test.cleanup() + if _chain_to_exitfunc: + _chain_to_exitfunc() + +try: + import atexit +except ImportError: + # TODO(1.5): atexit requires python 2.0, so chain sys.exitfunc + try: + _chain_to_exitfunc = sys.exitfunc + except AttributeError: + pass + sys.exitfunc = _clean +else: + atexit.register(_clean) + +try: + zip +except NameError: + def zip(*lists): + result = [] + for i in xrange(min(map(len, lists))): + result.append(tuple(map(lambda l, i=i: l[i], lists))) + return result + +class Collector: + def __init__(self, top): + self.entries = [top] + def __call__(self, arg, dirname, names): + pathjoin = lambda n, d=dirname: os.path.join(d, n) + self.entries.extend(map(pathjoin, names)) + +def _caller(tblist, skip): + string = "" + arr = [] + for file, line, name, text in tblist: + if file[-10:] == "TestCmd.py": + break + arr = [(file, line, name, text)] + arr + atfrom = "at" + for file, line, name, text in arr[skip:]: + if name in ("?", "<module>"): + name = "" + else: + name = " (" + name + ")" + string = string + ("%s line %d of %s%s\n" % (atfrom, line, file, name)) + atfrom = "\tfrom" + return string + +def fail_test(self = None, condition = 1, function = None, skip = 0): + """Cause the test to fail. + + By default, the fail_test() method reports that the test FAILED + and exits with a status of 1. If a condition argument is supplied, + the test fails only if the condition is true. + """ + if not condition: + return + if not function is None: + function() + of = "" + desc = "" + sep = " " + if not self is None: + if self.program: + of = " of " + self.program + sep = "\n\t" + if self.description: + desc = " [" + self.description + "]" + sep = "\n\t" + + at = _caller(traceback.extract_stack(), skip) + sys.stderr.write("FAILED test" + of + desc + sep + at) + + sys.exit(1) + +def no_result(self = None, condition = 1, function = None, skip = 0): + """Causes a test to exit with no valid result. + + By default, the no_result() method reports NO RESULT for the test + and exits with a status of 2. If a condition argument is supplied, + the test fails only if the condition is true. + """ + if not condition: + return + if not function is None: + function() + of = "" + desc = "" + sep = " " + if not self is None: + if self.program: + of = " of " + self.program + sep = "\n\t" + if self.description: + desc = " [" + self.description + "]" + sep = "\n\t" + + if os.environ.get('TESTCMD_DEBUG_SKIPS'): + at = _caller(traceback.extract_stack(), skip) + sys.stderr.write("NO RESULT for test" + of + desc + sep + at) + else: + sys.stderr.write("NO RESULT\n") + + sys.exit(2) + +def pass_test(self = None, condition = 1, function = None): + """Causes a test to pass. + + By default, the pass_test() method reports PASSED for the test + and exits with a status of 0. If a condition argument is supplied, + the test passes only if the condition is true. + """ + if not condition: + return + if not function is None: + function() + sys.stderr.write("PASSED\n") + sys.exit(0) + +def match_exact(lines = None, matches = None): + """ + """ + if not is_List(lines): + lines = string.split(lines, "\n") + if not is_List(matches): + matches = string.split(matches, "\n") + if len(lines) != len(matches): + return + for i in range(len(lines)): + if lines[i] != matches[i]: + return + return 1 + +def match_re(lines = None, res = None): + """ + """ + if not is_List(lines): + lines = string.split(lines, "\n") + if not is_List(res): + res = string.split(res, "\n") + if len(lines) != len(res): + return + for i in range(len(lines)): + s = "^" + res[i] + "$" + try: + expr = re.compile(s) + except re.error, e: + msg = "Regular expression error in %s: %s" + raise re.error, msg % (repr(s), e[0]) + if not expr.search(lines[i]): + return + return 1 + +def match_re_dotall(lines = None, res = None): + """ + """ + if not type(lines) is type(""): + lines = string.join(lines, "\n") + if not type(res) is type(""): + res = string.join(res, "\n") + s = "^" + res + "$" + try: + expr = re.compile(s, re.DOTALL) + except re.error, e: + msg = "Regular expression error in %s: %s" + raise re.error, msg % (repr(s), e[0]) + if expr.match(lines): + return 1 + +try: + import difflib +except ImportError: + pass +else: + def simple_diff(a, b, fromfile='', tofile='', + fromfiledate='', tofiledate='', n=3, lineterm='\n'): + """ + A function with the same calling signature as difflib.context_diff + (diff -c) and difflib.unified_diff (diff -u) but which prints + output like the simple, unadorned 'diff" command. + """ + sm = difflib.SequenceMatcher(None, a, b) + def comma(x1, x2): + return x1+1 == x2 and str(x2) or '%s,%s' % (x1+1, x2) + result = [] + for op, a1, a2, b1, b2 in sm.get_opcodes(): + if op == 'delete': + result.append("%sd%d" % (comma(a1, a2), b1)) + result.extend(map(lambda l: '< ' + l, a[a1:a2])) + elif op == 'insert': + result.append("%da%s" % (a1, comma(b1, b2))) + result.extend(map(lambda l: '> ' + l, b[b1:b2])) + elif op == 'replace': + result.append("%sc%s" % (comma(a1, a2), comma(b1, b2))) + result.extend(map(lambda l: '< ' + l, a[a1:a2])) + result.append('---') + result.extend(map(lambda l: '> ' + l, b[b1:b2])) + return result + +def diff_re(a, b, fromfile='', tofile='', + fromfiledate='', tofiledate='', n=3, lineterm='\n'): + """ + A simple "diff" of two sets of lines when the expected lines + are regular expressions. This is a really dumb thing that + just compares each line in turn, so it doesn't look for + chunks of matching lines and the like--but at least it lets + you know exactly which line first didn't compare correctl... + """ + result = [] + diff = len(a) - len(b) + if diff < 0: + a = a + ['']*(-diff) + elif diff > 0: + b = b + ['']*diff + i = 0 + for aline, bline in zip(a, b): + s = "^" + aline + "$" + try: + expr = re.compile(s) + except re.error, e: + msg = "Regular expression error in %s: %s" + raise re.error, msg % (repr(s), e[0]) + if not expr.search(bline): + result.append("%sc%s" % (i+1, i+1)) + result.append('< ' + repr(a[i])) + result.append('---') + result.append('> ' + repr(b[i])) + i = i+1 + return result + +if os.name == 'java': + + python_executable = os.path.join(sys.prefix, 'jython') + +else: + + python_executable = sys.executable + +if sys.platform == 'win32': + + default_sleep_seconds = 2 + + def where_is(file, path=None, pathext=None): + if path is None: + path = os.environ['PATH'] + if is_String(path): + path = string.split(path, os.pathsep) + if pathext is None: + pathext = os.environ['PATHEXT'] + if is_String(pathext): + pathext = string.split(pathext, os.pathsep) + for ext in pathext: + if string.lower(ext) == string.lower(file[-len(ext):]): + pathext = [''] + break + for dir in path: + f = os.path.join(dir, file) + for ext in pathext: + fext = f + ext + if os.path.isfile(fext): + return fext + return None + +else: + + def where_is(file, path=None, pathext=None): + if path is None: + path = os.environ['PATH'] + if is_String(path): + path = string.split(path, os.pathsep) + for dir in path: + f = os.path.join(dir, file) + if os.path.isfile(f): + try: + st = os.stat(f) + except OSError: + continue + if stat.S_IMODE(st[stat.ST_MODE]) & 0111: + return f + return None + + default_sleep_seconds = 1 + + + +try: + import subprocess +except ImportError: + # The subprocess module doesn't exist in this version of Python, + # so we're going to cobble up something that looks just enough + # like its API for our purposes below. + import new + + subprocess = new.module('subprocess') + + subprocess.PIPE = 'PIPE' + subprocess.STDOUT = 'STDOUT' + subprocess.mswindows = (sys.platform == 'win32') + + try: + import popen2 + popen2.Popen3 + except AttributeError: + class Popen3: + universal_newlines = 1 + def __init__(self, command, **kw): + if sys.platform == 'win32' and command[0] == '"': + command = '"' + command + '"' + (stdin, stdout, stderr) = os.popen3(' ' + command) + self.stdin = stdin + self.stdout = stdout + self.stderr = stderr + def close_output(self): + self.stdout.close() + self.resultcode = self.stderr.close() + def wait(self): + resultcode = self.resultcode + if os.WIFEXITED(resultcode): + return os.WEXITSTATUS(resultcode) + elif os.WIFSIGNALED(resultcode): + return os.WTERMSIG(resultcode) + else: + return None + + else: + try: + popen2.Popen4 + except AttributeError: + # A cribbed Popen4 class, with some retrofitted code from + # the Python 1.5 Popen3 class methods to do certain things + # by hand. + class Popen4(popen2.Popen3): + childerr = None + + def __init__(self, cmd, bufsize=-1): + p2cread, p2cwrite = os.pipe() + c2pread, c2pwrite = os.pipe() + self.pid = os.fork() + if self.pid == 0: + # Child + os.dup2(p2cread, 0) + os.dup2(c2pwrite, 1) + os.dup2(c2pwrite, 2) + for i in range(3, popen2.MAXFD): + try: + os.close(i) + except: pass + try: + os.execvp(cmd[0], cmd) + finally: + os._exit(1) + # Shouldn't come here, I guess + os._exit(1) + os.close(p2cread) + self.tochild = os.fdopen(p2cwrite, 'w', bufsize) + os.close(c2pwrite) + self.fromchild = os.fdopen(c2pread, 'r', bufsize) + popen2._active.append(self) + + popen2.Popen4 = Popen4 + + class Popen3(popen2.Popen3, popen2.Popen4): + universal_newlines = 1 + def __init__(self, command, **kw): + if kw.get('stderr') == 'STDOUT': + apply(popen2.Popen4.__init__, (self, command, 1)) + else: + apply(popen2.Popen3.__init__, (self, command, 1)) + self.stdin = self.tochild + self.stdout = self.fromchild + self.stderr = self.childerr + def wait(self, *args, **kw): + resultcode = apply(popen2.Popen3.wait, (self,)+args, kw) + if os.WIFEXITED(resultcode): + return os.WEXITSTATUS(resultcode) + elif os.WIFSIGNALED(resultcode): + return os.WTERMSIG(resultcode) + else: + return None + + subprocess.Popen = Popen3 + + + +# From Josiah Carlson, +# ASPN : Python Cookbook : Module to allow Asynchronous subprocess use on Windows and Posix platforms +# http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/440554 + +PIPE = subprocess.PIPE + +if subprocess.mswindows: + from win32file import ReadFile, WriteFile + from win32pipe import PeekNamedPipe + import msvcrt +else: + import select + import fcntl + + try: fcntl.F_GETFL + except AttributeError: fcntl.F_GETFL = 3 + + try: fcntl.F_SETFL + except AttributeError: fcntl.F_SETFL = 4 + +class Popen(subprocess.Popen): + def recv(self, maxsize=None): + return self._recv('stdout', maxsize) + + def recv_err(self, maxsize=None): + return self._recv('stderr', maxsize) + + def send_recv(self, input='', maxsize=None): + return self.send(input), self.recv(maxsize), self.recv_err(maxsize) + + def get_conn_maxsize(self, which, maxsize): + if maxsize is None: + maxsize = 1024 + elif maxsize < 1: + maxsize = 1 + return getattr(self, which), maxsize + + def _close(self, which): + getattr(self, which).close() + setattr(self, which, None) + + if subprocess.mswindows: + def send(self, input): + if not self.stdin: + return None + + try: + x = msvcrt.get_osfhandle(self.stdin.fileno()) + (errCode, written) = WriteFile(x, input) + except ValueError: + return self._close('stdin') + except (subprocess.pywintypes.error, Exception), why: + if why[0] in (109, errno.ESHUTDOWN): + return self._close('stdin') + raise + + return written + + def _recv(self, which, maxsize): + conn, maxsize = self.get_conn_maxsize(which, maxsize) + if conn is None: + return None + + try: + x = msvcrt.get_osfhandle(conn.fileno()) + (read, nAvail, nMessage) = PeekNamedPipe(x, 0) + if maxsize < nAvail: + nAvail = maxsize + if nAvail > 0: + (errCode, read) = ReadFile(x, nAvail, None) + except ValueError: + return self._close(which) + except (subprocess.pywintypes.error, Exception), why: + if why[0] in (109, errno.ESHUTDOWN): + return self._close(which) + raise + + #if self.universal_newlines: + # read = self._translate_newlines(read) + return read + + else: + def send(self, input): + if not self.stdin: + return None + + if not select.select([], [self.stdin], [], 0)[1]: + return 0 + + try: + written = os.write(self.stdin.fileno(), input) + except OSError, why: + if why[0] == errno.EPIPE: #broken pipe + return self._close('stdin') + raise + + return written + + def _recv(self, which, maxsize): + conn, maxsize = self.get_conn_maxsize(which, maxsize) + if conn is None: + return None + + try: + flags = fcntl.fcntl(conn, fcntl.F_GETFL) + except TypeError: + flags = None + else: + if not conn.closed: + fcntl.fcntl(conn, fcntl.F_SETFL, flags| os.O_NONBLOCK) + + try: + if not select.select([conn], [], [], 0)[0]: + return '' + + r = conn.read(maxsize) + if not r: + return self._close(which) + + #if self.universal_newlines: + # r = self._translate_newlines(r) + return r + finally: + if not conn.closed and not flags is None: + fcntl.fcntl(conn, fcntl.F_SETFL, flags) + +disconnect_message = "Other end disconnected!" + +def recv_some(p, t=.1, e=1, tr=5, stderr=0): + if tr < 1: + tr = 1 + x = time.time()+t + y = [] + r = '' + pr = p.recv + if stderr: + pr = p.recv_err + while time.time() < x or r: + r = pr() + if r is None: + if e: + raise Exception(disconnect_message) + else: + break + elif r: + y.append(r) + else: + time.sleep(max((x-time.time())/tr, 0)) + return ''.join(y) + +# TODO(3.0: rewrite to use memoryview() +def send_all(p, data): + while len(data): + sent = p.send(data) + if sent is None: + raise Exception(disconnect_message) + data = buffer(data, sent) + + + +try: + object +except NameError: + class object: + pass + + + +class TestCmd(object): + """Class TestCmd + """ + + def __init__(self, description = None, + program = None, + interpreter = None, + workdir = None, + subdir = None, + verbose = None, + match = None, + diff = None, + combine = 0, + universal_newlines = 1): + self._cwd = os.getcwd() + self.description_set(description) + self.program_set(program) + self.interpreter_set(interpreter) + if verbose is None: + try: + verbose = max( 0, int(os.environ.get('TESTCMD_VERBOSE', 0)) ) + except ValueError: + verbose = 0 + self.verbose_set(verbose) + self.combine = combine + self.universal_newlines = universal_newlines + if match is not None: + self.match_function = match + else: + self.match_function = match_re + if diff is not None: + self.diff_function = diff + else: + try: + difflib + except NameError: + pass + else: + self.diff_function = simple_diff + #self.diff_function = difflib.context_diff + #self.diff_function = difflib.unified_diff + self._dirlist = [] + self._preserve = {'pass_test': 0, 'fail_test': 0, 'no_result': 0} + if os.environ.has_key('PRESERVE') and not os.environ['PRESERVE'] is '': + self._preserve['pass_test'] = os.environ['PRESERVE'] + self._preserve['fail_test'] = os.environ['PRESERVE'] + self._preserve['no_result'] = os.environ['PRESERVE'] + else: + try: + self._preserve['pass_test'] = os.environ['PRESERVE_PASS'] + except KeyError: + pass + try: + self._preserve['fail_test'] = os.environ['PRESERVE_FAIL'] + except KeyError: + pass + try: + self._preserve['no_result'] = os.environ['PRESERVE_NO_RESULT'] + except KeyError: + pass + self._stdout = [] + self._stderr = [] + self.status = None + self.condition = 'no_result' + self.workdir_set(workdir) + self.subdir(subdir) + + def __del__(self): + self.cleanup() + + def __repr__(self): + return "%x" % id(self) + + banner_char = '=' + banner_width = 80 + + def banner(self, s, width=None): + if width is None: + width = self.banner_width + return s + self.banner_char * (width - len(s)) + + if os.name == 'posix': + + def escape(self, arg): + "escape shell special characters" + slash = '\\' + special = '"$' + + arg = string.replace(arg, slash, slash+slash) + for c in special: + arg = string.replace(arg, c, slash+c) + + if re_space.search(arg): + arg = '"' + arg + '"' + return arg + + else: + + # Windows does not allow special characters in file names + # anyway, so no need for an escape function, we will just quote + # the arg. + def escape(self, arg): + if re_space.search(arg): + arg = '"' + arg + '"' + return arg + + def canonicalize(self, path): + if is_List(path): + path = apply(os.path.join, tuple(path)) + if not os.path.isabs(path): + path = os.path.join(self.workdir, path) + return path + + def chmod(self, path, mode): + """Changes permissions on the specified file or directory + path name.""" + path = self.canonicalize(path) + os.chmod(path, mode) + + def cleanup(self, condition = None): + """Removes any temporary working directories for the specified + TestCmd environment. If the environment variable PRESERVE was + set when the TestCmd environment was created, temporary working + directories are not removed. If any of the environment variables + PRESERVE_PASS, PRESERVE_FAIL, or PRESERVE_NO_RESULT were set + when the TestCmd environment was created, then temporary working + directories are not removed if the test passed, failed, or had + no result, respectively. Temporary working directories are also + preserved for conditions specified via the preserve method. + + Typically, this method is not called directly, but is used when + the script exits to clean up temporary working directories as + appropriate for the exit status. + """ + if not self._dirlist: + return + os.chdir(self._cwd) + self.workdir = None + if condition is None: + condition = self.condition + if self._preserve[condition]: + for dir in self._dirlist: + print "Preserved directory", dir + else: + list = self._dirlist[:] + list.reverse() + for dir in list: + self.writable(dir, 1) + shutil.rmtree(dir, ignore_errors = 1) + self._dirlist = [] + + try: + global _Cleanup + _Cleanup.remove(self) + except (AttributeError, ValueError): + pass + + def command_args(self, program = None, + interpreter = None, + arguments = None): + if program: + if type(program) == type('') and not os.path.isabs(program): + program = os.path.join(self._cwd, program) + else: + program = self.program + if not interpreter: + interpreter = self.interpreter + if not type(program) in [type([]), type(())]: + program = [program] + cmd = list(program) + if interpreter: + if not type(interpreter) in [type([]), type(())]: + interpreter = [interpreter] + cmd = list(interpreter) + cmd + if arguments: + if type(arguments) == type(''): + arguments = string.split(arguments) + cmd.extend(arguments) + return cmd + + def description_set(self, description): + """Set the description of the functionality being tested. + """ + self.description = description + + try: + difflib + except NameError: + def diff(self, a, b, name, *args, **kw): + print self.banner('Expected %s' % name) + print a + print self.banner('Actual %s' % name) + print b + else: + def diff(self, a, b, name, *args, **kw): + print self.banner(name) + args = (a.splitlines(), b.splitlines()) + args + lines = apply(self.diff_function, args, kw) + for l in lines: + print l + + def fail_test(self, condition = 1, function = None, skip = 0): + """Cause the test to fail. + """ + if not condition: + return + self.condition = 'fail_test' + fail_test(self = self, + condition = condition, + function = function, + skip = skip) + + def interpreter_set(self, interpreter): + """Set the program to be used to interpret the program + under test as a script. + """ + self.interpreter = interpreter + + def match(self, lines, matches): + """Compare actual and expected file contents. + """ + return self.match_function(lines, matches) + + def match_exact(self, lines, matches): + """Compare actual and expected file contents. + """ + return match_exact(lines, matches) + + def match_re(self, lines, res): + """Compare actual and expected file contents. + """ + return match_re(lines, res) + + def match_re_dotall(self, lines, res): + """Compare actual and expected file contents. + """ + return match_re_dotall(lines, res) + + def no_result(self, condition = 1, function = None, skip = 0): + """Report that the test could not be run. + """ + if not condition: + return + self.condition = 'no_result' + no_result(self = self, + condition = condition, + function = function, + skip = skip) + + def pass_test(self, condition = 1, function = None): + """Cause the test to pass. + """ + if not condition: + return + self.condition = 'pass_test' + pass_test(self = self, condition = condition, function = function) + + def preserve(self, *conditions): + """Arrange for the temporary working directories for the + specified TestCmd environment to be preserved for one or more + conditions. If no conditions are specified, arranges for + the temporary working directories to be preserved for all + conditions. + """ + if conditions is (): + conditions = ('pass_test', 'fail_test', 'no_result') + for cond in conditions: + self._preserve[cond] = 1 + + def program_set(self, program): + """Set the executable program or script to be tested. + """ + if program and not os.path.isabs(program): + program = os.path.join(self._cwd, program) + self.program = program + + def read(self, file, mode = 'rb'): + """Reads and returns the contents of the specified file name. + The file name may be a list, in which case the elements are + concatenated with the os.path.join() method. The file is + assumed to be under the temporary working directory unless it + is an absolute path name. The I/O mode for the file may + be specified; it must begin with an 'r'. The default is + 'rb' (binary read). + """ + file = self.canonicalize(file) + if mode[0] != 'r': + raise ValueError, "mode must begin with 'r'" + with open(file, mode) as f: + result = f.read() + return result + + def rmdir(self, dir): + """Removes the specified dir name. + The dir name may be a list, in which case the elements are + concatenated with the os.path.join() method. The dir is + assumed to be under the temporary working directory unless it + is an absolute path name. + The dir must be empty. + """ + dir = self.canonicalize(dir) + os.rmdir(dir) + + def start(self, program = None, + interpreter = None, + arguments = None, + universal_newlines = None, + **kw): + """ + Starts a program or script for the test environment. + + The specified program will have the original directory + prepended unless it is enclosed in a [list]. + """ + cmd = self.command_args(program, interpreter, arguments) + cmd_string = string.join(map(self.escape, cmd), ' ') + if self.verbose: + sys.stderr.write(cmd_string + "\n") + if universal_newlines is None: + universal_newlines = self.universal_newlines + + # On Windows, if we make stdin a pipe when we plan to send + # no input, and the test program exits before + # Popen calls msvcrt.open_osfhandle, that call will fail. + # So don't use a pipe for stdin if we don't need one. + stdin = kw.get('stdin', None) + if stdin is not None: + stdin = subprocess.PIPE + + combine = kw.get('combine', self.combine) + if combine: + stderr_value = subprocess.STDOUT + else: + stderr_value = subprocess.PIPE + + return Popen(cmd, + stdin=stdin, + stdout=subprocess.PIPE, + stderr=stderr_value, + universal_newlines=universal_newlines) + + def finish(self, popen, **kw): + """ + Finishes and waits for the process being run under control of + the specified popen argument, recording the exit status, + standard output and error output. + """ + popen.stdin.close() + self.status = popen.wait() + if not self.status: + self.status = 0 + self._stdout.append(popen.stdout.read()) + if popen.stderr: + stderr = popen.stderr.read() + else: + stderr = '' + self._stderr.append(stderr) + + def run(self, program = None, + interpreter = None, + arguments = None, + chdir = None, + stdin = None, + universal_newlines = None): + """Runs a test of the program or script for the test + environment. Standard output and error output are saved for + future retrieval via the stdout() and stderr() methods. + + The specified program will have the original directory + prepended unless it is enclosed in a [list]. + """ + if chdir: + oldcwd = os.getcwd() + if not os.path.isabs(chdir): + chdir = os.path.join(self.workpath(chdir)) + if self.verbose: + sys.stderr.write("chdir(" + chdir + ")\n") + os.chdir(chdir) + p = self.start(program, + interpreter, + arguments, + universal_newlines, + stdin=stdin) + if stdin: + if is_List(stdin): + for line in stdin: + p.stdin.write(line) + else: + p.stdin.write(stdin) + p.stdin.close() + + out = p.stdout.read() + if p.stderr is None: + err = '' + else: + err = p.stderr.read() + try: + close_output = p.close_output + except AttributeError: + p.stdout.close() + if not p.stderr is None: + p.stderr.close() + else: + close_output() + + self._stdout.append(out) + self._stderr.append(err) + + self.status = p.wait() + if not self.status: + self.status = 0 + + if chdir: + os.chdir(oldcwd) + if self.verbose >= 2: + write = sys.stdout.write + write('============ STATUS: %d\n' % self.status) + out = self.stdout() + if out or self.verbose >= 3: + write('============ BEGIN STDOUT (len=%d):\n' % len(out)) + write(out) + write('============ END STDOUT\n') + err = self.stderr() + if err or self.verbose >= 3: + write('============ BEGIN STDERR (len=%d)\n' % len(err)) + write(err) + write('============ END STDERR\n') + + def sleep(self, seconds = default_sleep_seconds): + """Sleeps at least the specified number of seconds. If no + number is specified, sleeps at least the minimum number of + seconds necessary to advance file time stamps on the current + system. Sleeping more seconds is all right. + """ + time.sleep(seconds) + + def stderr(self, run = None): + """Returns the error output from the specified run number. + If there is no specified run number, then returns the error + output of the last run. If the run number is less than zero, + then returns the error output from that many runs back from the + current run. + """ + if not run: + run = len(self._stderr) + elif run < 0: + run = len(self._stderr) + run + run = run - 1 + return self._stderr[run] + + def stdout(self, run = None): + """Returns the standard output from the specified run number. + If there is no specified run number, then returns the standard + output of the last run. If the run number is less than zero, + then returns the standard output from that many runs back from + the current run. + """ + if not run: + run = len(self._stdout) + elif run < 0: + run = len(self._stdout) + run + run = run - 1 + return self._stdout[run] + + def subdir(self, *subdirs): + """Create new subdirectories under the temporary working + directory, one for each argument. An argument may be a list, + in which case the list elements are concatenated using the + os.path.join() method. Subdirectories multiple levels deep + must be created using a separate argument for each level: + + test.subdir('sub', ['sub', 'dir'], ['sub', 'dir', 'ectory']) + + Returns the number of subdirectories actually created. + """ + count = 0 + for sub in subdirs: + if sub is None: + continue + if is_List(sub): + sub = apply(os.path.join, tuple(sub)) + new = os.path.join(self.workdir, sub) + try: + os.mkdir(new) + except OSError: + pass + else: + count = count + 1 + return count + + def symlink(self, target, link): + """Creates a symlink to the specified target. + The link name may be a list, in which case the elements are + concatenated with the os.path.join() method. The link is + assumed to be under the temporary working directory unless it + is an absolute path name. The target is *not* assumed to be + under the temporary working directory. + """ + link = self.canonicalize(link) + os.symlink(target, link) + + def tempdir(self, path=None): + """Creates a temporary directory. + A unique directory name is generated if no path name is specified. + The directory is created, and will be removed when the TestCmd + object is destroyed. + """ + if path is None: + try: + path = tempfile.mktemp(prefix=tempfile.template) + except TypeError: + path = tempfile.mktemp() + os.mkdir(path) + + # Symlinks in the path will report things + # differently from os.getcwd(), so chdir there + # and back to fetch the canonical path. + cwd = os.getcwd() + try: + os.chdir(path) + path = os.getcwd() + finally: + os.chdir(cwd) + + # Uppercase the drive letter since the case of drive + # letters is pretty much random on win32: + drive,rest = os.path.splitdrive(path) + if drive: + path = string.upper(drive) + rest + + # + self._dirlist.append(path) + global _Cleanup + try: + _Cleanup.index(self) + except ValueError: + _Cleanup.append(self) + + return path + + def touch(self, path, mtime=None): + """Updates the modification time on the specified file or + directory path name. The default is to update to the + current time if no explicit modification time is specified. + """ + path = self.canonicalize(path) + atime = os.path.getatime(path) + if mtime is None: + mtime = time.time() + os.utime(path, (atime, mtime)) + + def unlink(self, file): + """Unlinks the specified file name. + The file name may be a list, in which case the elements are + concatenated with the os.path.join() method. The file is + assumed to be under the temporary working directory unless it + is an absolute path name. + """ + file = self.canonicalize(file) + os.unlink(file) + + def verbose_set(self, verbose): + """Set the verbose level. + """ + self.verbose = verbose + + def where_is(self, file, path=None, pathext=None): + """Find an executable file. + """ + if is_List(file): + file = apply(os.path.join, tuple(file)) + if not os.path.isabs(file): + file = where_is(file, path, pathext) + return file + + def workdir_set(self, path): + """Creates a temporary working directory with the specified + path name. If the path is a null string (''), a unique + directory name is created. + """ + if (path != None): + if path == '': + path = None + path = self.tempdir(path) + self.workdir = path + + def workpath(self, *args): + """Returns the absolute path name to a subdirectory or file + within the current temporary working directory. Concatenates + the temporary working directory name with the specified + arguments using the os.path.join() method. + """ + return apply(os.path.join, (self.workdir,) + tuple(args)) + + def readable(self, top, read=1): + """Make the specified directory tree readable (read == 1) + or not (read == None). + + This method has no effect on Windows systems, which use a + completely different mechanism to control file readability. + """ + + if sys.platform == 'win32': + return + + if read: + def do_chmod(fname): + try: st = os.stat(fname) + except OSError: pass + else: os.chmod(fname, stat.S_IMODE(st[stat.ST_MODE]|stat.S_IREAD)) + else: + def do_chmod(fname): + try: st = os.stat(fname) + except OSError: pass + else: os.chmod(fname, stat.S_IMODE(st[stat.ST_MODE]&~stat.S_IREAD)) + + if os.path.isfile(top): + # If it's a file, that's easy, just chmod it. + do_chmod(top) + elif read: + # It's a directory and we're trying to turn on read + # permission, so it's also pretty easy, just chmod the + # directory and then chmod every entry on our walk down the + # tree. Because os.path.walk() is top-down, we'll enable + # read permission on any directories that have it disabled + # before os.path.walk() tries to list their contents. + do_chmod(top) + + def chmod_entries(arg, dirname, names, do_chmod=do_chmod): + for n in names: + do_chmod(os.path.join(dirname, n)) + + os.path.walk(top, chmod_entries, None) + else: + # It's a directory and we're trying to turn off read + # permission, which means we have to chmod the directoreis + # in the tree bottom-up, lest disabling read permission from + # the top down get in the way of being able to get at lower + # parts of the tree. But os.path.walk() visits things top + # down, so we just use an object to collect a list of all + # of the entries in the tree, reverse the list, and then + # chmod the reversed (bottom-up) list. + col = Collector(top) + os.path.walk(top, col, None) + col.entries.reverse() + for d in col.entries: do_chmod(d) + + def writable(self, top, write=1): + """Make the specified directory tree writable (write == 1) + or not (write == None). + """ + + if sys.platform == 'win32': + + if write: + def do_chmod(fname): + try: os.chmod(fname, stat.S_IWRITE) + except OSError: pass + else: + def do_chmod(fname): + try: os.chmod(fname, stat.S_IREAD) + except OSError: pass + + else: + + if write: + def do_chmod(fname): + try: st = os.stat(fname) + except OSError: pass + else: os.chmod(fname, stat.S_IMODE(st[stat.ST_MODE]|0200)) + else: + def do_chmod(fname): + try: st = os.stat(fname) + except OSError: pass + else: os.chmod(fname, stat.S_IMODE(st[stat.ST_MODE]&~0200)) + + if os.path.isfile(top): + do_chmod(top) + else: + col = Collector(top) + os.path.walk(top, col, None) + for d in col.entries: do_chmod(d) + + def executable(self, top, execute=1): + """Make the specified directory tree executable (execute == 1) + or not (execute == None). + + This method has no effect on Windows systems, which use a + completely different mechanism to control file executability. + """ + + if sys.platform == 'win32': + return + + if execute: + def do_chmod(fname): + try: st = os.stat(fname) + except OSError: pass + else: os.chmod(fname, stat.S_IMODE(st[stat.ST_MODE]|stat.S_IEXEC)) + else: + def do_chmod(fname): + try: st = os.stat(fname) + except OSError: pass + else: os.chmod(fname, stat.S_IMODE(st[stat.ST_MODE]&~stat.S_IEXEC)) + + if os.path.isfile(top): + # If it's a file, that's easy, just chmod it. + do_chmod(top) + elif execute: + # It's a directory and we're trying to turn on execute + # permission, so it's also pretty easy, just chmod the + # directory and then chmod every entry on our walk down the + # tree. Because os.path.walk() is top-down, we'll enable + # execute permission on any directories that have it disabled + # before os.path.walk() tries to list their contents. + do_chmod(top) + + def chmod_entries(arg, dirname, names, do_chmod=do_chmod): + for n in names: + do_chmod(os.path.join(dirname, n)) + + os.path.walk(top, chmod_entries, None) + else: + # It's a directory and we're trying to turn off execute + # permission, which means we have to chmod the directories + # in the tree bottom-up, lest disabling execute permission from + # the top down get in the way of being able to get at lower + # parts of the tree. But os.path.walk() visits things top + # down, so we just use an object to collect a list of all + # of the entries in the tree, reverse the list, and then + # chmod the reversed (bottom-up) list. + col = Collector(top) + os.path.walk(top, col, None) + col.entries.reverse() + for d in col.entries: do_chmod(d) + + def write(self, file, content, mode = 'wb'): + """Writes the specified content text (second argument) to the + specified file name (first argument). The file name may be + a list, in which case the elements are concatenated with the + os.path.join() method. The file is created under the temporary + working directory. Any subdirectories in the path must already + exist. The I/O mode for the file may be specified; it must + begin with a 'w'. The default is 'wb' (binary write). + """ + file = self.canonicalize(file) + if mode[0] != 'w': + raise ValueError, "mode must begin with 'w'" + with open(file, mode) as f: + f.write(content) + +# Local Variables: +# tab-width:4 +# indent-tabs-mode:nil +# End: +# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/deps/gyp/test/lib/TestCommon.py b/deps/gyp/test/lib/TestCommon.py new file mode 100644 index 0000000000..2f526a6e3d --- /dev/null +++ b/deps/gyp/test/lib/TestCommon.py @@ -0,0 +1,582 @@ +""" +TestCommon.py: a testing framework for commands and scripts + with commonly useful error handling + +The TestCommon module provides a simple, high-level interface for writing +tests of executable commands and scripts, especially commands and scripts +that interact with the file system. All methods throw exceptions and +exit on failure, with useful error messages. This makes a number of +explicit checks unnecessary, making the test scripts themselves simpler +to write and easier to read. + +The TestCommon class is a subclass of the TestCmd class. In essence, +TestCommon is a wrapper that handles common TestCmd error conditions in +useful ways. You can use TestCommon directly, or subclass it for your +program and add additional (or override) methods to tailor it to your +program's specific needs. Alternatively, the TestCommon class serves +as a useful example of how to define your own TestCmd subclass. + +As a subclass of TestCmd, TestCommon provides access to all of the +variables and methods from the TestCmd module. Consequently, you can +use any variable or method documented in the TestCmd module without +having to explicitly import TestCmd. + +A TestCommon environment object is created via the usual invocation: + + import TestCommon + test = TestCommon.TestCommon() + +You can use all of the TestCmd keyword arguments when instantiating a +TestCommon object; see the TestCmd documentation for details. + +Here is an overview of the methods and keyword arguments that are +provided by the TestCommon class: + + test.must_be_writable('file1', ['file2', ...]) + + test.must_contain('file', 'required text\n') + + test.must_contain_all_lines(output, lines, ['title', find]) + + test.must_contain_any_line(output, lines, ['title', find]) + + test.must_exist('file1', ['file2', ...]) + + test.must_match('file', "expected contents\n") + + test.must_not_be_writable('file1', ['file2', ...]) + + test.must_not_contain('file', 'banned text\n') + + test.must_not_contain_any_line(output, lines, ['title', find]) + + test.must_not_exist('file1', ['file2', ...]) + + test.run(options = "options to be prepended to arguments", + stdout = "expected standard output from the program", + stderr = "expected error output from the program", + status = expected_status, + match = match_function) + +The TestCommon module also provides the following variables + + TestCommon.python_executable + TestCommon.exe_suffix + TestCommon.obj_suffix + TestCommon.shobj_prefix + TestCommon.shobj_suffix + TestCommon.lib_prefix + TestCommon.lib_suffix + TestCommon.dll_prefix + TestCommon.dll_suffix + +""" + +# Copyright 2000-2010 Steven Knight +# This module is free software, and you may redistribute it and/or modify +# it under the same terms as Python itself, so long as this copyright message +# and disclaimer are retained in their original form. +# +# IN NO EVENT SHALL THE AUTHOR BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, +# SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OF +# THIS CODE, EVEN IF THE AUTHOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +# DAMAGE. +# +# THE AUTHOR SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +# PARTICULAR PURPOSE. THE CODE PROVIDED HEREUNDER IS ON AN "AS IS" BASIS, +# AND THERE IS NO OBLIGATION WHATSOEVER TO PROVIDE MAINTENANCE, +# SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + +__author__ = "Steven Knight <knight at baldmt dot com>" +__revision__ = "TestCommon.py 0.37.D001 2010/01/11 16:55:50 knight" +__version__ = "0.37" + +import copy +import os +import os.path +import stat +import string +import sys +import types +import UserList + +from TestCmd import * +from TestCmd import __all__ + +__all__.extend([ 'TestCommon', + 'exe_suffix', + 'obj_suffix', + 'shobj_prefix', + 'shobj_suffix', + 'lib_prefix', + 'lib_suffix', + 'dll_prefix', + 'dll_suffix', + ]) + +# Variables that describe the prefixes and suffixes on this system. +if sys.platform == 'win32': + exe_suffix = '.exe' + obj_suffix = '.obj' + shobj_suffix = '.obj' + shobj_prefix = '' + lib_prefix = '' + lib_suffix = '.lib' + dll_prefix = '' + dll_suffix = '.dll' + module_prefix = '' + module_suffix = '.dll' +elif sys.platform == 'cygwin': + exe_suffix = '.exe' + obj_suffix = '.o' + shobj_suffix = '.os' + shobj_prefix = '' + lib_prefix = 'lib' + lib_suffix = '.a' + dll_prefix = '' + dll_suffix = '.dll' + module_prefix = '' + module_suffix = '.dll' +elif string.find(sys.platform, 'irix') != -1: + exe_suffix = '' + obj_suffix = '.o' + shobj_suffix = '.o' + shobj_prefix = '' + lib_prefix = 'lib' + lib_suffix = '.a' + dll_prefix = 'lib' + dll_suffix = '.so' + module_prefix = 'lib' + module_prefix = '.so' +elif string.find(sys.platform, 'darwin') != -1: + exe_suffix = '' + obj_suffix = '.o' + shobj_suffix = '.os' + shobj_prefix = '' + lib_prefix = 'lib' + lib_suffix = '.a' + dll_prefix = 'lib' + dll_suffix = '.dylib' + module_prefix = '' + module_suffix = '.so' +elif string.find(sys.platform, 'sunos') != -1: + exe_suffix = '' + obj_suffix = '.o' + shobj_suffix = '.os' + shobj_prefix = 'so_' + lib_prefix = 'lib' + lib_suffix = '.a' + dll_prefix = 'lib' + dll_suffix = '.dylib' + module_prefix = '' + module_suffix = '.so' +else: + exe_suffix = '' + obj_suffix = '.o' + shobj_suffix = '.os' + shobj_prefix = '' + lib_prefix = 'lib' + lib_suffix = '.a' + dll_prefix = 'lib' + dll_suffix = '.so' + module_prefix = 'lib' + module_suffix = '.so' + +def is_List(e): + return type(e) is types.ListType \ + or isinstance(e, UserList.UserList) + +def is_writable(f): + mode = os.stat(f)[stat.ST_MODE] + return mode & stat.S_IWUSR + +def separate_files(flist): + existing = [] + missing = [] + for f in flist: + if os.path.exists(f): + existing.append(f) + else: + missing.append(f) + return existing, missing + +def _failed(self, status = 0): + if self.status is None or status is None: + return None + try: + return _status(self) not in status + except TypeError: + # status wasn't an iterable + return _status(self) != status + +def _status(self): + return self.status + +class TestCommon(TestCmd): + + # Additional methods from the Perl Test::Cmd::Common module + # that we may wish to add in the future: + # + # $test->subdir('subdir', ...); + # + # $test->copy('src_file', 'dst_file'); + + def __init__(self, **kw): + """Initialize a new TestCommon instance. This involves just + calling the base class initialization, and then changing directory + to the workdir. + """ + apply(TestCmd.__init__, [self], kw) + os.chdir(self.workdir) + + def must_be_writable(self, *files): + """Ensures that the specified file(s) exist and are writable. + An individual file can be specified as a list of directory names, + in which case the pathname will be constructed by concatenating + them. Exits FAILED if any of the files does not exist or is + not writable. + """ + files = map(lambda x: is_List(x) and apply(os.path.join, x) or x, files) + existing, missing = separate_files(files) + unwritable = filter(lambda x, iw=is_writable: not iw(x), existing) + if missing: + print "Missing files: `%s'" % string.join(missing, "', `") + if unwritable: + print "Unwritable files: `%s'" % string.join(unwritable, "', `") + self.fail_test(missing + unwritable) + + def must_contain(self, file, required, mode = 'rb'): + """Ensures that the specified file contains the required text. + """ + file_contents = self.read(file, mode) + contains = (string.find(file_contents, required) != -1) + if not contains: + print "File `%s' does not contain required string." % file + print self.banner('Required string ') + print required + print self.banner('%s contents ' % file) + print file_contents + self.fail_test(not contains) + + def must_contain_all_lines(self, output, lines, title=None, find=None): + """Ensures that the specified output string (first argument) + contains all of the specified lines (second argument). + + An optional third argument can be used to describe the type + of output being searched, and only shows up in failure output. + + An optional fourth argument can be used to supply a different + function, of the form "find(line, output), to use when searching + for lines in the output. + """ + if find is None: + find = lambda o, l: string.find(o, l) != -1 + missing = [] + for line in lines: + if not find(output, line): + missing.append(line) + + if missing: + if title is None: + title = 'output' + sys.stdout.write("Missing expected lines from %s:\n" % title) + for line in missing: + sys.stdout.write(' ' + repr(line) + '\n') + sys.stdout.write(self.banner(title + ' ')) + sys.stdout.write(output) + self.fail_test() + + def must_contain_any_line(self, output, lines, title=None, find=None): + """Ensures that the specified output string (first argument) + contains at least one of the specified lines (second argument). + + An optional third argument can be used to describe the type + of output being searched, and only shows up in failure output. + + An optional fourth argument can be used to supply a different + function, of the form "find(line, output), to use when searching + for lines in the output. + """ + if find is None: + find = lambda o, l: string.find(o, l) != -1 + for line in lines: + if find(output, line): + return + + if title is None: + title = 'output' + sys.stdout.write("Missing any expected line from %s:\n" % title) + for line in lines: + sys.stdout.write(' ' + repr(line) + '\n') + sys.stdout.write(self.banner(title + ' ')) + sys.stdout.write(output) + self.fail_test() + + def must_contain_lines(self, lines, output, title=None): + # Deprecated; retain for backwards compatibility. + return self.must_contain_all_lines(output, lines, title) + + def must_exist(self, *files): + """Ensures that the specified file(s) must exist. An individual + file be specified as a list of directory names, in which case the + pathname will be constructed by concatenating them. Exits FAILED + if any of the files does not exist. + """ + files = map(lambda x: is_List(x) and apply(os.path.join, x) or x, files) + missing = filter(lambda x: not os.path.exists(x), files) + if missing: + print "Missing files: `%s'" % string.join(missing, "', `") + self.fail_test(missing) + + def must_match(self, file, expect, mode = 'rb'): + """Matches the contents of the specified file (first argument) + against the expected contents (second argument). The expected + contents are a list of lines or a string which will be split + on newlines. + """ + file_contents = self.read(file, mode) + try: + self.fail_test(not self.match(file_contents, expect)) + except KeyboardInterrupt: + raise + except: + print "Unexpected contents of `%s'" % file + self.diff(expect, file_contents, 'contents ') + raise + + def must_not_contain(self, file, banned, mode = 'rb'): + """Ensures that the specified file doesn't contain the banned text. + """ + file_contents = self.read(file, mode) + contains = (string.find(file_contents, banned) != -1) + if contains: + print "File `%s' contains banned string." % file + print self.banner('Banned string ') + print banned + print self.banner('%s contents ' % file) + print file_contents + self.fail_test(contains) + + def must_not_contain_any_line(self, output, lines, title=None, find=None): + """Ensures that the specified output string (first argument) + does not contain any of the specified lines (second argument). + + An optional third argument can be used to describe the type + of output being searched, and only shows up in failure output. + + An optional fourth argument can be used to supply a different + function, of the form "find(line, output), to use when searching + for lines in the output. + """ + if find is None: + find = lambda o, l: string.find(o, l) != -1 + unexpected = [] + for line in lines: + if find(output, line): + unexpected.append(line) + + if unexpected: + if title is None: + title = 'output' + sys.stdout.write("Unexpected lines in %s:\n" % title) + for line in unexpected: + sys.stdout.write(' ' + repr(line) + '\n') + sys.stdout.write(self.banner(title + ' ')) + sys.stdout.write(output) + self.fail_test() + + def must_not_contain_lines(self, lines, output, title=None): + return self.must_not_contain_any_line(output, lines, title) + + def must_not_exist(self, *files): + """Ensures that the specified file(s) must not exist. + An individual file be specified as a list of directory names, in + which case the pathname will be constructed by concatenating them. + Exits FAILED if any of the files exists. + """ + files = map(lambda x: is_List(x) and apply(os.path.join, x) or x, files) + existing = filter(os.path.exists, files) + if existing: + print "Unexpected files exist: `%s'" % string.join(existing, "', `") + self.fail_test(existing) + + def must_not_be_writable(self, *files): + """Ensures that the specified file(s) exist and are not writable. + An individual file can be specified as a list of directory names, + in which case the pathname will be constructed by concatenating + them. Exits FAILED if any of the files does not exist or is + writable. + """ + files = map(lambda x: is_List(x) and apply(os.path.join, x) or x, files) + existing, missing = separate_files(files) + writable = filter(is_writable, existing) + if missing: + print "Missing files: `%s'" % string.join(missing, "', `") + if writable: + print "Writable files: `%s'" % string.join(writable, "', `") + self.fail_test(missing + writable) + + def _complete(self, actual_stdout, expected_stdout, + actual_stderr, expected_stderr, status, match): + """ + Post-processes running a subcommand, checking for failure + status and displaying output appropriately. + """ + if _failed(self, status): + expect = '' + if status != 0: + expect = " (expected %s)" % str(status) + print "%s returned %s%s" % (self.program, str(_status(self)), expect) + print self.banner('STDOUT ') + print actual_stdout + print self.banner('STDERR ') + print actual_stderr + self.fail_test() + if not expected_stdout is None and not match(actual_stdout, expected_stdout): + self.diff(expected_stdout, actual_stdout, 'STDOUT ') + if actual_stderr: + print self.banner('STDERR ') + print actual_stderr + self.fail_test() + if not expected_stderr is None and not match(actual_stderr, expected_stderr): + print self.banner('STDOUT ') + print actual_stdout + self.diff(expected_stderr, actual_stderr, 'STDERR ') + self.fail_test() + + def start(self, program = None, + interpreter = None, + arguments = None, + universal_newlines = None, + **kw): + """ + Starts a program or script for the test environment. + + This handles the "options" keyword argument and exceptions. + """ + options = kw.pop('options', None) + if options: + if arguments is None: + arguments = options + else: + arguments = options + " " + arguments + + try: + return apply(TestCmd.start, + (self, program, interpreter, arguments, universal_newlines), + kw) + except KeyboardInterrupt: + raise + except Exception, e: + print self.banner('STDOUT ') + try: + print self.stdout() + except IndexError: + pass + print self.banner('STDERR ') + try: + print self.stderr() + except IndexError: + pass + cmd_args = self.command_args(program, interpreter, arguments) + sys.stderr.write('Exception trying to execute: %s\n' % cmd_args) + raise e + + def finish(self, popen, stdout = None, stderr = '', status = 0, **kw): + """ + Finishes and waits for the process being run under control of + the specified popen argument. Additional arguments are similar + to those of the run() method: + + stdout The expected standard output from + the command. A value of None means + don't test standard output. + + stderr The expected error output from + the command. A value of None means + don't test error output. + + status The expected exit status from the + command. A value of None means don't + test exit status. + """ + apply(TestCmd.finish, (self, popen,), kw) + match = kw.get('match', self.match) + self._complete(self.stdout(), stdout, + self.stderr(), stderr, status, match) + + def run(self, options = None, arguments = None, + stdout = None, stderr = '', status = 0, **kw): + """Runs the program under test, checking that the test succeeded. + + The arguments are the same as the base TestCmd.run() method, + with the addition of: + + options Extra options that get appended to the beginning + of the arguments. + + stdout The expected standard output from + the command. A value of None means + don't test standard output. + + stderr The expected error output from + the command. A value of None means + don't test error output. + + status The expected exit status from the + command. A value of None means don't + test exit status. + + By default, this expects a successful exit (status = 0), does + not test standard output (stdout = None), and expects that error + output is empty (stderr = ""). + """ + if options: + if arguments is None: + arguments = options + else: + arguments = options + " " + arguments + kw['arguments'] = arguments + match = kw.pop('match', self.match) + apply(TestCmd.run, [self], kw) + self._complete(self.stdout(), stdout, + self.stderr(), stderr, status, match) + + def skip_test(self, message="Skipping test.\n"): + """Skips a test. + + Proper test-skipping behavior is dependent on the external + TESTCOMMON_PASS_SKIPS environment variable. If set, we treat + the skip as a PASS (exit 0), and otherwise treat it as NO RESULT. + In either case, we print the specified message as an indication + that the substance of the test was skipped. + + (This was originally added to support development under Aegis. + Technically, skipping a test is a NO RESULT, but Aegis would + treat that as a test failure and prevent the change from going to + the next step. Since we ddn't want to force anyone using Aegis + to have to install absolutely every tool used by the tests, we + would actually report to Aegis that a skipped test has PASSED + so that the workflow isn't held up.) + """ + if message: + sys.stdout.write(message) + sys.stdout.flush() + pass_skips = os.environ.get('TESTCOMMON_PASS_SKIPS') + if pass_skips in [None, 0, '0']: + # skip=1 means skip this function when showing where this + # result came from. They only care about the line where the + # script called test.skip_test(), not the line number where + # we call test.no_result(). + self.no_result(skip=1) + else: + # We're under the development directory for this change, + # so this is an Aegis invocation; pass the test (exit 0). + self.pass_test() + +# Local Variables: +# tab-width:4 +# indent-tabs-mode:nil +# End: +# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/deps/gyp/test/lib/TestGyp.py b/deps/gyp/test/lib/TestGyp.py new file mode 100644 index 0000000000..c59b811a8d --- /dev/null +++ b/deps/gyp/test/lib/TestGyp.py @@ -0,0 +1,1151 @@ +# 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. + +""" +TestGyp.py: a testing framework for GYP integration tests. +""" + +import collections +from contextlib import contextmanager +import itertools +import os +import re +import shutil +import subprocess +import sys +import tempfile + +import TestCmd +import TestCommon +from TestCommon import __all__ + +__all__.extend([ + 'TestGyp', +]) + + +def remove_debug_line_numbers(contents): + """Function to remove the line numbers from the debug output + of gyp and thus reduce the extreme fragility of the stdout + comparison tests. + """ + lines = contents.splitlines() + # split each line on ":" + lines = [l.split(":", 3) for l in lines] + # join each line back together while ignoring the + # 3rd column which is the line number + lines = [len(l) > 3 and ":".join(l[3:]) or l for l in lines] + return "\n".join(lines) + + +def match_modulo_line_numbers(contents_a, contents_b): + """File contents matcher that ignores line numbers.""" + contents_a = remove_debug_line_numbers(contents_a) + contents_b = remove_debug_line_numbers(contents_b) + return TestCommon.match_exact(contents_a, contents_b) + + +@contextmanager +def LocalEnv(local_env): + """Context manager to provide a local OS environment.""" + old_env = os.environ.copy() + os.environ.update(local_env) + try: + yield + finally: + os.environ.clear() + os.environ.update(old_env) + + +class TestGypBase(TestCommon.TestCommon): + """ + Class for controlling end-to-end tests of gyp generators. + + Instantiating this class will create a temporary directory and + arrange for its destruction (via the TestCmd superclass) and + copy all of the non-gyptest files in the directory hierarchy of the + executing script. + + The default behavior is to test the 'gyp' or 'gyp.bat' file in the + current directory. An alternative may be specified explicitly on + instantiation, or by setting the TESTGYP_GYP environment variable. + + This class should be subclassed for each supported gyp generator + (format). Various abstract methods below define calling signatures + used by the test scripts to invoke builds on the generated build + configuration and to run executables generated by those builds. + """ + + formats = [] + build_tool = None + build_tool_list = [] + + _exe = TestCommon.exe_suffix + _obj = TestCommon.obj_suffix + shobj_ = TestCommon.shobj_prefix + _shobj = TestCommon.shobj_suffix + lib_ = TestCommon.lib_prefix + _lib = TestCommon.lib_suffix + dll_ = TestCommon.dll_prefix + _dll = TestCommon.dll_suffix + module_ = TestCommon.module_prefix + _module = TestCommon.module_suffix + + # Constants to represent different targets. + ALL = '__all__' + DEFAULT = '__default__' + + # Constants for different target types. + EXECUTABLE = '__executable__' + STATIC_LIB = '__static_lib__' + SHARED_LIB = '__shared_lib__' + LOADABLE_MODULE = '__loadable_module__' + + def __init__(self, gyp=None, *args, **kw): + self.origin_cwd = os.path.abspath(os.path.dirname(sys.argv[0])) + self.extra_args = sys.argv[1:] + + if not gyp: + gyp = os.environ.get('TESTGYP_GYP') + if not gyp: + if sys.platform == 'win32': + gyp = 'gyp.bat' + else: + gyp = 'gyp' + self.gyp = os.path.abspath(gyp) + self.no_parallel = False + + self.formats = [self.format] + + self.initialize_build_tool() + + kw.setdefault('match', TestCommon.match_exact) + + # Put test output in out/testworkarea by default. + # Use temporary names so there are no collisions. + workdir = os.path.join('out', kw.get('workdir', 'testworkarea')) + # Create work area if it doesn't already exist. + if not os.path.isdir(workdir): + os.makedirs(workdir) + + kw['workdir'] = tempfile.mktemp(prefix='testgyp.', dir=workdir) + + formats = kw.pop('formats', []) + + super(TestGypBase, self).__init__(*args, **kw) + + real_format = self.format.split('-')[-1] + excluded_formats = set([f for f in formats if f[0] == '!']) + included_formats = set(formats) - excluded_formats + if ('!'+real_format in excluded_formats or + included_formats and real_format not in included_formats): + msg = 'Invalid test for %r format; skipping test.\n' + self.skip_test(msg % self.format) + + self.copy_test_configuration(self.origin_cwd, self.workdir) + self.set_configuration(None) + + # Set $HOME so that gyp doesn't read the user's actual + # ~/.gyp/include.gypi file, which may contain variables + # and other settings that would change the output. + os.environ['HOME'] = self.workpath() + # Clear $GYP_DEFINES for the same reason. + if 'GYP_DEFINES' in os.environ: + del os.environ['GYP_DEFINES'] + # Override the user's language settings, which could + # otherwise make the output vary from what is expected. + os.environ['LC_ALL'] = 'C' + + def built_file_must_exist(self, name, type=None, **kw): + """ + Fails the test if the specified built file name does not exist. + """ + return self.must_exist(self.built_file_path(name, type, **kw)) + + def built_file_must_not_exist(self, name, type=None, **kw): + """ + Fails the test if the specified built file name exists. + """ + return self.must_not_exist(self.built_file_path(name, type, **kw)) + + def built_file_must_match(self, name, contents, **kw): + """ + Fails the test if the contents of the specified built file name + do not match the specified contents. + """ + return self.must_match(self.built_file_path(name, **kw), contents) + + def built_file_must_not_match(self, name, contents, **kw): + """ + Fails the test if the contents of the specified built file name + match the specified contents. + """ + return self.must_not_match(self.built_file_path(name, **kw), contents) + + def built_file_must_not_contain(self, name, contents, **kw): + """ + Fails the test if the specified built file name contains the specified + contents. + """ + return self.must_not_contain(self.built_file_path(name, **kw), contents) + + def copy_test_configuration(self, source_dir, dest_dir): + """ + Copies the test configuration from the specified source_dir + (the directory in which the test script lives) to the + specified dest_dir (a temporary working directory). + + This ignores all files and directories that begin with + the string 'gyptest', and all '.svn' subdirectories. + """ + for root, dirs, files in os.walk(source_dir): + if '.svn' in dirs: + dirs.remove('.svn') + dirs = [ d for d in dirs if not d.startswith('gyptest') ] + files = [ f for f in files if not f.startswith('gyptest') ] + for dirname in dirs: + source = os.path.join(root, dirname) + destination = source.replace(source_dir, dest_dir) + os.mkdir(destination) + if sys.platform != 'win32': + shutil.copystat(source, destination) + for filename in files: + source = os.path.join(root, filename) + destination = source.replace(source_dir, dest_dir) + shutil.copy2(source, destination) + + def initialize_build_tool(self): + """ + Initializes the .build_tool attribute. + + Searches the .build_tool_list for an executable name on the user's + $PATH. The first tool on the list is used as-is if nothing is found + on the current $PATH. + """ + for build_tool in self.build_tool_list: + if not build_tool: + continue + if os.path.isabs(build_tool): + self.build_tool = build_tool + return + build_tool = self.where_is(build_tool) + if build_tool: + self.build_tool = build_tool + return + + if self.build_tool_list: + self.build_tool = self.build_tool_list[0] + + def relocate(self, source, destination): + """ + Renames (relocates) the specified source (usually a directory) + to the specified destination, creating the destination directory + first if necessary. + + Note: Don't use this as a generic "rename" operation. In the + future, "relocating" parts of a GYP tree may affect the state of + the test to modify the behavior of later method calls. + """ + destination_dir = os.path.dirname(destination) + if not os.path.exists(destination_dir): + self.subdir(destination_dir) + os.rename(source, destination) + + def report_not_up_to_date(self): + """ + Reports that a build is not up-to-date. + + This provides common reporting for formats that have complicated + conditions for checking whether a build is up-to-date. Formats + that expect exact output from the command (make) can + just set stdout= when they call the run_build() method. + """ + print "Build is not up-to-date:" + print self.banner('STDOUT ') + print self.stdout() + stderr = self.stderr() + if stderr: + print self.banner('STDERR ') + print stderr + + def run_gyp(self, gyp_file, *args, **kw): + """ + Runs gyp against the specified gyp_file with the specified args. + """ + + # When running gyp, and comparing its output we use a comparitor + # that ignores the line numbers that gyp logs in its debug output. + if kw.pop('ignore_line_numbers', False): + kw.setdefault('match', match_modulo_line_numbers) + + # TODO: --depth=. works around Chromium-specific tree climbing. + depth = kw.pop('depth', '.') + run_args = ['--depth='+depth] + run_args.extend(['--format='+f for f in self.formats]); + run_args.append(gyp_file) + if self.no_parallel: + run_args += ['--no-parallel'] + # TODO: if extra_args contains a '--build' flag + # we really want that to only apply to the last format (self.format). + run_args.extend(self.extra_args) + # Default xcode_ninja_target_pattern to ^.*$ to fix xcode-ninja tests + xcode_ninja_target_pattern = kw.pop('xcode_ninja_target_pattern', '.*') + run_args.extend( + ['-G', 'xcode_ninja_target_pattern=%s' % xcode_ninja_target_pattern]) + run_args.extend(args) + return self.run(program=self.gyp, arguments=run_args, **kw) + + def run(self, *args, **kw): + """ + Executes a program by calling the superclass .run() method. + + This exists to provide a common place to filter out keyword + arguments implemented in this layer, without having to update + the tool-specific subclasses or clutter the tests themselves + with platform-specific code. + """ + if kw.has_key('SYMROOT'): + del kw['SYMROOT'] + super(TestGypBase, self).run(*args, **kw) + + def set_configuration(self, configuration): + """ + Sets the configuration, to be used for invoking the build + tool and testing potential built output. + """ + self.configuration = configuration + + def configuration_dirname(self): + if self.configuration: + return self.configuration.split('|')[0] + else: + return 'Default' + + def configuration_buildname(self): + if self.configuration: + return self.configuration + else: + return 'Default' + + # + # Abstract methods to be defined by format-specific subclasses. + # + + def build(self, gyp_file, target=None, **kw): + """ + Runs a build of the specified target against the configuration + generated from the specified gyp_file. + + A 'target' argument of None or the special value TestGyp.DEFAULT + specifies the default argument for the underlying build tool. + A 'target' argument of TestGyp.ALL specifies the 'all' target + (if any) of the underlying build tool. + """ + raise NotImplementedError + + def built_file_path(self, name, type=None, **kw): + """ + Returns a path to the specified file name, of the specified type. + """ + raise NotImplementedError + + def built_file_basename(self, name, type=None, **kw): + """ + Returns the base name of the specified file name, of the specified type. + + A bare=True keyword argument specifies that prefixes and suffixes shouldn't + be applied. + """ + if not kw.get('bare'): + if type == self.EXECUTABLE: + name = name + self._exe + elif type == self.STATIC_LIB: + name = self.lib_ + name + self._lib + elif type == self.SHARED_LIB: + name = self.dll_ + name + self._dll + elif type == self.LOADABLE_MODULE: + name = self.module_ + name + self._module + return name + + def run_built_executable(self, name, *args, **kw): + """ + Runs an executable program built from a gyp-generated configuration. + + The specified name should be independent of any particular generator. + Subclasses should find the output executable in the appropriate + output build directory, tack on any necessary executable suffix, etc. + """ + raise NotImplementedError + + def up_to_date(self, gyp_file, target=None, **kw): + """ + Verifies that a build of the specified target is up to date. + + The subclass should implement this by calling build() + (or a reasonable equivalent), checking whatever conditions + will tell it the build was an "up to date" null build, and + failing if it isn't. + """ + raise NotImplementedError + + +class TestGypGypd(TestGypBase): + """ + Subclass for testing the GYP 'gypd' generator (spit out the + internal data structure as pretty-printed Python). + """ + format = 'gypd' + def __init__(self, gyp=None, *args, **kw): + super(TestGypGypd, self).__init__(*args, **kw) + # gypd implies the use of 'golden' files, so parallelizing conflicts as it + # causes ordering changes. + self.no_parallel = True + + +class TestGypCustom(TestGypBase): + """ + Subclass for testing the GYP with custom generator + """ + + def __init__(self, gyp=None, *args, **kw): + self.format = kw.pop("format") + super(TestGypCustom, self).__init__(*args, **kw) + + +class TestGypCMake(TestGypBase): + """ + Subclass for testing the GYP CMake generator, using cmake's ninja backend. + """ + format = 'cmake' + build_tool_list = ['cmake'] + ALL = 'all' + + def cmake_build(self, gyp_file, target=None, **kw): + arguments = kw.get('arguments', [])[:] + + self.build_tool_list = ['cmake'] + self.initialize_build_tool() + + chdir = os.path.join(kw.get('chdir', '.'), + 'out', + self.configuration_dirname()) + kw['chdir'] = chdir + + arguments.append('-G') + arguments.append('Ninja') + + kw['arguments'] = arguments + + stderr = kw.get('stderr', None) + if stderr: + kw['stderr'] = stderr.split('$$$')[0] + + self.run(program=self.build_tool, **kw) + + def ninja_build(self, gyp_file, target=None, **kw): + arguments = kw.get('arguments', [])[:] + + self.build_tool_list = ['ninja'] + self.initialize_build_tool() + + # Add a -C output/path to the command line. + arguments.append('-C') + arguments.append(os.path.join('out', self.configuration_dirname())) + + if target not in (None, self.DEFAULT): + arguments.append(target) + + kw['arguments'] = arguments + + stderr = kw.get('stderr', None) + if stderr: + stderrs = stderr.split('$$$') + kw['stderr'] = stderrs[1] if len(stderrs) > 1 else '' + + return self.run(program=self.build_tool, **kw) + + def build(self, gyp_file, target=None, status=0, **kw): + # Two tools must be run to build, cmake and the ninja. + # Allow cmake to succeed when the overall expectation is to fail. + if status is None: + kw['status'] = None + else: + if not isinstance(status, collections.Iterable): status = (status,) + kw['status'] = list(itertools.chain((0,), status)) + self.cmake_build(gyp_file, target, **kw) + kw['status'] = status + self.ninja_build(gyp_file, target, **kw) + + def run_built_executable(self, name, *args, **kw): + # Enclosing the name in a list avoids prepending the original dir. + program = [self.built_file_path(name, type=self.EXECUTABLE, **kw)] + if sys.platform == 'darwin': + configuration = self.configuration_dirname() + os.environ['DYLD_LIBRARY_PATH'] = os.path.join('out', configuration) + return self.run(program=program, *args, **kw) + + def built_file_path(self, name, type=None, **kw): + result = [] + chdir = kw.get('chdir') + if chdir: + result.append(chdir) + result.append('out') + result.append(self.configuration_dirname()) + if type == self.STATIC_LIB: + if sys.platform != 'darwin': + result.append('obj.target') + elif type == self.SHARED_LIB: + if sys.platform != 'darwin' and sys.platform != 'win32': + result.append('lib.target') + subdir = kw.get('subdir') + if subdir and type != self.SHARED_LIB: + result.append(subdir) + result.append(self.built_file_basename(name, type, **kw)) + return self.workpath(*result) + + def up_to_date(self, gyp_file, target=None, **kw): + result = self.ninja_build(gyp_file, target, **kw) + if not result: + stdout = self.stdout() + if 'ninja: no work to do' not in stdout: + self.report_not_up_to_date() + self.fail_test() + return result + + +class TestGypMake(TestGypBase): + """ + Subclass for testing the GYP Make generator. + """ + format = 'make' + build_tool_list = ['make'] + ALL = 'all' + def build(self, gyp_file, target=None, **kw): + """ + Runs a Make build using the Makefiles generated from the specified + gyp_file. + """ + arguments = kw.get('arguments', [])[:] + if self.configuration: + arguments.append('BUILDTYPE=' + self.configuration) + if target not in (None, self.DEFAULT): + arguments.append(target) + # Sub-directory builds provide per-gyp Makefiles (i.e. + # Makefile.gyp_filename), so use that if there is no Makefile. + chdir = kw.get('chdir', '') + if not os.path.exists(os.path.join(chdir, 'Makefile')): + print "NO Makefile in " + os.path.join(chdir, 'Makefile') + arguments.insert(0, '-f') + arguments.insert(1, os.path.splitext(gyp_file)[0] + '.Makefile') + kw['arguments'] = arguments + return self.run(program=self.build_tool, **kw) + def up_to_date(self, gyp_file, target=None, **kw): + """ + Verifies that a build of the specified Make target is up to date. + """ + if target in (None, self.DEFAULT): + message_target = 'all' + else: + message_target = target + kw['stdout'] = "make: Nothing to be done for `%s'.\n" % message_target + return self.build(gyp_file, target, **kw) + def run_built_executable(self, name, *args, **kw): + """ + Runs an executable built by Make. + """ + configuration = self.configuration_dirname() + libdir = os.path.join('out', configuration, 'lib') + # TODO(piman): when everything is cross-compile safe, remove lib.target + if sys.platform == 'darwin': + # Mac puts target shared libraries right in the product directory. + configuration = self.configuration_dirname() + os.environ['DYLD_LIBRARY_PATH'] = ( + libdir + '.host:' + os.path.join('out', configuration)) + else: + os.environ['LD_LIBRARY_PATH'] = libdir + '.host:' + libdir + '.target' + # Enclosing the name in a list avoids prepending the original dir. + program = [self.built_file_path(name, type=self.EXECUTABLE, **kw)] + return self.run(program=program, *args, **kw) + def built_file_path(self, name, type=None, **kw): + """ + Returns a path to the specified file name, of the specified type, + as built by Make. + + Built files are in the subdirectory 'out/{configuration}'. + The default is 'out/Default'. + + A chdir= keyword argument specifies the source directory + relative to which the output subdirectory can be found. + + "type" values of STATIC_LIB or SHARED_LIB append the necessary + prefixes and suffixes to a platform-independent library base name. + + A subdir= keyword argument specifies a library subdirectory within + the default 'obj.target'. + """ + result = [] + chdir = kw.get('chdir') + if chdir: + result.append(chdir) + configuration = self.configuration_dirname() + result.extend(['out', configuration]) + if type == self.STATIC_LIB and sys.platform != 'darwin': + result.append('obj.target') + elif type == self.SHARED_LIB and sys.platform != 'darwin': + result.append('lib.target') + subdir = kw.get('subdir') + if subdir and type != self.SHARED_LIB: + result.append(subdir) + result.append(self.built_file_basename(name, type, **kw)) + return self.workpath(*result) + + +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 FindMSBuildInstallation(msvs_version = 'auto'): + """Returns path to MSBuild for msvs_version or latest available. + + Looks in the registry to find install location of MSBuild. + MSBuild before v4.0 will not build c++ projects, so only use newer versions. + """ + import TestWin + registry = TestWin.Registry() + + msvs_to_msbuild = { + '2013': r'12.0', + '2012': r'4.0', # Really v4.0.30319 which comes with .NET 4.5. + '2010': r'4.0'} + + msbuild_basekey = r'HKLM\SOFTWARE\Microsoft\MSBuild\ToolsVersions' + if not registry.KeyExists(msbuild_basekey): + print 'Error: could not find MSBuild base registry entry' + return None + + msbuild_version = None + if msvs_version in msvs_to_msbuild: + msbuild_test_version = msvs_to_msbuild[msvs_version] + if registry.KeyExists(msbuild_basekey + '\\' + msbuild_test_version): + msbuild_version = msbuild_test_version + else: + print ('Warning: Environment variable GYP_MSVS_VERSION specifies "%s" ' + 'but corresponding MSBuild "%s" was not found.' % + (msvs_version, msbuild_version)) + if not msbuild_version: + for msvs_version in sorted(msvs_to_msbuild, reverse=True): + msbuild_test_version = msvs_to_msbuild[msvs_version] + if registry.KeyExists(msbuild_basekey + '\\' + msbuild_test_version): + msbuild_version = msbuild_test_version + break + if not msbuild_version: + print 'Error: could not find MSBuild registry entry' + return None + + msbuild_path = registry.GetValue(msbuild_basekey + '\\' + msbuild_version, + 'MSBuildToolsPath') + if not msbuild_path: + print 'Error: could not get MSBuild registry entry value' + return None + + return os.path.join(msbuild_path, 'MSBuild.exe') + + +def FindVisualStudioInstallation(): + """Returns appropriate values for .build_tool and .uses_msbuild fields + of TestGypBase for Visual Studio. + + We use the value specified by GYP_MSVS_VERSION. If not specified, we + search %PATH% and %PATHEXT% for a devenv.{exe,bat,...} executable. + Failing that, we search for likely deployment paths. + """ + possible_roots = ['%s:\\Program Files%s' % (chr(drive), suffix) + for drive in range(ord('C'), ord('Z') + 1) + for suffix in ['', ' (x86)']] + possible_paths = { + '2013': r'Microsoft Visual Studio 12.0\Common7\IDE\devenv.com', + '2012': r'Microsoft Visual Studio 11.0\Common7\IDE\devenv.com', + '2010': r'Microsoft Visual Studio 10.0\Common7\IDE\devenv.com', + '2008': r'Microsoft Visual Studio 9.0\Common7\IDE\devenv.com', + '2005': r'Microsoft Visual Studio 8\Common7\IDE\devenv.com'} + + possible_roots = [ConvertToCygpath(r) for r in possible_roots] + + msvs_version = 'auto' + for flag in (f for f in sys.argv if f.startswith('msvs_version=')): + msvs_version = flag.split('=')[-1] + msvs_version = os.environ.get('GYP_MSVS_VERSION', msvs_version) + + if msvs_version in possible_paths: + # Check that the path to the specified GYP_MSVS_VERSION exists. + path = possible_paths[msvs_version] + for r in possible_roots: + build_tool = os.path.join(r, path) + if os.path.exists(build_tool): + uses_msbuild = msvs_version >= '2010' + msbuild_path = FindMSBuildInstallation(msvs_version) + return build_tool, uses_msbuild, msbuild_path + else: + print ('Warning: Environment variable GYP_MSVS_VERSION specifies "%s" ' + 'but corresponding "%s" was not found.' % (msvs_version, path)) + # Neither GYP_MSVS_VERSION nor the path help us out. Iterate through + # the choices looking for a match. + for version in sorted(possible_paths, reverse=True): + path = possible_paths[version] + for r in possible_roots: + build_tool = os.path.join(r, path) + if os.path.exists(build_tool): + uses_msbuild = msvs_version >= '2010' + msbuild_path = FindMSBuildInstallation(msvs_version) + return build_tool, uses_msbuild, msbuild_path + print 'Error: could not find devenv' + sys.exit(1) + +class TestGypOnMSToolchain(TestGypBase): + """ + Common subclass for testing generators that target the Microsoft Visual + Studio toolchain (cl, link, dumpbin, etc.) + """ + @staticmethod + def _ComputeVsvarsPath(devenv_path): + devenv_dir = os.path.split(devenv_path)[0] + vsvars_path = os.path.join(devenv_path, '../../Tools/vsvars32.bat') + return vsvars_path + + def initialize_build_tool(self): + super(TestGypOnMSToolchain, self).initialize_build_tool() + if sys.platform in ('win32', 'cygwin'): + build_tools = FindVisualStudioInstallation() + self.devenv_path, self.uses_msbuild, self.msbuild_path = build_tools + self.vsvars_path = TestGypOnMSToolchain._ComputeVsvarsPath( + self.devenv_path) + + def run_dumpbin(self, *dumpbin_args): + """Run the dumpbin tool with the specified arguments, and capturing and + returning stdout.""" + assert sys.platform in ('win32', 'cygwin') + cmd = os.environ.get('COMSPEC', 'cmd.exe') + arguments = [cmd, '/c', self.vsvars_path, '&&', 'dumpbin'] + arguments.extend(dumpbin_args) + proc = subprocess.Popen(arguments, stdout=subprocess.PIPE) + output = proc.communicate()[0] + assert not proc.returncode + return output + +class TestGypNinja(TestGypOnMSToolchain): + """ + Subclass for testing the GYP Ninja generator. + """ + format = 'ninja' + build_tool_list = ['ninja'] + ALL = 'all' + DEFAULT = 'all' + + def run_gyp(self, gyp_file, *args, **kw): + TestGypBase.run_gyp(self, gyp_file, *args, **kw) + + def build(self, gyp_file, target=None, **kw): + arguments = kw.get('arguments', [])[:] + + # Add a -C output/path to the command line. + arguments.append('-C') + arguments.append(os.path.join('out', self.configuration_dirname())) + + if target is None: + target = 'all' + arguments.append(target) + + kw['arguments'] = arguments + return self.run(program=self.build_tool, **kw) + + def run_built_executable(self, name, *args, **kw): + # Enclosing the name in a list avoids prepending the original dir. + program = [self.built_file_path(name, type=self.EXECUTABLE, **kw)] + if sys.platform == 'darwin': + configuration = self.configuration_dirname() + os.environ['DYLD_LIBRARY_PATH'] = os.path.join('out', configuration) + return self.run(program=program, *args, **kw) + + def built_file_path(self, name, type=None, **kw): + result = [] + chdir = kw.get('chdir') + if chdir: + result.append(chdir) + result.append('out') + result.append(self.configuration_dirname()) + if type == self.STATIC_LIB: + if sys.platform != 'darwin': + result.append('obj') + elif type == self.SHARED_LIB: + if sys.platform != 'darwin' and sys.platform != 'win32': + result.append('lib') + subdir = kw.get('subdir') + if subdir and type != self.SHARED_LIB: + result.append(subdir) + result.append(self.built_file_basename(name, type, **kw)) + return self.workpath(*result) + + def up_to_date(self, gyp_file, target=None, **kw): + result = self.build(gyp_file, target, **kw) + if not result: + stdout = self.stdout() + if 'ninja: no work to do' not in stdout: + self.report_not_up_to_date() + self.fail_test() + return result + + +class TestGypMSVS(TestGypOnMSToolchain): + """ + Subclass for testing the GYP Visual Studio generator. + """ + format = 'msvs' + + u = r'=== Build: 0 succeeded, 0 failed, (\d+) up-to-date, 0 skipped ===' + up_to_date_re = re.compile(u, re.M) + + # Initial None element will indicate to our .initialize_build_tool() + # method below that 'devenv' was not found on %PATH%. + # + # Note: we must use devenv.com to be able to capture build output. + # Directly executing devenv.exe only sends output to BuildLog.htm. + build_tool_list = [None, 'devenv.com'] + + def initialize_build_tool(self): + super(TestGypMSVS, self).initialize_build_tool() + self.build_tool = self.devenv_path + + def build(self, gyp_file, target=None, rebuild=False, clean=False, **kw): + """ + Runs a Visual Studio build using the configuration generated + from the specified gyp_file. + """ + configuration = self.configuration_buildname() + if clean: + build = '/Clean' + elif rebuild: + build = '/Rebuild' + else: + build = '/Build' + arguments = kw.get('arguments', [])[:] + arguments.extend([gyp_file.replace('.gyp', '.sln'), + build, configuration]) + # Note: the Visual Studio generator doesn't add an explicit 'all' + # target, so we just treat it the same as the default. + if target not in (None, self.ALL, self.DEFAULT): + arguments.extend(['/Project', target]) + if self.configuration: + arguments.extend(['/ProjectConfig', self.configuration]) + kw['arguments'] = arguments + return self.run(program=self.build_tool, **kw) + def up_to_date(self, gyp_file, target=None, **kw): + """ + Verifies that a build of the specified Visual Studio target is up to date. + + Beware that VS2010 will behave strangely if you build under + C:\USERS\yourname\AppData\Local. It will cause needless work. The ouptut + will be "1 succeeded and 0 up to date". MSBuild tracing reveals that: + "Project 'C:\Users\...\AppData\Local\...vcxproj' not up to date because + 'C:\PROGRAM FILES (X86)\MICROSOFT VISUAL STUDIO 10.0\VC\BIN\1033\CLUI.DLL' + was modified at 02/21/2011 17:03:30, which is newer than '' which was + modified at 01/01/0001 00:00:00. + + The workaround is to specify a workdir when instantiating the test, e.g. + test = TestGyp.TestGyp(workdir='workarea') + """ + result = self.build(gyp_file, target, **kw) + if not result: + stdout = self.stdout() + + m = self.up_to_date_re.search(stdout) + up_to_date = m and int(m.group(1)) > 0 + if not up_to_date: + self.report_not_up_to_date() + self.fail_test() + return result + def run_built_executable(self, name, *args, **kw): + """ + Runs an executable built by Visual Studio. + """ + configuration = self.configuration_dirname() + # Enclosing the name in a list avoids prepending the original dir. + program = [self.built_file_path(name, type=self.EXECUTABLE, **kw)] + return self.run(program=program, *args, **kw) + def built_file_path(self, name, type=None, **kw): + """ + Returns a path to the specified file name, of the specified type, + as built by Visual Studio. + + Built files are in a subdirectory that matches the configuration + name. The default is 'Default'. + + A chdir= keyword argument specifies the source directory + relative to which the output subdirectory can be found. + + "type" values of STATIC_LIB or SHARED_LIB append the necessary + prefixes and suffixes to a platform-independent library base name. + """ + result = [] + chdir = kw.get('chdir') + if chdir: + result.append(chdir) + result.append(self.configuration_dirname()) + if type == self.STATIC_LIB: + result.append('lib') + result.append(self.built_file_basename(name, type, **kw)) + return self.workpath(*result) + + +class TestGypMSVSNinja(TestGypNinja): + """ + Subclass for testing the GYP Visual Studio Ninja generator. + """ + format = 'msvs-ninja' + + def initialize_build_tool(self): + super(TestGypMSVSNinja, self).initialize_build_tool() + # When using '--build', make sure ninja is first in the format list. + self.formats.insert(0, 'ninja') + + def build(self, gyp_file, target=None, rebuild=False, clean=False, **kw): + """ + Runs a Visual Studio build using the configuration generated + from the specified gyp_file. + """ + arguments = kw.get('arguments', [])[:] + if target in (None, self.ALL, self.DEFAULT): + # Note: the Visual Studio generator doesn't add an explicit 'all' target. + # This will build each project. This will work if projects are hermetic, + # but may fail if they are not (a project may run more than once). + # It would be nice to supply an all.metaproj for MSBuild. + arguments.extend([gyp_file.replace('.gyp', '.sln')]) + else: + # MSBuild documentation claims that one can specify a sln but then build a + # project target like 'msbuild a.sln /t:proj:target' but this format only + # supports 'Clean', 'Rebuild', and 'Publish' (with none meaning Default). + # This limitation is due to the .sln -> .sln.metaproj conversion. + # The ':' is not special, 'proj:target' is a target in the metaproj. + arguments.extend([target+'.vcxproj']) + + if clean: + build = 'Clean' + elif rebuild: + build = 'Rebuild' + else: + build = 'Build' + arguments.extend(['/target:'+build]) + configuration = self.configuration_buildname() + config = configuration.split('|') + arguments.extend(['/property:Configuration='+config[0]]) + if len(config) > 1: + arguments.extend(['/property:Platform='+config[1]]) + arguments.extend(['/property:BuildInParallel=false']) + arguments.extend(['/verbosity:minimal']) + + kw['arguments'] = arguments + return self.run(program=self.msbuild_path, **kw) + + +class TestGypXcode(TestGypBase): + """ + Subclass for testing the GYP Xcode generator. + """ + format = 'xcode' + build_tool_list = ['xcodebuild'] + + phase_script_execution = ("\n" + "PhaseScriptExecution /\\S+/Script-[0-9A-F]+\\.sh\n" + " cd /\\S+\n" + " /bin/sh -c /\\S+/Script-[0-9A-F]+\\.sh\n" + "(make: Nothing to be done for `all'\\.\n)?") + + strip_up_to_date_expressions = [ + # Various actions or rules can run even when the overall build target + # is up to date. Strip those phases' GYP-generated output. + re.compile(phase_script_execution, re.S), + + # The message from distcc_pump can trail the "BUILD SUCCEEDED" + # message, so strip that, too. + re.compile('__________Shutting down distcc-pump include server\n', re.S), + ] + + up_to_date_endings = ( + 'Checking Dependencies...\n** BUILD SUCCEEDED **\n', # Xcode 3.0/3.1 + 'Check dependencies\n** BUILD SUCCEEDED **\n\n', # Xcode 3.2 + 'Check dependencies\n\n\n** BUILD SUCCEEDED **\n\n', # Xcode 4.2 + 'Check dependencies\n\n** BUILD SUCCEEDED **\n\n', # Xcode 5.0 + ) + + def build(self, gyp_file, target=None, **kw): + """ + Runs an xcodebuild using the .xcodeproj generated from the specified + gyp_file. + """ + # Be sure we're working with a copy of 'arguments' since we modify it. + # The caller may not be expecting it to be modified. + arguments = kw.get('arguments', [])[:] + arguments.extend(['-project', gyp_file.replace('.gyp', '.xcodeproj')]) + if target == self.ALL: + arguments.append('-alltargets',) + elif target not in (None, self.DEFAULT): + arguments.extend(['-target', target]) + if self.configuration: + arguments.extend(['-configuration', self.configuration]) + symroot = kw.get('SYMROOT', '$SRCROOT/build') + if symroot: + arguments.append('SYMROOT='+symroot) + kw['arguments'] = arguments + + # Work around spurious stderr output from Xcode 4, http://crbug.com/181012 + match = kw.pop('match', self.match) + def match_filter_xcode(actual, expected): + if actual: + if not TestCmd.is_List(actual): + actual = actual.split('\n') + if not TestCmd.is_List(expected): + expected = expected.split('\n') + actual = [a for a in actual + if 'No recorder, buildTask: <Xcode3BuildTask:' not in a] + return match(actual, expected) + kw['match'] = match_filter_xcode + + return self.run(program=self.build_tool, **kw) + def up_to_date(self, gyp_file, target=None, **kw): + """ + Verifies that a build of the specified Xcode target is up to date. + """ + result = self.build(gyp_file, target, **kw) + if not result: + output = self.stdout() + for expression in self.strip_up_to_date_expressions: + output = expression.sub('', output) + if not output.endswith(self.up_to_date_endings): + self.report_not_up_to_date() + self.fail_test() + return result + def run_built_executable(self, name, *args, **kw): + """ + Runs an executable built by xcodebuild. + """ + configuration = self.configuration_dirname() + os.environ['DYLD_LIBRARY_PATH'] = os.path.join('build', configuration) + # Enclosing the name in a list avoids prepending the original dir. + program = [self.built_file_path(name, type=self.EXECUTABLE, **kw)] + return self.run(program=program, *args, **kw) + def built_file_path(self, name, type=None, **kw): + """ + Returns a path to the specified file name, of the specified type, + as built by Xcode. + + Built files are in the subdirectory 'build/{configuration}'. + The default is 'build/Default'. + + A chdir= keyword argument specifies the source directory + relative to which the output subdirectory can be found. + + "type" values of STATIC_LIB or SHARED_LIB append the necessary + prefixes and suffixes to a platform-independent library base name. + """ + result = [] + chdir = kw.get('chdir') + if chdir: + result.append(chdir) + configuration = self.configuration_dirname() + result.extend(['build', configuration]) + result.append(self.built_file_basename(name, type, **kw)) + return self.workpath(*result) + + +class TestGypXcodeNinja(TestGypXcode): + """ + Subclass for testing the GYP Xcode Ninja generator. + """ + format = 'xcode-ninja' + + def initialize_build_tool(self): + super(TestGypXcodeNinja, self).initialize_build_tool() + # When using '--build', make sure ninja is first in the format list. + self.formats.insert(0, 'ninja') + + def build(self, gyp_file, target=None, **kw): + """ + Runs an xcodebuild using the .xcodeproj generated from the specified + gyp_file. + """ + build_config = self.configuration + if build_config and build_config.endswith(('-iphoneos', + '-iphonesimulator')): + build_config, sdk = self.configuration.split('-') + kw['arguments'] = kw.get('arguments', []) + ['-sdk', sdk] + + with self._build_configuration(build_config): + return super(TestGypXcodeNinja, self).build( + gyp_file.replace('.gyp', '.ninja.gyp'), target, **kw) + + @contextmanager + def _build_configuration(self, build_config): + config = self.configuration + self.configuration = build_config + try: + yield + finally: + self.configuration = config + + def built_file_path(self, name, type=None, **kw): + result = [] + chdir = kw.get('chdir') + if chdir: + result.append(chdir) + result.append('out') + result.append(self.configuration_dirname()) + subdir = kw.get('subdir') + if subdir and type != self.SHARED_LIB: + result.append(subdir) + result.append(self.built_file_basename(name, type, **kw)) + return self.workpath(*result) + + def up_to_date(self, gyp_file, target=None, **kw): + result = self.build(gyp_file, target, **kw) + if not result: + stdout = self.stdout() + if 'ninja: no work to do' not in stdout: + self.report_not_up_to_date() + self.fail_test() + return result + + def run_built_executable(self, name, *args, **kw): + """ + Runs an executable built by xcodebuild + ninja. + """ + configuration = self.configuration_dirname() + os.environ['DYLD_LIBRARY_PATH'] = os.path.join('out', configuration) + # Enclosing the name in a list avoids prepending the original dir. + program = [self.built_file_path(name, type=self.EXECUTABLE, **kw)] + return self.run(program=program, *args, **kw) + + +format_class_list = [ + TestGypGypd, + TestGypCMake, + TestGypMake, + TestGypMSVS, + TestGypMSVSNinja, + TestGypNinja, + TestGypXcode, + TestGypXcodeNinja, +] + +def TestGyp(*args, **kw): + """ + Returns an appropriate TestGyp* instance for a specified GYP format. + """ + format = kw.pop('format', os.environ.get('TESTGYP_FORMAT')) + for format_class in format_class_list: + if format == format_class.format: + return format_class(*args, **kw) + raise Exception, "unknown format %r" % format diff --git a/deps/gyp/test/lib/TestMac.py b/deps/gyp/test/lib/TestMac.py new file mode 100644 index 0000000000..68605d77b1 --- /dev/null +++ b/deps/gyp/test/lib/TestMac.py @@ -0,0 +1,73 @@ +# Copyright (c) 2014 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. + +""" +TestMac.py: a collection of helper function shared between test on Mac OS X. +""" + +import re +import subprocess + +__all__ = ['Xcode', 'CheckFileType'] + + +def CheckFileType(test, file, archs): + """Check that |file| contains exactly |archs| or fails |test|.""" + proc = subprocess.Popen(['lipo', '-info', file], stdout=subprocess.PIPE) + o = proc.communicate()[0].strip() + assert not proc.returncode + if len(archs) == 1: + pattern = re.compile('^Non-fat file: (.*) is architecture: (.*)$') + else: + pattern = re.compile('^Architectures in the fat file: (.*) are: (.*)$') + match = pattern.match(o) + if match is None: + print 'Ouput does not match expected pattern: %s' % (pattern.pattern) + test.fail_test() + else: + found_file, found_archs = match.groups() + if found_file != file or set(found_archs.split()) != set(archs): + print 'Expected file %s with arch %s, got %s with arch %s' % ( + file, ' '.join(archs), found_file, found_archs) + test.fail_test() + + +class XcodeInfo(object): + """Simplify access to Xcode informations.""" + + def __init__(self): + self._cache = {} + + def _XcodeVersion(self): + lines = subprocess.check_output(['xcodebuild', '-version']).splitlines() + version = ''.join(lines[0].split()[-1].split('.')) + version = (version + '0' * (3 - len(version))).zfill(4) + return version, lines[-1].split()[-1] + + def Version(self): + if 'Version' not in self._cache: + self._cache['Version'], self._cache['Build'] = self._XcodeVersion() + return self._cache['Version'] + + def Build(self): + if 'Build' not in self._cache: + self._cache['Version'], self._cache['Build'] = self._XcodeVersion() + return self._cache['Build'] + + def SDKBuild(self): + if 'SDKBuild' not in self._cache: + self._cache['SDKBuild'] = subprocess.check_output( + ['xcodebuild', '-version', '-sdk', '', 'ProductBuildVersion']) + self._cache['SDKBuild'] = self._cache['SDKBuild'].rstrip('\n') + return self._cache['SDKBuild'] + + def SDKVersion(self): + if 'SDKVersion' not in self._cache: + self._cache['SDKVersion'] = subprocess.check_output( + ['xcodebuild', '-version', '-sdk', '', 'SDKVersion']) + self._cache['SDKVersion'] = self._cache['SDKVersion'].rstrip('\n') + return self._cache['SDKVersion'] + + +Xcode = XcodeInfo() diff --git a/deps/gyp/test/lib/TestWin.py b/deps/gyp/test/lib/TestWin.py new file mode 100644 index 0000000000..7627197b1f --- /dev/null +++ b/deps/gyp/test/lib/TestWin.py @@ -0,0 +1,101 @@ +# Copyright (c) 2014 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. + +""" +TestWin.py: a collection of helpers for testing on Windows. +""" + +import errno +import os +import re +import sys +import subprocess + +class Registry(object): + def _QueryBase(self, sysdir, key, value): + """Use reg.exe to read a particular key. + + While ideally we might use the win32 module, we would like gyp to be + python neutral, so for instance cygwin python lacks this module. + + Arguments: + sysdir: The system subdirectory to attempt to launch reg.exe from. + key: The registry key to read from. + value: The particular value to read. + Return: + stdout from reg.exe, or None for failure. + """ + # Skip if not on Windows or Python Win32 setup issue + if sys.platform not in ('win32', 'cygwin'): + return None + # Setup params to pass to and attempt to launch reg.exe + cmd = [os.path.join(os.environ.get('WINDIR', ''), sysdir, 'reg.exe'), + 'query', key] + if value: + cmd.extend(['/v', value]) + p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + # Get the stdout from reg.exe, reading to the end so p.returncode is valid + # Note that the error text may be in [1] in some cases + text = p.communicate()[0] + # Check return code from reg.exe; officially 0==success and 1==error + if p.returncode: + return None + return text + + def Query(self, key, value=None): + r"""Use reg.exe to read a particular key through _QueryBase. + + First tries to launch from %WinDir%\Sysnative to avoid WoW64 redirection. If + that fails, it falls back to System32. Sysnative is available on Vista and + up and available on Windows Server 2003 and XP through KB patch 942589. Note + that Sysnative will always fail if using 64-bit python due to it being a + virtual directory and System32 will work correctly in the first place. + + KB 942589 - http://support.microsoft.com/kb/942589/en-us. + + Arguments: + key: The registry key. + value: The particular registry value to read (optional). + Return: + stdout from reg.exe, or None for failure. + """ + text = None + try: + text = self._QueryBase('Sysnative', key, value) + except OSError, e: + if e.errno == errno.ENOENT: + text = self._QueryBase('System32', key, value) + else: + raise + return text + + def GetValue(self, key, value): + """Use reg.exe to obtain the value of a registry key. + + Args: + key: The registry key. + value: The particular registry value to read. + Return: + contents of the registry key's value, or None on failure. + """ + text = self.Query(key, value) + if not text: + return None + # Extract value. + match = re.search(r'REG_\w+\s+([^\r]+)\r\n', text) + if not match: + return None + return match.group(1) + + def KeyExists(self, key): + """Use reg.exe to see if a key exists. + + Args: + key: The registry key to check. + Return: + True if the key exists + """ + if not self.Query(key): + return False + return True diff --git a/deps/gyp/test/library/gyptest-shared-obj-install-path.py b/deps/gyp/test/library/gyptest-shared-obj-install-path.py new file mode 100755 index 0000000000..af335365f9 --- /dev/null +++ b/deps/gyp/test/library/gyptest-shared-obj-install-path.py @@ -0,0 +1,39 @@ +#!/usr/bin/env python + +# 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. + +""" +Verifies that .so files that are order only dependencies are specified by +their install location rather than by their alias. +""" + +# Python 2.5 needs this for the with statement. +from __future__ import with_statement + +import os +import TestGyp + +test = TestGyp.TestGyp(formats=['make']) + +test.run_gyp('shared_dependency.gyp', + chdir='src') +test.relocate('src', 'relocate/src') + +test.build('shared_dependency.gyp', test.ALL, chdir='relocate/src') + +makefile_path = 'relocate/src/Makefile' + +with open(makefile_path) as makefile: + make_contents = makefile.read() + +# If we remove the code to generate lib1, Make should still be able +# to build lib2 since lib1.so already exists. +make_contents = make_contents.replace('include lib1.target.mk', '') +with open(makefile_path, 'w') as makefile: + makefile.write(make_contents) + +test.build('shared_dependency.gyp', test.ALL, chdir='relocate/src') + +test.pass_test() diff --git a/deps/gyp/test/library/gyptest-shared.py b/deps/gyp/test/library/gyptest-shared.py new file mode 100755 index 0000000000..a1d2985d91 --- /dev/null +++ b/deps/gyp/test/library/gyptest-shared.py @@ -0,0 +1,84 @@ +#!/usr/bin/env python + +# Copyright (c) 2009 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. + +""" +Verifies simple build of a "Hello, world!" program with shared libraries, +including verifying that libraries are rebuilt correctly when functions +move between libraries. +""" + +import TestGyp + +test = TestGyp.TestGyp() + +test.run_gyp('library.gyp', + '-Dlibrary=shared_library', + '-Dmoveable_function=lib1', + chdir='src') + +test.relocate('src', 'relocate/src') + +test.build('library.gyp', test.ALL, chdir='relocate/src') + +expect = """\ +Hello from program.c +Hello from lib1.c +Hello from lib2.c +Hello from lib1_moveable.c +""" +test.run_built_executable('program', chdir='relocate/src', stdout=expect) + + +test.run_gyp('library.gyp', + '-Dlibrary=shared_library', + '-Dmoveable_function=lib2', + chdir='relocate/src') + +# Update program.c to force a rebuild. +test.sleep() +contents = test.read('relocate/src/program.c') +contents = contents.replace('Hello', 'Hello again') +test.write('relocate/src/program.c', contents) + +test.build('library.gyp', test.ALL, chdir='relocate/src') + +expect = """\ +Hello again from program.c +Hello from lib1.c +Hello from lib2.c +Hello from lib2_moveable.c +""" +test.run_built_executable('program', chdir='relocate/src', stdout=expect) + + +test.run_gyp('library.gyp', + '-Dlibrary=shared_library', + '-Dmoveable_function=lib1', + chdir='relocate/src') + +# Update program.c to force a rebuild. +test.sleep() +contents = test.read('relocate/src/program.c') +contents = contents.replace('again', 'again again') +test.write('relocate/src/program.c', contents) + +# TODO(sgk): we have to force a rebuild of lib2 so that it weeds out +# the "moved" module. This should be done in gyp by adding a dependency +# on the generated .vcproj file itself. +test.touch('relocate/src/lib2.c') + +test.build('library.gyp', test.ALL, chdir='relocate/src') + +expect = """\ +Hello again again from program.c +Hello from lib1.c +Hello from lib2.c +Hello from lib1_moveable.c +""" +test.run_built_executable('program', chdir='relocate/src', stdout=expect) + + +test.pass_test() diff --git a/deps/gyp/test/library/gyptest-static.py b/deps/gyp/test/library/gyptest-static.py new file mode 100755 index 0000000000..4bc71c4962 --- /dev/null +++ b/deps/gyp/test/library/gyptest-static.py @@ -0,0 +1,84 @@ +#!/usr/bin/env python + +# Copyright (c) 2009 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. + +""" +Verifies simple build of a "Hello, world!" program with static libraries, +including verifying that libraries are rebuilt correctly when functions +move between libraries. +""" + +import TestGyp + +test = TestGyp.TestGyp() + +test.run_gyp('library.gyp', + '-Dlibrary=static_library', + '-Dmoveable_function=lib1', + chdir='src') + +test.relocate('src', 'relocate/src') + +test.build('library.gyp', test.ALL, chdir='relocate/src') + +expect = """\ +Hello from program.c +Hello from lib1.c +Hello from lib2.c +Hello from lib1_moveable.c +""" +test.run_built_executable('program', chdir='relocate/src', stdout=expect) + + +test.run_gyp('library.gyp', + '-Dlibrary=static_library', + '-Dmoveable_function=lib2', + chdir='relocate/src') + +# Update program.c to force a rebuild. +test.sleep() +contents = test.read('relocate/src/program.c') +contents = contents.replace('Hello', 'Hello again') +test.write('relocate/src/program.c', contents) + +test.build('library.gyp', test.ALL, chdir='relocate/src') + +expect = """\ +Hello again from program.c +Hello from lib1.c +Hello from lib2.c +Hello from lib2_moveable.c +""" +test.run_built_executable('program', chdir='relocate/src', stdout=expect) + + +test.run_gyp('library.gyp', + '-Dlibrary=static_library', + '-Dmoveable_function=lib1', + chdir='relocate/src') + +# Update program.c and lib2.c to force a rebuild. +test.sleep() +contents = test.read('relocate/src/program.c') +contents = contents.replace('again', 'again again') +test.write('relocate/src/program.c', contents) + +# TODO(sgk): we have to force a rebuild of lib2 so that it weeds out +# the "moved" module. This should be done in gyp by adding a dependency +# on the generated .vcproj file itself. +test.touch('relocate/src/lib2.c') + +test.build('library.gyp', test.ALL, chdir='relocate/src') + +expect = """\ +Hello again again from program.c +Hello from lib1.c +Hello from lib2.c +Hello from lib1_moveable.c +""" +test.run_built_executable('program', chdir='relocate/src', stdout=expect) + + +test.pass_test() diff --git a/deps/gyp/test/library/src/lib1.c b/deps/gyp/test/library/src/lib1.c new file mode 100644 index 0000000000..3866b1b845 --- /dev/null +++ b/deps/gyp/test/library/src/lib1.c @@ -0,0 +1,10 @@ +#include <stdio.h> + +#ifdef _WIN32 +__declspec(dllexport) +#endif +void lib1_function(void) +{ + fprintf(stdout, "Hello from lib1.c\n"); + fflush(stdout); +} diff --git a/deps/gyp/test/library/src/lib1_moveable.c b/deps/gyp/test/library/src/lib1_moveable.c new file mode 100644 index 0000000000..5d3cc1d9aa --- /dev/null +++ b/deps/gyp/test/library/src/lib1_moveable.c @@ -0,0 +1,10 @@ +#include <stdio.h> + +#ifdef _WIN32 +__declspec(dllexport) +#endif +void moveable_function(void) +{ + fprintf(stdout, "Hello from lib1_moveable.c\n"); + fflush(stdout); +} diff --git a/deps/gyp/test/library/src/lib2.c b/deps/gyp/test/library/src/lib2.c new file mode 100644 index 0000000000..21dda72653 --- /dev/null +++ b/deps/gyp/test/library/src/lib2.c @@ -0,0 +1,10 @@ +#include <stdio.h> + +#ifdef _WIN32 +__declspec(dllexport) +#endif +void lib2_function(void) +{ + fprintf(stdout, "Hello from lib2.c\n"); + fflush(stdout); +} diff --git a/deps/gyp/test/library/src/lib2_moveable.c b/deps/gyp/test/library/src/lib2_moveable.c new file mode 100644 index 0000000000..f645071d1e --- /dev/null +++ b/deps/gyp/test/library/src/lib2_moveable.c @@ -0,0 +1,10 @@ +#include <stdio.h> + +#ifdef _WIN32 +__declspec(dllexport) +#endif +void moveable_function(void) +{ + fprintf(stdout, "Hello from lib2_moveable.c\n"); + fflush(stdout); +} diff --git a/deps/gyp/test/library/src/library.gyp b/deps/gyp/test/library/src/library.gyp new file mode 100644 index 0000000000..bc35516426 --- /dev/null +++ b/deps/gyp/test/library/src/library.gyp @@ -0,0 +1,58 @@ +# Copyright (c) 2009 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. + +{ + 'variables': { + 'moveable_function%': 0, + }, + 'targets': [ + { + 'target_name': 'program', + 'type': 'executable', + 'dependencies': [ + 'lib1', + 'lib2', + ], + 'sources': [ + 'program.c', + ], + }, + { + 'target_name': 'lib1', + 'type': '<(library)', + 'sources': [ + 'lib1.c', + ], + 'conditions': [ + ['moveable_function=="lib1"', { + 'sources': [ + 'lib1_moveable.c', + ], + }], + ], + }, + { + 'target_name': 'lib2', + 'type': '<(library)', + 'sources': [ + 'lib2.c', + ], + 'conditions': [ + ['moveable_function=="lib2"', { + 'sources': [ + 'lib2_moveable.c', + ], + }], + ], + }, + ], + 'conditions': [ + ['OS=="linux"', { + 'target_defaults': { + # Support 64-bit shared libs (also works fine for 32-bit). + 'cflags': ['-fPIC'], + }, + }], + ], +} diff --git a/deps/gyp/test/library/src/program.c b/deps/gyp/test/library/src/program.c new file mode 100644 index 0000000000..d460f60e40 --- /dev/null +++ b/deps/gyp/test/library/src/program.c @@ -0,0 +1,15 @@ +#include <stdio.h> + +extern void lib1_function(void); +extern void lib2_function(void); +extern void moveable_function(void); + +int main(void) +{ + fprintf(stdout, "Hello from program.c\n"); + fflush(stdout); + lib1_function(); + lib2_function(); + moveable_function(); + return 0; +} diff --git a/deps/gyp/test/library/src/shared_dependency.gyp b/deps/gyp/test/library/src/shared_dependency.gyp new file mode 100644 index 0000000000..7d29f5de59 --- /dev/null +++ b/deps/gyp/test/library/src/shared_dependency.gyp @@ -0,0 +1,33 @@ +# Copyright (c) 2009 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. + +{ + 'targets': [ + { + 'target_name': 'lib1', + 'type': 'shared_library', + 'sources': [ + 'lib1.c', + ], + }, + { + 'target_name': 'lib2', + 'type': 'shared_library', + 'sources': [ + 'lib2.c', + ], + 'dependencies': [ + 'lib1', + ], + }, + ], + 'conditions': [ + ['OS=="linux"', { + 'target_defaults': { + # Support 64-bit shared libs (also works fine for 32-bit). + 'cflags': ['-fPIC'], + }, + }], + ], +} diff --git a/deps/gyp/test/library_dirs/gyptest-library-dirs.py b/deps/gyp/test/library_dirs/gyptest-library-dirs.py new file mode 100644 index 0000000000..e725dd1176 --- /dev/null +++ b/deps/gyp/test/library_dirs/gyptest-library-dirs.py @@ -0,0 +1,50 @@ +#!/usr/bin/env python + +# Copyright (c) 2013 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. + +""" +Verifies library_dirs (in link_settings) are properly found. +""" + +import sys + +import TestGyp + +test = TestGyp.TestGyp() + +lib_dir = test.tempdir('secret_location') + +test.run_gyp('test.gyp', + '-D', 'abs_path_to_secret_library_location={0}'.format(lib_dir), + chdir='subdir') + +# Must build each target independently, since they are not in each others' +# 'dependencies' (test.ALL does NOT work here for some builders, and in any case +# would not ensure the correct ordering). +test.build('test.gyp', 'mylib', chdir='subdir') +test.build('test.gyp', 'libraries-search-path-test', chdir='subdir') + +expect = """Hello world +""" +test.run_built_executable( + 'libraries-search-path-test', chdir='subdir', stdout=expect) + +if sys.platform in ('win32', 'cygwin'): + test.run_gyp('test-win.gyp', + '-D', + 'abs_path_to_secret_library_location={0}'.format(lib_dir), + chdir='subdir') + + test.build('test.gyp', 'mylib', chdir='subdir') + test.build('test-win.gyp', + 'libraries-search-path-test-lib-suffix', + chdir='subdir') + + test.run_built_executable( + 'libraries-search-path-test-lib-suffix', chdir='subdir', stdout=expect) + + +test.pass_test() +test.cleanup() diff --git a/deps/gyp/test/library_dirs/subdir/README.txt b/deps/gyp/test/library_dirs/subdir/README.txt new file mode 100644 index 0000000000..4031ded85f --- /dev/null +++ b/deps/gyp/test/library_dirs/subdir/README.txt @@ -0,0 +1 @@ +Make things live in a subdirectory, to make sure that DEPTH works correctly. diff --git a/deps/gyp/test/library_dirs/subdir/hello.cc b/deps/gyp/test/library_dirs/subdir/hello.cc new file mode 100644 index 0000000000..5dbbd48d34 --- /dev/null +++ b/deps/gyp/test/library_dirs/subdir/hello.cc @@ -0,0 +1,11 @@ +// Copyright (c) 2013 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. + +#include <iostream> +#include "mylib.h" + +int main() { + std::cout << "Hello " << my_foo(99) << std::endl; + return 0; +} diff --git a/deps/gyp/test/library_dirs/subdir/mylib.cc b/deps/gyp/test/library_dirs/subdir/mylib.cc new file mode 100644 index 0000000000..654f3d0e6c --- /dev/null +++ b/deps/gyp/test/library_dirs/subdir/mylib.cc @@ -0,0 +1,9 @@ +// Copyright (c) 2013 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. + +#include "mylib.h" + +std::string my_foo(int x) { + return std::string("world"); +} diff --git a/deps/gyp/test/library_dirs/subdir/mylib.h b/deps/gyp/test/library_dirs/subdir/mylib.h new file mode 100644 index 0000000000..84b4022e7b --- /dev/null +++ b/deps/gyp/test/library_dirs/subdir/mylib.h @@ -0,0 +1,12 @@ +// Copyright (c) 2013 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. + +#ifndef TEST_LIBRARY_DIRS_SUBDIR_MYLIB_H +#define TEST_LIBRARY_DIRS_SUBDIR_MYLIB_H + +#include <string> + +std::string my_foo(int); + +#endif // TEST_LIBRARY_DIRS_SUBDIR_MYLIB_H diff --git a/deps/gyp/test/library_dirs/subdir/test-win.gyp b/deps/gyp/test/library_dirs/subdir/test-win.gyp new file mode 100644 index 0000000000..033b6f7fdd --- /dev/null +++ b/deps/gyp/test/library_dirs/subdir/test-win.gyp @@ -0,0 +1,60 @@ +# Copyright (c) 2013 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. + +{ + 'targets': [ + { + # This creates a static library and puts it in a nonstandard location for + # libraries-search-path-test. + 'target_name': 'mylib', + 'type': 'static_library', + 'standalone_static_library': 1, + # This directory is NOT in the default library search locations. It also + # MUST be passed in on the gyp command line: + # + # -D abs_path_to_secret_library_location=/some_absolute_path + # + # The gyptest itself (../gyptest-library-dirs.py) provides this. + 'product_dir': '<(abs_path_to_secret_library_location)', + 'sources': [ + 'mylib.cc', + ], + }, + { + 'target_name': 'libraries-search-path-test-lib-suffix', + 'type': 'executable', + 'dependencies': [ + # It is important to NOT list the mylib as a dependency here, because + # some build systems will track it down based on its product_dir, + # such that the link succeeds even without the library_dirs below. + # + # The point of this weird structuring is to ensure that 'library_dirs' + # works as advertised, such that just '-lmylib' (or its equivalent) + # works based on the directories that library_dirs puts in the library + # link path. + # + # If 'mylib' was listed as a proper dependency here, the build system + # would find it and link with its path on disk. + # + # Note that this implies 'mylib' must already be built when building + # 'libraries-search-path-test' (see ../gyptest-library-dirs.py). + # + #'mylib', + ], + 'sources': [ + 'hello.cc', + ], + # Note that without this, the mylib library would not be found and + # successfully linked. + 'library_dirs': [ + '<(abs_path_to_secret_library_location)', + ], + 'link_settings': { + 'libraries': [ + '-lmylib.lib', + ], + }, + }, + ], +} diff --git a/deps/gyp/test/library_dirs/subdir/test.gyp b/deps/gyp/test/library_dirs/subdir/test.gyp new file mode 100644 index 0000000000..f83d7f2bf1 --- /dev/null +++ b/deps/gyp/test/library_dirs/subdir/test.gyp @@ -0,0 +1,68 @@ +# Copyright (c) 2013 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. + +{ + 'targets': [ + { + # This creates a static library and puts it in a nonstandard location for + # libraries-search-path-test. + 'target_name': 'mylib', + 'type': 'static_library', + 'standalone_static_library': 1, + # This directory is NOT in the default library search locations. It also + # MUST be passed in on the gyp command line: + # + # -D abs_path_to_secret_library_location=/some_absolute_path + # + # The gyptest itself (../gyptest-library-dirs.py) provides this. + 'product_dir': '<(abs_path_to_secret_library_location)', + 'sources': [ + 'mylib.cc', + ], + }, + { + 'target_name': 'libraries-search-path-test', + 'type': 'executable', + 'dependencies': [ + # It is important to NOT list the mylib as a dependency here, because + # some build systems will track it down based on its product_dir, + # such that the link succeeds even without the library_dirs below. + # + # The point of this weird structuring is to ensure that 'library_dirs' + # works as advertised, such that just '-lmylib' (or its equivalent) + # works based on the directories that library_dirs puts in the library + # link path. + # + # If 'mylib' was listed as a proper dependency here, the build system + # would find it and link with its path on disk. + # + # Note that this implies 'mylib' must already be built when building + # 'libraries-search-path-test' (see ../gyptest-library-dirs.py). + # + #'mylib', + ], + 'sources': [ + 'hello.cc', + ], + # Note that without this, the mylib library would not be found and + # successfully linked. + 'library_dirs': [ + '<(abs_path_to_secret_library_location)', + ], + 'link_settings': { + 'conditions': [ + ['OS=="linux"', { + 'libraries': [ + '-lmylib', + ], + }, { # else + 'libraries': [ + '<(STATIC_LIB_PREFIX)mylib<(STATIC_LIB_SUFFIX)', + ], + }], + ], # conditions + }, + }, + ], +} diff --git a/deps/gyp/test/link-dependency/gyptest-link-dependency.py b/deps/gyp/test/link-dependency/gyptest-link-dependency.py new file mode 100755 index 0000000000..3a8300d44e --- /dev/null +++ b/deps/gyp/test/link-dependency/gyptest-link-dependency.py @@ -0,0 +1,23 @@ +#!/usr/bin/env python + +# Copyright (c) 2013 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. + +""" +Verify that a target marked as 'link_dependency==1' isn't being pulled into +the 'none' target's dependency (which would otherwise lead to a dependency +cycle in ninja). +""" + +import TestGyp + +# See https://codereview.chromium.org/177043010/#msg15 for why this doesn't +# work with cmake. +test = TestGyp.TestGyp(formats=['!cmake']) + +test.run_gyp('test.gyp') +test.build('test.gyp', 'main') + +# If running gyp worked, all is well. +test.pass_test() diff --git a/deps/gyp/test/link-dependency/main.c b/deps/gyp/test/link-dependency/main.c new file mode 100644 index 0000000000..543d8b6951 --- /dev/null +++ b/deps/gyp/test/link-dependency/main.c @@ -0,0 +1,7 @@ +#include <stdio.h> +#include <stdlib.h> +int main() { + void *p = malloc(1); + printf("p: %p\n", p); + return 0; +} diff --git a/deps/gyp/test/link-dependency/mymalloc.c b/deps/gyp/test/link-dependency/mymalloc.c new file mode 100644 index 0000000000..f80bc02a62 --- /dev/null +++ b/deps/gyp/test/link-dependency/mymalloc.c @@ -0,0 +1,12 @@ +#include <stdlib.h> + +// The windows ninja generator is expecting an import library to get generated, +// but it doesn't if there are no exports. +#ifdef _MSC_VER +__declspec(dllexport) void foo() {} +#endif + +void *malloc(size_t size) { + (void)size; + return (void*)0xdeadbeef; +} diff --git a/deps/gyp/test/link-dependency/test.gyp b/deps/gyp/test/link-dependency/test.gyp new file mode 100644 index 0000000000..47cec15005 --- /dev/null +++ b/deps/gyp/test/link-dependency/test.gyp @@ -0,0 +1,37 @@ +{ + 'variables': { + 'custom_malloc%' : 1, + }, + 'target_defaults': { + 'conditions': [ + ['custom_malloc==1', { + 'dependencies': [ + 'malloc', + ], + }], + ], + }, + 'targets': [ + { + 'target_name': 'main', + 'type': 'none', + 'dependencies': [ 'main_initial',], + }, + { + 'target_name': 'main_initial', + 'type': 'executable', + 'product_name': 'main', + 'sources': [ 'main.c' ], + }, + { + 'target_name': 'malloc', + 'type': 'shared_library', + 'variables': { + 'prune_self_dependency': 1, + # Targets with type 'none' won't depend on this target. + 'link_dependency': 1, + }, + 'sources': [ 'mymalloc.c' ], + }, + ], +} diff --git a/deps/gyp/test/link-objects/base.c b/deps/gyp/test/link-objects/base.c new file mode 100644 index 0000000000..3327459205 --- /dev/null +++ b/deps/gyp/test/link-objects/base.c @@ -0,0 +1,6 @@ +void extra(); + +int main(void) { + extra(); + return 0; +} diff --git a/deps/gyp/test/link-objects/extra.c b/deps/gyp/test/link-objects/extra.c new file mode 100644 index 0000000000..1d7ee09b10 --- /dev/null +++ b/deps/gyp/test/link-objects/extra.c @@ -0,0 +1,5 @@ +#include <stdio.h> + +void extra() { + printf("PASS\n"); +} diff --git a/deps/gyp/test/link-objects/gyptest-all.py b/deps/gyp/test/link-objects/gyptest-all.py new file mode 100755 index 0000000000..45bd6e1891 --- /dev/null +++ b/deps/gyp/test/link-objects/gyptest-all.py @@ -0,0 +1,28 @@ +#!/usr/bin/env python + +# Copyright (c) 2011 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. + +""" +Put an object file on the sources list. +Expect the result to link ok. +""" + +import TestGyp + +import sys + +if sys.platform != 'darwin': + # Currently only works under the linux make build. + test = TestGyp.TestGyp(formats=['make']) + + test.run_gyp('link-objects.gyp') + + test.build('link-objects.gyp', test.ALL) + + test.run_built_executable('link-objects', stdout="PASS\n") + + test.up_to_date('link-objects.gyp', test.ALL) + + test.pass_test() diff --git a/deps/gyp/test/link-objects/link-objects.gyp b/deps/gyp/test/link-objects/link-objects.gyp new file mode 100644 index 0000000000..ab72855531 --- /dev/null +++ b/deps/gyp/test/link-objects/link-objects.gyp @@ -0,0 +1,24 @@ +# Copyright (c) 2009 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. + +{ + 'targets': [ + { + 'target_name': 'link-objects', + 'type': 'executable', + 'actions': [ + { + 'action_name': 'build extra object', + 'inputs': ['extra.c'], + 'outputs': ['extra.o'], + 'action': ['gcc', '-o', 'extra.o', '-c', 'extra.c'], + 'process_outputs_as_sources': 1, + }, + ], + 'sources': [ + 'base.c', + ], + }, + ], +} diff --git a/deps/gyp/test/linux/gyptest-implicit-rpath.py b/deps/gyp/test/linux/gyptest-implicit-rpath.py new file mode 100644 index 0000000000..dd7718c76d --- /dev/null +++ b/deps/gyp/test/linux/gyptest-implicit-rpath.py @@ -0,0 +1,48 @@ +#!/usr/bin/env python + +# Copyright (c) 2013 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. + +""" +Verifies that the implicit rpath is added only when needed. +""" + +import TestGyp + +import re +import subprocess +import sys + +if sys.platform.startswith('linux'): + test = TestGyp.TestGyp(formats=['ninja', 'make']) + + CHDIR = 'implicit-rpath' + test.run_gyp('test.gyp', chdir=CHDIR) + test.build('test.gyp', test.ALL, chdir=CHDIR) + + def GetRpaths(p): + p = test.built_file_path(p, chdir=CHDIR) + r = re.compile(r'Library rpath: \[([^\]]+)\]') + proc = subprocess.Popen(['readelf', '-d', p], stdout=subprocess.PIPE) + o = proc.communicate()[0] + assert not proc.returncode + return r.findall(o) + + if test.format == 'ninja': + expect = '$ORIGIN/lib/' + elif test.format == 'make': + expect = '$ORIGIN/lib.target/' + else: + test.fail_test() + + if GetRpaths('shared_executable') != [expect]: + test.fail_test() + + if GetRpaths('shared_executable_no_so_suffix') != [expect]: + test.fail_test() + + if GetRpaths('static_executable'): + test.fail_test() + + test.pass_test() diff --git a/deps/gyp/test/linux/gyptest-ldflags-duplicates.py b/deps/gyp/test/linux/gyptest-ldflags-duplicates.py new file mode 100644 index 0000000000..43a4607adf --- /dev/null +++ b/deps/gyp/test/linux/gyptest-ldflags-duplicates.py @@ -0,0 +1,22 @@ +#!/usr/bin/env python + +# Copyright (c) 2015 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. + +""" +Verifies duplicate ldflags are not removed. +""" + +import TestGyp + +import sys + +if sys.platform.startswith('linux'): + test = TestGyp.TestGyp() + + CHDIR = 'ldflags-duplicates' + test.run_gyp('test.gyp', chdir=CHDIR) + test.build('test.gyp', chdir=CHDIR) + + test.pass_test() diff --git a/deps/gyp/test/linux/implicit-rpath/file.c b/deps/gyp/test/linux/implicit-rpath/file.c new file mode 100644 index 0000000000..56757a701b --- /dev/null +++ b/deps/gyp/test/linux/implicit-rpath/file.c @@ -0,0 +1 @@ +void f() {} diff --git a/deps/gyp/test/linux/implicit-rpath/main.c b/deps/gyp/test/linux/implicit-rpath/main.c new file mode 100644 index 0000000000..237c8ce181 --- /dev/null +++ b/deps/gyp/test/linux/implicit-rpath/main.c @@ -0,0 +1 @@ +int main() {} diff --git a/deps/gyp/test/linux/implicit-rpath/test.gyp b/deps/gyp/test/linux/implicit-rpath/test.gyp new file mode 100644 index 0000000000..b546106986 --- /dev/null +++ b/deps/gyp/test/linux/implicit-rpath/test.gyp @@ -0,0 +1,47 @@ +# Copyright (c) 2013 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. +{ + 'targets': [ + { + 'target_name': 'shared', + 'type': 'shared_library', + 'sources': [ 'file.c' ], + }, + { + 'target_name': 'shared_no_so_suffix', + 'product_extension': 'so.0.1', + 'type': 'shared_library', + 'sources': [ 'file.c' ], + }, + { + 'target_name': 'static', + 'type': 'static_library', + 'sources': [ 'file.c' ], + }, + { + 'target_name': 'shared_executable', + 'type': 'executable', + 'sources': [ 'main.c' ], + 'dependencies': [ + 'shared', + ] + }, + { + 'target_name': 'shared_executable_no_so_suffix', + 'type': 'executable', + 'sources': [ 'main.c' ], + 'dependencies': [ + 'shared_no_so_suffix', + ] + }, + { + 'target_name': 'static_executable', + 'type': 'executable', + 'sources': [ 'main.c' ], + 'dependencies': [ + 'static', + ] + }, + ], +} diff --git a/deps/gyp/test/linux/ldflags-duplicates/check-ldflags.py b/deps/gyp/test/linux/ldflags-duplicates/check-ldflags.py new file mode 100755 index 0000000000..0515da95e4 --- /dev/null +++ b/deps/gyp/test/linux/ldflags-duplicates/check-ldflags.py @@ -0,0 +1,25 @@ +#!/usr/bin/env python + +# Copyright (c) 2015 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. + +""" +Verifies duplicate ldflags are not removed. +""" + +import sys + +def CheckContainsFlags(args, substring): + if args.find(substring) is -1: + print 'ERROR: Linker arguments "%s" are missing in "%s"' % (substring, args) + return False; + return True; + +if __name__ == '__main__': + args = " ".join(sys.argv) + print "args = " +args + if not CheckContainsFlags(args, 'lib1.a -Wl,--no-whole-archive') \ + or not CheckContainsFlags(args, 'lib2.a -Wl,--no-whole-archive'): + sys.exit(1); + sys.exit(0) diff --git a/deps/gyp/test/linux/ldflags-duplicates/lib1.c b/deps/gyp/test/linux/ldflags-duplicates/lib1.c new file mode 100644 index 0000000000..a1322e7395 --- /dev/null +++ b/deps/gyp/test/linux/ldflags-duplicates/lib1.c @@ -0,0 +1,6 @@ +// Copyright (c) 2015 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. + +void foo() { +} diff --git a/deps/gyp/test/linux/ldflags-duplicates/lib2.c b/deps/gyp/test/linux/ldflags-duplicates/lib2.c new file mode 100644 index 0000000000..8e7a082820 --- /dev/null +++ b/deps/gyp/test/linux/ldflags-duplicates/lib2.c @@ -0,0 +1,6 @@ +// Copyright (c) 2015 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. + +void bar() { +} diff --git a/deps/gyp/test/linux/ldflags-duplicates/main.c b/deps/gyp/test/linux/ldflags-duplicates/main.c new file mode 100644 index 0000000000..b3039ace96 --- /dev/null +++ b/deps/gyp/test/linux/ldflags-duplicates/main.c @@ -0,0 +1,7 @@ +// Copyright (c) 2015 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. + +int main() { + return 0; +} diff --git a/deps/gyp/test/linux/ldflags-duplicates/test.gyp b/deps/gyp/test/linux/ldflags-duplicates/test.gyp new file mode 100644 index 0000000000..c36835b18f --- /dev/null +++ b/deps/gyp/test/linux/ldflags-duplicates/test.gyp @@ -0,0 +1,45 @@ +# Copyright (c) 2015 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. + +{ + 'make_global_settings': [ + ['LINK_wrapper', './check-ldflags.py'], + ], + 'targets': [ + { + 'target_name': 'test', + 'type': 'executable', + 'ldflags': [ + '-Wl,--whole-archive <(PRODUCT_DIR)/lib1.a', + '-Wl,--no-whole-archive', + + '-Wl,--whole-archive <(PRODUCT_DIR)/lib2.a', + '-Wl,--no-whole-archive', + ], + 'dependencies': [ + 'lib1', + 'lib2', + ], + 'sources': [ + 'main.c', + ], + }, + { + 'target_name': 'lib1', + 'type': 'static_library', + 'standalone_static_library': 1, + 'sources': [ + 'lib1.c', + ], + }, + { + 'target_name': 'lib2', + 'type': 'static_library', + 'standalone_static_library': 1, + 'sources': [ + 'lib2.c', + ], + }, + ], +} diff --git a/deps/gyp/test/mac/action-envvars/action/action.gyp b/deps/gyp/test/mac/action-envvars/action/action.gyp new file mode 100644 index 0000000000..d9d65745ca --- /dev/null +++ b/deps/gyp/test/mac/action-envvars/action/action.gyp @@ -0,0 +1,34 @@ +# 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. +{ + 'targets': [ + { + 'target_name': 'action', + 'type': 'none', + 'actions': [ + { + 'inputs': [ ], + 'outputs': [ + '<(PRODUCT_DIR)/result', + '<(SHARED_INTERMEDIATE_DIR)/tempfile', + ], + 'action_name': 'Test action', + 'action': ['./action.sh', '<(SHARED_INTERMEDIATE_DIR)/tempfile' ], + }, + { + 'inputs': [ + '<(SHARED_INTERMEDIATE_DIR)/tempfile', + ], + 'outputs': [ + '<(PRODUCT_DIR)/other_result', + ], + 'action_name': 'Other test action', + 'action': ['cp', '<(SHARED_INTERMEDIATE_DIR)/tempfile', + '<(PRODUCT_DIR)/other_result' ], + }, + ], + }, + ], +} + diff --git a/deps/gyp/test/mac/action-envvars/action/action.sh b/deps/gyp/test/mac/action-envvars/action/action.sh new file mode 100755 index 0000000000..48d5f6bf86 --- /dev/null +++ b/deps/gyp/test/mac/action-envvars/action/action.sh @@ -0,0 +1,8 @@ +# 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. + +set -e + +echo 'Test output' > "${BUILT_PRODUCTS_DIR}/result" +echo 'Other output' > "$1" diff --git a/deps/gyp/test/mac/app-bundle/TestApp/English.lproj/InfoPlist-error.strings b/deps/gyp/test/mac/app-bundle/TestApp/English.lproj/InfoPlist-error.strings new file mode 100644 index 0000000000..452e7fabf9 --- /dev/null +++ b/deps/gyp/test/mac/app-bundle/TestApp/English.lproj/InfoPlist-error.strings @@ -0,0 +1,3 @@ +/* Localized versions of Info.plist keys */ + +NSHumanReadableCopyright = "Copyright ©2011 Google Inc." diff --git a/deps/gyp/test/mac/app-bundle/TestApp/English.lproj/InfoPlist.strings b/deps/gyp/test/mac/app-bundle/TestApp/English.lproj/InfoPlist.strings new file mode 100644 index 0000000000..35bd33a96e --- /dev/null +++ b/deps/gyp/test/mac/app-bundle/TestApp/English.lproj/InfoPlist.strings @@ -0,0 +1,3 @@ +/* Localized versions of Info.plist keys */ + +NSHumanReadableCopyright = "Copyright ©2011 Google Inc."; diff --git a/deps/gyp/test/mac/app-bundle/TestApp/English.lproj/MainMenu.xib b/deps/gyp/test/mac/app-bundle/TestApp/English.lproj/MainMenu.xib new file mode 100644 index 0000000000..4524596787 --- /dev/null +++ b/deps/gyp/test/mac/app-bundle/TestApp/English.lproj/MainMenu.xib @@ -0,0 +1,4119 @@ +<?xml version="1.0" encoding="UTF-8"?> +<archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="7.10"> + <data> + <int key="IBDocument.SystemTarget">1060</int> + <string key="IBDocument.SystemVersion">10A324</string> + <string key="IBDocument.InterfaceBuilderVersion">719</string> + <string key="IBDocument.AppKitVersion">1015</string> + <string key="IBDocument.HIToolboxVersion">418.00</string> + <object class="NSMutableDictionary" key="IBDocument.PluginVersions"> + <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="NS.object.0">719</string> + </object> + <object class="NSMutableArray" key="IBDocument.EditedObjectIDs"> + <bool key="EncodedWithXMLCoder">YES</bool> + <integer value="371"/> + <integer value="29"/> + </object> + <object class="NSArray" key="IBDocument.PluginDependencies"> + <bool key="EncodedWithXMLCoder">YES</bool> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + </object> + <object class="NSMutableDictionary" key="IBDocument.Metadata"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSArray" key="dict.sortedKeys" id="0"> + <bool key="EncodedWithXMLCoder">YES</bool> + </object> + <object class="NSMutableArray" key="dict.values"> + <bool key="EncodedWithXMLCoder">YES</bool> + </object> + </object> + <object class="NSMutableArray" key="IBDocument.RootObjects" id="1048"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSCustomObject" id="1021"> + <string key="NSClassName">NSApplication</string> + </object> + <object class="NSCustomObject" id="1014"> + <string key="NSClassName">FirstResponder</string> + </object> + <object class="NSCustomObject" id="1050"> + <string key="NSClassName">NSApplication</string> + </object> + <object class="NSMenu" id="649796088"> + <string key="NSTitle">AMainMenu</string> + <object class="NSMutableArray" key="NSMenuItems"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSMenuItem" id="694149608"> + <reference key="NSMenu" ref="649796088"/> + <string key="NSTitle">TestApp</string> + <string key="NSKeyEquiv"/> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <object class="NSCustomResource" key="NSOnImage" id="35465992"> + <string key="NSClassName">NSImage</string> + <string key="NSResourceName">NSMenuCheckmark</string> + </object> + <object class="NSCustomResource" key="NSMixedImage" id="502551668"> + <string key="NSClassName">NSImage</string> + <string key="NSResourceName">NSMenuMixedState</string> + </object> + <string key="NSAction">submenuAction:</string> + <object class="NSMenu" key="NSSubmenu" id="110575045"> + <string key="NSTitle">TestApp</string> + <object class="NSMutableArray" key="NSMenuItems"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSMenuItem" id="238522557"> + <reference key="NSMenu" ref="110575045"/> + <string key="NSTitle">About TestApp</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="304266470"> + <reference key="NSMenu" ref="110575045"/> + <bool key="NSIsDisabled">YES</bool> + <bool key="NSIsSeparator">YES</bool> + <string key="NSTitle"/> + <string key="NSKeyEquiv"/> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="609285721"> + <reference key="NSMenu" ref="110575045"/> + <string key="NSTitle">Preferences…</string> + <string key="NSKeyEquiv">,</string> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="481834944"> + <reference key="NSMenu" ref="110575045"/> + <bool key="NSIsDisabled">YES</bool> + <bool key="NSIsSeparator">YES</bool> + <string key="NSTitle"/> + <string key="NSKeyEquiv"/> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="1046388886"> + <reference key="NSMenu" ref="110575045"/> + <string key="NSTitle">Services</string> + <string key="NSKeyEquiv"/> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + <string key="NSAction">submenuAction:</string> + <object class="NSMenu" key="NSSubmenu" id="752062318"> + <string key="NSTitle">Services</string> + <object class="NSMutableArray" key="NSMenuItems"> + <bool key="EncodedWithXMLCoder">YES</bool> + </object> + <string key="NSName">_NSServicesMenu</string> + </object> + </object> + <object class="NSMenuItem" id="646227648"> + <reference key="NSMenu" ref="110575045"/> + <bool key="NSIsDisabled">YES</bool> + <bool key="NSIsSeparator">YES</bool> + <string key="NSTitle"/> + <string key="NSKeyEquiv"/> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="755159360"> + <reference key="NSMenu" ref="110575045"/> + <string key="NSTitle">Hide TestApp</string> + <string key="NSKeyEquiv">h</string> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="342932134"> + <reference key="NSMenu" ref="110575045"/> + <string key="NSTitle">Hide Others</string> + <string key="NSKeyEquiv">h</string> + <int key="NSKeyEquivModMask">1572864</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="908899353"> + <reference key="NSMenu" ref="110575045"/> + <string key="NSTitle">Show All</string> + <string key="NSKeyEquiv"/> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="1056857174"> + <reference key="NSMenu" ref="110575045"/> + <bool key="NSIsDisabled">YES</bool> + <bool key="NSIsSeparator">YES</bool> + <string key="NSTitle"/> + <string key="NSKeyEquiv"/> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="632727374"> + <reference key="NSMenu" ref="110575045"/> + <string key="NSTitle">Quit TestApp</string> + <string key="NSKeyEquiv">q</string> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + </object> + <string key="NSName">_NSAppleMenu</string> + </object> + </object> + <object class="NSMenuItem" id="379814623"> + <reference key="NSMenu" ref="649796088"/> + <string key="NSTitle">File</string> + <string key="NSKeyEquiv"/> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + <string key="NSAction">submenuAction:</string> + <object class="NSMenu" key="NSSubmenu" id="720053764"> + <string key="NSTitle">File</string> + <object class="NSMutableArray" key="NSMenuItems"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSMenuItem" id="705341025"> + <reference key="NSMenu" ref="720053764"/> + <string key="NSTitle">New</string> + <string key="NSKeyEquiv">n</string> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="722745758"> + <reference key="NSMenu" ref="720053764"/> + <string key="NSTitle">Open…</string> + <string key="NSKeyEquiv">o</string> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="1025936716"> + <reference key="NSMenu" ref="720053764"/> + <string key="NSTitle">Open Recent</string> + <string key="NSKeyEquiv"/> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + <string key="NSAction">submenuAction:</string> + <object class="NSMenu" key="NSSubmenu" id="1065607017"> + <string key="NSTitle">Open Recent</string> + <object class="NSMutableArray" key="NSMenuItems"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSMenuItem" id="759406840"> + <reference key="NSMenu" ref="1065607017"/> + <string key="NSTitle">Clear Menu</string> + <string key="NSKeyEquiv"/> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + </object> + <string key="NSName">_NSRecentDocumentsMenu</string> + </object> + </object> + <object class="NSMenuItem" id="425164168"> + <reference key="NSMenu" ref="720053764"/> + <bool key="NSIsDisabled">YES</bool> + <bool key="NSIsSeparator">YES</bool> + <string key="NSTitle"/> + <string key="NSKeyEquiv"/> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="776162233"> + <reference key="NSMenu" ref="720053764"/> + <string key="NSTitle">Close</string> + <string key="NSKeyEquiv">w</string> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="1023925487"> + <reference key="NSMenu" ref="720053764"/> + <string key="NSTitle">Save</string> + <string key="NSKeyEquiv">s</string> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="117038363"> + <reference key="NSMenu" ref="720053764"/> + <string key="NSTitle">Save As…</string> + <string key="NSKeyEquiv">S</string> + <int key="NSKeyEquivModMask">1179648</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="579971712"> + <reference key="NSMenu" ref="720053764"/> + <string key="NSTitle">Revert to Saved</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="1010469920"> + <reference key="NSMenu" ref="720053764"/> + <bool key="NSIsDisabled">YES</bool> + <bool key="NSIsSeparator">YES</bool> + <string key="NSTitle"/> + <string key="NSKeyEquiv"/> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="294629803"> + <reference key="NSMenu" ref="720053764"/> + <string key="NSTitle">Page Setup...</string> + <string key="NSKeyEquiv">P</string> + <int key="NSKeyEquivModMask">1179648</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + <string key="NSToolTip"/> + </object> + <object class="NSMenuItem" id="49223823"> + <reference key="NSMenu" ref="720053764"/> + <string key="NSTitle">Print…</string> + <string key="NSKeyEquiv">p</string> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + </object> + </object> + </object> + <object class="NSMenuItem" id="952259628"> + <reference key="NSMenu" ref="649796088"/> + <string key="NSTitle">Edit</string> + <string key="NSKeyEquiv"/> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + <string key="NSAction">submenuAction:</string> + <object class="NSMenu" key="NSSubmenu" id="789758025"> + <string key="NSTitle">Edit</string> + <object class="NSMutableArray" key="NSMenuItems"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSMenuItem" id="1058277027"> + <reference key="NSMenu" ref="789758025"/> + <string key="NSTitle">Undo</string> + <string key="NSKeyEquiv">z</string> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="790794224"> + <reference key="NSMenu" ref="789758025"/> + <string key="NSTitle">Redo</string> + <string key="NSKeyEquiv">Z</string> + <int key="NSKeyEquivModMask">1179648</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="1040322652"> + <reference key="NSMenu" ref="789758025"/> + <bool key="NSIsDisabled">YES</bool> + <bool key="NSIsSeparator">YES</bool> + <string key="NSTitle"/> + <string key="NSKeyEquiv"/> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="296257095"> + <reference key="NSMenu" ref="789758025"/> + <string key="NSTitle">Cut</string> + <string key="NSKeyEquiv">x</string> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="860595796"> + <reference key="NSMenu" ref="789758025"/> + <string key="NSTitle">Copy</string> + <string key="NSKeyEquiv">c</string> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="29853731"> + <reference key="NSMenu" ref="789758025"/> + <string key="NSTitle">Paste</string> + <string key="NSKeyEquiv">v</string> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="82994268"> + <reference key="NSMenu" ref="789758025"/> + <string key="NSTitle">Paste and Match Style</string> + <string key="NSKeyEquiv">V</string> + <int key="NSKeyEquivModMask">1572864</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="437104165"> + <reference key="NSMenu" ref="789758025"/> + <string key="NSTitle">Delete</string> + <string key="NSKeyEquiv"/> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="583158037"> + <reference key="NSMenu" ref="789758025"/> + <string key="NSTitle">Select All</string> + <string key="NSKeyEquiv">a</string> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="212016141"> + <reference key="NSMenu" ref="789758025"/> + <bool key="NSIsDisabled">YES</bool> + <bool key="NSIsSeparator">YES</bool> + <string key="NSTitle"/> + <string key="NSKeyEquiv"/> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="892235320"> + <reference key="NSMenu" ref="789758025"/> + <string key="NSTitle">Find</string> + <string key="NSKeyEquiv"/> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + <string key="NSAction">submenuAction:</string> + <object class="NSMenu" key="NSSubmenu" id="963351320"> + <string key="NSTitle">Find</string> + <object class="NSMutableArray" key="NSMenuItems"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSMenuItem" id="447796847"> + <reference key="NSMenu" ref="963351320"/> + <string key="NSTitle">Find…</string> + <string key="NSKeyEquiv">f</string> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + <int key="NSTag">1</int> + </object> + <object class="NSMenuItem" id="326711663"> + <reference key="NSMenu" ref="963351320"/> + <string key="NSTitle">Find Next</string> + <string key="NSKeyEquiv">g</string> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + <int key="NSTag">2</int> + </object> + <object class="NSMenuItem" id="270902937"> + <reference key="NSMenu" ref="963351320"/> + <string key="NSTitle">Find Previous</string> + <string key="NSKeyEquiv">G</string> + <int key="NSKeyEquivModMask">1179648</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + <int key="NSTag">3</int> + </object> + <object class="NSMenuItem" id="159080638"> + <reference key="NSMenu" ref="963351320"/> + <string key="NSTitle">Use Selection for Find</string> + <string key="NSKeyEquiv">e</string> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + <int key="NSTag">7</int> + </object> + <object class="NSMenuItem" id="88285865"> + <reference key="NSMenu" ref="963351320"/> + <string key="NSTitle">Jump to Selection</string> + <string key="NSKeyEquiv">j</string> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + </object> + </object> + </object> + <object class="NSMenuItem" id="972420730"> + <reference key="NSMenu" ref="789758025"/> + <string key="NSTitle">Spelling and Grammar</string> + <string key="NSKeyEquiv"/> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + <string key="NSAction">submenuAction:</string> + <object class="NSMenu" key="NSSubmenu" id="769623530"> + <string key="NSTitle">Spelling and Grammar</string> + <object class="NSMutableArray" key="NSMenuItems"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSMenuItem" id="679648819"> + <reference key="NSMenu" ref="769623530"/> + <string key="NSTitle">Show Spelling and Grammar</string> + <string key="NSKeyEquiv">:</string> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="96193923"> + <reference key="NSMenu" ref="769623530"/> + <string key="NSTitle">Check Document Now</string> + <string key="NSKeyEquiv">;</string> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="859480356"> + <reference key="NSMenu" ref="769623530"/> + <bool key="NSIsDisabled">YES</bool> + <bool key="NSIsSeparator">YES</bool> + <string key="NSTitle"/> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="948374510"> + <reference key="NSMenu" ref="769623530"/> + <string key="NSTitle">Check Spelling While Typing</string> + <string key="NSKeyEquiv"/> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="967646866"> + <reference key="NSMenu" ref="769623530"/> + <string key="NSTitle">Check Grammar With Spelling</string> + <string key="NSKeyEquiv"/> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="795346622"> + <reference key="NSMenu" ref="769623530"/> + <string key="NSTitle">Correct Spelling Automatically</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + </object> + </object> + </object> + <object class="NSMenuItem" id="507821607"> + <reference key="NSMenu" ref="789758025"/> + <string key="NSTitle">Substitutions</string> + <string key="NSKeyEquiv"/> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + <string key="NSAction">submenuAction:</string> + <object class="NSMenu" key="NSSubmenu" id="698887838"> + <string key="NSTitle">Substitutions</string> + <object class="NSMutableArray" key="NSMenuItems"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSMenuItem" id="65139061"> + <reference key="NSMenu" ref="698887838"/> + <string key="NSTitle">Show Substitutions</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="19036812"> + <reference key="NSMenu" ref="698887838"/> + <bool key="NSIsDisabled">YES</bool> + <bool key="NSIsSeparator">YES</bool> + <string key="NSTitle"/> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="605118523"> + <reference key="NSMenu" ref="698887838"/> + <string key="NSTitle">Smart Copy/Paste</string> + <string key="NSKeyEquiv">f</string> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + <int key="NSTag">1</int> + </object> + <object class="NSMenuItem" id="197661976"> + <reference key="NSMenu" ref="698887838"/> + <string key="NSTitle">Smart Quotes</string> + <string key="NSKeyEquiv">g</string> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + <int key="NSTag">2</int> + </object> + <object class="NSMenuItem" id="672708820"> + <reference key="NSMenu" ref="698887838"/> + <string key="NSTitle">Smart Dashes</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="708854459"> + <reference key="NSMenu" ref="698887838"/> + <string key="NSTitle">Smart Links</string> + <string key="NSKeyEquiv">G</string> + <int key="NSKeyEquivModMask">1179648</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + <int key="NSTag">3</int> + </object> + <object class="NSMenuItem" id="537092702"> + <reference key="NSMenu" ref="698887838"/> + <string key="NSTitle">Text Replacement</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + </object> + </object> + </object> + <object class="NSMenuItem" id="288088188"> + <reference key="NSMenu" ref="789758025"/> + <string key="NSTitle">Transformations</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + <string key="NSAction">submenuAction:</string> + <object class="NSMenu" key="NSSubmenu" id="579392910"> + <string key="NSTitle">Transformations</string> + <object class="NSMutableArray" key="NSMenuItems"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSMenuItem" id="1060694897"> + <reference key="NSMenu" ref="579392910"/> + <string key="NSTitle">Make Upper Case</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="879586729"> + <reference key="NSMenu" ref="579392910"/> + <string key="NSTitle">Make Lower Case</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="56570060"> + <reference key="NSMenu" ref="579392910"/> + <string key="NSTitle">Capitalize</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + </object> + </object> + </object> + <object class="NSMenuItem" id="676164635"> + <reference key="NSMenu" ref="789758025"/> + <string key="NSTitle">Speech</string> + <string key="NSKeyEquiv"/> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + <string key="NSAction">submenuAction:</string> + <object class="NSMenu" key="NSSubmenu" id="785027613"> + <string key="NSTitle">Speech</string> + <object class="NSMutableArray" key="NSMenuItems"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSMenuItem" id="731782645"> + <reference key="NSMenu" ref="785027613"/> + <string key="NSTitle">Start Speaking</string> + <string key="NSKeyEquiv"/> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="680220178"> + <reference key="NSMenu" ref="785027613"/> + <string key="NSTitle">Stop Speaking</string> + <string key="NSKeyEquiv"/> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + </object> + </object> + </object> + </object> + </object> + </object> + <object class="NSMenuItem" id="302598603"> + <reference key="NSMenu" ref="649796088"/> + <string key="NSTitle">Format</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + <string key="NSAction">submenuAction:</string> + <object class="NSMenu" key="NSSubmenu" id="941447902"> + <string key="NSTitle">Format</string> + <object class="NSMutableArray" key="NSMenuItems"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSMenuItem" id="792887677"> + <reference key="NSMenu" ref="941447902"/> + <string key="NSTitle">Font</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + <string key="NSAction">submenuAction:</string> + <object class="NSMenu" key="NSSubmenu" id="786677654"> + <string key="NSTitle">Font</string> + <object class="NSMutableArray" key="NSMenuItems"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSMenuItem" id="159677712"> + <reference key="NSMenu" ref="786677654"/> + <string key="NSTitle">Show Fonts</string> + <string key="NSKeyEquiv">t</string> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="305399458"> + <reference key="NSMenu" ref="786677654"/> + <string key="NSTitle">Bold</string> + <string key="NSKeyEquiv">b</string> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + <int key="NSTag">2</int> + </object> + <object class="NSMenuItem" id="814362025"> + <reference key="NSMenu" ref="786677654"/> + <string key="NSTitle">Italic</string> + <string key="NSKeyEquiv">i</string> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + <int key="NSTag">1</int> + </object> + <object class="NSMenuItem" id="330926929"> + <reference key="NSMenu" ref="786677654"/> + <string key="NSTitle">Underline</string> + <string key="NSKeyEquiv">u</string> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="533507878"> + <reference key="NSMenu" ref="786677654"/> + <bool key="NSIsDisabled">YES</bool> + <bool key="NSIsSeparator">YES</bool> + <string key="NSTitle"/> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="158063935"> + <reference key="NSMenu" ref="786677654"/> + <string key="NSTitle">Bigger</string> + <string key="NSKeyEquiv">+</string> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + <int key="NSTag">3</int> + </object> + <object class="NSMenuItem" id="885547335"> + <reference key="NSMenu" ref="786677654"/> + <string key="NSTitle">Smaller</string> + <string key="NSKeyEquiv">-</string> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + <int key="NSTag">4</int> + </object> + <object class="NSMenuItem" id="901062459"> + <reference key="NSMenu" ref="786677654"/> + <bool key="NSIsDisabled">YES</bool> + <bool key="NSIsSeparator">YES</bool> + <string key="NSTitle"/> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="767671776"> + <reference key="NSMenu" ref="786677654"/> + <string key="NSTitle">Kern</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + <string key="NSAction">submenuAction:</string> + <object class="NSMenu" key="NSSubmenu" id="175441468"> + <string key="NSTitle">Kern</string> + <object class="NSMutableArray" key="NSMenuItems"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSMenuItem" id="252969304"> + <reference key="NSMenu" ref="175441468"/> + <string key="NSTitle">Use Default</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="766922938"> + <reference key="NSMenu" ref="175441468"/> + <string key="NSTitle">Use None</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="677519740"> + <reference key="NSMenu" ref="175441468"/> + <string key="NSTitle">Tighten</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="238351151"> + <reference key="NSMenu" ref="175441468"/> + <string key="NSTitle">Loosen</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + </object> + </object> + </object> + <object class="NSMenuItem" id="691570813"> + <reference key="NSMenu" ref="786677654"/> + <string key="NSTitle">Ligature</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + <string key="NSAction">submenuAction:</string> + <object class="NSMenu" key="NSSubmenu" id="1058217995"> + <string key="NSTitle">Ligature</string> + <object class="NSMutableArray" key="NSMenuItems"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSMenuItem" id="706297211"> + <reference key="NSMenu" ref="1058217995"/> + <string key="NSTitle">Use Default</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="568384683"> + <reference key="NSMenu" ref="1058217995"/> + <string key="NSTitle">Use None</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="663508465"> + <reference key="NSMenu" ref="1058217995"/> + <string key="NSTitle">Use All</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + </object> + </object> + </object> + <object class="NSMenuItem" id="769124883"> + <reference key="NSMenu" ref="786677654"/> + <string key="NSTitle">Baseline</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + <string key="NSAction">submenuAction:</string> + <object class="NSMenu" key="NSSubmenu" id="18263474"> + <string key="NSTitle">Baseline</string> + <object class="NSMutableArray" key="NSMenuItems"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSMenuItem" id="257962622"> + <reference key="NSMenu" ref="18263474"/> + <string key="NSTitle">Use Default</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="644725453"> + <reference key="NSMenu" ref="18263474"/> + <string key="NSTitle">Superscript</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="1037576581"> + <reference key="NSMenu" ref="18263474"/> + <string key="NSTitle">Subscript</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="941806246"> + <reference key="NSMenu" ref="18263474"/> + <string key="NSTitle">Raise</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="1045724900"> + <reference key="NSMenu" ref="18263474"/> + <string key="NSTitle">Lower</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + </object> + </object> + </object> + <object class="NSMenuItem" id="739652853"> + <reference key="NSMenu" ref="786677654"/> + <bool key="NSIsDisabled">YES</bool> + <bool key="NSIsSeparator">YES</bool> + <string key="NSTitle"/> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="1012600125"> + <reference key="NSMenu" ref="786677654"/> + <string key="NSTitle">Show Colors</string> + <string key="NSKeyEquiv">C</string> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="214559597"> + <reference key="NSMenu" ref="786677654"/> + <bool key="NSIsDisabled">YES</bool> + <bool key="NSIsSeparator">YES</bool> + <string key="NSTitle"/> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="596732606"> + <reference key="NSMenu" ref="786677654"/> + <string key="NSTitle">Copy Style</string> + <string key="NSKeyEquiv">c</string> + <int key="NSKeyEquivModMask">1572864</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="393423671"> + <reference key="NSMenu" ref="786677654"/> + <string key="NSTitle">Paste Style</string> + <string key="NSKeyEquiv">v</string> + <int key="NSKeyEquivModMask">1572864</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + </object> + <string key="NSName">_NSFontMenu</string> + </object> + </object> + <object class="NSMenuItem" id="215659978"> + <reference key="NSMenu" ref="941447902"/> + <string key="NSTitle">Text</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + <string key="NSAction">submenuAction:</string> + <object class="NSMenu" key="NSSubmenu" id="446991534"> + <string key="NSTitle">Text</string> + <object class="NSMutableArray" key="NSMenuItems"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSMenuItem" id="875092757"> + <reference key="NSMenu" ref="446991534"/> + <string key="NSTitle">Align Left</string> + <string key="NSKeyEquiv">{</string> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="630155264"> + <reference key="NSMenu" ref="446991534"/> + <string key="NSTitle">Center</string> + <string key="NSKeyEquiv">|</string> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="945678886"> + <reference key="NSMenu" ref="446991534"/> + <string key="NSTitle">Justify</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="512868991"> + <reference key="NSMenu" ref="446991534"/> + <string key="NSTitle">Align Right</string> + <string key="NSKeyEquiv">}</string> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="163117631"> + <reference key="NSMenu" ref="446991534"/> + <bool key="NSIsDisabled">YES</bool> + <bool key="NSIsSeparator">YES</bool> + <string key="NSTitle"/> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="31516759"> + <reference key="NSMenu" ref="446991534"/> + <string key="NSTitle">Writing Direction</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + <string key="NSAction">submenuAction:</string> + <object class="NSMenu" key="NSSubmenu" id="956096989"> + <string key="NSTitle">Writing Direction</string> + <object class="NSMutableArray" key="NSMenuItems"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSMenuItem" id="257099033"> + <reference key="NSMenu" ref="956096989"/> + <bool key="NSIsDisabled">YES</bool> + <string key="NSTitle">Paragraph</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="551969625"> + <reference key="NSMenu" ref="956096989"/> + <string type="base64-UTF8" key="NSTitle">CURlZmF1bHQ</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="249532473"> + <reference key="NSMenu" ref="956096989"/> + <string type="base64-UTF8" key="NSTitle">CUxlZnQgdG8gUmlnaHQ</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="607364498"> + <reference key="NSMenu" ref="956096989"/> + <string type="base64-UTF8" key="NSTitle">CVJpZ2h0IHRvIExlZnQ</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="508151438"> + <reference key="NSMenu" ref="956096989"/> + <bool key="NSIsDisabled">YES</bool> + <bool key="NSIsSeparator">YES</bool> + <string key="NSTitle"/> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="981751889"> + <reference key="NSMenu" ref="956096989"/> + <bool key="NSIsDisabled">YES</bool> + <string key="NSTitle">Selection</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="380031999"> + <reference key="NSMenu" ref="956096989"/> + <string type="base64-UTF8" key="NSTitle">CURlZmF1bHQ</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="825984362"> + <reference key="NSMenu" ref="956096989"/> + <string type="base64-UTF8" key="NSTitle">CUxlZnQgdG8gUmlnaHQ</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="560145579"> + <reference key="NSMenu" ref="956096989"/> + <string type="base64-UTF8" key="NSTitle">CVJpZ2h0IHRvIExlZnQ</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + </object> + </object> + </object> + <object class="NSMenuItem" id="908105787"> + <reference key="NSMenu" ref="446991534"/> + <bool key="NSIsDisabled">YES</bool> + <bool key="NSIsSeparator">YES</bool> + <string key="NSTitle"/> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="644046920"> + <reference key="NSMenu" ref="446991534"/> + <string key="NSTitle">Show Ruler</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="231811626"> + <reference key="NSMenu" ref="446991534"/> + <string key="NSTitle">Copy Ruler</string> + <string key="NSKeyEquiv">c</string> + <int key="NSKeyEquivModMask">1310720</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="883618387"> + <reference key="NSMenu" ref="446991534"/> + <string key="NSTitle">Paste Ruler</string> + <string key="NSKeyEquiv">v</string> + <int key="NSKeyEquivModMask">1310720</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + </object> + </object> + </object> + </object> + </object> + </object> + <object class="NSMenuItem" id="586577488"> + <reference key="NSMenu" ref="649796088"/> + <string key="NSTitle">View</string> + <string key="NSKeyEquiv"/> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + <string key="NSAction">submenuAction:</string> + <object class="NSMenu" key="NSSubmenu" id="466310130"> + <string key="NSTitle">View</string> + <object class="NSMutableArray" key="NSMenuItems"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSMenuItem" id="102151532"> + <reference key="NSMenu" ref="466310130"/> + <string key="NSTitle">Show Toolbar</string> + <string key="NSKeyEquiv">t</string> + <int key="NSKeyEquivModMask">1572864</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="237841660"> + <reference key="NSMenu" ref="466310130"/> + <string key="NSTitle">Customize Toolbar…</string> + <string key="NSKeyEquiv"/> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + </object> + </object> + </object> + <object class="NSMenuItem" id="713487014"> + <reference key="NSMenu" ref="649796088"/> + <string key="NSTitle">Window</string> + <string key="NSKeyEquiv"/> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + <string key="NSAction">submenuAction:</string> + <object class="NSMenu" key="NSSubmenu" id="835318025"> + <string key="NSTitle">Window</string> + <object class="NSMutableArray" key="NSMenuItems"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSMenuItem" id="1011231497"> + <reference key="NSMenu" ref="835318025"/> + <string key="NSTitle">Minimize</string> + <string key="NSKeyEquiv">m</string> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="575023229"> + <reference key="NSMenu" ref="835318025"/> + <string key="NSTitle">Zoom</string> + <string key="NSKeyEquiv"/> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="299356726"> + <reference key="NSMenu" ref="835318025"/> + <bool key="NSIsDisabled">YES</bool> + <bool key="NSIsSeparator">YES</bool> + <string key="NSTitle"/> + <string key="NSKeyEquiv"/> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="625202149"> + <reference key="NSMenu" ref="835318025"/> + <string key="NSTitle">Bring All to Front</string> + <string key="NSKeyEquiv"/> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + </object> + <string key="NSName">_NSWindowsMenu</string> + </object> + </object> + <object class="NSMenuItem" id="448692316"> + <reference key="NSMenu" ref="649796088"/> + <string key="NSTitle">Help</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + <string key="NSAction">submenuAction:</string> + <object class="NSMenu" key="NSSubmenu" id="992780483"> + <string key="NSTitle">Help</string> + <object class="NSMutableArray" key="NSMenuItems"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSMenuItem" id="105068016"> + <reference key="NSMenu" ref="992780483"/> + <string key="NSTitle">TestApp Help</string> + <string key="NSKeyEquiv">?</string> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + </object> + <string key="NSName">_NSHelpMenu</string> + </object> + </object> + </object> + <string key="NSName">_NSMainMenu</string> + </object> + <object class="NSWindowTemplate" id="972006081"> + <int key="NSWindowStyleMask">15</int> + <int key="NSWindowBacking">2</int> + <string key="NSWindowRect">{{335, 390}, {480, 360}}</string> + <int key="NSWTFlags">1954021376</int> + <string key="NSWindowTitle">TestApp</string> + <string key="NSWindowClass">NSWindow</string> + <nil key="NSViewClass"/> + <string key="NSWindowContentMaxSize">{1.79769e+308, 1.79769e+308}</string> + <object class="NSView" key="NSWindowView" id="439893737"> + <reference key="NSNextResponder"/> + <int key="NSvFlags">256</int> + <string key="NSFrameSize">{480, 360}</string> + <reference key="NSSuperview"/> + </object> + <string key="NSScreenRect">{{0, 0}, {1920, 1178}}</string> + <string key="NSMaxSize">{1.79769e+308, 1.79769e+308}</string> + </object> + <object class="NSCustomObject" id="976324537"> + <string key="NSClassName">TestAppAppDelegate</string> + </object> + <object class="NSCustomObject" id="755631768"> + <string key="NSClassName">NSFontManager</string> + </object> + </object> + <object class="IBObjectContainer" key="IBDocument.Objects"> + <object class="NSMutableArray" key="connectionRecords"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">performMiniaturize:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="1011231497"/> + </object> + <int key="connectionID">37</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">arrangeInFront:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="625202149"/> + </object> + <int key="connectionID">39</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">print:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="49223823"/> + </object> + <int key="connectionID">86</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">runPageLayout:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="294629803"/> + </object> + <int key="connectionID">87</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">clearRecentDocuments:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="759406840"/> + </object> + <int key="connectionID">127</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">orderFrontStandardAboutPanel:</string> + <reference key="source" ref="1021"/> + <reference key="destination" ref="238522557"/> + </object> + <int key="connectionID">142</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">performClose:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="776162233"/> + </object> + <int key="connectionID">193</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">toggleContinuousSpellChecking:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="948374510"/> + </object> + <int key="connectionID">222</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">undo:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="1058277027"/> + </object> + <int key="connectionID">223</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">copy:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="860595796"/> + </object> + <int key="connectionID">224</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">checkSpelling:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="96193923"/> + </object> + <int key="connectionID">225</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">paste:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="29853731"/> + </object> + <int key="connectionID">226</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">stopSpeaking:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="680220178"/> + </object> + <int key="connectionID">227</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">cut:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="296257095"/> + </object> + <int key="connectionID">228</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">showGuessPanel:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="679648819"/> + </object> + <int key="connectionID">230</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">redo:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="790794224"/> + </object> + <int key="connectionID">231</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">selectAll:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="583158037"/> + </object> + <int key="connectionID">232</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">startSpeaking:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="731782645"/> + </object> + <int key="connectionID">233</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">delete:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="437104165"/> + </object> + <int key="connectionID">235</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">performZoom:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="575023229"/> + </object> + <int key="connectionID">240</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">performFindPanelAction:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="447796847"/> + </object> + <int key="connectionID">241</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">centerSelectionInVisibleArea:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="88285865"/> + </object> + <int key="connectionID">245</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">toggleGrammarChecking:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="967646866"/> + </object> + <int key="connectionID">347</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">toggleSmartInsertDelete:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="605118523"/> + </object> + <int key="connectionID">355</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">toggleAutomaticQuoteSubstitution:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="197661976"/> + </object> + <int key="connectionID">356</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">toggleAutomaticLinkDetection:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="708854459"/> + </object> + <int key="connectionID">357</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">saveDocument:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="1023925487"/> + </object> + <int key="connectionID">362</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">saveDocumentAs:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="117038363"/> + </object> + <int key="connectionID">363</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">revertDocumentToSaved:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="579971712"/> + </object> + <int key="connectionID">364</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">runToolbarCustomizationPalette:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="237841660"/> + </object> + <int key="connectionID">365</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">toggleToolbarShown:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="102151532"/> + </object> + <int key="connectionID">366</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">hide:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="755159360"/> + </object> + <int key="connectionID">367</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">hideOtherApplications:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="342932134"/> + </object> + <int key="connectionID">368</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">unhideAllApplications:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="908899353"/> + </object> + <int key="connectionID">370</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">newDocument:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="705341025"/> + </object> + <int key="connectionID">373</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">openDocument:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="722745758"/> + </object> + <int key="connectionID">374</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">addFontTrait:</string> + <reference key="source" ref="755631768"/> + <reference key="destination" ref="305399458"/> + </object> + <int key="connectionID">421</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">addFontTrait:</string> + <reference key="source" ref="755631768"/> + <reference key="destination" ref="814362025"/> + </object> + <int key="connectionID">422</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">modifyFont:</string> + <reference key="source" ref="755631768"/> + <reference key="destination" ref="885547335"/> + </object> + <int key="connectionID">423</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">orderFrontFontPanel:</string> + <reference key="source" ref="755631768"/> + <reference key="destination" ref="159677712"/> + </object> + <int key="connectionID">424</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">modifyFont:</string> + <reference key="source" ref="755631768"/> + <reference key="destination" ref="158063935"/> + </object> + <int key="connectionID">425</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">raiseBaseline:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="941806246"/> + </object> + <int key="connectionID">426</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">lowerBaseline:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="1045724900"/> + </object> + <int key="connectionID">427</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">copyFont:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="596732606"/> + </object> + <int key="connectionID">428</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">subscript:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="1037576581"/> + </object> + <int key="connectionID">429</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">superscript:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="644725453"/> + </object> + <int key="connectionID">430</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">tightenKerning:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="677519740"/> + </object> + <int key="connectionID">431</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">underline:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="330926929"/> + </object> + <int key="connectionID">432</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">orderFrontColorPanel:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="1012600125"/> + </object> + <int key="connectionID">433</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">useAllLigatures:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="663508465"/> + </object> + <int key="connectionID">434</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">loosenKerning:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="238351151"/> + </object> + <int key="connectionID">435</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">pasteFont:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="393423671"/> + </object> + <int key="connectionID">436</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">unscript:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="257962622"/> + </object> + <int key="connectionID">437</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">useStandardKerning:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="252969304"/> + </object> + <int key="connectionID">438</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">useStandardLigatures:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="706297211"/> + </object> + <int key="connectionID">439</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">turnOffLigatures:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="568384683"/> + </object> + <int key="connectionID">440</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">turnOffKerning:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="766922938"/> + </object> + <int key="connectionID">441</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">terminate:</string> + <reference key="source" ref="1050"/> + <reference key="destination" ref="632727374"/> + </object> + <int key="connectionID">449</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">toggleAutomaticSpellingCorrection:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="795346622"/> + </object> + <int key="connectionID">456</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">orderFrontSubstitutionsPanel:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="65139061"/> + </object> + <int key="connectionID">458</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">toggleAutomaticDashSubstitution:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="672708820"/> + </object> + <int key="connectionID">461</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">toggleAutomaticTextReplacement:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="537092702"/> + </object> + <int key="connectionID">463</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">uppercaseWord:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="1060694897"/> + </object> + <int key="connectionID">464</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">capitalizeWord:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="56570060"/> + </object> + <int key="connectionID">467</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">lowercaseWord:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="879586729"/> + </object> + <int key="connectionID">468</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">pasteAsPlainText:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="82994268"/> + </object> + <int key="connectionID">486</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">performFindPanelAction:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="326711663"/> + </object> + <int key="connectionID">487</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">performFindPanelAction:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="270902937"/> + </object> + <int key="connectionID">488</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">performFindPanelAction:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="159080638"/> + </object> + <int key="connectionID">489</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">showHelp:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="105068016"/> + </object> + <int key="connectionID">493</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBOutletConnection" key="connection"> + <string key="label">delegate</string> + <reference key="source" ref="1021"/> + <reference key="destination" ref="976324537"/> + </object> + <int key="connectionID">495</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">alignCenter:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="630155264"/> + </object> + <int key="connectionID">518</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">pasteRuler:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="883618387"/> + </object> + <int key="connectionID">519</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">toggleRuler:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="644046920"/> + </object> + <int key="connectionID">520</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">alignRight:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="512868991"/> + </object> + <int key="connectionID">521</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">copyRuler:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="231811626"/> + </object> + <int key="connectionID">522</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">alignJustified:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="945678886"/> + </object> + <int key="connectionID">523</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">alignLeft:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="875092757"/> + </object> + <int key="connectionID">524</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">makeBaseWritingDirectionNatural:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="551969625"/> + </object> + <int key="connectionID">525</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">makeBaseWritingDirectionLeftToRight:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="249532473"/> + </object> + <int key="connectionID">526</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">makeBaseWritingDirectionRightToLeft:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="607364498"/> + </object> + <int key="connectionID">527</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">makeTextWritingDirectionNatural:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="380031999"/> + </object> + <int key="connectionID">528</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">makeTextWritingDirectionLeftToRight:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="825984362"/> + </object> + <int key="connectionID">529</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">makeTextWritingDirectionRightToLeft:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="560145579"/> + </object> + <int key="connectionID">530</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBOutletConnection" key="connection"> + <string key="label">window</string> + <reference key="source" ref="976324537"/> + <reference key="destination" ref="972006081"/> + </object> + <int key="connectionID">532</int> + </object> + </object> + <object class="IBMutableOrderedSet" key="objectRecords"> + <object class="NSArray" key="orderedObjects"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="IBObjectRecord"> + <int key="objectID">0</int> + <reference key="object" ref="0"/> + <reference key="children" ref="1048"/> + <nil key="parent"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">-2</int> + <reference key="object" ref="1021"/> + <reference key="parent" ref="0"/> + <string key="objectName">File's Owner</string> + </object> + <object class="IBObjectRecord"> + <int key="objectID">-1</int> + <reference key="object" ref="1014"/> + <reference key="parent" ref="0"/> + <string key="objectName">First Responder</string> + </object> + <object class="IBObjectRecord"> + <int key="objectID">-3</int> + <reference key="object" ref="1050"/> + <reference key="parent" ref="0"/> + <string key="objectName">Application</string> + </object> + <object class="IBObjectRecord"> + <int key="objectID">29</int> + <reference key="object" ref="649796088"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="713487014"/> + <reference ref="694149608"/> + <reference ref="952259628"/> + <reference ref="379814623"/> + <reference ref="586577488"/> + <reference ref="302598603"/> + <reference ref="448692316"/> + </object> + <reference key="parent" ref="0"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">19</int> + <reference key="object" ref="713487014"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="835318025"/> + </object> + <reference key="parent" ref="649796088"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">56</int> + <reference key="object" ref="694149608"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="110575045"/> + </object> + <reference key="parent" ref="649796088"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">217</int> + <reference key="object" ref="952259628"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="789758025"/> + </object> + <reference key="parent" ref="649796088"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">83</int> + <reference key="object" ref="379814623"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="720053764"/> + </object> + <reference key="parent" ref="649796088"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">81</int> + <reference key="object" ref="720053764"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="1023925487"/> + <reference ref="117038363"/> + <reference ref="49223823"/> + <reference ref="722745758"/> + <reference ref="705341025"/> + <reference ref="1025936716"/> + <reference ref="294629803"/> + <reference ref="776162233"/> + <reference ref="425164168"/> + <reference ref="579971712"/> + <reference ref="1010469920"/> + </object> + <reference key="parent" ref="379814623"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">75</int> + <reference key="object" ref="1023925487"/> + <reference key="parent" ref="720053764"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">80</int> + <reference key="object" ref="117038363"/> + <reference key="parent" ref="720053764"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">78</int> + <reference key="object" ref="49223823"/> + <reference key="parent" ref="720053764"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">72</int> + <reference key="object" ref="722745758"/> + <reference key="parent" ref="720053764"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">82</int> + <reference key="object" ref="705341025"/> + <reference key="parent" ref="720053764"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">124</int> + <reference key="object" ref="1025936716"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="1065607017"/> + </object> + <reference key="parent" ref="720053764"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">77</int> + <reference key="object" ref="294629803"/> + <reference key="parent" ref="720053764"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">73</int> + <reference key="object" ref="776162233"/> + <reference key="parent" ref="720053764"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">79</int> + <reference key="object" ref="425164168"/> + <reference key="parent" ref="720053764"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">112</int> + <reference key="object" ref="579971712"/> + <reference key="parent" ref="720053764"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">74</int> + <reference key="object" ref="1010469920"/> + <reference key="parent" ref="720053764"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">125</int> + <reference key="object" ref="1065607017"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="759406840"/> + </object> + <reference key="parent" ref="1025936716"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">126</int> + <reference key="object" ref="759406840"/> + <reference key="parent" ref="1065607017"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">205</int> + <reference key="object" ref="789758025"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="437104165"/> + <reference ref="583158037"/> + <reference ref="1058277027"/> + <reference ref="212016141"/> + <reference ref="296257095"/> + <reference ref="29853731"/> + <reference ref="860595796"/> + <reference ref="1040322652"/> + <reference ref="790794224"/> + <reference ref="892235320"/> + <reference ref="972420730"/> + <reference ref="676164635"/> + <reference ref="507821607"/> + <reference ref="288088188"/> + <reference ref="82994268"/> + </object> + <reference key="parent" ref="952259628"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">202</int> + <reference key="object" ref="437104165"/> + <reference key="parent" ref="789758025"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">198</int> + <reference key="object" ref="583158037"/> + <reference key="parent" ref="789758025"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">207</int> + <reference key="object" ref="1058277027"/> + <reference key="parent" ref="789758025"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">214</int> + <reference key="object" ref="212016141"/> + <reference key="parent" ref="789758025"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">199</int> + <reference key="object" ref="296257095"/> + <reference key="parent" ref="789758025"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">203</int> + <reference key="object" ref="29853731"/> + <reference key="parent" ref="789758025"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">197</int> + <reference key="object" ref="860595796"/> + <reference key="parent" ref="789758025"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">206</int> + <reference key="object" ref="1040322652"/> + <reference key="parent" ref="789758025"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">215</int> + <reference key="object" ref="790794224"/> + <reference key="parent" ref="789758025"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">218</int> + <reference key="object" ref="892235320"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="963351320"/> + </object> + <reference key="parent" ref="789758025"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">216</int> + <reference key="object" ref="972420730"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="769623530"/> + </object> + <reference key="parent" ref="789758025"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">200</int> + <reference key="object" ref="769623530"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="948374510"/> + <reference ref="96193923"/> + <reference ref="679648819"/> + <reference ref="967646866"/> + <reference ref="859480356"/> + <reference ref="795346622"/> + </object> + <reference key="parent" ref="972420730"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">219</int> + <reference key="object" ref="948374510"/> + <reference key="parent" ref="769623530"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">201</int> + <reference key="object" ref="96193923"/> + <reference key="parent" ref="769623530"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">204</int> + <reference key="object" ref="679648819"/> + <reference key="parent" ref="769623530"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">220</int> + <reference key="object" ref="963351320"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="270902937"/> + <reference ref="88285865"/> + <reference ref="159080638"/> + <reference ref="326711663"/> + <reference ref="447796847"/> + </object> + <reference key="parent" ref="892235320"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">213</int> + <reference key="object" ref="270902937"/> + <reference key="parent" ref="963351320"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">210</int> + <reference key="object" ref="88285865"/> + <reference key="parent" ref="963351320"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">221</int> + <reference key="object" ref="159080638"/> + <reference key="parent" ref="963351320"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">208</int> + <reference key="object" ref="326711663"/> + <reference key="parent" ref="963351320"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">209</int> + <reference key="object" ref="447796847"/> + <reference key="parent" ref="963351320"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">57</int> + <reference key="object" ref="110575045"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="238522557"/> + <reference ref="755159360"/> + <reference ref="908899353"/> + <reference ref="632727374"/> + <reference ref="646227648"/> + <reference ref="609285721"/> + <reference ref="481834944"/> + <reference ref="304266470"/> + <reference ref="1046388886"/> + <reference ref="1056857174"/> + <reference ref="342932134"/> + </object> + <reference key="parent" ref="694149608"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">58</int> + <reference key="object" ref="238522557"/> + <reference key="parent" ref="110575045"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">134</int> + <reference key="object" ref="755159360"/> + <reference key="parent" ref="110575045"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">150</int> + <reference key="object" ref="908899353"/> + <reference key="parent" ref="110575045"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">136</int> + <reference key="object" ref="632727374"/> + <reference key="parent" ref="110575045"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">144</int> + <reference key="object" ref="646227648"/> + <reference key="parent" ref="110575045"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">129</int> + <reference key="object" ref="609285721"/> + <reference key="parent" ref="110575045"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">143</int> + <reference key="object" ref="481834944"/> + <reference key="parent" ref="110575045"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">236</int> + <reference key="object" ref="304266470"/> + <reference key="parent" ref="110575045"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">131</int> + <reference key="object" ref="1046388886"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="752062318"/> + </object> + <reference key="parent" ref="110575045"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">149</int> + <reference key="object" ref="1056857174"/> + <reference key="parent" ref="110575045"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">145</int> + <reference key="object" ref="342932134"/> + <reference key="parent" ref="110575045"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">130</int> + <reference key="object" ref="752062318"/> + <reference key="parent" ref="1046388886"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">24</int> + <reference key="object" ref="835318025"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="299356726"/> + <reference ref="625202149"/> + <reference ref="575023229"/> + <reference ref="1011231497"/> + </object> + <reference key="parent" ref="713487014"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">92</int> + <reference key="object" ref="299356726"/> + <reference key="parent" ref="835318025"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5</int> + <reference key="object" ref="625202149"/> + <reference key="parent" ref="835318025"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">239</int> + <reference key="object" ref="575023229"/> + <reference key="parent" ref="835318025"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">23</int> + <reference key="object" ref="1011231497"/> + <reference key="parent" ref="835318025"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">295</int> + <reference key="object" ref="586577488"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="466310130"/> + </object> + <reference key="parent" ref="649796088"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">296</int> + <reference key="object" ref="466310130"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="102151532"/> + <reference ref="237841660"/> + </object> + <reference key="parent" ref="586577488"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">297</int> + <reference key="object" ref="102151532"/> + <reference key="parent" ref="466310130"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">298</int> + <reference key="object" ref="237841660"/> + <reference key="parent" ref="466310130"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">211</int> + <reference key="object" ref="676164635"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="785027613"/> + </object> + <reference key="parent" ref="789758025"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">212</int> + <reference key="object" ref="785027613"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="680220178"/> + <reference ref="731782645"/> + </object> + <reference key="parent" ref="676164635"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">195</int> + <reference key="object" ref="680220178"/> + <reference key="parent" ref="785027613"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">196</int> + <reference key="object" ref="731782645"/> + <reference key="parent" ref="785027613"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">346</int> + <reference key="object" ref="967646866"/> + <reference key="parent" ref="769623530"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">348</int> + <reference key="object" ref="507821607"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="698887838"/> + </object> + <reference key="parent" ref="789758025"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">349</int> + <reference key="object" ref="698887838"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="605118523"/> + <reference ref="197661976"/> + <reference ref="708854459"/> + <reference ref="65139061"/> + <reference ref="19036812"/> + <reference ref="672708820"/> + <reference ref="537092702"/> + </object> + <reference key="parent" ref="507821607"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">350</int> + <reference key="object" ref="605118523"/> + <reference key="parent" ref="698887838"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">351</int> + <reference key="object" ref="197661976"/> + <reference key="parent" ref="698887838"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">354</int> + <reference key="object" ref="708854459"/> + <reference key="parent" ref="698887838"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">371</int> + <reference key="object" ref="972006081"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="439893737"/> + </object> + <reference key="parent" ref="0"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">372</int> + <reference key="object" ref="439893737"/> + <reference key="parent" ref="972006081"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">375</int> + <reference key="object" ref="302598603"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="941447902"/> + </object> + <reference key="parent" ref="649796088"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">376</int> + <reference key="object" ref="941447902"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="792887677"/> + <reference ref="215659978"/> + </object> + <reference key="parent" ref="302598603"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">377</int> + <reference key="object" ref="792887677"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="786677654"/> + </object> + <reference key="parent" ref="941447902"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">388</int> + <reference key="object" ref="786677654"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="159677712"/> + <reference ref="305399458"/> + <reference ref="814362025"/> + <reference ref="330926929"/> + <reference ref="533507878"/> + <reference ref="158063935"/> + <reference ref="885547335"/> + <reference ref="901062459"/> + <reference ref="767671776"/> + <reference ref="691570813"/> + <reference ref="769124883"/> + <reference ref="739652853"/> + <reference ref="1012600125"/> + <reference ref="214559597"/> + <reference ref="596732606"/> + <reference ref="393423671"/> + </object> + <reference key="parent" ref="792887677"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">389</int> + <reference key="object" ref="159677712"/> + <reference key="parent" ref="786677654"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">390</int> + <reference key="object" ref="305399458"/> + <reference key="parent" ref="786677654"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">391</int> + <reference key="object" ref="814362025"/> + <reference key="parent" ref="786677654"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">392</int> + <reference key="object" ref="330926929"/> + <reference key="parent" ref="786677654"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">393</int> + <reference key="object" ref="533507878"/> + <reference key="parent" ref="786677654"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">394</int> + <reference key="object" ref="158063935"/> + <reference key="parent" ref="786677654"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">395</int> + <reference key="object" ref="885547335"/> + <reference key="parent" ref="786677654"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">396</int> + <reference key="object" ref="901062459"/> + <reference key="parent" ref="786677654"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">397</int> + <reference key="object" ref="767671776"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="175441468"/> + </object> + <reference key="parent" ref="786677654"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">398</int> + <reference key="object" ref="691570813"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="1058217995"/> + </object> + <reference key="parent" ref="786677654"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">399</int> + <reference key="object" ref="769124883"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="18263474"/> + </object> + <reference key="parent" ref="786677654"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">400</int> + <reference key="object" ref="739652853"/> + <reference key="parent" ref="786677654"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">401</int> + <reference key="object" ref="1012600125"/> + <reference key="parent" ref="786677654"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">402</int> + <reference key="object" ref="214559597"/> + <reference key="parent" ref="786677654"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">403</int> + <reference key="object" ref="596732606"/> + <reference key="parent" ref="786677654"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">404</int> + <reference key="object" ref="393423671"/> + <reference key="parent" ref="786677654"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">405</int> + <reference key="object" ref="18263474"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="257962622"/> + <reference ref="644725453"/> + <reference ref="1037576581"/> + <reference ref="941806246"/> + <reference ref="1045724900"/> + </object> + <reference key="parent" ref="769124883"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">406</int> + <reference key="object" ref="257962622"/> + <reference key="parent" ref="18263474"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">407</int> + <reference key="object" ref="644725453"/> + <reference key="parent" ref="18263474"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">408</int> + <reference key="object" ref="1037576581"/> + <reference key="parent" ref="18263474"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">409</int> + <reference key="object" ref="941806246"/> + <reference key="parent" ref="18263474"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">410</int> + <reference key="object" ref="1045724900"/> + <reference key="parent" ref="18263474"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">411</int> + <reference key="object" ref="1058217995"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="706297211"/> + <reference ref="568384683"/> + <reference ref="663508465"/> + </object> + <reference key="parent" ref="691570813"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">412</int> + <reference key="object" ref="706297211"/> + <reference key="parent" ref="1058217995"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">413</int> + <reference key="object" ref="568384683"/> + <reference key="parent" ref="1058217995"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">414</int> + <reference key="object" ref="663508465"/> + <reference key="parent" ref="1058217995"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">415</int> + <reference key="object" ref="175441468"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="252969304"/> + <reference ref="766922938"/> + <reference ref="677519740"/> + <reference ref="238351151"/> + </object> + <reference key="parent" ref="767671776"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">416</int> + <reference key="object" ref="252969304"/> + <reference key="parent" ref="175441468"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">417</int> + <reference key="object" ref="766922938"/> + <reference key="parent" ref="175441468"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">418</int> + <reference key="object" ref="677519740"/> + <reference key="parent" ref="175441468"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">419</int> + <reference key="object" ref="238351151"/> + <reference key="parent" ref="175441468"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">420</int> + <reference key="object" ref="755631768"/> + <reference key="parent" ref="0"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">450</int> + <reference key="object" ref="288088188"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="579392910"/> + </object> + <reference key="parent" ref="789758025"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">451</int> + <reference key="object" ref="579392910"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="1060694897"/> + <reference ref="879586729"/> + <reference ref="56570060"/> + </object> + <reference key="parent" ref="288088188"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">452</int> + <reference key="object" ref="1060694897"/> + <reference key="parent" ref="579392910"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">453</int> + <reference key="object" ref="859480356"/> + <reference key="parent" ref="769623530"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">454</int> + <reference key="object" ref="795346622"/> + <reference key="parent" ref="769623530"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">457</int> + <reference key="object" ref="65139061"/> + <reference key="parent" ref="698887838"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">459</int> + <reference key="object" ref="19036812"/> + <reference key="parent" ref="698887838"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">460</int> + <reference key="object" ref="672708820"/> + <reference key="parent" ref="698887838"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">462</int> + <reference key="object" ref="537092702"/> + <reference key="parent" ref="698887838"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">465</int> + <reference key="object" ref="879586729"/> + <reference key="parent" ref="579392910"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">466</int> + <reference key="object" ref="56570060"/> + <reference key="parent" ref="579392910"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">485</int> + <reference key="object" ref="82994268"/> + <reference key="parent" ref="789758025"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">490</int> + <reference key="object" ref="448692316"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="992780483"/> + </object> + <reference key="parent" ref="649796088"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">491</int> + <reference key="object" ref="992780483"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="105068016"/> + </object> + <reference key="parent" ref="448692316"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">492</int> + <reference key="object" ref="105068016"/> + <reference key="parent" ref="992780483"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">494</int> + <reference key="object" ref="976324537"/> + <reference key="parent" ref="0"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">496</int> + <reference key="object" ref="215659978"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="446991534"/> + </object> + <reference key="parent" ref="941447902"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">497</int> + <reference key="object" ref="446991534"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="875092757"/> + <reference ref="630155264"/> + <reference ref="945678886"/> + <reference ref="512868991"/> + <reference ref="163117631"/> + <reference ref="31516759"/> + <reference ref="908105787"/> + <reference ref="644046920"/> + <reference ref="231811626"/> + <reference ref="883618387"/> + </object> + <reference key="parent" ref="215659978"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">498</int> + <reference key="object" ref="875092757"/> + <reference key="parent" ref="446991534"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">499</int> + <reference key="object" ref="630155264"/> + <reference key="parent" ref="446991534"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">500</int> + <reference key="object" ref="945678886"/> + <reference key="parent" ref="446991534"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">501</int> + <reference key="object" ref="512868991"/> + <reference key="parent" ref="446991534"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">502</int> + <reference key="object" ref="163117631"/> + <reference key="parent" ref="446991534"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">503</int> + <reference key="object" ref="31516759"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="956096989"/> + </object> + <reference key="parent" ref="446991534"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">504</int> + <reference key="object" ref="908105787"/> + <reference key="parent" ref="446991534"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">505</int> + <reference key="object" ref="644046920"/> + <reference key="parent" ref="446991534"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">506</int> + <reference key="object" ref="231811626"/> + <reference key="parent" ref="446991534"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">507</int> + <reference key="object" ref="883618387"/> + <reference key="parent" ref="446991534"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">508</int> + <reference key="object" ref="956096989"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="257099033"/> + <reference ref="551969625"/> + <reference ref="249532473"/> + <reference ref="607364498"/> + <reference ref="508151438"/> + <reference ref="981751889"/> + <reference ref="380031999"/> + <reference ref="825984362"/> + <reference ref="560145579"/> + </object> + <reference key="parent" ref="31516759"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">509</int> + <reference key="object" ref="257099033"/> + <reference key="parent" ref="956096989"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">510</int> + <reference key="object" ref="551969625"/> + <reference key="parent" ref="956096989"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">511</int> + <reference key="object" ref="249532473"/> + <reference key="parent" ref="956096989"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">512</int> + <reference key="object" ref="607364498"/> + <reference key="parent" ref="956096989"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">513</int> + <reference key="object" ref="508151438"/> + <reference key="parent" ref="956096989"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">514</int> + <reference key="object" ref="981751889"/> + <reference key="parent" ref="956096989"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">515</int> + <reference key="object" ref="380031999"/> + <reference key="parent" ref="956096989"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">516</int> + <reference key="object" ref="825984362"/> + <reference key="parent" ref="956096989"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">517</int> + <reference key="object" ref="560145579"/> + <reference key="parent" ref="956096989"/> + </object> + </object> + </object> + <object class="NSMutableDictionary" key="flattenedProperties"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSArray" key="dict.sortedKeys"> + <bool key="EncodedWithXMLCoder">YES</bool> + <string>-3.IBPluginDependency</string> + <string>112.IBPluginDependency</string> + <string>112.ImportedFromIB2</string> + <string>124.IBPluginDependency</string> + <string>124.ImportedFromIB2</string> + <string>125.IBPluginDependency</string> + <string>125.ImportedFromIB2</string> + <string>125.editorWindowContentRectSynchronizationRect</string> + <string>126.IBPluginDependency</string> + <string>126.ImportedFromIB2</string> + <string>129.IBPluginDependency</string> + <string>129.ImportedFromIB2</string> + <string>130.IBPluginDependency</string> + <string>130.ImportedFromIB2</string> + <string>130.editorWindowContentRectSynchronizationRect</string> + <string>131.IBPluginDependency</string> + <string>131.ImportedFromIB2</string> + <string>134.IBPluginDependency</string> + <string>134.ImportedFromIB2</string> + <string>136.IBPluginDependency</string> + <string>136.ImportedFromIB2</string> + <string>143.IBPluginDependency</string> + <string>143.ImportedFromIB2</string> + <string>144.IBPluginDependency</string> + <string>144.ImportedFromIB2</string> + <string>145.IBPluginDependency</string> + <string>145.ImportedFromIB2</string> + <string>149.IBPluginDependency</string> + <string>149.ImportedFromIB2</string> + <string>150.IBPluginDependency</string> + <string>150.ImportedFromIB2</string> + <string>19.IBPluginDependency</string> + <string>19.ImportedFromIB2</string> + <string>195.IBPluginDependency</string> + <string>195.ImportedFromIB2</string> + <string>196.IBPluginDependency</string> + <string>196.ImportedFromIB2</string> + <string>197.IBPluginDependency</string> + <string>197.ImportedFromIB2</string> + <string>198.IBPluginDependency</string> + <string>198.ImportedFromIB2</string> + <string>199.IBPluginDependency</string> + <string>199.ImportedFromIB2</string> + <string>200.IBEditorWindowLastContentRect</string> + <string>200.IBPluginDependency</string> + <string>200.ImportedFromIB2</string> + <string>200.editorWindowContentRectSynchronizationRect</string> + <string>201.IBPluginDependency</string> + <string>201.ImportedFromIB2</string> + <string>202.IBPluginDependency</string> + <string>202.ImportedFromIB2</string> + <string>203.IBPluginDependency</string> + <string>203.ImportedFromIB2</string> + <string>204.IBPluginDependency</string> + <string>204.ImportedFromIB2</string> + <string>205.IBEditorWindowLastContentRect</string> + <string>205.IBPluginDependency</string> + <string>205.ImportedFromIB2</string> + <string>205.editorWindowContentRectSynchronizationRect</string> + <string>206.IBPluginDependency</string> + <string>206.ImportedFromIB2</string> + <string>207.IBPluginDependency</string> + <string>207.ImportedFromIB2</string> + <string>208.IBPluginDependency</string> + <string>208.ImportedFromIB2</string> + <string>209.IBPluginDependency</string> + <string>209.ImportedFromIB2</string> + <string>210.IBPluginDependency</string> + <string>210.ImportedFromIB2</string> + <string>211.IBPluginDependency</string> + <string>211.ImportedFromIB2</string> + <string>212.IBPluginDependency</string> + <string>212.ImportedFromIB2</string> + <string>212.editorWindowContentRectSynchronizationRect</string> + <string>213.IBPluginDependency</string> + <string>213.ImportedFromIB2</string> + <string>214.IBPluginDependency</string> + <string>214.ImportedFromIB2</string> + <string>215.IBPluginDependency</string> + <string>215.ImportedFromIB2</string> + <string>216.IBPluginDependency</string> + <string>216.ImportedFromIB2</string> + <string>217.IBPluginDependency</string> + <string>217.ImportedFromIB2</string> + <string>218.IBPluginDependency</string> + <string>218.ImportedFromIB2</string> + <string>219.IBPluginDependency</string> + <string>219.ImportedFromIB2</string> + <string>220.IBEditorWindowLastContentRect</string> + <string>220.IBPluginDependency</string> + <string>220.ImportedFromIB2</string> + <string>220.editorWindowContentRectSynchronizationRect</string> + <string>221.IBPluginDependency</string> + <string>221.ImportedFromIB2</string> + <string>23.IBPluginDependency</string> + <string>23.ImportedFromIB2</string> + <string>236.IBPluginDependency</string> + <string>236.ImportedFromIB2</string> + <string>239.IBPluginDependency</string> + <string>239.ImportedFromIB2</string> + <string>24.IBEditorWindowLastContentRect</string> + <string>24.IBPluginDependency</string> + <string>24.ImportedFromIB2</string> + <string>24.editorWindowContentRectSynchronizationRect</string> + <string>29.IBEditorWindowLastContentRect</string> + <string>29.IBPluginDependency</string> + <string>29.ImportedFromIB2</string> + <string>29.WindowOrigin</string> + <string>29.editorWindowContentRectSynchronizationRect</string> + <string>295.IBPluginDependency</string> + <string>296.IBEditorWindowLastContentRect</string> + <string>296.IBPluginDependency</string> + <string>296.editorWindowContentRectSynchronizationRect</string> + <string>297.IBPluginDependency</string> + <string>298.IBPluginDependency</string> + <string>346.IBPluginDependency</string> + <string>346.ImportedFromIB2</string> + <string>348.IBPluginDependency</string> + <string>348.ImportedFromIB2</string> + <string>349.IBEditorWindowLastContentRect</string> + <string>349.IBPluginDependency</string> + <string>349.ImportedFromIB2</string> + <string>349.editorWindowContentRectSynchronizationRect</string> + <string>350.IBPluginDependency</string> + <string>350.ImportedFromIB2</string> + <string>351.IBPluginDependency</string> + <string>351.ImportedFromIB2</string> + <string>354.IBPluginDependency</string> + <string>354.ImportedFromIB2</string> + <string>371.IBEditorWindowLastContentRect</string> + <string>371.IBPluginDependency</string> + <string>371.IBWindowTemplateEditedContentRect</string> + <string>371.NSWindowTemplate.visibleAtLaunch</string> + <string>371.editorWindowContentRectSynchronizationRect</string> + <string>371.windowTemplate.maxSize</string> + <string>372.IBPluginDependency</string> + <string>375.IBPluginDependency</string> + <string>376.IBEditorWindowLastContentRect</string> + <string>376.IBPluginDependency</string> + <string>377.IBPluginDependency</string> + <string>388.IBEditorWindowLastContentRect</string> + <string>388.IBPluginDependency</string> + <string>389.IBPluginDependency</string> + <string>390.IBPluginDependency</string> + <string>391.IBPluginDependency</string> + <string>392.IBPluginDependency</string> + <string>393.IBPluginDependency</string> + <string>394.IBPluginDependency</string> + <string>395.IBPluginDependency</string> + <string>396.IBPluginDependency</string> + <string>397.IBPluginDependency</string> + <string>398.IBPluginDependency</string> + <string>399.IBPluginDependency</string> + <string>400.IBPluginDependency</string> + <string>401.IBPluginDependency</string> + <string>402.IBPluginDependency</string> + <string>403.IBPluginDependency</string> + <string>404.IBPluginDependency</string> + <string>405.IBPluginDependency</string> + <string>406.IBPluginDependency</string> + <string>407.IBPluginDependency</string> + <string>408.IBPluginDependency</string> + <string>409.IBPluginDependency</string> + <string>410.IBPluginDependency</string> + <string>411.IBPluginDependency</string> + <string>412.IBPluginDependency</string> + <string>413.IBPluginDependency</string> + <string>414.IBPluginDependency</string> + <string>415.IBPluginDependency</string> + <string>416.IBPluginDependency</string> + <string>417.IBPluginDependency</string> + <string>418.IBPluginDependency</string> + <string>419.IBPluginDependency</string> + <string>450.IBPluginDependency</string> + <string>451.IBEditorWindowLastContentRect</string> + <string>451.IBPluginDependency</string> + <string>452.IBPluginDependency</string> + <string>453.IBPluginDependency</string> + <string>454.IBPluginDependency</string> + <string>457.IBPluginDependency</string> + <string>459.IBPluginDependency</string> + <string>460.IBPluginDependency</string> + <string>462.IBPluginDependency</string> + <string>465.IBPluginDependency</string> + <string>466.IBPluginDependency</string> + <string>485.IBPluginDependency</string> + <string>490.IBPluginDependency</string> + <string>491.IBEditorWindowLastContentRect</string> + <string>491.IBPluginDependency</string> + <string>492.IBPluginDependency</string> + <string>496.IBPluginDependency</string> + <string>497.IBEditorWindowLastContentRect</string> + <string>497.IBPluginDependency</string> + <string>498.IBPluginDependency</string> + <string>499.IBPluginDependency</string> + <string>5.IBPluginDependency</string> + <string>5.ImportedFromIB2</string> + <string>500.IBPluginDependency</string> + <string>501.IBPluginDependency</string> + <string>502.IBPluginDependency</string> + <string>503.IBPluginDependency</string> + <string>504.IBPluginDependency</string> + <string>505.IBPluginDependency</string> + <string>506.IBPluginDependency</string> + <string>507.IBPluginDependency</string> + <string>508.IBEditorWindowLastContentRect</string> + <string>508.IBPluginDependency</string> + <string>509.IBPluginDependency</string> + <string>510.IBPluginDependency</string> + <string>511.IBPluginDependency</string> + <string>512.IBPluginDependency</string> + <string>513.IBPluginDependency</string> + <string>514.IBPluginDependency</string> + <string>515.IBPluginDependency</string> + <string>516.IBPluginDependency</string> + <string>517.IBPluginDependency</string> + <string>56.IBPluginDependency</string> + <string>56.ImportedFromIB2</string> + <string>57.IBEditorWindowLastContentRect</string> + <string>57.IBPluginDependency</string> + <string>57.ImportedFromIB2</string> + <string>57.editorWindowContentRectSynchronizationRect</string> + <string>58.IBPluginDependency</string> + <string>58.ImportedFromIB2</string> + <string>72.IBPluginDependency</string> + <string>72.ImportedFromIB2</string> + <string>73.IBPluginDependency</string> + <string>73.ImportedFromIB2</string> + <string>74.IBPluginDependency</string> + <string>74.ImportedFromIB2</string> + <string>75.IBPluginDependency</string> + <string>75.ImportedFromIB2</string> + <string>77.IBPluginDependency</string> + <string>77.ImportedFromIB2</string> + <string>78.IBPluginDependency</string> + <string>78.ImportedFromIB2</string> + <string>79.IBPluginDependency</string> + <string>79.ImportedFromIB2</string> + <string>80.IBPluginDependency</string> + <string>80.ImportedFromIB2</string> + <string>81.IBEditorWindowLastContentRect</string> + <string>81.IBPluginDependency</string> + <string>81.ImportedFromIB2</string> + <string>81.editorWindowContentRectSynchronizationRect</string> + <string>82.IBPluginDependency</string> + <string>82.ImportedFromIB2</string> + <string>83.IBPluginDependency</string> + <string>83.ImportedFromIB2</string> + <string>92.IBPluginDependency</string> + <string>92.ImportedFromIB2</string> + </object> + <object class="NSMutableArray" key="dict.values"> + <bool key="EncodedWithXMLCoder">YES</bool> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <integer value="1"/> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <integer value="1"/> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <integer value="1"/> + <string>{{522, 812}, {146, 23}}</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <integer value="1"/> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <integer value="1"/> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <integer value="1"/> + <string>{{436, 809}, {64, 6}}</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <integer value="1"/> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <integer value="1"/> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <integer value="1"/> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <integer value="1"/> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <integer value="1"/> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <integer value="1"/> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <integer value="1"/> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <integer value="1"/> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <integer value="1"/> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <integer value="1"/> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <integer value="1"/> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <integer value="1"/> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <integer value="1"/> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <integer value="1"/> + <string>{{753, 187}, {275, 113}}</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <integer value="1"/> + <string>{{608, 612}, {275, 83}}</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <integer value="1"/> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <integer value="1"/> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <integer value="1"/> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <integer value="1"/> + <string>{{547, 180}, {254, 283}}</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <integer value="1"/> + <string>{{187, 434}, {243, 243}}</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <integer value="1"/> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <integer value="1"/> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <integer value="1"/> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <integer value="1"/> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <integer value="1"/> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <integer value="1"/> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <integer value="1"/> + <string>{{608, 612}, {167, 43}}</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <integer value="1"/> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <integer value="1"/> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <integer value="1"/> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <integer value="1"/> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <integer value="1"/> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <integer value="1"/> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <integer value="1"/> + <string>{{753, 217}, {238, 103}}</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <integer value="1"/> + <string>{{608, 612}, {241, 103}}</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <integer value="1"/> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <integer value="1"/> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <integer value="1"/> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <integer value="1"/> + <string>{{654, 239}, {194, 73}}</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <integer value="1"/> + <string>{{525, 802}, {197, 73}}</string> + <string>{{380, 836}, {512, 20}}</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <integer value="1"/> + <string>{74, 862}</string> + <string>{{6, 978}, {478, 20}}</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>{{604, 269}, {231, 43}}</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>{{475, 832}, {234, 43}}</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <integer value="1"/> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <integer value="1"/> + <string>{{746, 287}, {220, 133}}</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <integer value="1"/> + <string>{{608, 612}, {215, 63}}</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <integer value="1"/> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <integer value="1"/> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <integer value="1"/> + <string>{{380, 496}, {480, 360}}</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>{{380, 496}, {480, 360}}</string> + <integer value="1"/> + <string>{{33, 99}, {480, 360}}</string> + <string>{3.40282e+38, 3.40282e+38}</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>{{591, 420}, {83, 43}}</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>{{523, 2}, {178, 283}}</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>{{753, 197}, {170, 63}}</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>{{725, 289}, {246, 23}}</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>{{674, 260}, {204, 183}}</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <integer value="1"/> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>{{878, 180}, {164, 173}}</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <integer value="1"/> + <string>{{286, 129}, {275, 183}}</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <integer value="1"/> + <string>{{23, 794}, {245, 183}}</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <integer value="1"/> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <integer value="1"/> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <integer value="1"/> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <integer value="1"/> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <integer value="1"/> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <integer value="1"/> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <integer value="1"/> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <integer value="1"/> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <integer value="1"/> + <string>{{452, 109}, {196, 203}}</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <integer value="1"/> + <string>{{145, 474}, {199, 203}}</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <integer value="1"/> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <integer value="1"/> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <integer value="1"/> + </object> + </object> + <object class="NSMutableDictionary" key="unlocalizedProperties"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference key="dict.sortedKeys" ref="0"/> + <object class="NSMutableArray" key="dict.values"> + <bool key="EncodedWithXMLCoder">YES</bool> + </object> + </object> + <nil key="activeLocalization"/> + <object class="NSMutableDictionary" key="localizations"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference key="dict.sortedKeys" ref="0"/> + <object class="NSMutableArray" key="dict.values"> + <bool key="EncodedWithXMLCoder">YES</bool> + </object> + </object> + <nil key="sourceID"/> + <int key="maxID">532</int> + </object> + <object class="IBClassDescriber" key="IBDocument.Classes"> + <object class="NSMutableArray" key="referencedPartialClassDescriptions"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="IBPartialClassDescription"> + <string key="className">TestAppAppDelegate</string> + <string key="superclassName">NSObject</string> + <object class="NSMutableDictionary" key="outlets"> + <string key="NS.key.0">window</string> + <string key="NS.object.0">NSWindow</string> + </object> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBProjectSource</string> + <string key="minorKey">TestAppAppDelegate.h</string> + </object> + </object> + </object> + <object class="NSMutableArray" key="referencedPartialClassDescriptionsV3.2+"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="IBPartialClassDescription"> + <string key="className">NSApplication</string> + <string key="superclassName">NSResponder</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier" id="822405504"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSApplication.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSApplication</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier" id="850738725"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSApplicationScripting.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSApplication</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier" id="624831158"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSColorPanel.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSApplication</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSHelpManager.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSApplication</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSPageLayout.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSApplication</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSUserInterfaceItemSearching.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSBrowser</string> + <string key="superclassName">NSControl</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSBrowser.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSControl</string> + <string key="superclassName">NSView</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier" id="310914472"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSControl.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSDocument</string> + <string key="superclassName">NSObject</string> + <object class="NSMutableDictionary" key="actions"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSArray" key="dict.sortedKeys"> + <bool key="EncodedWithXMLCoder">YES</bool> + <string>printDocument:</string> + <string>revertDocumentToSaved:</string> + <string>runPageLayout:</string> + <string>saveDocument:</string> + <string>saveDocumentAs:</string> + <string>saveDocumentTo:</string> + </object> + <object class="NSMutableArray" key="dict.values"> + <bool key="EncodedWithXMLCoder">YES</bool> + <string>id</string> + <string>id</string> + <string>id</string> + <string>id</string> + <string>id</string> + <string>id</string> + </object> + </object> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSDocument.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSDocument</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSDocumentScripting.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSDocumentController</string> + <string key="superclassName">NSObject</string> + <object class="NSMutableDictionary" key="actions"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSArray" key="dict.sortedKeys"> + <bool key="EncodedWithXMLCoder">YES</bool> + <string>clearRecentDocuments:</string> + <string>newDocument:</string> + <string>openDocument:</string> + <string>saveAllDocuments:</string> + </object> + <object class="NSMutableArray" key="dict.values"> + <bool key="EncodedWithXMLCoder">YES</bool> + <string>id</string> + <string>id</string> + <string>id</string> + <string>id</string> + </object> + </object> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSDocumentController.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSFontManager</string> + <string key="superclassName">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier" id="946436764"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSFontManager.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSFormatter</string> + <string key="superclassName">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">Foundation.framework/Headers/NSFormatter.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSMatrix</string> + <string key="superclassName">NSControl</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSMatrix.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSMenu</string> + <string key="superclassName">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier" id="1056362899"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSMenu.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSMenuItem</string> + <string key="superclassName">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier" id="472958451"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSMenuItem.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSMovieView</string> + <string key="superclassName">NSView</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSMovieView.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSAccessibility.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <reference key="sourceIdentifier" ref="822405504"/> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <reference key="sourceIdentifier" ref="850738725"/> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <reference key="sourceIdentifier" ref="624831158"/> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <reference key="sourceIdentifier" ref="310914472"/> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSDictionaryController.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSDragging.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <reference key="sourceIdentifier" ref="946436764"/> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSFontPanel.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSKeyValueBinding.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <reference key="sourceIdentifier" ref="1056362899"/> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSNibLoading.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSOutlineView.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSPasteboard.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSSavePanel.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier" id="809545482"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSTableView.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSToolbarItem.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier" id="260078765"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSView.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">Foundation.framework/Headers/NSArchiver.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">Foundation.framework/Headers/NSClassDescription.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">Foundation.framework/Headers/NSError.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">Foundation.framework/Headers/NSFileManager.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">Foundation.framework/Headers/NSKeyValueCoding.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">Foundation.framework/Headers/NSKeyValueObserving.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">Foundation.framework/Headers/NSKeyedArchiver.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">Foundation.framework/Headers/NSObject.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">Foundation.framework/Headers/NSObjectScripting.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">Foundation.framework/Headers/NSPortCoder.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">Foundation.framework/Headers/NSRunLoop.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">Foundation.framework/Headers/NSScriptClassDescription.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">Foundation.framework/Headers/NSScriptKeyValueCoding.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">Foundation.framework/Headers/NSScriptObjectSpecifiers.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">Foundation.framework/Headers/NSScriptWhoseTests.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">Foundation.framework/Headers/NSThread.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">Foundation.framework/Headers/NSURL.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">Foundation.framework/Headers/NSURLConnection.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">Foundation.framework/Headers/NSURLDownload.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSResponder</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSInterfaceStyle.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSResponder</string> + <string key="superclassName">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSResponder.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSTableView</string> + <string key="superclassName">NSControl</string> + <reference key="sourceIdentifier" ref="809545482"/> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSText</string> + <string key="superclassName">NSView</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSText.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSTextView</string> + <string key="superclassName">NSText</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSTextView.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSView</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSClipView.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSView</string> + <reference key="sourceIdentifier" ref="472958451"/> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSView</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSRulerView.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSView</string> + <string key="superclassName">NSResponder</string> + <reference key="sourceIdentifier" ref="260078765"/> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSWindow</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSDrawer.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSWindow</string> + <string key="superclassName">NSResponder</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSWindow.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSWindow</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSWindowScripting.h</string> + </object> + </object> + </object> + </object> + <int key="IBDocument.localizationMode">0</int> + <object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDependencyDefaults"> + <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin.macosx</string> + <integer value="1060" key="NS.object.0"/> + </object> + <object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDevelopmentDependencies"> + <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3</string> + <integer value="3000" key="NS.object.0"/> + </object> + <bool key="IBDocument.PluginDeclaredDependenciesTrackSystemTargetVersion">YES</bool> + <string key="IBDocument.LastKnownRelativeProjectPath">../TestApp.xcodeproj</string> + <int key="IBDocument.defaultPropertyAccessControl">3</int> + </data> +</archive> diff --git a/deps/gyp/test/mac/app-bundle/TestApp/English.lproj/utf-16be.strings b/deps/gyp/test/mac/app-bundle/TestApp/English.lproj/utf-16be.strings Binary files differnew file mode 100644 index 0000000000..580783735f --- /dev/null +++ b/deps/gyp/test/mac/app-bundle/TestApp/English.lproj/utf-16be.strings diff --git a/deps/gyp/test/mac/app-bundle/TestApp/English.lproj/utf-16le.strings b/deps/gyp/test/mac/app-bundle/TestApp/English.lproj/utf-16le.strings Binary files differnew file mode 100644 index 0000000000..eeb383784c --- /dev/null +++ b/deps/gyp/test/mac/app-bundle/TestApp/English.lproj/utf-16le.strings diff --git a/deps/gyp/test/mac/app-bundle/TestApp/Images.xcassets/AppIcon.appiconset/Contents.json b/deps/gyp/test/mac/app-bundle/TestApp/Images.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000000..2db2b1c7c6 --- /dev/null +++ b/deps/gyp/test/mac/app-bundle/TestApp/Images.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,58 @@ +{ + "images" : [ + { + "idiom" : "mac", + "size" : "16x16", + "scale" : "1x" + }, + { + "idiom" : "mac", + "size" : "16x16", + "scale" : "2x" + }, + { + "idiom" : "mac", + "size" : "32x32", + "scale" : "1x" + }, + { + "idiom" : "mac", + "size" : "32x32", + "scale" : "2x" + }, + { + "idiom" : "mac", + "size" : "128x128", + "scale" : "1x" + }, + { + "idiom" : "mac", + "size" : "128x128", + "scale" : "2x" + }, + { + "idiom" : "mac", + "size" : "256x256", + "scale" : "1x" + }, + { + "idiom" : "mac", + "size" : "256x256", + "scale" : "2x" + }, + { + "idiom" : "mac", + "size" : "512x512", + "scale" : "1x" + }, + { + "idiom" : "mac", + "size" : "512x512", + "scale" : "2x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +}
\ No newline at end of file diff --git a/deps/gyp/test/mac/app-bundle/TestApp/Images.xcassets/image.imageset/Contents.json b/deps/gyp/test/mac/app-bundle/TestApp/Images.xcassets/image.imageset/Contents.json new file mode 100644 index 0000000000..0a87b6edc6 --- /dev/null +++ b/deps/gyp/test/mac/app-bundle/TestApp/Images.xcassets/image.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x", + "filename" : "super_sylvain.png" + }, + { + "idiom" : "universal", + "scale" : "2x", + "filename" : "super_sylvain@2x.png" + }, + { + "idiom" : "universal", + "scale" : "3x", + "filename" : "super_sylvain@3x.png" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +}
\ No newline at end of file diff --git a/deps/gyp/test/mac/app-bundle/TestApp/Images.xcassets/image.imageset/super_sylvain.png b/deps/gyp/test/mac/app-bundle/TestApp/Images.xcassets/image.imageset/super_sylvain.png Binary files differnew file mode 100644 index 0000000000..0ba769182f --- /dev/null +++ b/deps/gyp/test/mac/app-bundle/TestApp/Images.xcassets/image.imageset/super_sylvain.png diff --git a/deps/gyp/test/mac/app-bundle/TestApp/Images.xcassets/image.imageset/super_sylvain@2x.png b/deps/gyp/test/mac/app-bundle/TestApp/Images.xcassets/image.imageset/super_sylvain@2x.png Binary files differnew file mode 100644 index 0000000000..edfa6a5682 --- /dev/null +++ b/deps/gyp/test/mac/app-bundle/TestApp/Images.xcassets/image.imageset/super_sylvain@2x.png diff --git a/deps/gyp/test/mac/app-bundle/TestApp/Images.xcassets/image.imageset/super_sylvain@3x.png b/deps/gyp/test/mac/app-bundle/TestApp/Images.xcassets/image.imageset/super_sylvain@3x.png Binary files differnew file mode 100644 index 0000000000..e0652efc72 --- /dev/null +++ b/deps/gyp/test/mac/app-bundle/TestApp/Images.xcassets/image.imageset/super_sylvain@3x.png diff --git a/deps/gyp/test/mac/app-bundle/TestApp/TestApp-Info.plist b/deps/gyp/test/mac/app-bundle/TestApp/TestApp-Info.plist new file mode 100644 index 0000000000..e005852f9f --- /dev/null +++ b/deps/gyp/test/mac/app-bundle/TestApp/TestApp-Info.plist @@ -0,0 +1,34 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> +<plist version="1.0"> +<dict> + <key>BuildMachineOSBuild</key> + <string>Doesn't matter, will be overwritten</string> + <key>CFBundleDevelopmentRegion</key> + <string>English</string> + <key>CFBundleExecutable</key> + <string>${EXECUTABLE_NAME}</string> + <key>CFBundleIconFile</key> + <string></string> + <key>CFBundleIdentifier</key> + <string>com.google.${PRODUCT_NAME:rfc1034identifier}</string> + <key>CFBundleInfoDictionaryVersion</key> + <string>6.0</string> + <key>CFBundleName</key> + <string>${PRODUCT_NAME}</string> + <key>CFBundlePackageType</key> + <string>APPL</string> + <key>CFBundleShortVersionString</key> + <string>1.0</string> + <key>CFBundleSignature</key> + <string>ause</string> + <key>CFBundleVersion</key> + <string>1</string> + <key>LSMinimumSystemVersion</key> + <string>${MACOSX_DEPLOYMENT_TARGET}</string> + <key>NSMainNibFile</key> + <string>MainMenu</string> + <key>NSPrincipalClass</key> + <string>NSApplication</string> +</dict> +</plist> diff --git a/deps/gyp/test/mac/app-bundle/TestApp/TestAppAppDelegate.h b/deps/gyp/test/mac/app-bundle/TestApp/TestAppAppDelegate.h new file mode 100644 index 0000000000..518645eae9 --- /dev/null +++ b/deps/gyp/test/mac/app-bundle/TestApp/TestAppAppDelegate.h @@ -0,0 +1,13 @@ +// Copyright (c) 2011 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 <Cocoa/Cocoa.h> + +@interface TestAppAppDelegate : NSObject <NSApplicationDelegate> { + NSWindow *window; +} + +@property (assign) IBOutlet NSWindow *window; + +@end diff --git a/deps/gyp/test/mac/app-bundle/TestApp/TestAppAppDelegate.m b/deps/gyp/test/mac/app-bundle/TestApp/TestAppAppDelegate.m new file mode 100644 index 0000000000..9aafa42000 --- /dev/null +++ b/deps/gyp/test/mac/app-bundle/TestApp/TestAppAppDelegate.m @@ -0,0 +1,15 @@ +// Copyright (c) 2011 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 "TestAppAppDelegate.h" + +@implementation TestAppAppDelegate + +@synthesize window; + +- (void)applicationDidFinishLaunching:(NSNotification *)aNotification { + // Insert code here to initialize your application +} + +@end diff --git a/deps/gyp/test/mac/app-bundle/TestApp/main.m b/deps/gyp/test/mac/app-bundle/TestApp/main.m new file mode 100644 index 0000000000..df6a12d065 --- /dev/null +++ b/deps/gyp/test/mac/app-bundle/TestApp/main.m @@ -0,0 +1,10 @@ +// Copyright (c) 2011 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 <Cocoa/Cocoa.h> + +int main(int argc, char *argv[]) +{ + return NSApplicationMain(argc, (const char **) argv); +} diff --git a/deps/gyp/test/mac/app-bundle/empty.c b/deps/gyp/test/mac/app-bundle/empty.c new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/deps/gyp/test/mac/app-bundle/empty.c diff --git a/deps/gyp/test/mac/app-bundle/test-assets-catalog.gyp b/deps/gyp/test/mac/app-bundle/test-assets-catalog.gyp new file mode 100644 index 0000000000..25f94a12d0 --- /dev/null +++ b/deps/gyp/test/mac/app-bundle/test-assets-catalog.gyp @@ -0,0 +1,43 @@ +# Copyright (c) 2011 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. +{ + 'targets': [ + { + 'target_name': 'dep_framework', + 'product_name': 'Dependency Framework', + 'type': 'shared_library', + 'mac_bundle': 1, + 'sources': [ 'empty.c', ], + }, + { + 'target_name': 'test_app', + 'product_name': 'Test App Assets Catalog Gyp', + 'type': 'executable', + 'mac_bundle': 1, + 'dependencies': [ 'dep_framework', ], + 'sources': [ + 'TestApp/main.m', + 'TestApp/TestApp_Prefix.pch', + 'TestApp/TestAppAppDelegate.h', + 'TestApp/TestAppAppDelegate.m', + ], + 'mac_bundle_resources': [ + 'TestApp/English.lproj/InfoPlist.strings', # UTF-8 + 'TestApp/English.lproj/utf-16be.strings', + 'TestApp/English.lproj/utf-16le.strings', + 'TestApp/English.lproj/MainMenu.xib', + 'TestApp/Images.xcassets', + ], + 'link_settings': { + 'libraries': [ + '$(SDKROOT)/System/Library/Frameworks/Cocoa.framework', + ], + }, + 'xcode_settings': { + 'INFOPLIST_FILE': 'TestApp/TestApp-Info.plist', + 'MACOSX_DEPLOYMENT_TARGET': '10.9', + }, + }, + ], +} diff --git a/deps/gyp/test/mac/app-bundle/test-error.gyp b/deps/gyp/test/mac/app-bundle/test-error.gyp new file mode 100644 index 0000000000..370772cc31 --- /dev/null +++ b/deps/gyp/test/mac/app-bundle/test-error.gyp @@ -0,0 +1,31 @@ +# Copyright (c) 2011 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. +{ + 'targets': [ + { + 'target_name': 'test_app', + 'product_name': 'Test App Gyp', + 'type': 'executable', + 'mac_bundle': 1, + 'sources': [ + 'TestApp/main.m', + 'TestApp/TestApp_Prefix.pch', + 'TestApp/TestAppAppDelegate.h', + 'TestApp/TestAppAppDelegate.m', + ], + 'mac_bundle_resources': [ + 'TestApp/English.lproj/InfoPlist-error.strings', + 'TestApp/English.lproj/MainMenu.xib', + ], + 'link_settings': { + 'libraries': [ + '$(SDKROOT)/System/Library/Frameworks/Cocoa.framework', + ], + }, + 'xcode_settings': { + 'INFOPLIST_FILE': 'TestApp/TestApp-Info.plist', + }, + }, + ], +} diff --git a/deps/gyp/test/mac/app-bundle/test.gyp b/deps/gyp/test/mac/app-bundle/test.gyp new file mode 100644 index 0000000000..21973c3623 --- /dev/null +++ b/deps/gyp/test/mac/app-bundle/test.gyp @@ -0,0 +1,41 @@ +# Copyright (c) 2011 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. +{ + 'targets': [ + { + 'target_name': 'dep_framework', + 'product_name': 'Dependency Framework', + 'type': 'shared_library', + 'mac_bundle': 1, + 'sources': [ 'empty.c', ], + }, + { + 'target_name': 'test_app', + 'product_name': 'Test App Gyp', + 'type': 'executable', + 'mac_bundle': 1, + 'dependencies': [ 'dep_framework', ], + 'sources': [ + 'TestApp/main.m', + 'TestApp/TestApp_Prefix.pch', + 'TestApp/TestAppAppDelegate.h', + 'TestApp/TestAppAppDelegate.m', + ], + 'mac_bundle_resources': [ + 'TestApp/English.lproj/InfoPlist.strings', # UTF-8 + 'TestApp/English.lproj/utf-16be.strings', + 'TestApp/English.lproj/utf-16le.strings', + 'TestApp/English.lproj/MainMenu.xib', + ], + 'link_settings': { + 'libraries': [ + '$(SDKROOT)/System/Library/Frameworks/Cocoa.framework', + ], + }, + 'xcode_settings': { + 'INFOPLIST_FILE': 'TestApp/TestApp-Info.plist', + }, + }, + ], +} diff --git a/deps/gyp/test/mac/archs/empty_main.cc b/deps/gyp/test/mac/archs/empty_main.cc new file mode 100644 index 0000000000..237c8ce181 --- /dev/null +++ b/deps/gyp/test/mac/archs/empty_main.cc @@ -0,0 +1 @@ +int main() {} diff --git a/deps/gyp/test/mac/archs/file.mm b/deps/gyp/test/mac/archs/file.mm new file mode 100644 index 0000000000..d0b39d1f6d --- /dev/null +++ b/deps/gyp/test/mac/archs/file.mm @@ -0,0 +1 @@ +MyInt f() { return 0; } diff --git a/deps/gyp/test/mac/archs/file_a.cc b/deps/gyp/test/mac/archs/file_a.cc new file mode 100644 index 0000000000..7307873c83 --- /dev/null +++ b/deps/gyp/test/mac/archs/file_a.cc @@ -0,0 +1,8 @@ +// Copyright (c) 2014 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. + +#include "file_a.h" + +void DependentFunctionA() { +} diff --git a/deps/gyp/test/mac/archs/file_a.h b/deps/gyp/test/mac/archs/file_a.h new file mode 100644 index 0000000000..7439d13182 --- /dev/null +++ b/deps/gyp/test/mac/archs/file_a.h @@ -0,0 +1,10 @@ +// Copyright (c) 2014 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. + +#ifndef _INCLUDED_TEST_MAC_DEPENDENCIES_FILE_A_H_ +#define _INCLUDED_TEST_MAC_DEPENDENCIES_FILE_A_H_ + +void DependentFunctionA(); + +#endif // _INCLUDED_TEST_MAC_DEPENDENCIES_FILE_A_H_ diff --git a/deps/gyp/test/mac/archs/file_b.cc b/deps/gyp/test/mac/archs/file_b.cc new file mode 100644 index 0000000000..72d59cbfb4 --- /dev/null +++ b/deps/gyp/test/mac/archs/file_b.cc @@ -0,0 +1,8 @@ +// Copyright (c) 2014 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. + +#include "file_b.h" + +void DependentFunctionB() { +} diff --git a/deps/gyp/test/mac/archs/file_b.h b/deps/gyp/test/mac/archs/file_b.h new file mode 100644 index 0000000000..eb272ece55 --- /dev/null +++ b/deps/gyp/test/mac/archs/file_b.h @@ -0,0 +1,10 @@ +// Copyright (c) 2014 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. + +#ifndef _INCLUDED_TEST_MAC_DEPENDENCIES_FILE_B_H_ +#define _INCLUDED_TEST_MAC_DEPENDENCIES_FILE_B_H_ + +void DependentFunctionB(); + +#endif // _INCLUDED_TEST_MAC_DEPENDENCIES_FILE_B_H_ diff --git a/deps/gyp/test/mac/archs/file_c.cc b/deps/gyp/test/mac/archs/file_c.cc new file mode 100644 index 0000000000..ca39f7a671 --- /dev/null +++ b/deps/gyp/test/mac/archs/file_c.cc @@ -0,0 +1,11 @@ +// Copyright (c) 2014 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. + +#include "file_a.h" +#include "file_b.h" + +void PublicFunctionC() { + DependentFunctionA(); + DependentFunctionB(); +} diff --git a/deps/gyp/test/mac/archs/file_d.cc b/deps/gyp/test/mac/archs/file_d.cc new file mode 100644 index 0000000000..c40911cdca --- /dev/null +++ b/deps/gyp/test/mac/archs/file_d.cc @@ -0,0 +1,11 @@ +// Copyright (c) 2014 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. + +#include "file_a.h" +#include "file_b.h" + +void PublicFunctionD() { + DependentFunctionA(); + DependentFunctionB(); +} diff --git a/deps/gyp/test/mac/archs/header.h b/deps/gyp/test/mac/archs/header.h new file mode 100644 index 0000000000..0716e500c5 --- /dev/null +++ b/deps/gyp/test/mac/archs/header.h @@ -0,0 +1 @@ +typedef int MyInt; diff --git a/deps/gyp/test/mac/archs/my_file.cc b/deps/gyp/test/mac/archs/my_file.cc new file mode 100644 index 0000000000..94216a74df --- /dev/null +++ b/deps/gyp/test/mac/archs/my_file.cc @@ -0,0 +1,4 @@ +/* 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. */ +int x = 1; diff --git a/deps/gyp/test/mac/archs/my_main_file.cc b/deps/gyp/test/mac/archs/my_main_file.cc new file mode 100644 index 0000000000..f1fa06f276 --- /dev/null +++ b/deps/gyp/test/mac/archs/my_main_file.cc @@ -0,0 +1,9 @@ +/* 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. */ +#include <stdio.h> +extern int x; +int main() { + printf("hello, world %d\n", x); +} + diff --git a/deps/gyp/test/mac/archs/test-archs-multiarch.gyp b/deps/gyp/test/mac/archs/test-archs-multiarch.gyp new file mode 100644 index 0000000000..567e8a6653 --- /dev/null +++ b/deps/gyp/test/mac/archs/test-archs-multiarch.gyp @@ -0,0 +1,92 @@ +# 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. + +{ + 'targets': [ + { + 'target_name': 'static_32_64', + 'type': 'static_library', + 'sources': [ 'my_file.cc' ], + 'xcode_settings': { + 'ARCHS': [ 'i386', 'x86_64' ], + }, + }, + { + 'target_name': 'shared_32_64', + 'type': 'shared_library', + 'sources': [ 'my_file.cc' ], + 'xcode_settings': { + 'ARCHS': [ 'i386', 'x86_64' ], + }, + }, + { + 'target_name': 'shared_32_64_bundle', + 'product_name': 'My Framework', + 'type': 'shared_library', + 'mac_bundle': 1, + 'sources': [ 'my_file.cc' ], + 'xcode_settings': { + 'ARCHS': [ 'i386', 'x86_64' ], + }, + }, + { + 'target_name': 'module_32_64', + 'type': 'loadable_module', + 'sources': [ 'my_file.cc' ], + 'xcode_settings': { + 'ARCHS': [ 'i386', 'x86_64' ], + }, + }, + { + 'target_name': 'module_32_64_bundle', + 'product_name': 'My Bundle', + 'type': 'loadable_module', + 'mac_bundle': 1, + 'sources': [ 'my_file.cc' ], + 'xcode_settings': { + 'ARCHS': [ 'i386', 'x86_64' ], + }, + }, + { + 'target_name': 'exe_32_64', + 'type': 'executable', + 'sources': [ 'empty_main.cc' ], + 'xcode_settings': { + 'ARCHS': [ 'i386', 'x86_64' ], + }, + }, + { + 'target_name': 'exe_32_64_bundle', + 'product_name': 'Test App', + 'type': 'executable', + 'mac_bundle': 1, + 'sources': [ 'empty_main.cc' ], + 'xcode_settings': { + 'ARCHS': [ 'i386', 'x86_64' ], + }, + }, + # This only needs to compile. + { + 'target_name': 'precompiled_prefix_header_mm_32_64', + 'type': 'shared_library', + 'sources': [ 'file.mm', ], + 'xcode_settings': { + 'GCC_PREFIX_HEADER': 'header.h', + 'GCC_PRECOMPILE_PREFIX_HEADER': 'YES', + }, + }, + # This does not compile but should not cause generation errors. + { + 'target_name': 'exe_32_64_no_sources', + 'type': 'executable', + 'dependencies': [ + 'static_32_64', + ], + 'sources': [], + 'xcode_settings': { + 'ARCHS': ['i386', 'x86_64'], + }, + }, + ] +} diff --git a/deps/gyp/test/mac/archs/test-archs-x86_64.gyp b/deps/gyp/test/mac/archs/test-archs-x86_64.gyp new file mode 100644 index 0000000000..d11a896273 --- /dev/null +++ b/deps/gyp/test/mac/archs/test-archs-x86_64.gyp @@ -0,0 +1,27 @@ +# 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. + +{ + 'targets': [ + { + 'target_name': 'lib', + 'product_name': 'Test64', + 'type': 'static_library', + 'sources': [ 'my_file.cc' ], + 'xcode_settings': { + 'ARCHS': [ 'x86_64' ], + }, + }, + { + 'target_name': 'exe', + 'product_name': 'Test64', + 'type': 'executable', + 'dependencies': [ 'lib' ], + 'sources': [ 'my_main_file.cc' ], + 'xcode_settings': { + 'ARCHS': [ 'x86_64' ], + }, + }, + ] +} diff --git a/deps/gyp/test/mac/archs/test-dependencies.gyp b/deps/gyp/test/mac/archs/test-dependencies.gyp new file mode 100644 index 0000000000..0431f5f2f4 --- /dev/null +++ b/deps/gyp/test/mac/archs/test-dependencies.gyp @@ -0,0 +1,92 @@ +# Copyright (c) 2014 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. + +{ + 'target_defaults': { + 'xcode_settings': { + 'ARCHS': ['i386', 'x86_64'], + }, + }, + 'targets': [ + { + 'target_name': 'target_a', + 'type': 'static_library', + 'sources': [ + 'file_a.cc', + 'file_a.h', + ], + }, + { + 'target_name': 'target_b', + 'type': 'static_library', + 'sources': [ + 'file_b.cc', + 'file_b.h', + ], + }, + { + 'target_name': 'target_c_standalone_helper', + 'type': 'loadable_module', + 'hard_dependency': 1, + 'dependencies': [ + 'target_a', + 'target_b', + ], + 'sources': [ + 'file_c.cc', + ], + }, + { + 'target_name': 'target_c_standalone', + 'type': 'none', + 'dependencies': [ + 'target_c_standalone_helper', + ], + 'actions': [ + { + 'action_name': 'Package C', + 'inputs': [], + 'outputs': [ + '<(PRODUCT_DIR)/libc_standalone.a', + ], + 'action': [ + 'touch', + '<@(_outputs)', + ], + }, + ], + }, + { + 'target_name': 'target_d_standalone_helper', + 'type': 'shared_library', + 'dependencies': [ + 'target_a', + 'target_b', + ], + 'sources': [ + 'file_d.cc', + ], + }, + { + 'target_name': 'target_d_standalone', + 'type': 'none', + 'dependencies': [ + 'target_d_standalone_helper', + ], + 'actions': [ + { + 'action_name': 'Package D', + 'inputs': [], + 'outputs': [ + '<(PRODUCT_DIR)/libd_standalone.a', + ], + 'action': [ + 'touch', + '<@(_outputs)', + ], + }, + ], + } + ], +} diff --git a/deps/gyp/test/mac/archs/test-no-archs.gyp b/deps/gyp/test/mac/archs/test-no-archs.gyp new file mode 100644 index 0000000000..8f3b6b47cc --- /dev/null +++ b/deps/gyp/test/mac/archs/test-no-archs.gyp @@ -0,0 +1,21 @@ +# 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. + +{ + 'targets': [ + { + 'target_name': 'lib', + 'product_name': 'Test', + 'type': 'static_library', + 'sources': [ 'my_file.cc' ], + }, + { + 'target_name': 'exe', + 'product_name': 'Test', + 'type': 'executable', + 'dependencies': [ 'lib' ], + 'sources': [ 'my_main_file.cc' ], + }, + ] +} diff --git a/deps/gyp/test/mac/archs/test-valid-archs.gyp b/deps/gyp/test/mac/archs/test-valid-archs.gyp new file mode 100644 index 0000000000..c90ec1fe9b --- /dev/null +++ b/deps/gyp/test/mac/archs/test-valid-archs.gyp @@ -0,0 +1,28 @@ +# Copyright (c) 2014 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. + +{ + 'targets': [ + { + 'target_name': 'lib', + 'product_name': 'Test', + 'type': 'static_library', + 'sources': [ 'my_file.cc' ], + 'xcode_settings': { + 'ARCHS': ['i386', 'x86_64', 'unknown-arch'], + 'VALID_ARCHS': ['x86_64'], + }, + }, + { + 'target_name': 'exe', + 'product_name': 'Test', + 'type': 'executable', + 'dependencies': [ 'lib' ], + 'sources': [ 'my_main_file.cc' ], + 'xcode_settings': { + 'ARCHS': ['i386', 'x86_64', 'unknown-arch'], + 'VALID_ARCHS': ['x86_64'], + }, + }] +} diff --git a/deps/gyp/test/mac/bundle-resources/change.sh b/deps/gyp/test/mac/bundle-resources/change.sh new file mode 100755 index 0000000000..6d0fe6c7c2 --- /dev/null +++ b/deps/gyp/test/mac/bundle-resources/change.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +tr a-z A-Z < "${1}" > "${2}" diff --git a/deps/gyp/test/mac/bundle-resources/executable-file.sh b/deps/gyp/test/mac/bundle-resources/executable-file.sh new file mode 100755 index 0000000000..796953a1a2 --- /dev/null +++ b/deps/gyp/test/mac/bundle-resources/executable-file.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +echo echo echo echo cho ho o o diff --git a/deps/gyp/test/mac/bundle-resources/secret.txt b/deps/gyp/test/mac/bundle-resources/secret.txt new file mode 100644 index 0000000000..8baef1b4ab --- /dev/null +++ b/deps/gyp/test/mac/bundle-resources/secret.txt @@ -0,0 +1 @@ +abc diff --git a/deps/gyp/test/mac/bundle-resources/test.gyp b/deps/gyp/test/mac/bundle-resources/test.gyp new file mode 100644 index 0000000000..af034ce3f4 --- /dev/null +++ b/deps/gyp/test/mac/bundle-resources/test.gyp @@ -0,0 +1,59 @@ +# Copyright (c) 2013 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. +{ + 'targets': [ + { + 'target_name': 'resource', + 'type': 'executable', + 'mac_bundle': 1, + 'mac_bundle_resources': [ + 'secret.txt', + 'executable-file.sh', + ], + }, + # A rule with process_outputs_as_mac_bundle_resources should copy files + # into the Resources folder. + { + 'target_name': 'source_rule', + 'type': 'executable', + 'mac_bundle': 1, + 'sources': [ + 'secret.txt', + ], + 'rules': [ + { + 'rule_name': 'bundlerule', + 'extension': 'txt', + 'outputs': [ + '<(INTERMEDIATE_DIR)/<(RULE_INPUT_ROOT).txt', + ], + 'action': ['./change.sh', '<(RULE_INPUT_PATH)', '<@(_outputs)'], + 'message': 'Running rule on <(RULE_INPUT_PATH)', + 'process_outputs_as_mac_bundle_resources': 1, + }, + ], + }, + # So should an ordinary rule acting on mac_bundle_resources. + { + 'target_name': 'resource_rule', + 'type': 'executable', + 'mac_bundle': 1, + 'mac_bundle_resources': [ + 'secret.txt', + ], + 'rules': [ + { + 'rule_name': 'bundlerule', + 'extension': 'txt', + 'outputs': [ + '<(INTERMEDIATE_DIR)/<(RULE_INPUT_ROOT).txt', + ], + 'action': ['./change.sh', '<(RULE_INPUT_PATH)', '<@(_outputs)'], + 'message': 'Running rule on <(RULE_INPUT_PATH)', + }, + ], + }, + ], +} + diff --git a/deps/gyp/test/mac/cflags/ccfile.cc b/deps/gyp/test/mac/cflags/ccfile.cc new file mode 100644 index 0000000000..1a54d18eec --- /dev/null +++ b/deps/gyp/test/mac/cflags/ccfile.cc @@ -0,0 +1,7 @@ +#ifdef CFLAG +#error CFLAG should not be set +#endif + +#ifndef CCFLAG +#error CCFLAG should be set +#endif diff --git a/deps/gyp/test/mac/cflags/ccfile_withcflags.cc b/deps/gyp/test/mac/cflags/ccfile_withcflags.cc new file mode 100644 index 0000000000..de078a0641 --- /dev/null +++ b/deps/gyp/test/mac/cflags/ccfile_withcflags.cc @@ -0,0 +1,7 @@ +#ifndef CFLAG +#error CFLAG should be set +#endif + +#ifndef CCFLAG +#error CCFLAG should be set +#endif diff --git a/deps/gyp/test/mac/cflags/cfile.c b/deps/gyp/test/mac/cflags/cfile.c new file mode 100644 index 0000000000..0af9d0af5d --- /dev/null +++ b/deps/gyp/test/mac/cflags/cfile.c @@ -0,0 +1,7 @@ +#ifndef CFLAG +#error CFLAG should be set +#endif + +#ifdef CCFLAG +#error CCFLAG should not be set +#endif diff --git a/deps/gyp/test/mac/cflags/cppfile.cpp b/deps/gyp/test/mac/cflags/cppfile.cpp new file mode 100644 index 0000000000..1a54d18eec --- /dev/null +++ b/deps/gyp/test/mac/cflags/cppfile.cpp @@ -0,0 +1,7 @@ +#ifdef CFLAG +#error CFLAG should not be set +#endif + +#ifndef CCFLAG +#error CCFLAG should be set +#endif diff --git a/deps/gyp/test/mac/cflags/cppfile_withcflags.cpp b/deps/gyp/test/mac/cflags/cppfile_withcflags.cpp new file mode 100644 index 0000000000..de078a0641 --- /dev/null +++ b/deps/gyp/test/mac/cflags/cppfile_withcflags.cpp @@ -0,0 +1,7 @@ +#ifndef CFLAG +#error CFLAG should be set +#endif + +#ifndef CCFLAG +#error CCFLAG should be set +#endif diff --git a/deps/gyp/test/mac/cflags/cxxfile.cxx b/deps/gyp/test/mac/cflags/cxxfile.cxx new file mode 100644 index 0000000000..1a54d18eec --- /dev/null +++ b/deps/gyp/test/mac/cflags/cxxfile.cxx @@ -0,0 +1,7 @@ +#ifdef CFLAG +#error CFLAG should not be set +#endif + +#ifndef CCFLAG +#error CCFLAG should be set +#endif diff --git a/deps/gyp/test/mac/cflags/cxxfile_withcflags.cxx b/deps/gyp/test/mac/cflags/cxxfile_withcflags.cxx new file mode 100644 index 0000000000..de078a0641 --- /dev/null +++ b/deps/gyp/test/mac/cflags/cxxfile_withcflags.cxx @@ -0,0 +1,7 @@ +#ifndef CFLAG +#error CFLAG should be set +#endif + +#ifndef CCFLAG +#error CCFLAG should be set +#endif diff --git a/deps/gyp/test/mac/cflags/mfile.m b/deps/gyp/test/mac/cflags/mfile.m new file mode 100644 index 0000000000..0af9d0af5d --- /dev/null +++ b/deps/gyp/test/mac/cflags/mfile.m @@ -0,0 +1,7 @@ +#ifndef CFLAG +#error CFLAG should be set +#endif + +#ifdef CCFLAG +#error CCFLAG should not be set +#endif diff --git a/deps/gyp/test/mac/cflags/mmfile.mm b/deps/gyp/test/mac/cflags/mmfile.mm new file mode 100644 index 0000000000..1a54d18eec --- /dev/null +++ b/deps/gyp/test/mac/cflags/mmfile.mm @@ -0,0 +1,7 @@ +#ifdef CFLAG +#error CFLAG should not be set +#endif + +#ifndef CCFLAG +#error CCFLAG should be set +#endif diff --git a/deps/gyp/test/mac/cflags/mmfile_withcflags.mm b/deps/gyp/test/mac/cflags/mmfile_withcflags.mm new file mode 100644 index 0000000000..de078a0641 --- /dev/null +++ b/deps/gyp/test/mac/cflags/mmfile_withcflags.mm @@ -0,0 +1,7 @@ +#ifndef CFLAG +#error CFLAG should be set +#endif + +#ifndef CCFLAG +#error CCFLAG should be set +#endif diff --git a/deps/gyp/test/mac/cflags/test.gyp b/deps/gyp/test/mac/cflags/test.gyp new file mode 100644 index 0000000000..d330a548f6 --- /dev/null +++ b/deps/gyp/test/mac/cflags/test.gyp @@ -0,0 +1,132 @@ +# 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. +{ + 'targets': [ + { + 'target_name': 'mytarget', + 'type': 'shared_library', + 'sources': [ + 'cfile.c', + 'mfile.m', + 'ccfile.cc', + 'cppfile.cpp', + 'cxxfile.cxx', + 'mmfile.mm', + ], + 'xcode_settings': { + # Normally, defines would go in 'defines' instead. This is just for + # testing. + 'OTHER_CFLAGS': [ + '-DCFLAG', + ], + 'OTHER_CPLUSPLUSFLAGS': [ + '-DCCFLAG', + ], + 'GCC_C_LANGUAGE_STANDARD': 'c99', + }, + }, + { + 'target_name': 'mytarget_reuse_cflags', + 'type': 'shared_library', + 'sources': [ + 'cfile.c', + 'mfile.m', + 'ccfile_withcflags.cc', + 'cppfile_withcflags.cpp', + 'cxxfile_withcflags.cxx', + 'mmfile_withcflags.mm', + ], + 'xcode_settings': { + 'OTHER_CFLAGS': [ + '-DCFLAG', + ], + 'OTHER_CPLUSPLUSFLAGS': [ + '$OTHER_CFLAGS', + '-DCCFLAG', + ], + # This is a C-only flag, to check these don't get added to C++ files. + 'GCC_C_LANGUAGE_STANDARD': 'c99', + }, + }, + { + 'target_name': 'mytarget_inherit_cflags', + 'type': 'shared_library', + 'sources': [ + 'cfile.c', + 'mfile.m', + 'ccfile_withcflags.cc', + 'cppfile_withcflags.cpp', + 'cxxfile_withcflags.cxx', + 'mmfile_withcflags.mm', + ], + 'xcode_settings': { + 'OTHER_CFLAGS': [ + '-DCFLAG', + ], + 'OTHER_CPLUSPLUSFLAGS': [ + '$inherited', + '-DCCFLAG', + ], + 'GCC_C_LANGUAGE_STANDARD': 'c99', + }, + }, + { + 'target_name': 'mytarget_inherit_cflags_parens', + 'type': 'shared_library', + 'sources': [ + 'cfile.c', + 'mfile.m', + 'ccfile_withcflags.cc', + 'cppfile_withcflags.cpp', + 'cxxfile_withcflags.cxx', + 'mmfile_withcflags.mm', + ], + 'xcode_settings': { + 'OTHER_CFLAGS': [ + '-DCFLAG', + ], + 'OTHER_CPLUSPLUSFLAGS': [ + '$(inherited)', + '-DCCFLAG', + ], + 'GCC_C_LANGUAGE_STANDARD': 'c99', + }, + }, + { + 'target_name': 'mytarget_inherit_cflags_braces', + 'type': 'shared_library', + 'sources': [ + 'cfile.c', + 'mfile.m', + 'ccfile_withcflags.cc', + 'cppfile_withcflags.cpp', + 'cxxfile_withcflags.cxx', + 'mmfile_withcflags.mm', + ], + 'xcode_settings': { + 'OTHER_CFLAGS': [ + '-DCFLAG', + ], + 'OTHER_CPLUSPLUSFLAGS': [ + '${inherited}', + '-DCCFLAG', + ], + 'GCC_C_LANGUAGE_STANDARD': 'c99', + }, + }, + { + 'target_name': 'ansi_standard', + 'type': 'shared_library', + 'sources': [ + 'cfile.c', + ], + 'xcode_settings': { + 'OTHER_CFLAGS': [ + '-DCFLAG', + ], + 'GCC_C_LANGUAGE_STANDARD': 'ansi', + }, + }, + ], +} diff --git a/deps/gyp/test/mac/clang-cxx-language-standard/c++11.cc b/deps/gyp/test/mac/clang-cxx-language-standard/c++11.cc new file mode 100644 index 0000000000..756dc1c7e6 --- /dev/null +++ b/deps/gyp/test/mac/clang-cxx-language-standard/c++11.cc @@ -0,0 +1,8 @@ +// Copyright (c) 2013 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. + +static_assert(__cplusplus == 201103L, "wrong c++ standard version"); + +int main() { return 0; } + diff --git a/deps/gyp/test/mac/clang-cxx-language-standard/c++98.cc b/deps/gyp/test/mac/clang-cxx-language-standard/c++98.cc new file mode 100644 index 0000000000..a6a00c70f4 --- /dev/null +++ b/deps/gyp/test/mac/clang-cxx-language-standard/c++98.cc @@ -0,0 +1,24 @@ +// Copyright (c) 2013 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. + +#if __cplusplus != 199711L +#error wrong c++ standard version +#endif + +enum cxx11_keywords { + alignas, + alignof, + char16_t, + char32_t, + constexpr, + decltype, + noexcept, + nullptr, + override, + static_assert, + thread_local, +}; + +int main() { return 0; } + diff --git a/deps/gyp/test/mac/clang-cxx-language-standard/clang-cxx-language-standard.gyp b/deps/gyp/test/mac/clang-cxx-language-standard/clang-cxx-language-standard.gyp new file mode 100644 index 0000000000..eb60bbd0e8 --- /dev/null +++ b/deps/gyp/test/mac/clang-cxx-language-standard/clang-cxx-language-standard.gyp @@ -0,0 +1,30 @@ +# Copyright (c) 2013 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. +{ + 'make_global_settings': [ + ['CC', '/usr/bin/clang'], + ['CXX', '/usr/bin/clang++'], + ], + 'targets': [ + { + 'target_name': 'c++98', + 'type': 'executable', + 'sources': [ 'c++98.cc', ], + 'xcode_settings': { + 'GCC_VERSION': 'com.apple.compilers.llvm.clang.1_0', + 'CLANG_CXX_LANGUAGE_STANDARD': 'c++98', + }, + }, + { + 'target_name': 'c++11', + 'type': 'executable', + 'sources': [ 'c++11.cc', ], + 'xcode_settings': { + 'GCC_VERSION': 'com.apple.compilers.llvm.clang.1_0', + 'CLANG_CXX_LANGUAGE_STANDARD': 'c++0x', + }, + }, + ], +} + diff --git a/deps/gyp/test/mac/clang-cxx-library/clang-cxx-library.gyp b/deps/gyp/test/mac/clang-cxx-library/clang-cxx-library.gyp new file mode 100644 index 0000000000..67006e50a0 --- /dev/null +++ b/deps/gyp/test/mac/clang-cxx-library/clang-cxx-library.gyp @@ -0,0 +1,32 @@ +# Copyright (c) 2013 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. +{ + 'make_global_settings': [ + ['CC', '/usr/bin/clang'], + ['CXX', '/usr/bin/clang++'], + ], + 'targets': [ + { + 'target_name': 'libc++', + 'type': 'executable', + 'sources': [ 'libc++.cc', ], + 'xcode_settings': { + 'CC': 'clang', + # libc++ requires OS X 10.7+. + 'MACOSX_DEPLOYMENT_TARGET': '10.7', + 'CLANG_CXX_LIBRARY': 'libc++', + }, + }, + { + 'target_name': 'libstdc++', + 'type': 'executable', + 'sources': [ 'libstdc++.cc', ], + 'xcode_settings': { + 'CC': 'clang', + 'CLANG_CXX_LIBRARY': 'libstdc++', + }, + }, + ], +} + diff --git a/deps/gyp/test/mac/clang-cxx-library/libc++.cc b/deps/gyp/test/mac/clang-cxx-library/libc++.cc new file mode 100644 index 0000000000..b8d6e6b3e2 --- /dev/null +++ b/deps/gyp/test/mac/clang-cxx-library/libc++.cc @@ -0,0 +1,11 @@ +// Copyright (c) 2013 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. + +#include <string> +#ifndef _LIBCPP_VERSION +#error expected std library: libc++ +#endif + +int main() { std::string x; return x.size(); } + diff --git a/deps/gyp/test/mac/clang-cxx-library/libstdc++.cc b/deps/gyp/test/mac/clang-cxx-library/libstdc++.cc new file mode 100644 index 0000000000..474dbf350d --- /dev/null +++ b/deps/gyp/test/mac/clang-cxx-library/libstdc++.cc @@ -0,0 +1,11 @@ +// Copyright (c) 2013 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. + +#include <string> +#ifndef __GLIBCXX__ +#error expected std library: libstdc++ +#endif + +int main() { std::string x; return x.size(); } + diff --git a/deps/gyp/test/mac/copy-dylib/empty.c b/deps/gyp/test/mac/copy-dylib/empty.c new file mode 100644 index 0000000000..237c8ce181 --- /dev/null +++ b/deps/gyp/test/mac/copy-dylib/empty.c @@ -0,0 +1 @@ +int main() {} diff --git a/deps/gyp/test/mac/copy-dylib/test.gyp b/deps/gyp/test/mac/copy-dylib/test.gyp new file mode 100644 index 0000000000..4210c51463 --- /dev/null +++ b/deps/gyp/test/mac/copy-dylib/test.gyp @@ -0,0 +1,31 @@ +# 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. +{ + 'targets': [ + { + 'target_name': 'my_dylib', + 'type': 'shared_library', + 'sources': [ 'empty.c', ], + }, + { + 'target_name': 'test_app', + 'product_name': 'Test App', + 'type': 'executable', + 'mac_bundle': 1, + 'dependencies': [ 'my_dylib', ], + 'sources': [ + 'empty.c', + ], + 'copies': [ + { + 'destination': '<(PRODUCT_DIR)/Test App.app/Contents/Resources', + 'files': [ + '<(PRODUCT_DIR)/libmy_dylib.dylib', + ], + }, + ], + }, + ], +} + diff --git a/deps/gyp/test/mac/debuginfo/file.c b/deps/gyp/test/mac/debuginfo/file.c new file mode 100644 index 0000000000..9cddaf1b0b --- /dev/null +++ b/deps/gyp/test/mac/debuginfo/file.c @@ -0,0 +1,6 @@ +// Copyright (c) 2011 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. + +void f() {} +int main() {} diff --git a/deps/gyp/test/mac/debuginfo/test.gyp b/deps/gyp/test/mac/debuginfo/test.gyp new file mode 100644 index 0000000000..3faf6b5c76 --- /dev/null +++ b/deps/gyp/test/mac/debuginfo/test.gyp @@ -0,0 +1,82 @@ +# Copyright (c) 2011 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. +{ + 'targets': [ + { + 'target_name': 'nonbundle_static_library', + 'type': 'static_library', + 'sources': [ 'file.c', ], + 'xcode_settings': { + 'DEBUG_INFORMATION_FORMAT': 'dwarf-with-dsym', + 'DEPLOYMENT_POSTPROCESSING': 'YES', + 'STRIP_INSTALLED_PRODUCT': 'YES', + }, + }, + { + 'target_name': 'nonbundle_shared_library', + 'type': 'shared_library', + 'sources': [ 'file.c', ], + 'xcode_settings': { + 'DEBUG_INFORMATION_FORMAT': 'dwarf-with-dsym', + 'DEPLOYMENT_POSTPROCESSING': 'YES', + 'STRIP_INSTALLED_PRODUCT': 'YES', + }, + }, + { + 'target_name': 'nonbundle_loadable_module', + 'type': 'loadable_module', + 'sources': [ 'file.c', ], + 'xcode_settings': { + 'DEBUG_INFORMATION_FORMAT': 'dwarf-with-dsym', + 'DEPLOYMENT_POSTPROCESSING': 'YES', + 'STRIP_INSTALLED_PRODUCT': 'YES', + }, + }, + { + 'target_name': 'nonbundle_executable', + 'type': 'executable', + 'sources': [ 'file.c', ], + 'xcode_settings': { + 'DEBUG_INFORMATION_FORMAT': 'dwarf-with-dsym', + 'DEPLOYMENT_POSTPROCESSING': 'YES', + 'STRIP_INSTALLED_PRODUCT': 'YES', + }, + }, + + { + 'target_name': 'bundle_shared_library', + 'type': 'shared_library', + 'mac_bundle': 1, + 'sources': [ 'file.c', ], + 'xcode_settings': { + 'DEBUG_INFORMATION_FORMAT': 'dwarf-with-dsym', + 'DEPLOYMENT_POSTPROCESSING': 'YES', + 'STRIP_INSTALLED_PRODUCT': 'YES', + }, + }, + { + 'target_name': 'bundle_loadable_module', + 'type': 'loadable_module', + 'mac_bundle': 1, + 'sources': [ 'file.c', ], + 'xcode_settings': { + 'DEBUG_INFORMATION_FORMAT': 'dwarf-with-dsym', + 'DEPLOYMENT_POSTPROCESSING': 'YES', + 'STRIP_INSTALLED_PRODUCT': 'YES', + }, + }, + { + 'target_name': 'my_app', + 'product_name': 'My App', + 'type': 'executable', + 'mac_bundle': 1, + 'sources': [ 'file.c', ], + 'xcode_settings': { + 'DEBUG_INFORMATION_FORMAT': 'dwarf-with-dsym', + 'DEPLOYMENT_POSTPROCESSING': 'YES', + 'STRIP_INSTALLED_PRODUCT': 'YES', + }, + }, + ], +} diff --git a/deps/gyp/test/mac/depend-on-bundle/English.lproj/InfoPlist.strings b/deps/gyp/test/mac/depend-on-bundle/English.lproj/InfoPlist.strings new file mode 100644 index 0000000000..b92732c79e --- /dev/null +++ b/deps/gyp/test/mac/depend-on-bundle/English.lproj/InfoPlist.strings @@ -0,0 +1 @@ +/* Localized versions of Info.plist keys */ diff --git a/deps/gyp/test/mac/depend-on-bundle/Info.plist b/deps/gyp/test/mac/depend-on-bundle/Info.plist new file mode 100644 index 0000000000..5e05a5190c --- /dev/null +++ b/deps/gyp/test/mac/depend-on-bundle/Info.plist @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> +<plist version="1.0"> +<dict> + <key>CFBundleDevelopmentRegion</key> + <string>English</string> + <key>CFBundleExecutable</key> + <string>${EXECUTABLE_NAME}</string> + <key>CFBundleIconFile</key> + <string></string> + <key>CFBundleIdentifier</key> + <string>com.yourcompany.${PRODUCT_NAME}</string> + <key>CFBundleInfoDictionaryVersion</key> + <string>6.0</string> + <key>CFBundleName</key> + <string>${PRODUCT_NAME}</string> + <key>CFBundlePackageType</key> + <string>FMWK</string> + <key>CFBundleShortVersionString</key> + <string>1.0</string> + <key>CFBundleSignature</key> + <string>????</string> + <key>CFBundleVersion</key> + <string>1</string> + <key>NSPrincipalClass</key> + <string></string> +</dict> +</plist> diff --git a/deps/gyp/test/mac/depend-on-bundle/bundle.c b/deps/gyp/test/mac/depend-on-bundle/bundle.c new file mode 100644 index 0000000000..d64ff8ca23 --- /dev/null +++ b/deps/gyp/test/mac/depend-on-bundle/bundle.c @@ -0,0 +1 @@ +int f() { return 42; } diff --git a/deps/gyp/test/mac/depend-on-bundle/executable.c b/deps/gyp/test/mac/depend-on-bundle/executable.c new file mode 100644 index 0000000000..931bce637e --- /dev/null +++ b/deps/gyp/test/mac/depend-on-bundle/executable.c @@ -0,0 +1,4 @@ +int f(); +int main() { + return f(); +} diff --git a/deps/gyp/test/mac/depend-on-bundle/test.gyp b/deps/gyp/test/mac/depend-on-bundle/test.gyp new file mode 100644 index 0000000000..e00b105415 --- /dev/null +++ b/deps/gyp/test/mac/depend-on-bundle/test.gyp @@ -0,0 +1,28 @@ +# 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. +{ + 'targets': [ + { + 'target_name': 'my_bundle', + 'type': 'shared_library', + 'mac_bundle': 1, + 'sources': [ 'bundle.c' ], + 'mac_bundle_resources': [ + 'English.lproj/InfoPlist.strings', + ], + 'xcode_settings': { + 'INFOPLIST_FILE': 'Info.plist', + } + }, + { + 'target_name': 'dependent_on_bundle', + 'type': 'executable', + 'sources': [ 'executable.c' ], + 'dependencies': [ + 'my_bundle', + ], + }, + ], +} + diff --git a/deps/gyp/test/mac/deployment-target/check-version-min.c b/deps/gyp/test/mac/deployment-target/check-version-min.c new file mode 100644 index 0000000000..761c529085 --- /dev/null +++ b/deps/gyp/test/mac/deployment-target/check-version-min.c @@ -0,0 +1,33 @@ +/* Copyright (c) 2013 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. */ + +#include <Availability.h> + +/* GYPTEST_MAC_VERSION_MIN: should be set to the corresponding value of + * xcode setting 'MACOSX_DEPLOYMENT_TARGET', otherwise both should be + * left undefined. + * + * GYPTEST_IOS_VERSION_MIN: should be set to the corresponding value of + * xcode setting 'IPHONEOS_DEPLOYMENT_TARGET', otherwise both should be + * left undefined. + */ + +#if defined(GYPTEST_MAC_VERSION_MIN) +# if GYPTEST_MAC_VERSION_MIN != __MAC_OS_X_VERSION_MIN_REQUIRED +# error __MAC_OS_X_VERSION_MIN_REQUIRED has wrong value +# endif +#elif defined(__MAC_OS_X_VERSION_MIN_REQUIRED) +# error __MAC_OS_X_VERSION_MIN_REQUIRED should be undefined +#endif + +#if defined(GYPTEST_IOS_VERSION_MIN) +# if GYPTEST_IOS_VERSION_MIN != __IPHONE_OS_VERSION_MIN_REQUIRED +# error __IPHONE_OS_VERSION_MIN_REQUIRED has wrong value +# endif +#elif defined(__IPHONE_OS_VERSION_MIN_REQUIRED) +# error __IPHONE_OS_VERSION_MIN_REQUIRED should be undefined +#endif + +int main() { return 0; } + diff --git a/deps/gyp/test/mac/deployment-target/deployment-target.gyp b/deps/gyp/test/mac/deployment-target/deployment-target.gyp new file mode 100644 index 0000000000..47e0565c0c --- /dev/null +++ b/deps/gyp/test/mac/deployment-target/deployment-target.gyp @@ -0,0 +1,28 @@ +# Copyright (c) 2013 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. +{ + 'targets': [ + { + 'target_name': 'macosx-version-min-10.5', + 'type': 'executable', + 'sources': [ 'check-version-min.c', ], + 'defines': [ 'GYPTEST_MAC_VERSION_MIN=1050', ], + 'xcode_settings': { + 'SDKROOT': 'macosx', + 'MACOSX_DEPLOYMENT_TARGET': '10.5', + }, + }, + { + 'target_name': 'macosx-version-min-10.6', + 'type': 'executable', + 'sources': [ 'check-version-min.c', ], + 'defines': [ 'GYPTEST_MAC_VERSION_MIN=1060', ], + 'xcode_settings': { + 'SDKROOT': 'macosx', + 'MACOSX_DEPLOYMENT_TARGET': '10.6', + }, + }, + ], +} + diff --git a/deps/gyp/test/mac/framework-dirs/calculate.c b/deps/gyp/test/mac/framework-dirs/calculate.c new file mode 100644 index 0000000000..7dc9d2d8b4 --- /dev/null +++ b/deps/gyp/test/mac/framework-dirs/calculate.c @@ -0,0 +1,15 @@ +/* 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. + */ + +int CalculatePerformExpression(char* expr, + int significantDigits, + int flags, + char* answer); + +int main() { + char buffer[1024]; + return CalculatePerformExpression("42", 1, 0, buffer); +} + diff --git a/deps/gyp/test/mac/framework-dirs/framework-dirs.gyp b/deps/gyp/test/mac/framework-dirs/framework-dirs.gyp new file mode 100644 index 0000000000..bf1cbde4de --- /dev/null +++ b/deps/gyp/test/mac/framework-dirs/framework-dirs.gyp @@ -0,0 +1,21 @@ +# 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. + +{ + 'targets': [ + { + 'target_name': 'calculate', + 'type': 'executable', + 'sources': [ + 'calculate.c', + ], + 'libraries': [ + '/System/Library/PrivateFrameworks/Calculate.framework', + ], + 'mac_framework_dirs': [ + '/System/Library/PrivateFrameworks', + ], + }, + ], +} diff --git a/deps/gyp/test/mac/framework-headers/myframework.h b/deps/gyp/test/mac/framework-headers/myframework.h new file mode 100644 index 0000000000..961fc701bc --- /dev/null +++ b/deps/gyp/test/mac/framework-headers/myframework.h @@ -0,0 +1,8 @@ +// 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 <Foundation/Foundation.h> + +@interface TestObject : NSObject +@end diff --git a/deps/gyp/test/mac/framework-headers/myframework.m b/deps/gyp/test/mac/framework-headers/myframework.m new file mode 100644 index 0000000000..13d53a37ab --- /dev/null +++ b/deps/gyp/test/mac/framework-headers/myframework.m @@ -0,0 +1,8 @@ +// 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 "myframework.h" + +@implementation TestObject +@end diff --git a/deps/gyp/test/mac/framework-headers/test.gyp b/deps/gyp/test/mac/framework-headers/test.gyp new file mode 100644 index 0000000000..70ed00715c --- /dev/null +++ b/deps/gyp/test/mac/framework-headers/test.gyp @@ -0,0 +1,44 @@ +# Copyright (c) 2011 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. +{ + 'targets': [ + { + 'target_name': 'test_framework_headers_framework', + 'product_name': 'TestFramework', + 'type': 'shared_library', + 'mac_bundle': 1, + 'sources': [ + 'myframework.h', + 'myframework.m', + ], + 'mac_framework_headers': [ + 'myframework.h', + ], + 'link_settings': { + 'libraries': [ + '$(SDKROOT)/System/Library/Frameworks/Foundation.framework', + ], + }, + },{ + 'target_name': 'test_framework_headers_static', + 'product_name': 'TestLibrary', + 'type': 'static_library', + 'xcode_settings': { + 'PUBLIC_HEADERS_FOLDER_PATH': 'include', + }, + 'sources': [ + 'myframework.h', + 'myframework.m', + ], + 'mac_framework_headers': [ + 'myframework.h', + ], + 'link_settings': { + 'libraries': [ + '$(SDKROOT)/System/Library/Frameworks/Foundation.framework', + ], + }, + }, + ], +} diff --git a/deps/gyp/test/mac/framework/TestFramework/English.lproj/InfoPlist.strings b/deps/gyp/test/mac/framework/TestFramework/English.lproj/InfoPlist.strings new file mode 100644 index 0000000000..88f65cf6ea --- /dev/null +++ b/deps/gyp/test/mac/framework/TestFramework/English.lproj/InfoPlist.strings @@ -0,0 +1,2 @@ +/* Localized versions of Info.plist keys */ + diff --git a/deps/gyp/test/mac/framework/TestFramework/Info.plist b/deps/gyp/test/mac/framework/TestFramework/Info.plist new file mode 100644 index 0000000000..a791b3ee48 --- /dev/null +++ b/deps/gyp/test/mac/framework/TestFramework/Info.plist @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> +<plist version="1.0"> +<dict> + <key>CFBundleDevelopmentRegion</key> + <string>English</string> + <key>CFBundleExecutable</key> + <string>${EXECUTABLE_NAME}</string> + <key>CFBundleIconFile</key> + <string></string> + <key>CFBundleIdentifier</key> + <string>com.yourcompany.${PRODUCT_NAME:identifier}</string> + <key>CFBundleInfoDictionaryVersion</key> + <string>6.0</string> + <key>CFBundleName</key> + <string>${PRODUCT_NAME}</string> + <key>CFBundlePackageType</key> + <string>FMWK</string> + <key>CFBundleShortVersionString</key> + <string>1.0</string> + <key>CFBundleSignature</key> + <string>????</string> + <key>CFBundleVersion</key> + <string>1</string> + <key>NSPrincipalClass</key> + <string></string> +</dict> +</plist> diff --git a/deps/gyp/test/mac/framework/TestFramework/ObjCVector.h b/deps/gyp/test/mac/framework/TestFramework/ObjCVector.h new file mode 100644 index 0000000000..c2450960cd --- /dev/null +++ b/deps/gyp/test/mac/framework/TestFramework/ObjCVector.h @@ -0,0 +1,28 @@ +// Copyright (c) 2011 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 <Cocoa/Cocoa.h> + +#ifdef __cplusplus +struct ObjCVectorImp; +#else +typedef struct _ObjCVectorImpT ObjCVectorImp; +#endif + +@interface ObjCVector : NSObject { + @private + ObjCVectorImp* imp_; +} + +- (id)init; + +- (void)addObject:(id)obj; +- (void)addObject:(id)obj atIndex:(NSUInteger)index; + +- (void)removeObject:(id)obj; +- (void)removeObjectAtIndex:(NSUInteger)index; + +- (id)objectAtIndex:(NSUInteger)index; + +@end diff --git a/deps/gyp/test/mac/framework/TestFramework/ObjCVector.mm b/deps/gyp/test/mac/framework/TestFramework/ObjCVector.mm new file mode 100644 index 0000000000..cbf431f28d --- /dev/null +++ b/deps/gyp/test/mac/framework/TestFramework/ObjCVector.mm @@ -0,0 +1,63 @@ +// Copyright (c) 2011 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 "ObjCVectorInternal.h" +#import "ObjCVector.h" + +#include <vector> + +@interface ObjCVector (Private) +- (std::vector<id>::iterator)makeIterator:(NSUInteger)index; +@end + +@implementation ObjCVector + +- (id)init { + if ((self = [super init])) { + imp_ = new ObjCVectorImp(); + } + return self; +} + +- (void)dealloc { + delete imp_; + [super dealloc]; +} + +- (void)addObject:(id)obj { + imp_->v.push_back([obj retain]); +} + +- (void)addObject:(id)obj atIndex:(NSUInteger)index { + imp_->v.insert([self makeIterator:index], [obj retain]); +} + +- (void)removeObject:(id)obj { + for (std::vector<id>::iterator it = imp_->v.begin(); + it != imp_->v.end(); + ++it) { + if ([*it isEqual:obj]) { + [*it autorelease]; + imp_->v.erase(it); + return; + } + } +} + +- (void)removeObjectAtIndex:(NSUInteger)index { + [imp_->v[index] autorelease]; + imp_->v.erase([self makeIterator:index]); +} + +- (id)objectAtIndex:(NSUInteger)index { + return imp_->v[index]; +} + +- (std::vector<id>::iterator)makeIterator:(NSUInteger)index { + std::vector<id>::iterator it = imp_->v.begin(); + it += index; + return it; +} + +@end diff --git a/deps/gyp/test/mac/framework/TestFramework/ObjCVectorInternal.h b/deps/gyp/test/mac/framework/TestFramework/ObjCVectorInternal.h new file mode 100644 index 0000000000..fb6c98258b --- /dev/null +++ b/deps/gyp/test/mac/framework/TestFramework/ObjCVectorInternal.h @@ -0,0 +1,9 @@ +// Copyright (c) 2011 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. + +#include <vector> + +struct ObjCVectorImp { + std::vector<id> v; +}; diff --git a/deps/gyp/test/mac/framework/TestFramework/TestFramework_Prefix.pch b/deps/gyp/test/mac/framework/TestFramework/TestFramework_Prefix.pch new file mode 100644 index 0000000000..394f41d957 --- /dev/null +++ b/deps/gyp/test/mac/framework/TestFramework/TestFramework_Prefix.pch @@ -0,0 +1,7 @@ +// +// Prefix header for all source files of the 'TestFramework' target in the 'TestFramework' project. +// + +#ifdef __OBJC__ + #import <Cocoa/Cocoa.h> +#endif diff --git a/deps/gyp/test/mac/framework/empty.c b/deps/gyp/test/mac/framework/empty.c new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/deps/gyp/test/mac/framework/empty.c diff --git a/deps/gyp/test/mac/framework/framework.gyp b/deps/gyp/test/mac/framework/framework.gyp new file mode 100644 index 0000000000..52b4f37be9 --- /dev/null +++ b/deps/gyp/test/mac/framework/framework.gyp @@ -0,0 +1,108 @@ +# Copyright (c) 2011 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. +{ + 'targets': [ + { + 'target_name': 'dep_framework', + 'product_name': 'Dependency Bundle', + 'type': 'shared_library', + 'mac_bundle': 1, + 'sources': [ 'empty.c', ], + }, + { + 'target_name': 'test_framework', + 'product_name': 'Test Framework', + 'type': 'shared_library', + 'mac_bundle': 1, + 'dependencies': [ 'dep_framework', ], + 'sources': [ + 'TestFramework/ObjCVector.h', + 'TestFramework/ObjCVectorInternal.h', + 'TestFramework/ObjCVector.mm', + ], + 'mac_bundle_resources': [ + 'TestFramework/English.lproj/InfoPlist.strings', + ], + 'link_settings': { + 'libraries': [ + '$(SDKROOT)/System/Library/Frameworks/Cocoa.framework', + ], + }, + 'xcode_settings': { + 'INFOPLIST_FILE': 'TestFramework/Info.plist', + 'GCC_DYNAMIC_NO_PIC': 'NO', + }, + 'copies': [ + # Test copying to a file that has envvars in its dest path. + # Needs to be in a mac_bundle target, else CONTENTS_FOLDER_PATH isn't + # set. + { + 'destination': '<(PRODUCT_DIR)/$(CONTENTS_FOLDER_PATH)/Libraries', + 'files': [ + 'empty.c', + ], + }, + ], + }, + { + 'target_name': 'copy_target', + 'type': 'none', + 'dependencies': [ 'test_framework', 'dep_framework', ], + 'copies': [ + # Test copying directories with spaces in src and dest paths. + { + 'destination': '<(PRODUCT_DIR)/Test Framework.framework/foo', + 'files': [ + '<(PRODUCT_DIR)/Dependency Bundle.framework', + ], + }, + ], + 'actions': [ + { + 'action_name': 'aektschn', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/touched_file'], + 'action': ['touch', '${BUILT_PRODUCTS_DIR}/action_file'], + }, + ], + }, + { + 'target_name': 'copy_embedded', + 'type': 'none', + 'dependencies': [ 'test_framework' ], + 'copies': [ + # Test copying framework to FRAMEWORK directory. + { + 'destination': '$(BUILT_FRAMEWORKS_DIR)/Embedded', + 'files': [ + '<(PRODUCT_DIR)/Test Framework.framework', + ], + }, + ], + }, + { + 'target_name': 'copy_target_code_sign', + 'type': 'none', + 'dependencies': [ 'test_framework', 'dep_framework', ], + 'copies': [ + # Test copying directories with spaces in src and dest paths. + { + 'destination': '<(PRODUCT_DIR)/Test Framework.framework/foo', + 'files': [ + '<(PRODUCT_DIR)/Dependency Bundle.framework', + ], + 'xcode_code_sign': 1, + }, + ], + 'actions': [ + { + 'action_name': 'aektschn', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/touched_file'], + 'action': ['touch', '${BUILT_PRODUCTS_DIR}/action_file'], + }, + ], + }, + ], +} diff --git a/deps/gyp/test/mac/global-settings/src/dir1/dir1.gyp b/deps/gyp/test/mac/global-settings/src/dir1/dir1.gyp new file mode 100644 index 0000000000..153e34ddd6 --- /dev/null +++ b/deps/gyp/test/mac/global-settings/src/dir1/dir1.gyp @@ -0,0 +1,11 @@ +# 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. +{ + 'targets': [ + { + 'target_name': 'dir1_target', + 'type': 'none', + }, + ], +} diff --git a/deps/gyp/test/mac/global-settings/src/dir2/dir2.gyp b/deps/gyp/test/mac/global-settings/src/dir2/dir2.gyp new file mode 100644 index 0000000000..cda46c839b --- /dev/null +++ b/deps/gyp/test/mac/global-settings/src/dir2/dir2.gyp @@ -0,0 +1,22 @@ +# 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. +{ + 'targets': [ + { + 'target_name': 'dir2_target', + 'type': 'none', + 'dependencies': [ + '../dir1/dir1.gyp:dir1_target', + ], + 'actions': [ + { + 'inputs': [ ], + 'outputs': [ '<(PRODUCT_DIR)/file.txt' ], + 'action_name': 'Test action', + 'action': ['cp', 'file.txt', '${BUILT_PRODUCTS_DIR}/file.txt' ], + }, + ], + }, + ], +} diff --git a/deps/gyp/test/mac/global-settings/src/dir2/file.txt b/deps/gyp/test/mac/global-settings/src/dir2/file.txt new file mode 100644 index 0000000000..58da2d8e9a --- /dev/null +++ b/deps/gyp/test/mac/global-settings/src/dir2/file.txt @@ -0,0 +1 @@ +File. diff --git a/deps/gyp/test/mac/gyptest-action-envvars.py b/deps/gyp/test/mac/gyptest-action-envvars.py new file mode 100644 index 0000000000..c84eeaa465 --- /dev/null +++ b/deps/gyp/test/mac/gyptest-action-envvars.py @@ -0,0 +1,36 @@ +#!/usr/bin/env python + +# 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. + +""" +Verifies that env vars work with actions, with relative directory paths. +""" + +import TestGyp + +import sys + +if sys.platform == 'darwin': + test = TestGyp.TestGyp(formats=['ninja', 'make', 'xcode']) + + # The xcode-ninja generator handles gypfiles which are not at the + # project root incorrectly. + # cf. https://code.google.com/p/gyp/issues/detail?id=460 + if test.format == 'xcode-ninja': + test.skip_test() + + CHDIR = 'action-envvars' + test.run_gyp('action/action.gyp', chdir=CHDIR) + test.build('action/action.gyp', 'action', chdir=CHDIR, SYMROOT='../build') + + result_file = test.built_file_path('result', chdir=CHDIR) + test.must_exist(result_file) + test.must_contain(result_file, 'Test output') + + other_result_file = test.built_file_path('other_result', chdir=CHDIR) + test.must_exist(other_result_file) + test.must_contain(other_result_file, 'Other output') + + test.pass_test() diff --git a/deps/gyp/test/mac/gyptest-app-assets-catalog.py b/deps/gyp/test/mac/gyptest-app-assets-catalog.py new file mode 100755 index 0000000000..ca76b513aa --- /dev/null +++ b/deps/gyp/test/mac/gyptest-app-assets-catalog.py @@ -0,0 +1,123 @@ +#!/usr/bin/env python + +# 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. + +""" +Verifies that app bundles are built correctly. +""" + +import TestGyp +import TestMac + +import os +import plistlib +import subprocess +import sys + +if sys.platform == 'darwin': + print "This test is currently disabled: https://crbug.com/483696." + sys.exit(0) + +def ExpectEq(expected, actual): + if expected != actual: + print >>sys.stderr, 'Expected "%s", got "%s"' % (expected, actual) + test.fail_test() + +def ls(path): + '''Returns a list of all files in a directory, relative to the directory.''' + result = [] + for dirpath, _, files in os.walk(path): + for f in files: + result.append(os.path.join(dirpath, f)[len(path) + 1:]) + return result + +# Xcode supports for assets catalog was introduced in Xcode 6.0 +if sys.platform == 'darwin' and TestMac.Xcode.Version() >= '0600': + test_gyp_path = 'test-assets-catalog.gyp' + test_app_path = 'Test App Assets Catalog Gyp.app' + + test = TestGyp.TestGyp(formats=['ninja', 'make', 'xcode']) + test.run_gyp(test_gyp_path, chdir='app-bundle') + test.build(test_gyp_path, test.ALL, chdir='app-bundle') + + # Binary + test.built_file_must_exist( + os.path.join(test_app_path, 'Contents/MacOS/Test App Assets Catalog Gyp'), + chdir='app-bundle') + + # Info.plist + info_plist = test.built_file_path( + os.path.join(test_app_path, 'Contents/Info.plist'), + chdir='app-bundle') + test.must_exist(info_plist) + test.must_contain( + info_plist, + 'com.google.Test-App-Assets-Catalog-Gyp') # Variable expansion + test.must_not_contain(info_plist, '${MACOSX_DEPLOYMENT_TARGET}'); + + if test.format != 'make': + # TODO: Synthesized plist entries aren't hooked up in the make generator. + machine = subprocess.check_output(['sw_vers', '-buildVersion']).rstrip('\n') + plist = plistlib.readPlist(info_plist) + ExpectEq(machine, plist['BuildMachineOSBuild']) + + expected = '' + version = TestMac.Xcode.SDKVersion() + expected = 'macosx' + version + ExpectEq(expected, plist['DTSDKName']) + sdkbuild = TestMac.Xcode.SDKBuild() + if not sdkbuild: + # Above command doesn't work in Xcode 4.2. + sdkbuild = plist['BuildMachineOSBuild'] + ExpectEq(sdkbuild, plist['DTSDKBuild']) + ExpectEq(TestMac.Xcode.Version(), plist['DTXcode']) + ExpectEq(TestMac.Xcode.Build(), plist['DTXcodeBuild']) + + # Resources + strings_files = ['InfoPlist.strings', 'utf-16be.strings', 'utf-16le.strings'] + for f in strings_files: + strings = test.built_file_path( + os.path.join(test_app_path, 'Contents/Resources/English.lproj', f), + chdir='app-bundle') + test.must_exist(strings) + # Xcodes writes UTF-16LE with BOM. + contents = open(strings, 'rb').read() + if not contents.startswith('\xff\xfe' + '/* Localized'.encode('utf-16le')): + test.fail_test() + + test.built_file_must_exist( + os.path.join( + test_app_path, 'Contents/Resources/English.lproj/MainMenu.nib'), + chdir='app-bundle') + + # make does not supports .xcassets files + extra_content_files = [] + if test.format != 'make': + extra_content_files = ['Contents/Resources/Assets.car'] + for f in extra_content_files: + test.built_file_must_exist( + os.path.join(test_app_path, f), + chdir='app-bundle') + + # Packaging + test.built_file_must_exist( + os.path.join(test_app_path, 'Contents/PkgInfo'), + chdir='app-bundle') + test.built_file_must_match( + os.path.join(test_app_path, 'Contents/PkgInfo'), 'APPLause', + chdir='app-bundle') + + # Check that no other files get added to the bundle. + if set(ls(test.built_file_path(test_app_path, chdir='app-bundle'))) != \ + set(['Contents/MacOS/Test App Assets Catalog Gyp', + 'Contents/Info.plist', + 'Contents/Resources/English.lproj/MainMenu.nib', + 'Contents/PkgInfo', + ] + extra_content_files + + [os.path.join('Contents/Resources/English.lproj', f) + for f in strings_files]): + test.fail_test() + + test.pass_test() diff --git a/deps/gyp/test/mac/gyptest-app-error.py b/deps/gyp/test/mac/gyptest-app-error.py new file mode 100755 index 0000000000..c6fe33f128 --- /dev/null +++ b/deps/gyp/test/mac/gyptest-app-error.py @@ -0,0 +1,47 @@ +#!/usr/bin/env python + +# 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. + +""" +Verifies that invalid strings files cause the build to fail. +""" + +import TestCmd +import TestGyp + +import sys + +if sys.platform == 'darwin': + print "This test is currently disabled: https://crbug.com/483696." + sys.exit(0) + + expected_error = 'Old-style plist parser: missing semicolon in dictionary' + saw_expected_error = [False] # Python2 has no "nonlocal" keyword. + def match(a, b): + if a == b: + return True + if not TestCmd.is_List(a): + a = a.split('\n') + if not TestCmd.is_List(b): + b = b.split('\n') + if expected_error in '\n'.join(a) + '\n'.join(b): + saw_expected_error[0] = True + return True + return False + test = TestGyp.TestGyp(formats=['ninja', 'make', 'xcode'], match=match) + + test.run_gyp('test-error.gyp', chdir='app-bundle') + + test.build('test-error.gyp', test.ALL, chdir='app-bundle') + + # Ninja pipes stderr of subprocesses to stdout. + if test.format in ['ninja', 'xcode-ninja'] \ + and expected_error in test.stdout(): + saw_expected_error[0] = True + + if saw_expected_error[0]: + test.pass_test() + else: + test.fail_test() diff --git a/deps/gyp/test/mac/gyptest-app.py b/deps/gyp/test/mac/gyptest-app.py new file mode 100755 index 0000000000..be92d01aed --- /dev/null +++ b/deps/gyp/test/mac/gyptest-app.py @@ -0,0 +1,120 @@ +#!/usr/bin/env python + +# 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. + +""" +Verifies that app bundles are built correctly. +""" + +import TestGyp +import TestMac + +import os +import plistlib +import subprocess +import sys + + +if sys.platform in ('darwin', 'win32'): + print "This test is currently disabled: https://crbug.com/483696." + sys.exit(0) + + +def CheckFileXMLPropertyList(file): + output = subprocess.check_output(['file', file]) + # The double space after XML is intentional. + if not 'XML document text' in output: + print 'File: Expected XML document text, got %s' % output + test.fail_test() + +def ExpectEq(expected, actual): + if expected != actual: + print >>sys.stderr, 'Expected "%s", got "%s"' % (expected, actual) + test.fail_test() + +def ls(path): + '''Returns a list of all files in a directory, relative to the directory.''' + result = [] + for dirpath, _, files in os.walk(path): + for f in files: + result.append(os.path.join(dirpath, f)[len(path) + 1:]) + return result + + +if sys.platform == 'darwin': + test = TestGyp.TestGyp(formats=['ninja', 'make', 'xcode']) + + test.run_gyp('test.gyp', chdir='app-bundle') + + test.build('test.gyp', test.ALL, chdir='app-bundle') + + # Binary + test.built_file_must_exist('Test App Gyp.app/Contents/MacOS/Test App Gyp', + chdir='app-bundle') + + # Info.plist + info_plist = test.built_file_path('Test App Gyp.app/Contents/Info.plist', + chdir='app-bundle') + test.must_exist(info_plist) + test.must_contain(info_plist, 'com.google.Test-App-Gyp') # Variable expansion + test.must_not_contain(info_plist, '${MACOSX_DEPLOYMENT_TARGET}'); + CheckFileXMLPropertyList(info_plist) + + if test.format != 'make': + # TODO: Synthesized plist entries aren't hooked up in the make generator. + machine = subprocess.check_output(['sw_vers', '-buildVersion']).rstrip('\n') + plist = plistlib.readPlist(info_plist) + ExpectEq(machine, plist['BuildMachineOSBuild']) + + # Prior to Xcode 5.0.0, SDKROOT (and thus DTSDKName) was only defined if + # set in the Xcode project file. Starting with that version, it is always + # defined. + expected = '' + if TestMac.Xcode.Version() >= '0500': + version = TestMac.Xcode.SDKVersion() + expected = 'macosx' + version + ExpectEq(expected, plist['DTSDKName']) + sdkbuild = TestMac.Xcode.SDKBuild() + if not sdkbuild: + # Above command doesn't work in Xcode 4.2. + sdkbuild = plist['BuildMachineOSBuild'] + ExpectEq(sdkbuild, plist['DTSDKBuild']) + ExpectEq(TestMac.Xcode.Version(), plist['DTXcode']) + ExpectEq(TestMac.Xcode.Build(), plist['DTXcodeBuild']) + + # Resources + strings_files = ['InfoPlist.strings', 'utf-16be.strings', 'utf-16le.strings'] + for f in strings_files: + strings = test.built_file_path( + os.path.join('Test App Gyp.app/Contents/Resources/English.lproj', f), + chdir='app-bundle') + test.must_exist(strings) + # Xcodes writes UTF-16LE with BOM. + contents = open(strings, 'rb').read() + if not contents.startswith('\xff\xfe' + '/* Localized'.encode('utf-16le')): + test.fail_test() + + test.built_file_must_exist( + 'Test App Gyp.app/Contents/Resources/English.lproj/MainMenu.nib', + chdir='app-bundle') + + # Packaging + test.built_file_must_exist('Test App Gyp.app/Contents/PkgInfo', + chdir='app-bundle') + test.built_file_must_match('Test App Gyp.app/Contents/PkgInfo', 'APPLause', + chdir='app-bundle') + + # Check that no other files get added to the bundle. + if set(ls(test.built_file_path('Test App Gyp.app', chdir='app-bundle'))) != \ + set(['Contents/MacOS/Test App Gyp', + 'Contents/Info.plist', + 'Contents/Resources/English.lproj/MainMenu.nib', + 'Contents/PkgInfo', + ] + + [os.path.join('Contents/Resources/English.lproj', f) + for f in strings_files]): + test.fail_test() + + test.pass_test() diff --git a/deps/gyp/test/mac/gyptest-archs.py b/deps/gyp/test/mac/gyptest-archs.py new file mode 100644 index 0000000000..106a928e92 --- /dev/null +++ b/deps/gyp/test/mac/gyptest-archs.py @@ -0,0 +1,95 @@ +#!/usr/bin/env python + +# 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. + +""" +Tests things related to ARCHS. +""" + +import TestGyp +import TestMac + +import re +import subprocess +import sys + +if sys.platform == 'darwin': + test = TestGyp.TestGyp(formats=['ninja', 'make', 'xcode']) + + test.run_gyp('test-no-archs.gyp', chdir='archs') + test.build('test-no-archs.gyp', test.ALL, chdir='archs') + result_file = test.built_file_path('Test', chdir='archs') + test.must_exist(result_file) + + if TestMac.Xcode.Version() >= '0500': + expected_type = ['x86_64'] + else: + expected_type = ['i386'] + TestMac.CheckFileType(test, result_file, expected_type) + + test.run_gyp('test-valid-archs.gyp', chdir='archs') + test.build('test-valid-archs.gyp', test.ALL, chdir='archs') + result_file = test.built_file_path('Test', chdir='archs') + test.must_exist(result_file) + TestMac.CheckFileType(test, result_file, ['x86_64']) + + test.run_gyp('test-archs-x86_64.gyp', chdir='archs') + test.build('test-archs-x86_64.gyp', test.ALL, chdir='archs') + result_file = test.built_file_path('Test64', chdir='archs') + test.must_exist(result_file) + TestMac.CheckFileType(test, result_file, ['x86_64']) + + test.run_gyp('test-dependencies.gyp', chdir='archs') + test.build('test-dependencies.gyp', target=test.ALL, chdir='archs') + products = ['c_standalone', 'd_standalone'] + for product in products: + result_file = test.built_file_path( + product, chdir='archs', type=test.STATIC_LIB) + test.must_exist(result_file) + + if test.format != 'make': + # Build all targets except 'exe_32_64_no_sources' that does build + # but should not cause error when generating ninja files + targets = [ + 'static_32_64', 'shared_32_64', 'shared_32_64_bundle', + 'module_32_64', 'module_32_64_bundle', + 'exe_32_64', 'exe_32_64_bundle', 'precompiled_prefix_header_mm_32_64', + ] + + test.run_gyp('test-archs-multiarch.gyp', chdir='archs') + + for target in targets: + test.build('test-archs-multiarch.gyp', target=target, chdir='archs') + + result_file = test.built_file_path( + 'static_32_64', chdir='archs', type=test.STATIC_LIB) + test.must_exist(result_file) + TestMac.CheckFileType(test, result_file, ['i386', 'x86_64']) + + result_file = test.built_file_path( + 'shared_32_64', chdir='archs', type=test.SHARED_LIB) + test.must_exist(result_file) + TestMac.CheckFileType(test, result_file, ['i386', 'x86_64']) + + result_file = test.built_file_path('My Framework.framework/My Framework', + chdir='archs') + test.must_exist(result_file) + TestMac.CheckFileType(test, result_file, ['i386', 'x86_64']) + # Check that symbol "_x" made it into both versions of the binary: + if not all(['D _x' in subprocess.check_output( + ['nm', '-arch', arch, result_file]) for arch in ['i386', 'x86_64']]): + # This can only flakily fail, due to process ordering issues. If this + # does fail flakily, then something's broken, it's not the test at fault. + test.fail_test() + + result_file = test.built_file_path( + 'exe_32_64', chdir='archs', type=test.EXECUTABLE) + test.must_exist(result_file) + TestMac.CheckFileType(test, result_file, ['i386', 'x86_64']) + + result_file = test.built_file_path('Test App.app/Contents/MacOS/Test App', + chdir='archs') + test.must_exist(result_file) + TestMac.CheckFileType(test, result_file, ['i386', 'x86_64']) diff --git a/deps/gyp/test/mac/gyptest-bundle-resources.py b/deps/gyp/test/mac/gyptest-bundle-resources.py new file mode 100644 index 0000000000..e9eddb70fa --- /dev/null +++ b/deps/gyp/test/mac/gyptest-bundle-resources.py @@ -0,0 +1,62 @@ +#!/usr/bin/env python + +# Copyright (c) 2013 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. + +""" +Verifies things related to bundle resources. +""" + +import TestGyp + +import os +import stat +import sys + +if sys.platform in ('darwin'): + print "This test is currently disabled: https://crbug.com/483696." + sys.exit(0) + + +def check_attribs(path, expected_exec_bit): + out_path = test.built_file_path( + os.path.join('resource.app/Contents/Resources', path), chdir=CHDIR) + + in_stat = os.stat(os.path.join(CHDIR, path)) + out_stat = os.stat(out_path) + if in_stat.st_mtime == out_stat.st_mtime: + test.fail_test() + if out_stat.st_mode & stat.S_IXUSR != expected_exec_bit: + test.fail_test() + + +if sys.platform == 'darwin': + # set |match| to ignore build stderr output. + test = TestGyp.TestGyp(formats=['ninja', 'make', 'xcode']) + + CHDIR = 'bundle-resources' + test.run_gyp('test.gyp', chdir=CHDIR) + + test.build('test.gyp', test.ALL, chdir=CHDIR) + + test.built_file_must_match('resource.app/Contents/Resources/secret.txt', + 'abc\n', chdir=CHDIR) + test.built_file_must_match('source_rule.app/Contents/Resources/secret.txt', + 'ABC\n', chdir=CHDIR) + + test.built_file_must_match( + 'resource.app/Contents/Resources/executable-file.sh', + '#!/bin/bash\n' + '\n' + 'echo echo echo echo cho ho o o\n', chdir=CHDIR) + + check_attribs('executable-file.sh', expected_exec_bit=stat.S_IXUSR) + check_attribs('secret.txt', expected_exec_bit=0) + + # TODO(thakis): This currently fails with make. + if test.format != 'make': + test.built_file_must_match( + 'resource_rule.app/Contents/Resources/secret.txt', 'ABC\n', chdir=CHDIR) + + test.pass_test() diff --git a/deps/gyp/test/mac/gyptest-cflags.py b/deps/gyp/test/mac/gyptest-cflags.py new file mode 100644 index 0000000000..17afd15665 --- /dev/null +++ b/deps/gyp/test/mac/gyptest-cflags.py @@ -0,0 +1,21 @@ +#!/usr/bin/env python + +# 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. + +""" +Verifies that compile-time flags work. +""" + +import TestGyp + +import sys + +if sys.platform == 'darwin': + test = TestGyp.TestGyp(formats=['ninja', 'make', 'xcode']) + CHDIR = 'cflags' + test.run_gyp('test.gyp', chdir=CHDIR) + + test.build('test.gyp', test.ALL, chdir=CHDIR) + test.pass_test() diff --git a/deps/gyp/test/mac/gyptest-clang-cxx-language-standard.py b/deps/gyp/test/mac/gyptest-clang-cxx-language-standard.py new file mode 100644 index 0000000000..75c6c74c97 --- /dev/null +++ b/deps/gyp/test/mac/gyptest-clang-cxx-language-standard.py @@ -0,0 +1,25 @@ +#!/usr/bin/env python + +# Copyright (c) 2013 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. + +""" +Verifies that CLANG_CXX_LANGUAGE_STANDARD works. +""" + +import TestGyp + +import sys + +if sys.platform == 'darwin': + test = TestGyp.TestGyp(formats=['make', 'ninja', 'xcode']) + + test.run_gyp('clang-cxx-language-standard.gyp', + chdir='clang-cxx-language-standard') + + test.build('clang-cxx-language-standard.gyp', test.ALL, + chdir='clang-cxx-language-standard') + + test.pass_test() + diff --git a/deps/gyp/test/mac/gyptest-clang-cxx-library.py b/deps/gyp/test/mac/gyptest-clang-cxx-library.py new file mode 100644 index 0000000000..39a11c75c4 --- /dev/null +++ b/deps/gyp/test/mac/gyptest-clang-cxx-library.py @@ -0,0 +1,28 @@ +#!/usr/bin/env python + +# Copyright (c) 2013 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. + +""" +Verifies that CLANG_CXX_LIBRARY works. +""" + +import TestGyp +import TestMac + +import os +import sys + +if sys.platform == 'darwin': + # Xcode 4.2 on OS X 10.6 doesn't install the libc++ headers, don't run this + # test there. + if TestMac.Xcode.Version() <= '0420': + sys.exit(0) + + test = TestGyp.TestGyp(formats=['make', 'ninja', 'xcode']) + test.run_gyp('clang-cxx-library.gyp', chdir='clang-cxx-library') + test.build('clang-cxx-library.gyp', test.ALL, chdir='clang-cxx-library') + + test.pass_test() + diff --git a/deps/gyp/test/mac/gyptest-copies.py b/deps/gyp/test/mac/gyptest-copies.py new file mode 100755 index 0000000000..4146441862 --- /dev/null +++ b/deps/gyp/test/mac/gyptest-copies.py @@ -0,0 +1,60 @@ +#!/usr/bin/env python + +# 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. + +""" +Verifies that 'copies' with app bundles are handled correctly. +""" + +import TestGyp + +import os +import sys +import time + +if sys.platform == 'darwin': + print "This test is currently disabled: https://crbug.com/483696." + sys.exit(0) + + test = TestGyp.TestGyp(formats=['ninja', 'make', 'xcode']) + + test.run_gyp('framework.gyp', chdir='framework') + + test.build('framework.gyp', 'copy_target', chdir='framework') + + # Check that the copy succeeded. + test.built_file_must_exist( + 'Test Framework.framework/foo/Dependency Bundle.framework', + chdir='framework') + test.built_file_must_exist( + 'Test Framework.framework/foo/Dependency Bundle.framework/Versions/A', + chdir='framework') + test.built_file_must_exist( + 'Test Framework.framework/Versions/A/Libraries/empty.c', + chdir='framework') + + # Verify BUILT_FRAMEWORKS_DIR is set and working. + test.build('framework.gyp', 'copy_embedded', chdir='framework') + + test.built_file_must_exist( + 'Embedded/Test Framework.framework', chdir='framework') + + # Check that rebuilding the target a few times works. + dep_bundle = test.built_file_path('Dependency Bundle.framework', + chdir='framework') + mtime = os.path.getmtime(dep_bundle) + atime = os.path.getatime(dep_bundle) + for i in range(3): + os.utime(dep_bundle, (atime + i * 1000, mtime + i * 1000)) + test.build('framework.gyp', 'copy_target', chdir='framework') + + + # Check that actions ran. + test.built_file_must_exist('action_file', chdir='framework') + + # Test that a copy with the "Code Sign on Copy" flag on succeeds. + test.build('framework.gyp', 'copy_target_code_sign', chdir='framework') + + test.pass_test() diff --git a/deps/gyp/test/mac/gyptest-copy-dylib.py b/deps/gyp/test/mac/gyptest-copy-dylib.py new file mode 100644 index 0000000000..253623d1c6 --- /dev/null +++ b/deps/gyp/test/mac/gyptest-copy-dylib.py @@ -0,0 +1,25 @@ +#!/usr/bin/env python + +# 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. + +""" +Verifies that dylibs can be copied into app bundles. +""" + +import TestGyp + +import sys + +if sys.platform == 'darwin': + test = TestGyp.TestGyp(formats=['ninja', 'make', 'xcode']) + + test.run_gyp('test.gyp', chdir='copy-dylib') + + test.build('test.gyp', 'test_app', chdir='copy-dylib') + + test.built_file_must_exist( + 'Test App.app/Contents/Resources/libmy_dylib.dylib', chdir='copy-dylib') + + test.pass_test() diff --git a/deps/gyp/test/mac/gyptest-debuginfo.py b/deps/gyp/test/mac/gyptest-debuginfo.py new file mode 100755 index 0000000000..a0e9438e2a --- /dev/null +++ b/deps/gyp/test/mac/gyptest-debuginfo.py @@ -0,0 +1,36 @@ +#!/usr/bin/env python + +# Copyright (c) 2011 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. + +""" +Tests things related to debug information generation. +""" + +import TestGyp + +import sys + +if sys.platform == 'darwin': + test = TestGyp.TestGyp(formats=['ninja', 'make', 'xcode']) + + test.run_gyp('test.gyp', chdir='debuginfo') + + test.build('test.gyp', test.ALL, chdir='debuginfo') + + test.built_file_must_exist('libnonbundle_shared_library.dylib.dSYM', + chdir='debuginfo') + test.built_file_must_exist('nonbundle_loadable_module.so.dSYM', + chdir='debuginfo') + test.built_file_must_exist('nonbundle_executable.dSYM', + chdir='debuginfo') + + test.built_file_must_exist('bundle_shared_library.framework.dSYM', + chdir='debuginfo') + test.built_file_must_exist('bundle_loadable_module.bundle.dSYM', + chdir='debuginfo') + test.built_file_must_exist('My App.app.dSYM', + chdir='debuginfo') + + test.pass_test() diff --git a/deps/gyp/test/mac/gyptest-depend-on-bundle.py b/deps/gyp/test/mac/gyptest-depend-on-bundle.py new file mode 100644 index 0000000000..486fbfe2da --- /dev/null +++ b/deps/gyp/test/mac/gyptest-depend-on-bundle.py @@ -0,0 +1,43 @@ +#!/usr/bin/env python + +# 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. + +""" +Verifies that a dependency on a bundle causes the whole bundle to be built. +""" + +import TestGyp + +import sys + +if sys.platform == 'darwin': + print "This test is currently disabled: https://crbug.com/483696." + sys.exit(0) + + test = TestGyp.TestGyp(formats=['ninja', 'make', 'xcode']) + + test.run_gyp('test.gyp', chdir='depend-on-bundle') + + test.build('test.gyp', 'dependent_on_bundle', chdir='depend-on-bundle') + + # Binary itself. + test.built_file_must_exist('dependent_on_bundle', chdir='depend-on-bundle') + + # Bundle dependency. + test.built_file_must_exist( + 'my_bundle.framework/Versions/A/my_bundle', + chdir='depend-on-bundle') + test.built_file_must_exist( # package_framework + 'my_bundle.framework/my_bundle', + chdir='depend-on-bundle') + test.built_file_must_exist( # plist + 'my_bundle.framework/Versions/A/Resources/Info.plist', + chdir='depend-on-bundle') + test.built_file_must_exist( + 'my_bundle.framework/Versions/A/Resources/English.lproj/' # Resources + 'InfoPlist.strings', + chdir='depend-on-bundle') + + test.pass_test() diff --git a/deps/gyp/test/mac/gyptest-deployment-target.py b/deps/gyp/test/mac/gyptest-deployment-target.py new file mode 100644 index 0000000000..afa6c776ef --- /dev/null +++ b/deps/gyp/test/mac/gyptest-deployment-target.py @@ -0,0 +1,23 @@ +#!/usr/bin/env python + +# Copyright (c) 2013 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. + +""" +Verifies that MACOSX_DEPLOYMENT_TARGET works. +""" + +import TestGyp + +import sys + +if sys.platform == 'darwin': + test = TestGyp.TestGyp(formats=['make', 'ninja', 'xcode']) + + test.run_gyp('deployment-target.gyp', chdir='deployment-target') + + test.build('deployment-target.gyp', test.ALL, chdir='deployment-target') + + test.pass_test() + diff --git a/deps/gyp/test/mac/gyptest-framework-dirs.py b/deps/gyp/test/mac/gyptest-framework-dirs.py new file mode 100644 index 0000000000..a1ae54c57f --- /dev/null +++ b/deps/gyp/test/mac/gyptest-framework-dirs.py @@ -0,0 +1,23 @@ +#!/usr/bin/env python + +# 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. + +""" +Verify that it is possible to build an object that depends on a +PrivateFramework. +""" + +import os +import sys +import TestGyp + +if sys.platform == 'darwin': + test = TestGyp.TestGyp(formats=['ninja', 'make', 'xcode']) + + CHDIR = 'framework-dirs' + test.run_gyp('framework-dirs.gyp', chdir=CHDIR) + test.build('framework-dirs.gyp', 'calculate', chdir=CHDIR) + + test.pass_test() diff --git a/deps/gyp/test/mac/gyptest-framework-headers.py b/deps/gyp/test/mac/gyptest-framework-headers.py new file mode 100644 index 0000000000..aa13a742cd --- /dev/null +++ b/deps/gyp/test/mac/gyptest-framework-headers.py @@ -0,0 +1,38 @@ +#!/usr/bin/env python + +# 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. + +""" +Verifies that mac_framework_headers works properly. +""" + +import TestGyp + +import sys + +if sys.platform == 'darwin': + # TODO(thakis): Make this work with ninja, make. http://crbug.com/129013 + test = TestGyp.TestGyp(formats=['xcode']) + + CHDIR = 'framework-headers' + test.run_gyp('test.gyp', chdir=CHDIR) + + # Test that headers are installed for frameworks + test.build('test.gyp', 'test_framework_headers_framework', chdir=CHDIR) + + test.built_file_must_exist( + 'TestFramework.framework/Versions/A/TestFramework', chdir=CHDIR) + + test.built_file_must_exist( + 'TestFramework.framework/Versions/A/Headers/myframework.h', chdir=CHDIR) + + # Test that headers are installed for static libraries. + test.build('test.gyp', 'test_framework_headers_static', chdir=CHDIR) + + test.built_file_must_exist('libTestLibrary.a', chdir=CHDIR) + + test.built_file_must_exist('include/myframework.h', chdir=CHDIR) + + test.pass_test() diff --git a/deps/gyp/test/mac/gyptest-framework.py b/deps/gyp/test/mac/gyptest-framework.py new file mode 100755 index 0000000000..553cc9f648 --- /dev/null +++ b/deps/gyp/test/mac/gyptest-framework.py @@ -0,0 +1,78 @@ +#!/usr/bin/env python + +# 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. + +""" +Verifies that app bundles are built correctly. +""" + +import TestGyp + +import os +import sys + +if sys.platform == 'darwin': + print "This test is currently disabled: https://crbug.com/483696." + sys.exit(0) + + +def ls(path): + '''Returns a list of all files in a directory, relative to the directory.''' + result = [] + for dirpath, _, files in os.walk(path): + for f in files: + result.append(os.path.join(dirpath, f)[len(path) + 1:]) + return result + + +if sys.platform == 'darwin': + test = TestGyp.TestGyp(formats=['ninja', 'make', 'xcode']) + + test.run_gyp('framework.gyp', chdir='framework') + + test.build('framework.gyp', 'test_framework', chdir='framework') + + # Binary + test.built_file_must_exist( + 'Test Framework.framework/Versions/A/Test Framework', + chdir='framework') + + # Info.plist + info_plist = test.built_file_path( + 'Test Framework.framework/Versions/A/Resources/Info.plist', + chdir='framework') + test.must_exist(info_plist) + test.must_contain(info_plist, 'com.yourcompany.Test_Framework') + + # Resources + test.built_file_must_exist( + 'Test Framework.framework/Versions/A/Resources/English.lproj/' + 'InfoPlist.strings', + chdir='framework') + + # Symlinks created by packaging process + test.built_file_must_exist('Test Framework.framework/Versions/Current', + chdir='framework') + test.built_file_must_exist('Test Framework.framework/Resources', + chdir='framework') + test.built_file_must_exist('Test Framework.framework/Test Framework', + chdir='framework') + # PkgInfo. + test.built_file_must_not_exist( + 'Test Framework.framework/Versions/A/Resources/PkgInfo', + chdir='framework') + + # Check that no other files get added to the bundle. + if set(ls(test.built_file_path('Test Framework.framework', + chdir='framework'))) != \ + set(['Versions/A/Test Framework', + 'Versions/A/Resources/Info.plist', + 'Versions/A/Resources/English.lproj/InfoPlist.strings', + 'Test Framework', + 'Versions/A/Libraries/empty.c', # Written by a gyp action. + ]): + test.fail_test() + + test.pass_test() diff --git a/deps/gyp/test/mac/gyptest-global-settings.py b/deps/gyp/test/mac/gyptest-global-settings.py new file mode 100644 index 0000000000..f4ed16630e --- /dev/null +++ b/deps/gyp/test/mac/gyptest-global-settings.py @@ -0,0 +1,33 @@ +#!/usr/bin/env python + +# 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. + +""" +Verifies that the global xcode_settings processing doesn't throw. +Regression test for http://crbug.com/109163 +""" + +import TestGyp + +import sys + +if sys.platform == 'darwin': + test = TestGyp.TestGyp(formats=['ninja', 'make', 'xcode']) + + # The xcode-ninja generator handles gypfiles which are not at the + # project root incorrectly. + # cf. https://code.google.com/p/gyp/issues/detail?id=460 + if test.format == 'xcode-ninja': + test.skip_test() + + test.run_gyp('src/dir2/dir2.gyp', chdir='global-settings', depth='src') + # run_gyp shouldn't throw. + + # Check that BUILT_PRODUCTS_DIR was set correctly, too. + test.build('dir2/dir2.gyp', 'dir2_target', chdir='global-settings/src', + SYMROOT='../build') + test.built_file_must_exist('file.txt', chdir='global-settings/src') + + test.pass_test() diff --git a/deps/gyp/test/mac/gyptest-identical-name.py b/deps/gyp/test/mac/gyptest-identical-name.py new file mode 100644 index 0000000000..0d358df921 --- /dev/null +++ b/deps/gyp/test/mac/gyptest-identical-name.py @@ -0,0 +1,45 @@ +#!/usr/bin/env python + +# Copyright (c) 2014 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. + +""" +Verifies libraries (in identical-names) are properly handeled by xcode. + +The names for all libraries participating in this build are: +libtestlib.a - identical-name/testlib +libtestlib.a - identical-name/proxy/testlib +libproxy.a - identical-name/proxy +The first two libs produce a hash collision in Xcode when Gyp is executed, +because they have the same name and would be copied to the same directory with +Xcode default settings. +For this scenario to work one needs to change the Xcode variables SYMROOT and +CONFIGURATION_BUILD_DIR. Setting these to per-lib-unique directories, avoids +copying the libs into the same directory. + +The test consists of two steps. The first one verifies that by setting both +vars, there is no hash collision anymore during Gyp execution and that the libs +can actually be be built. The second one verifies that there is still a hash +collision if the vars are not set and thus the current behavior is preserved. +""" + +import TestGyp + +import sys + +def IgnoreOutput(string, expected_string): + return True + +if sys.platform == 'darwin': + test = TestGyp.TestGyp(formats=['xcode']) + + + test.run_gyp('test.gyp', chdir='identical-name') + test.build('test.gyp', test.ALL, chdir='identical-name') + + test.run_gyp('test-should-fail.gyp', chdir='identical-name') + test.built_file_must_not_exist('test-should-fail.xcodeproj') + + test.pass_test() + diff --git a/deps/gyp/test/mac/gyptest-infoplist-process.py b/deps/gyp/test/mac/gyptest-infoplist-process.py new file mode 100755 index 0000000000..2e5168477e --- /dev/null +++ b/deps/gyp/test/mac/gyptest-infoplist-process.py @@ -0,0 +1,54 @@ +#!/usr/bin/env python + +# 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. + +""" +Verifies the Info.plist preprocessor functionality. +""" + +import TestGyp + +import sys + +if sys.platform == 'darwin': + print "This test is currently disabled: https://crbug.com/483696." + sys.exit(0) + + test = TestGyp.TestGyp(formats=['ninja', 'make', 'xcode']) + + CHDIR = 'infoplist-process' + INFO_PLIST_PATH = 'Test.app/Contents/Info.plist' + + # First process both keys. + test.set_configuration('One') + test.run_gyp('test1.gyp', chdir=CHDIR) + test.build('test1.gyp', test.ALL, chdir=CHDIR) + info_plist = test.built_file_path(INFO_PLIST_PATH, chdir=CHDIR) + test.must_exist(info_plist) + test.must_contain(info_plist, 'Foo') + test.must_contain(info_plist, 'Bar') + + # Then process a single key. + test.set_configuration('Two') + test.run_gyp('test2.gyp', chdir=CHDIR) + test.build('test2.gyp', chdir=CHDIR) + info_plist = test.built_file_path(INFO_PLIST_PATH, chdir=CHDIR) + test.must_exist(info_plist) + test.must_contain(info_plist, 'com.google.Test') # Normal expansion works. + test.must_contain(info_plist, 'Foo (Bar)') + test.must_contain(info_plist, 'PROCESSED_KEY2') + + # Then turn off the processor. + test.set_configuration('Three') + test.run_gyp('test3.gyp', chdir=CHDIR) + test.build('test3.gyp', chdir=CHDIR) + info_plist = test.built_file_path('Test App.app/Contents/Info.plist', + chdir=CHDIR) + test.must_exist(info_plist) + test.must_contain(info_plist, 'com.google.Test') # Normal expansion works. + test.must_contain(info_plist, 'PROCESSED_KEY1') + test.must_contain(info_plist, 'PROCESSED_KEY2') + + test.pass_test() diff --git a/deps/gyp/test/mac/gyptest-installname.py b/deps/gyp/test/mac/gyptest-installname.py new file mode 100644 index 0000000000..3fc7152242 --- /dev/null +++ b/deps/gyp/test/mac/gyptest-installname.py @@ -0,0 +1,83 @@ +#!/usr/bin/env python + +# 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. + +""" +Verifies that LD_DYLIB_INSTALL_NAME and DYLIB_INSTALL_NAME_BASE are handled +correctly. +""" + +import TestGyp + +import re +import subprocess +import sys + +if sys.platform == 'darwin': + print "This test is currently disabled: https://crbug.com/483696." + sys.exit(0) + + test = TestGyp.TestGyp(formats=['ninja', 'make', 'xcode']) + + CHDIR = 'installname' + test.run_gyp('test.gyp', chdir=CHDIR) + + test.build('test.gyp', test.ALL, chdir=CHDIR) + + def GetInstallname(p): + p = test.built_file_path(p, chdir=CHDIR) + r = re.compile(r'cmd LC_ID_DYLIB.*?name (.*?) \(offset \d+\)', re.DOTALL) + proc = subprocess.Popen(['otool', '-l', p], stdout=subprocess.PIPE) + o = proc.communicate()[0] + assert not proc.returncode + m = r.search(o) + assert m + return m.group(1) + + if (GetInstallname('libdefault_installname.dylib') != + '/usr/local/lib/libdefault_installname.dylib'): + test.fail_test() + + if (GetInstallname('My Framework.framework/My Framework') != + '/Library/Frameworks/My Framework.framework/' + 'Versions/A/My Framework'): + test.fail_test() + + if (GetInstallname('libexplicit_installname.dylib') != + 'Trapped in a dynamiclib factory'): + test.fail_test() + + if (GetInstallname('libexplicit_installname_base.dylib') != + '@executable_path/../../../libexplicit_installname_base.dylib'): + test.fail_test() + + if (GetInstallname('My Other Framework.framework/My Other Framework') != + '@executable_path/../../../My Other Framework.framework/' + 'Versions/A/My Other Framework'): + test.fail_test() + + if (GetInstallname('libexplicit_installname_with_base.dylib') != + '/usr/local/lib/libexplicit_installname_with_base.dylib'): + test.fail_test() + + if (GetInstallname('libexplicit_installname_with_explicit_base.dylib') != + '@executable_path/../libexplicit_installname_with_explicit_base.dylib'): + test.fail_test() + + if (GetInstallname('libboth_base_and_installname.dylib') != + 'Still trapped in a dynamiclib factory'): + test.fail_test() + + if (GetInstallname('install_name_with_info_plist.framework/' + 'install_name_with_info_plist') != + '/Library/Frameworks/install_name_with_info_plist.framework/' + 'Versions/A/install_name_with_info_plist'): + test.fail_test() + + if ('DYLIB_INSTALL_NAME_BASE:standardizepath: command not found' in + test.stdout()): + test.fail_test() + + test.pass_test() diff --git a/deps/gyp/test/mac/gyptest-kext.py b/deps/gyp/test/mac/gyptest-kext.py new file mode 100755 index 0000000000..56790bdb65 --- /dev/null +++ b/deps/gyp/test/mac/gyptest-kext.py @@ -0,0 +1,27 @@ +#!/usr/bin/env python + +# Copyright (c) 2015 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. + +""" +Verifies that kext bundles are built correctly. +""" + +import TestGyp +import TestMac + +import os +import plistlib +import subprocess +import sys + +if sys.platform == 'darwin': + test = TestGyp.TestGyp(formats=['xcode']) + test.run_gyp('kext.gyp', chdir='kext') + test.build('kext.gyp', test.ALL, chdir='kext') + test.built_file_must_exist('GypKext.kext/Contents/MacOS/GypKext', + chdir='kext') + test.built_file_must_exist('GypKext.kext/Contents/Info.plist', + chdir='kext') + test.pass_test() diff --git a/deps/gyp/test/mac/gyptest-ldflags-passed-to-libtool.py b/deps/gyp/test/mac/gyptest-ldflags-passed-to-libtool.py new file mode 100644 index 0000000000..48afcd46bc --- /dev/null +++ b/deps/gyp/test/mac/gyptest-ldflags-passed-to-libtool.py @@ -0,0 +1,35 @@ +#!/usr/bin/env python + +# 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. + +""" +Verifies that OTHER_LDFLAGS is passed to libtool. +""" + +import TestGyp + +import sys + +if sys.platform == 'darwin': + print "This test is currently disabled: https://crbug.com/483696." + sys.exit(0) + + test = TestGyp.TestGyp(formats=['ninja', 'make', 'xcode'], + match = lambda a, b: True) + + build_error_code = { + 'xcode': [1, 65], # 1 for xcode 3, 65 for xcode 4 (see `man sysexits`) + 'make': 2, + 'ninja': 1, + 'xcode-ninja': [1, 65], + }[test.format] + + CHDIR = 'ldflags-libtool' + test.run_gyp('test.gyp', chdir=CHDIR) + + test.build('test.gyp', 'ldflags_passed_to_libtool', chdir=CHDIR, + status=build_error_code) + + test.pass_test() diff --git a/deps/gyp/test/mac/gyptest-ldflags.py b/deps/gyp/test/mac/gyptest-ldflags.py new file mode 100644 index 0000000000..af44b8c5a0 --- /dev/null +++ b/deps/gyp/test/mac/gyptest-ldflags.py @@ -0,0 +1,74 @@ +#!/usr/bin/env python + +# 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. + +""" +Verifies that filenames passed to various linker flags are converted into +build-directory relative paths correctly. +""" + +import TestGyp + +import sys + +if sys.platform == 'darwin': + test = TestGyp.TestGyp(formats=['ninja', 'make', 'xcode']) + + # The xcode-ninja generator handles gypfiles which are not at the + # project root incorrectly. + # cf. https://code.google.com/p/gyp/issues/detail?id=460 + if test.format == 'xcode-ninja': + test.skip_test() + + CHDIR = 'ldflags' + test.run_gyp('subdirectory/test.gyp', chdir=CHDIR) + + test.build('subdirectory/test.gyp', test.ALL, chdir=CHDIR) + + test.pass_test() + + +# These flags from `man ld` couldl show up in OTHER_LDFLAGS and need path +# translation. +# +# Done: +# -exported_symbols_list filename +# -unexported_symbols_list file +# -reexported_symbols_list file +# -sectcreate segname sectname file +# +# Will be done on demand: +# -weak_library path_to_library +# -reexport_library path_to_library +# -lazy_library path_to_library +# -upward_library path_to_library +# -syslibroot rootdir +# -framework name[,suffix] +# -weak_framework name[,suffix] +# -reexport_framework name[,suffix] +# -lazy_framework name[,suffix] +# -upward_framework name[,suffix] +# -force_load path_to_archive +# -filelist file[,dirname] +# -dtrace file +# -order_file file # should use ORDER_FILE +# -exported_symbols_order file +# -bundle_loader executable # should use BUNDLE_LOADER +# -alias_list filename +# -seg_addr_table filename +# -dylib_file install_name:file_name +# -interposable_list filename +# -object_path_lto filename +# +# +# obsolete: +# -sectorder segname sectname orderfile +# -seg_addr_table_filename path +# +# +# ??: +# -map map_file_path +# -sub_library library_name +# -sub_umbrella framework_name diff --git a/deps/gyp/test/mac/gyptest-libraries.py b/deps/gyp/test/mac/gyptest-libraries.py new file mode 100755 index 0000000000..d5b64bda7f --- /dev/null +++ b/deps/gyp/test/mac/gyptest-libraries.py @@ -0,0 +1,28 @@ +#!/usr/bin/env python + +# 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. + +""" +Verifies libraries (in link_settings) are properly found. +""" + +import TestGyp + +import sys + +if sys.platform == 'darwin': + test = TestGyp.TestGyp(formats=['ninja', 'make', 'xcode']) + + # The xcode-ninja generator handles gypfiles which are not at the + # project root incorrectly. + # cf. https://code.google.com/p/gyp/issues/detail?id=460 + if test.format == 'xcode-ninja': + test.skip_test() + + test.run_gyp('subdir/test.gyp', chdir='libraries') + + test.build('subdir/test.gyp', test.ALL, chdir='libraries') + + test.pass_test() diff --git a/deps/gyp/test/mac/gyptest-libtool-zero.py b/deps/gyp/test/mac/gyptest-libtool-zero.py new file mode 100644 index 0000000000..ae5b7e635b --- /dev/null +++ b/deps/gyp/test/mac/gyptest-libtool-zero.py @@ -0,0 +1,26 @@ +#!/usr/bin/env python + +# Copyright (c) 2014 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. + +""" +Verifies libraries have proper mtime. +""" + +import TestGyp + +import sys + +if sys.platform == 'darwin': + test = TestGyp.TestGyp(formats=['ninja', 'make', 'xcode']) + + CHDIR = 'libtool-zero' + + test.run_gyp('test.gyp', chdir=CHDIR) + + test.build('test.gyp', 'mylib', chdir=CHDIR) + + test.up_to_date('test.gyp', 'mylib', chdir=CHDIR) + + test.pass_test() diff --git a/deps/gyp/test/mac/gyptest-loadable-module-bundle-product-extension.py b/deps/gyp/test/mac/gyptest-loadable-module-bundle-product-extension.py new file mode 100644 index 0000000000..7a60ca2d17 --- /dev/null +++ b/deps/gyp/test/mac/gyptest-loadable-module-bundle-product-extension.py @@ -0,0 +1,31 @@ +#!/usr/bin/env python + +# Copyright (c) 2014 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. + +""" +Tests that loadable_modules don't collide when using the same name with +different file extensions. +""" + +import TestGyp + +import os +import struct +import sys + +if sys.platform == 'darwin': + test = TestGyp.TestGyp(formats=['ninja', 'make', 'xcode']) + + CHDIR = 'loadable-module-bundle-product-extension' + test.run_gyp('test.gyp', + '-G', 'xcode_ninja_target_pattern=^.*$', + chdir=CHDIR) + + test.build('test.gyp', test.ALL, chdir=CHDIR) + + test.must_exist(test.built_file_path('Collide.foo', chdir=CHDIR)) + test.must_exist(test.built_file_path('Collide.bar', chdir=CHDIR)) + + test.pass_test() diff --git a/deps/gyp/test/mac/gyptest-loadable-module.py b/deps/gyp/test/mac/gyptest-loadable-module.py new file mode 100755 index 0000000000..158a930552 --- /dev/null +++ b/deps/gyp/test/mac/gyptest-loadable-module.py @@ -0,0 +1,52 @@ +#!/usr/bin/env python + +# 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. + +""" +Tests that a loadable_module target is built correctly. +""" + +import TestGyp + +import os +import struct +import sys + +if sys.platform == 'darwin': + print "This test is currently disabled: https://crbug.com/483696." + sys.exit(0) + + test = TestGyp.TestGyp(formats=['ninja', 'make', 'xcode']) + + CHDIR = 'loadable-module' + test.run_gyp('test.gyp', chdir=CHDIR) + + test.build('test.gyp', test.ALL, chdir=CHDIR) + + # Binary. + binary = test.built_file_path( + 'test_loadable_module.plugin/Contents/MacOS/test_loadable_module', + chdir=CHDIR) + test.must_exist(binary) + MH_BUNDLE = 8 + if struct.unpack('4I', open(binary, 'rb').read(16))[3] != MH_BUNDLE: + test.fail_test() + + # Info.plist. + info_plist = test.built_file_path( + 'test_loadable_module.plugin/Contents/Info.plist', chdir=CHDIR) + test.must_exist(info_plist) + test.must_contain(info_plist, """ + <key>CFBundleExecutable</key> + <string>test_loadable_module</string> +""") + + # PkgInfo. + test.built_file_must_not_exist( + 'test_loadable_module.plugin/Contents/PkgInfo', chdir=CHDIR) + test.built_file_must_not_exist( + 'test_loadable_module.plugin/Contents/Resources', chdir=CHDIR) + + test.pass_test() diff --git a/deps/gyp/test/mac/gyptest-lto.py b/deps/gyp/test/mac/gyptest-lto.py new file mode 100644 index 0000000000..5171544750 --- /dev/null +++ b/deps/gyp/test/mac/gyptest-lto.py @@ -0,0 +1,65 @@ +#!/usr/bin/env python + +# Copyright (c) 2015 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. + +""" +Verifies that LTO flags work. +""" + +import TestGyp + +import os +import re +import subprocess +import sys + +if sys.platform == 'darwin': + test = TestGyp.TestGyp(formats=['ninja', 'make', 'xcode']) + CHDIR = 'lto' + test.run_gyp('test.gyp', chdir=CHDIR) + + test.build('test.gyp', test.ALL, chdir=CHDIR) + + def ObjPath(srcpath, target): + # TODO: Move this into TestGyp if it's needed elsewhere. + if test.format == 'xcode': + return os.path.join(CHDIR, 'build', 'test.build', 'Default', + target + '.build', 'Objects-normal', 'x86_64', + srcpath + '.o') + elif 'ninja' in test.format: # ninja, xcode-ninja + return os.path.join(CHDIR, 'out', 'Default', 'obj', + target + '.' + srcpath + '.o') + elif test.format == 'make': + return os.path.join(CHDIR, 'out', 'Default', 'obj.target', + target, srcpath + '.o') + + def ObjType(p, t_expected): + r = re.compile(r'nsyms\s+(\d+)') + o = subprocess.check_output(['file', p]) + objtype = 'unknown' + if ': Mach-O ' in o: + objtype = 'mach-o' + elif ': LLVM bit-code ' in o: + objtype = 'llvm' + if objtype != t_expected: + print 'Expected %s, got %s' % (t_expected, objtype) + test.fail_test() + + ObjType(ObjPath('cfile', 'lto'), 'llvm') + ObjType(ObjPath('ccfile', 'lto'), 'llvm') + ObjType(ObjPath('mfile', 'lto'), 'llvm') + ObjType(ObjPath('mmfile', 'lto'), 'llvm') + ObjType(ObjPath('asmfile', 'lto'), 'mach-o') + + ObjType(ObjPath('cfile', 'lto_static'), 'llvm') + ObjType(ObjPath('ccfile', 'lto_static'), 'llvm') + ObjType(ObjPath('mfile', 'lto_static'), 'llvm') + ObjType(ObjPath('mmfile', 'lto_static'), 'llvm') + ObjType(ObjPath('asmfile', 'lto_static'), 'mach-o') + + test.pass_test() + + # TODO: Probably test for -object_path_lto too, else dsymutil won't be + # useful maybe? diff --git a/deps/gyp/test/mac/gyptest-missing-cfbundlesignature.py b/deps/gyp/test/mac/gyptest-missing-cfbundlesignature.py new file mode 100644 index 0000000000..43cab77bdf --- /dev/null +++ b/deps/gyp/test/mac/gyptest-missing-cfbundlesignature.py @@ -0,0 +1,32 @@ +#!/usr/bin/env python + +# 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. + +""" +Verifies that an Info.plist with CFBundleSignature works. +""" + +import TestGyp + +import sys + +if sys.platform == 'darwin': + print "This test is currently disabled: https://crbug.com/483696." + sys.exit(0) + + test = TestGyp.TestGyp(formats=['ninja', 'make', 'xcode']) + + test.run_gyp('test.gyp', chdir='missing-cfbundlesignature') + test.build('test.gyp', test.ALL, chdir='missing-cfbundlesignature') + + test.built_file_must_match('mytarget.app/Contents/PkgInfo', 'APPL????', + chdir='missing-cfbundlesignature') + + test.built_file_must_match('myothertarget.app/Contents/PkgInfo', 'APPL????', + chdir='missing-cfbundlesignature') + + test.built_file_must_match('thirdtarget.app/Contents/PkgInfo', 'APPL????', + chdir='missing-cfbundlesignature') + test.pass_test() diff --git a/deps/gyp/test/mac/gyptest-non-strs-flattened-to-env.py b/deps/gyp/test/mac/gyptest-non-strs-flattened-to-env.py new file mode 100644 index 0000000000..b802619ba2 --- /dev/null +++ b/deps/gyp/test/mac/gyptest-non-strs-flattened-to-env.py @@ -0,0 +1,36 @@ +#!/usr/bin/env python + +# 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. + +""" +Verifies that list xcode_settings are flattened before being exported to the +environment. +""" + +import TestGyp + +import sys + +if sys.platform == 'darwin': + print "This test is currently disabled: https://crbug.com/483696." + sys.exit(0) + + test = TestGyp.TestGyp(formats=['ninja', 'make', 'xcode']) + + CHDIR = 'non-strs-flattened-to-env' + INFO_PLIST_PATH = 'Test.app/Contents/Info.plist' + + test.run_gyp('test.gyp', chdir=CHDIR) + test.build('test.gyp', test.ALL, chdir=CHDIR) + info_plist = test.built_file_path(INFO_PLIST_PATH, chdir=CHDIR) + test.must_exist(info_plist) + test.must_contain(info_plist, '''\ +\t<key>My Variable</key> +\t<string>some expansion</string>''') + test.must_contain(info_plist, '''\ +\t<key>CFlags</key> +\t<string>-fstack-protector-all -fno-strict-aliasing -DS="A Space"</string>''') + + test.pass_test() diff --git a/deps/gyp/test/mac/gyptest-objc-arc.py b/deps/gyp/test/mac/gyptest-objc-arc.py new file mode 100755 index 0000000000..b3192a19dd --- /dev/null +++ b/deps/gyp/test/mac/gyptest-objc-arc.py @@ -0,0 +1,26 @@ +#!/usr/bin/env python + +# Copyright (c) 2013 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. + +""" +Verifies that ARC objc settings are handled correctly. +""" + +import TestGyp + +import sys + +if sys.platform == 'darwin': + # set |match| to ignore build stderr output. + test = TestGyp.TestGyp(formats=['ninja', 'make', 'xcode'], + match = lambda a, b: True) + + CHDIR = 'objc-arc' + test.run_gyp('test.gyp', chdir=CHDIR) + + test.build('test.gyp', 'arc_enabled', chdir=CHDIR) + test.build('test.gyp', 'arc_disabled', chdir=CHDIR) + + test.pass_test() diff --git a/deps/gyp/test/mac/gyptest-objc-gc.py b/deps/gyp/test/mac/gyptest-objc-gc.py new file mode 100644 index 0000000000..0cec458983 --- /dev/null +++ b/deps/gyp/test/mac/gyptest-objc-gc.py @@ -0,0 +1,51 @@ +#!/usr/bin/env python + +# 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. + +""" +Verifies that GC objc settings are handled correctly. +""" + +import TestGyp +import TestMac + +import sys + +if sys.platform == 'darwin': + # set |match| to ignore build stderr output. + test = TestGyp.TestGyp(formats=['ninja', 'make', 'xcode'], + match = lambda a, b: True) + + # Xcode 5.1 removed support for garbage-collection: + # error: garbage collection is no longer supported + if TestMac.Xcode.Version() < '0510': + + CHDIR = 'objc-gc' + test.run_gyp('test.gyp', chdir=CHDIR) + + build_error_code = { + 'xcode': [1, 65], # 1 for xcode 3, 65 for xcode 4 (see `man sysexits`) + 'make': 2, + 'ninja': 1, + }[test.format] + + test.build('test.gyp', 'gc_exe_fails', chdir=CHDIR, status=build_error_code) + test.build( + 'test.gyp', 'gc_off_exe_req_lib', chdir=CHDIR, status=build_error_code) + + test.build('test.gyp', 'gc_req_exe', chdir=CHDIR) + test.run_built_executable('gc_req_exe', chdir=CHDIR, stdout="gc on: 1\n") + + test.build('test.gyp', 'gc_exe_req_lib', chdir=CHDIR) + test.run_built_executable( + 'gc_exe_req_lib', chdir=CHDIR, stdout="gc on: 1\n") + + test.build('test.gyp', 'gc_exe', chdir=CHDIR) + test.run_built_executable('gc_exe', chdir=CHDIR, stdout="gc on: 1\n") + + test.build('test.gyp', 'gc_off_exe', chdir=CHDIR) + test.run_built_executable('gc_off_exe', chdir=CHDIR, stdout="gc on: 0\n") + + test.pass_test() diff --git a/deps/gyp/test/mac/gyptest-postbuild-copy-bundle.py b/deps/gyp/test/mac/gyptest-postbuild-copy-bundle.py new file mode 100644 index 0000000000..1f04d1cb36 --- /dev/null +++ b/deps/gyp/test/mac/gyptest-postbuild-copy-bundle.py @@ -0,0 +1,75 @@ +#!/usr/bin/env python + +# 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. + +""" +Verifies that a postbuild copying a dependend framework into an app bundle is +rerun if the resources in the framework change. +""" + +import TestGyp + +import os.path +import sys + +if sys.platform == 'darwin': + # TODO(thakis): Make this pass with the make generator, http://crbug.com/95529 + test = TestGyp.TestGyp(formats=['ninja', 'xcode']) + + CHDIR = 'postbuild-copy-bundle' + test.run_gyp('test.gyp', chdir=CHDIR) + + app_bundle_dir = test.built_file_path('Test App.app', chdir=CHDIR) + bundled_framework_dir = os.path.join( + app_bundle_dir, 'Contents', 'My Framework.framework', 'Resources') + final_plist_path = os.path.join(bundled_framework_dir, 'Info.plist') + final_resource_path = os.path.join(bundled_framework_dir, 'resource_file.sb') + final_copies_path = os.path.join( + app_bundle_dir, 'Contents', 'My Framework.framework', 'Versions', 'A', + 'Libraries', 'copied.txt') + + # Check that the dependency was built and copied into the app bundle: + test.build('test.gyp', 'test_app', chdir=CHDIR) + test.must_exist(final_resource_path) + test.must_match(final_resource_path, + 'This is included in the framework bundle.\n') + + test.must_exist(final_plist_path) + test.must_contain(final_plist_path, '''\ +\t<key>RandomKey</key> +\t<string>RandomValue</string>''') + + # Touch the dependency's bundle resource, and check that the modification + # makes it all the way into the app bundle: + test.sleep() + test.write('postbuild-copy-bundle/resource_file.sb', 'New text\n') + test.build('test.gyp', 'test_app', chdir=CHDIR) + + test.must_exist(final_resource_path) + test.must_match(final_resource_path, 'New text\n') + + # Check the same for the plist file. + test.sleep() + contents = test.read('postbuild-copy-bundle/Framework-Info.plist') + contents = contents.replace('RandomValue', 'NewRandomValue') + test.write('postbuild-copy-bundle/Framework-Info.plist', contents) + test.build('test.gyp', 'test_app', chdir=CHDIR) + + test.must_exist(final_plist_path) + test.must_contain(final_plist_path, '''\ +\t<key>RandomKey</key> +\t<string>NewRandomValue</string>''') + + # Check the same for the copies section, test for http://crbug.com/157077 + test.sleep() + contents = test.read('postbuild-copy-bundle/copied.txt') + contents = contents.replace('old', 'new') + test.write('postbuild-copy-bundle/copied.txt', contents) + test.build('test.gyp', 'test_app', chdir=CHDIR) + + test.must_exist(final_copies_path) + test.must_contain(final_copies_path, 'new copied file') + + test.pass_test() diff --git a/deps/gyp/test/mac/gyptest-postbuild-defaults.py b/deps/gyp/test/mac/gyptest-postbuild-defaults.py new file mode 100644 index 0000000000..892a0c4b06 --- /dev/null +++ b/deps/gyp/test/mac/gyptest-postbuild-defaults.py @@ -0,0 +1,32 @@ +#!/usr/bin/env python + +# 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. + +""" +Verifies that a postbuild invoking |defaults| works. +""" + +import TestGyp + +import sys + +if sys.platform == 'darwin': + print "This test is currently disabled: https://crbug.com/483696." + sys.exit(0) + + test = TestGyp.TestGyp(formats=['ninja', 'make', 'xcode']) + + CHDIR = 'postbuild-defaults' + test.run_gyp('test.gyp', chdir=CHDIR) + test.build('test.gyp', test.ALL, chdir=CHDIR) + + result_file = test.built_file_path('result', chdir=CHDIR) + test.must_exist(result_file) + test.must_contain(result_file, '''\ +Test +${PRODUCT_NAME} +''') + + test.pass_test() diff --git a/deps/gyp/test/mac/gyptest-postbuild-fail.py b/deps/gyp/test/mac/gyptest-postbuild-fail.py new file mode 100755 index 0000000000..9cd5d47d28 --- /dev/null +++ b/deps/gyp/test/mac/gyptest-postbuild-fail.py @@ -0,0 +1,68 @@ +#!/usr/bin/env python + +# Copyright (c) 2011 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. + +""" +Verifies that a failing postbuild step lets the build fail. +""" + +import TestGyp + +import sys + +if sys.platform == 'darwin': + # set |match| to ignore build stderr output. + test = TestGyp.TestGyp(formats=['ninja', 'make', 'xcode'], + match = lambda a, b: True) + + test.run_gyp('test.gyp', chdir='postbuild-fail') + + build_error_code = { + 'xcode': [1, 65], # 1 for xcode 3, 65 for xcode 4 (see `man sysexits`) + 'make': 2, + 'ninja': 1, + 'xcode-ninja': [1, 65], + }[test.format] + + + # If a postbuild fails, all postbuilds should be re-run on the next build. + # In Xcode 3, even if the first postbuild fails the other postbuilds were + # still executed. In Xcode 4, postbuilds are stopped after the first + # failing postbuild. This test checks for the Xcode 4 behavior. + + # Ignore this test on Xcode 3. + import subprocess + job = subprocess.Popen(['xcodebuild', '-version'], + stdout=subprocess.PIPE, + stderr=subprocess.STDOUT) + out, err = job.communicate() + if job.returncode != 0: + print out + raise Exception('Error %d running xcodebuild' % job.returncode) + if out.startswith('Xcode 3.'): + test.pass_test() + + # Non-bundles + test.build('test.gyp', 'nonbundle', chdir='postbuild-fail', + status=build_error_code) + test.built_file_must_not_exist('static_touch', + chdir='postbuild-fail') + # Check for non-up-to-date-ness by checking if building again produces an + # error. + test.build('test.gyp', 'nonbundle', chdir='postbuild-fail', + status=build_error_code) + + + # Bundles + test.build('test.gyp', 'bundle', chdir='postbuild-fail', + status=build_error_code) + test.built_file_must_not_exist('dynamic_touch', + chdir='postbuild-fail') + # Check for non-up-to-date-ness by checking if building again produces an + # error. + test.build('test.gyp', 'bundle', chdir='postbuild-fail', + status=build_error_code) + + test.pass_test() diff --git a/deps/gyp/test/mac/gyptest-postbuild-multiple-configurations.py b/deps/gyp/test/mac/gyptest-postbuild-multiple-configurations.py new file mode 100644 index 0000000000..84694f36cc --- /dev/null +++ b/deps/gyp/test/mac/gyptest-postbuild-multiple-configurations.py @@ -0,0 +1,26 @@ +#!/usr/bin/env python + +# 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. + +""" +Verifies that a postbuild work in projects with multiple configurations. +""" + +import TestGyp + +import sys + +if sys.platform == 'darwin': + test = TestGyp.TestGyp(formats=['ninja', 'make', 'xcode']) + + CHDIR = 'postbuild-multiple-configurations' + test.run_gyp('test.gyp', chdir=CHDIR) + + for configuration in ['Debug', 'Release']: + test.set_configuration(configuration) + test.build('test.gyp', test.ALL, chdir=CHDIR) + test.built_file_must_exist('postbuild-file', chdir=CHDIR) + + test.pass_test() diff --git a/deps/gyp/test/mac/gyptest-postbuild-static-library.py b/deps/gyp/test/mac/gyptest-postbuild-static-library.py new file mode 100644 index 0000000000..8f9a6ebcb0 --- /dev/null +++ b/deps/gyp/test/mac/gyptest-postbuild-static-library.py @@ -0,0 +1,28 @@ +#!/usr/bin/env python + +# 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. + +""" +Verifies that a postbuilds on static libraries work, and that sourceless +libraries don't cause failures at gyp time. +""" + +import TestGyp + +import sys + +if sys.platform == 'darwin': + test = TestGyp.TestGyp(formats=['make', 'xcode']) + + CHDIR = 'postbuild-static-library' + test.run_gyp('test.gyp', chdir=CHDIR) + test.build('test.gyp', 'my_lib', chdir=CHDIR) + # Building my_sourceless_lib doesn't work with make. gyp should probably + # forbid sourceless static libraries, since they're pretty pointless. + # But they shouldn't cause gyp time exceptions. + + test.built_file_must_exist('postbuild-file', chdir=CHDIR) + + test.pass_test() diff --git a/deps/gyp/test/mac/gyptest-postbuild.py b/deps/gyp/test/mac/gyptest-postbuild.py new file mode 100755 index 0000000000..684e7b8426 --- /dev/null +++ b/deps/gyp/test/mac/gyptest-postbuild.py @@ -0,0 +1,53 @@ +#!/usr/bin/env python + +# Copyright (c) 2011 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. + +""" +Verifies that postbuild steps work. +""" + +import TestGyp + +import sys + +if sys.platform == 'darwin': + test = TestGyp.TestGyp(formats=['ninja', 'make', 'xcode']) + + test.run_gyp('test.gyp', chdir='postbuilds') + + test.build('test.gyp', test.ALL, chdir='postbuilds') + + # See comment in test/subdirectory/gyptest-subdir-default.py + if test.format == 'xcode': + chdir = 'postbuilds/subdirectory' + else: + chdir = 'postbuilds' + + # Created by the postbuild scripts + test.built_file_must_exist('el.a_touch', + type=test.STATIC_LIB, + chdir='postbuilds') + test.built_file_must_exist('el.a_gyp_touch', + type=test.STATIC_LIB, + chdir='postbuilds') + test.built_file_must_exist('nest_el.a_touch', + type=test.STATIC_LIB, + chdir=chdir) + test.built_file_must_exist( + 'dyna.framework/Versions/A/dyna_touch', + chdir='postbuilds') + test.built_file_must_exist( + 'dyna.framework/Versions/A/dyna_gyp_touch', + chdir='postbuilds') + test.built_file_must_exist( + 'nest_dyna.framework/Versions/A/nest_dyna_touch', + chdir=chdir) + test.built_file_must_exist('dyna_standalone.dylib_gyp_touch', + type=test.SHARED_LIB, + chdir='postbuilds') + test.built_file_must_exist('copied_file.txt', chdir='postbuilds') + test.built_file_must_exist('copied_file_2.txt', chdir=chdir) + + test.pass_test() diff --git a/deps/gyp/test/mac/gyptest-prefixheader.py b/deps/gyp/test/mac/gyptest-prefixheader.py new file mode 100755 index 0000000000..0cf85f9422 --- /dev/null +++ b/deps/gyp/test/mac/gyptest-prefixheader.py @@ -0,0 +1,20 @@ +#!/usr/bin/env python + +# 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. + +""" +Verifies that GCC_PREFIX_HEADER works. +""" + +import TestGyp + +import sys + +if sys.platform == 'darwin': + test = TestGyp.TestGyp(formats=['ninja', 'make', 'xcode']) + test.run_gyp('test.gyp', chdir='prefixheader') + + test.build('test.gyp', test.ALL, chdir='prefixheader') + test.pass_test() diff --git a/deps/gyp/test/mac/gyptest-rebuild.py b/deps/gyp/test/mac/gyptest-rebuild.py new file mode 100755 index 0000000000..e615d06786 --- /dev/null +++ b/deps/gyp/test/mac/gyptest-rebuild.py @@ -0,0 +1,44 @@ +#!/usr/bin/env python + +# 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. + +""" +Verifies that app bundles are rebuilt correctly. +""" + +import TestGyp + +import sys + +if sys.platform == 'darwin': + print "This test is currently disabled: https://crbug.com/483696." + sys.exit(0) + + test = TestGyp.TestGyp(formats=['ninja', 'make', 'xcode']) + + CHDIR = 'rebuild' + test.run_gyp('test.gyp', chdir=CHDIR) + + test.build('test.gyp', 'test_app', chdir=CHDIR) + + # Touch a source file, rebuild, and check that the app target is up-to-date. + test.touch('rebuild/main.c') + test.build('test.gyp', 'test_app', chdir=CHDIR) + + test.up_to_date('test.gyp', 'test_app', chdir=CHDIR) + + # Xcode runs postbuilds on every build, so targets with postbuilds are + # never marked as up_to_date. + if test.format != 'xcode': + # Same for a framework bundle. + test.build('test.gyp', 'test_framework_postbuilds', chdir=CHDIR) + test.up_to_date('test.gyp', 'test_framework_postbuilds', chdir=CHDIR) + + # Test that an app bundle with a postbuild that touches the app binary needs + # to be built only once. + test.build('test.gyp', 'test_app_postbuilds', chdir=CHDIR) + test.up_to_date('test.gyp', 'test_app_postbuilds', chdir=CHDIR) + + test.pass_test() diff --git a/deps/gyp/test/mac/gyptest-rpath.py b/deps/gyp/test/mac/gyptest-rpath.py new file mode 100644 index 0000000000..ef415cd7d3 --- /dev/null +++ b/deps/gyp/test/mac/gyptest-rpath.py @@ -0,0 +1,50 @@ +#!/usr/bin/env python + +# 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. + +""" +Verifies that LD_DYLIB_INSTALL_NAME and DYLIB_INSTALL_NAME_BASE are handled +correctly. +""" + +import TestGyp + +import re +import subprocess +import sys + +if sys.platform == 'darwin': + test = TestGyp.TestGyp(formats=['ninja', 'make', 'xcode']) + + CHDIR = 'rpath' + test.run_gyp('test.gyp', chdir=CHDIR) + + test.build('test.gyp', test.ALL, chdir=CHDIR) + + def GetRpaths(p): + p = test.built_file_path(p, chdir=CHDIR) + r = re.compile(r'cmd LC_RPATH.*?path (.*?) \(offset \d+\)', re.DOTALL) + proc = subprocess.Popen(['otool', '-l', p], stdout=subprocess.PIPE) + o = proc.communicate()[0] + assert not proc.returncode + return r.findall(o) + + if GetRpaths('libdefault_rpath.dylib') != []: + test.fail_test() + + if GetRpaths('libexplicit_rpath.dylib') != ['@executable_path/.']: + test.fail_test() + + if (GetRpaths('libexplicit_rpaths_escaped.dylib') != + ['First rpath', 'Second rpath']): + test.fail_test() + + if GetRpaths('My Framework.framework/My Framework') != ['@loader_path/.']: + test.fail_test() + + if GetRpaths('executable') != ['@executable_path/.']: + test.fail_test() + + test.pass_test() diff --git a/deps/gyp/test/mac/gyptest-sdkroot.py b/deps/gyp/test/mac/gyptest-sdkroot.py new file mode 100644 index 0000000000..f7d41cd25a --- /dev/null +++ b/deps/gyp/test/mac/gyptest-sdkroot.py @@ -0,0 +1,54 @@ +#!/usr/bin/env python + +# 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. + +""" +Verifies that setting SDKROOT works. +""" + +import TestGyp + +import os +import subprocess +import sys + + +if sys.platform == 'darwin': + print "This test is currently disabled: https://crbug.com/483696." + sys.exit(0) + + test = TestGyp.TestGyp(formats=['ninja', 'make', 'xcode']) + + def GetSDKPath(sdk): + """Return SDKROOT if the SDK version |sdk| is installed or empty string.""" + DEVNULL = open(os.devnull, 'wb') + try: + proc = subprocess.Popen( + ['xcodebuild', '-version', '-sdk', 'macosx' + sdk, 'Path'], + stdout=subprocess.PIPE, stderr=DEVNULL) + return proc.communicate()[0].rstrip('\n') + finally: + DEVNULL.close() + + def SelectSDK(): + """Select the oldest SDK installed (greater than 10.6).""" + for sdk in ['10.6', '10.7', '10.8', '10.9']: + path = GetSDKPath(sdk) + if path: + return True, sdk, path + return False, '', '' + + # Make sure this works on the bots, which only have the 10.6 sdk, and on + # dev machines which usually don't have the 10.6 sdk. + sdk_found, sdk, sdk_path = SelectSDK() + if not sdk_found: + test.fail_test() + + test.write('sdkroot/test.gyp', test.read('sdkroot/test.gyp') % sdk) + + test.run_gyp('test.gyp', '-D', 'sdk_path=%s' % sdk_path, + chdir='sdkroot') + test.build('test.gyp', test.ALL, chdir='sdkroot') + test.pass_test() diff --git a/deps/gyp/test/mac/gyptest-sourceless-module.py b/deps/gyp/test/mac/gyptest-sourceless-module.py new file mode 100644 index 0000000000..c34bc546bd --- /dev/null +++ b/deps/gyp/test/mac/gyptest-sourceless-module.py @@ -0,0 +1,75 @@ +#!/usr/bin/env python + +# 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. + +""" +Verifies that bundles that have no 'sources' (pure resource containers) work. +""" + +import TestGyp + +import sys + +if sys.platform == 'darwin': + print "This test is currently disabled: https://crbug.com/483696." + sys.exit(0) + + test = TestGyp.TestGyp(formats=['ninja', 'make', 'xcode']) + + test.run_gyp('test.gyp', chdir='sourceless-module') + + # Just needs to build without errors. + test.build('test.gyp', 'empty_bundle', chdir='sourceless-module') + test.built_file_must_not_exist( + 'empty_bundle.bundle', chdir='sourceless-module') + + # Needs to build, and contain a resource. + test.build('test.gyp', 'resource_bundle', chdir='sourceless-module') + + test.built_file_must_exist( + 'resource_bundle.bundle/Contents/Resources/foo.manifest', + chdir='sourceless-module') + test.built_file_must_not_exist( + 'resource_bundle.bundle/Contents/MacOS/resource_bundle', + chdir='sourceless-module') + + # Build an app containing an actionless bundle. + test.build( + 'test.gyp', + 'bundle_dependent_on_resource_bundle_no_actions', + chdir='sourceless-module') + + test.built_file_must_exist( + 'bundle_dependent_on_resource_bundle_no_actions.app/Contents/Resources/' + 'mac_resource_bundle_no_actions.bundle/Contents/Resources/empty.txt', + chdir='sourceless-module') + + # Needs to build and cause the bundle to be built. + test.build( + 'test.gyp', 'dependent_on_resource_bundle', chdir='sourceless-module') + + test.built_file_must_exist( + 'resource_bundle.bundle/Contents/Resources/foo.manifest', + chdir='sourceless-module') + test.built_file_must_not_exist( + 'resource_bundle.bundle/Contents/MacOS/resource_bundle', + chdir='sourceless-module') + + # TODO(thakis): shared_libraries that have no sources but depend on static + # libraries currently only work with the ninja generator. This is used by + # chrome/mac's components build. + if test.format == 'ninja': + # Check that an executable depending on a resource framework links fine too. + test.build( + 'test.gyp', 'dependent_on_resource_framework', chdir='sourceless-module') + + test.built_file_must_exist( + 'resource_framework.framework/Resources/foo.manifest', + chdir='sourceless-module') + test.built_file_must_exist( + 'resource_framework.framework/resource_framework', + chdir='sourceless-module') + + test.pass_test() diff --git a/deps/gyp/test/mac/gyptest-strip-default.py b/deps/gyp/test/mac/gyptest-strip-default.py new file mode 100644 index 0000000000..f73fa1124c --- /dev/null +++ b/deps/gyp/test/mac/gyptest-strip-default.py @@ -0,0 +1,95 @@ +#!/usr/bin/env python + +# Copyright (c) 2013 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. + +""" +Verifies that the default STRIP_STYLEs match between different generators. +""" + +import TestGyp + +import re +import subprocess +import sys +import time + +if sys.platform == 'darwin': + test = TestGyp.TestGyp(formats=['ninja', 'make', 'xcode']) + + CHDIR='strip' + test.run_gyp('test-defaults.gyp', chdir=CHDIR) + + test.build('test-defaults.gyp', test.ALL, chdir=CHDIR) + + # Lightweight check if stripping was done. + def OutPath(s): + return test.built_file_path(s, chdir=CHDIR) + + def CheckNsyms(p, o_expected): + proc = subprocess.Popen(['nm', '-aU', p], stdout=subprocess.PIPE) + o = proc.communicate()[0] + + # Filter out mysterious "00 0000 OPT radr://5614542" symbol which + # is apparently only printed on the bots (older toolchain?). + # Yes, "radr", not "rdar". + o = ''.join(filter(lambda s: 'radr://5614542' not in s, o.splitlines(True))) + + o = o.replace('A', 'T') + o = re.sub(r'^[a-fA-F0-9]+', 'XXXXXXXX', o, flags=re.MULTILINE) + assert not proc.returncode + if o != o_expected: + print 'Stripping: Expected symbols """\n%s""", got """\n%s"""' % ( + o_expected, o) + test.fail_test() + + CheckNsyms(OutPath('libsingle_dylib.dylib'), +"""\ +XXXXXXXX S _ci +XXXXXXXX S _i +XXXXXXXX T _the_function +XXXXXXXX t _the_hidden_function +XXXXXXXX T _the_used_function +XXXXXXXX T _the_visible_function +""") + CheckNsyms(OutPath('single_so.so'), +"""\ +XXXXXXXX S _ci +XXXXXXXX S _i +XXXXXXXX T _the_function +XXXXXXXX t _the_hidden_function +XXXXXXXX T _the_used_function +XXXXXXXX T _the_visible_function +""") + CheckNsyms(OutPath('single_exe'), +"""\ +XXXXXXXX T __mh_execute_header +""") + + CheckNsyms(test.built_file_path( + 'bundle_dylib.framework/Versions/A/bundle_dylib', chdir=CHDIR), +"""\ +XXXXXXXX S _ci +XXXXXXXX S _i +XXXXXXXX T _the_function +XXXXXXXX t _the_hidden_function +XXXXXXXX T _the_used_function +XXXXXXXX T _the_visible_function +""") + CheckNsyms(test.built_file_path( + 'bundle_so.bundle/Contents/MacOS/bundle_so', chdir=CHDIR), +"""\ +XXXXXXXX S _ci +XXXXXXXX S _i +XXXXXXXX T _the_function +XXXXXXXX T _the_used_function +XXXXXXXX T _the_visible_function +""") + CheckNsyms(test.built_file_path( + 'bundle_exe.app/Contents/MacOS/bundle_exe', chdir=CHDIR), +"""\ +XXXXXXXX T __mh_execute_header +""") + + test.pass_test() diff --git a/deps/gyp/test/mac/gyptest-strip.py b/deps/gyp/test/mac/gyptest-strip.py new file mode 100755 index 0000000000..a729521e18 --- /dev/null +++ b/deps/gyp/test/mac/gyptest-strip.py @@ -0,0 +1,61 @@ +#!/usr/bin/env python + +# 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. + +""" +Verifies that stripping works. +""" + +import TestGyp +import TestMac + +import re +import subprocess +import sys +import time + +if sys.platform == 'darwin': + test = TestGyp.TestGyp(formats=['ninja', 'make', 'xcode']) + + test.run_gyp('test.gyp', chdir='strip') + + test.build('test.gyp', test.ALL, chdir='strip') + + # Lightweight check if stripping was done. + def OutPath(s): + return test.built_file_path(s, type=test.SHARED_LIB, chdir='strip') + + def CheckNsyms(p, n_expected): + r = re.compile(r'nsyms\s+(\d+)') + o = subprocess.check_output(['otool', '-l', p]) + m = r.search(o) + n = int(m.group(1)) + if n != n_expected: + print 'Stripping: Expected %d symbols, got %d' % (n_expected, n) + test.fail_test() + + # Starting with Xcode 5.0, clang adds an additional symbols to the compiled + # file when using a relative path to the input file. So when using ninja + # with Xcode 5.0 or higher, take this additional symbol into consideration + # for unstripped builds (it is stripped by all strip commands). + expected_extra_symbol_count = 0 + if test.format in ['ninja', 'xcode-ninja'] \ + and TestMac.Xcode.Version() >= '0500': + expected_extra_symbol_count = 1 + + # The actual numbers here are not interesting, they just need to be the same + # in both the xcode and the make build. + CheckNsyms(OutPath('no_postprocess'), 29 + expected_extra_symbol_count) + CheckNsyms(OutPath('no_strip'), 29 + expected_extra_symbol_count) + CheckNsyms(OutPath('strip_all'), 0) + CheckNsyms(OutPath('strip_nonglobal'), 6) + CheckNsyms(OutPath('strip_debugging'), 7) + CheckNsyms(OutPath('strip_all_custom_flags'), 0) + CheckNsyms(test.built_file_path( + 'strip_all_bundle.framework/Versions/A/strip_all_bundle', chdir='strip'), + 0) + CheckNsyms(OutPath('strip_save'), 7) + + test.pass_test() diff --git a/deps/gyp/test/mac/gyptest-swift-library.py b/deps/gyp/test/mac/gyptest-swift-library.py new file mode 100644 index 0000000000..dde7a62351 --- /dev/null +++ b/deps/gyp/test/mac/gyptest-swift-library.py @@ -0,0 +1,65 @@ +#!/usr/bin/env python + +# Copyright (c) 2014 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. + +""" +Verifies that a swift framework builds correctly. +""" + +import TestGyp +import TestMac + +import collections +import sys +import subprocess + +if sys.platform == 'darwin': + print "This test is currently disabled: https://crbug.com/483696." + sys.exit(0) + + test = TestGyp.TestGyp(formats=['xcode']) + + # Ensures that the given symbol is present in the given file, by running nm. + def CheckHasSymbolName(path, symbol): + output = subprocess.check_output(['nm', '-j', path]) + idx = output.find(symbol) + if idx == -1: + print 'Swift: Could not find symobl: %s' % symbol + test.fail_test() + + test_cases = [] + + # Run this for iOS on XCode 6.0 or greater + if TestMac.Xcode.Version() >= '0600': + test_cases.append(('Default', 'iphoneos')) + test_cases.append(('Default', 'iphonesimulator')) + + # Run it for Mac on XCode 6.1 or greater + if TestMac.Xcode.Version() >= '0610': + test_cases.append(('Default', None)) + + # Generate the project. + test.run_gyp('test.gyp', chdir='swift-library') + + # Build and verify for each configuration. + for configuration, sdk in test_cases: + kwds = collections.defaultdict(list) + if test.format == 'xcode': + if sdk is not None: + kwds['arguments'].extend(['-sdk', sdk]) + + test.set_configuration(configuration) + test.build('test.gyp', 'SwiftFramework', chdir='swift-library', **kwds) + + filename = 'SwiftFramework.framework/SwiftFramework' + result_file = test.built_file_path(filename, chdir='swift-library') + + test.must_exist(result_file) + + # Check to make sure that our swift class (GypSwiftTest) is present in the + # built binary + CheckHasSymbolName(result_file, "C14SwiftFramework12GypSwiftTest") + + test.pass_test() diff --git a/deps/gyp/test/mac/gyptest-type-envvars.py b/deps/gyp/test/mac/gyptest-type-envvars.py new file mode 100755 index 0000000000..a5203c5f1e --- /dev/null +++ b/deps/gyp/test/mac/gyptest-type-envvars.py @@ -0,0 +1,26 @@ +#!/usr/bin/env python + +# 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. + +""" +Test that MACH_O_TYPE etc are set correctly. +""" + +import TestGyp + +import sys + +if sys.platform == 'darwin': + test = TestGyp.TestGyp(formats=['ninja', 'make', 'xcode']) + + test.run_gyp('test.gyp', + '-G', 'xcode_ninja_target_pattern=^(?!nonbundle_none).*$', + chdir='type_envvars') + + test.build('test.gyp', test.ALL, chdir='type_envvars') + + # The actual test is done by postbuild scripts during |test.build()|. + + test.pass_test() diff --git a/deps/gyp/test/mac/gyptest-unicode-settings.py b/deps/gyp/test/mac/gyptest-unicode-settings.py new file mode 100644 index 0000000000..a71b3bd9a3 --- /dev/null +++ b/deps/gyp/test/mac/gyptest-unicode-settings.py @@ -0,0 +1,20 @@ +#!/usr/bin/env python + +# Copyright 2013 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. + +""" +Verifies that unicode strings in 'xcode_settings' work. +Also checks that ASCII control characters are escaped properly. +""" + +import TestGyp + +import sys + +if sys.platform == 'darwin': + test = TestGyp.TestGyp(formats=['xcode']) + test.run_gyp('test.gyp', chdir='unicode-settings') + test.build('test.gyp', test.ALL, chdir='unicode-settings') + test.pass_test() diff --git a/deps/gyp/test/mac/gyptest-xcode-env-order.py b/deps/gyp/test/mac/gyptest-xcode-env-order.py new file mode 100755 index 0000000000..6e7ca2413f --- /dev/null +++ b/deps/gyp/test/mac/gyptest-xcode-env-order.py @@ -0,0 +1,93 @@ +#!/usr/bin/env python + +# 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. + +""" +Verifies that dependent Xcode settings are processed correctly. +""" + +import TestGyp +import TestMac + +import subprocess +import sys + +if sys.platform == 'darwin': + print "This test is currently disabled: https://crbug.com/483696." + sys.exit(0) + + test = TestGyp.TestGyp(formats=['ninja', 'make', 'xcode']) + + CHDIR = 'xcode-env-order' + INFO_PLIST_PATH = 'Test.app/Contents/Info.plist' + + test.run_gyp('test.gyp', chdir=CHDIR) + test.build('test.gyp', test.ALL, chdir=CHDIR) + + # Env vars in 'copies' filenames. + test.built_file_must_exist('Test-copy-brace/main.c', chdir=CHDIR) + test.built_file_must_exist('Test-copy-paren/main.c', chdir=CHDIR) + test.built_file_must_exist('Test-copy-bare/main.c', chdir=CHDIR) + + # Env vars in 'actions' filenames and inline actions + test.built_file_must_exist('action-copy-brace.txt', chdir=CHDIR) + test.built_file_must_exist('action-copy-paren.txt', chdir=CHDIR) + test.built_file_must_exist('action-copy-bare.txt', chdir=CHDIR) + + # Env vars in 'rules' filenames and inline actions + test.built_file_must_exist('rule-copy-brace.txt', chdir=CHDIR) + test.built_file_must_exist('rule-copy-paren.txt', chdir=CHDIR) + # TODO: see comment in test.gyp for this file. + #test.built_file_must_exist('rule-copy-bare.txt', chdir=CHDIR) + + # Env vars in Info.plist. + info_plist = test.built_file_path(INFO_PLIST_PATH, chdir=CHDIR) + test.must_exist(info_plist) + + test.must_contain(info_plist, '''\ +\t<key>BraceProcessedKey1</key> +\t<string>D:/Source/Project/Test</string>''') + test.must_contain(info_plist, '''\ +\t<key>BraceProcessedKey2</key> +\t<string>/Source/Project/Test</string>''') + test.must_contain(info_plist, '''\ +\t<key>BraceProcessedKey3</key> +\t<string>com.apple.product-type.application:D:/Source/Project/Test</string>''') + + test.must_contain(info_plist, '''\ +\t<key>ParenProcessedKey1</key> +\t<string>D:/Source/Project/Test</string>''') + test.must_contain(info_plist, '''\ +\t<key>ParenProcessedKey2</key> +\t<string>/Source/Project/Test</string>''') + test.must_contain(info_plist, '''\ +\t<key>ParenProcessedKey3</key> +\t<string>com.apple.product-type.application:D:/Source/Project/Test</string>''') + + test.must_contain(info_plist, '''\ +\t<key>BareProcessedKey1</key> +\t<string>D:/Source/Project/Test</string>''') + test.must_contain(info_plist, '''\ +\t<key>BareProcessedKey2</key> +\t<string>/Source/Project/Test</string>''') + # NOTE: For bare variables, $PRODUCT_TYPE is not replaced! It _is_ replaced + # if it's not right at the start of the string (e.g. ':$PRODUCT_TYPE'), so + # this looks like an Xcode bug. This bug isn't emulated (yet?), so check this + # only for Xcode. + if test.format == 'xcode' and TestMac.Xcode.Version() < '0500': + test.must_contain(info_plist, '''\ +\t<key>BareProcessedKey3</key> +\t<string>$PRODUCT_TYPE:D:/Source/Project/Test</string>''') + else: + # The bug has been fixed by Xcode version 5.0.0. + test.must_contain(info_plist, '''\ +\t<key>BareProcessedKey3</key> +\t<string>com.apple.product-type.application:D:/Source/Project/Test</string>''') + + test.must_contain(info_plist, '''\ +\t<key>MixedProcessedKey</key> +\t<string>/Source/Project:Test:mh_execute</string>''') + + test.pass_test() diff --git a/deps/gyp/test/mac/gyptest-xcode-gcc-clang.py b/deps/gyp/test/mac/gyptest-xcode-gcc-clang.py new file mode 100644 index 0000000000..981c3fc564 --- /dev/null +++ b/deps/gyp/test/mac/gyptest-xcode-gcc-clang.py @@ -0,0 +1,40 @@ +#!/usr/bin/env python + +# 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. + +""" +Verifies that xcode-style GCC_... settings that require clang are handled +properly. +""" + +import TestGyp + +import os +import sys + +if sys.platform == 'darwin': + test = TestGyp.TestGyp(formats=['ninja', 'make', 'xcode']) + + CHDIR = 'xcode-gcc' + test.run_gyp('test-clang.gyp', chdir=CHDIR) + + test.build('test-clang.gyp', 'aliasing_yes', chdir=CHDIR) + test.run_built_executable('aliasing_yes', chdir=CHDIR, stdout="1\n") + test.build('test-clang.gyp', 'aliasing_no', chdir=CHDIR) + test.run_built_executable('aliasing_no', chdir=CHDIR, stdout="0\n") + + # The default behavior changed: strict aliasing used to be off, now it's on + # by default. The important part is that this is identical for all generators + # (which it is). TODO(thakis): Enable this once the bots have a newer Xcode. + #test.build('test-clang.gyp', 'aliasing_default', chdir=CHDIR) + #test.run_built_executable('aliasing_default', chdir=CHDIR, stdout="1\n") + # For now, just check the generated ninja file: + if test.format == 'ninja': + contents = open(test.built_file_path('obj/aliasing_default.ninja', + chdir=CHDIR)).read() + if 'strict-aliasing' in contents: + test.fail_test() + + test.pass_test() diff --git a/deps/gyp/test/mac/gyptest-xcode-gcc.py b/deps/gyp/test/mac/gyptest-xcode-gcc.py new file mode 100644 index 0000000000..e45d0b5e8b --- /dev/null +++ b/deps/gyp/test/mac/gyptest-xcode-gcc.py @@ -0,0 +1,56 @@ +#!/usr/bin/env python + +# 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. + +""" +Verifies that xcode-style GCC_... settings are handled properly. +""" + +import TestGyp + +import os +import subprocess +import sys + +def IgnoreOutput(string, expected_string): + return True + +def CompilerVersion(compiler): + stdout = subprocess.check_output([compiler, '-v'], stderr=subprocess.STDOUT) + return stdout.rstrip('\n') + +def CompilerSupportsWarnAboutInvalidOffsetOfMacro(test): + # "clang" does not support the "-Winvalid-offsetof" flag, and silently + # ignore it. Starting with Xcode 5.0.0, "gcc" is just a "clang" binary with + # some hard-coded include path hack, so use the output of "-v" to detect if + # the compiler supports the flag or not. + return 'clang' not in CompilerVersion('/usr/bin/cc') + +if sys.platform == 'darwin': + test = TestGyp.TestGyp(formats=['ninja', 'make', 'xcode']) + + CHDIR = 'xcode-gcc' + test.run_gyp('test.gyp', chdir=CHDIR) + + # List of targets that'll pass. It expects targets of the same name with + # '-fail' appended that'll fail to build. + targets = [ + 'warn_about_missing_newline', + ] + + # clang doesn't warn on invalid offsetofs, it silently ignores + # -Wno-invalid-offsetof. + if CompilerSupportsWarnAboutInvalidOffsetOfMacro(test): + targets.append('warn_about_invalid_offsetof_macro') + + for target in targets: + test.build('test.gyp', target, chdir=CHDIR) + test.built_file_must_exist(target, chdir=CHDIR) + fail_target = target + '-fail' + test.build('test.gyp', fail_target, chdir=CHDIR, status=None, + stderr=None, match=IgnoreOutput) + test.built_file_must_not_exist(fail_target, chdir=CHDIR) + + test.pass_test() diff --git a/deps/gyp/test/mac/gyptest-xcode-support-actions.py b/deps/gyp/test/mac/gyptest-xcode-support-actions.py new file mode 100755 index 0000000000..ecc1402972 --- /dev/null +++ b/deps/gyp/test/mac/gyptest-xcode-support-actions.py @@ -0,0 +1,25 @@ +#!/usr/bin/env python + +# Copyright (c) 2014 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. + +""" +Verifies that support actions are properly created. +""" + +import TestGyp + +import os +import subprocess +import sys + +if sys.platform == 'darwin': + test = TestGyp.TestGyp(formats=['xcode']) + + CHDIR = 'xcode-support-actions' + + test.run_gyp('test.gyp', '-Gsupport_target_suffix=_customsuffix', chdir=CHDIR) + test.build('test.gyp', target='target_customsuffix', chdir=CHDIR) + + test.pass_test() diff --git a/deps/gyp/test/mac/gyptest-xctest.py b/deps/gyp/test/mac/gyptest-xctest.py new file mode 100644 index 0000000000..a46a5fb3db --- /dev/null +++ b/deps/gyp/test/mac/gyptest-xctest.py @@ -0,0 +1,38 @@ +#!/usr/bin/env python + +# Copyright (c) 2013 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. + +""" +Verifies that xctest targets are correctly configured. +""" + +import TestGyp + +import sys + +if sys.platform == 'darwin': + test = TestGyp.TestGyp(formats=['xcode']) + + # Ignore this test if Xcode 5 is not installed + import subprocess + job = subprocess.Popen(['xcodebuild', '-version'], + stdout=subprocess.PIPE, + stderr=subprocess.STDOUT) + out, err = job.communicate() + if job.returncode != 0: + raise Exception('Error %d running xcodebuild' % job.returncode) + xcode_version, build_number = out.splitlines() + # Convert the version string from 'Xcode 5.0' to ['5','0']. + xcode_version = xcode_version.split()[-1].split('.') + if xcode_version < ['5']: + test.pass_test() + + CHDIR = 'xctest' + test.run_gyp('test.gyp', chdir=CHDIR) + test.build('test.gyp', chdir=CHDIR, arguments=['-scheme', 'classes', 'test']) + + test.built_file_must_match('tests.xctest/Contents/Resources/resource.txt', + 'foo\n', chdir=CHDIR) + test.pass_test() diff --git a/deps/gyp/test/mac/identical-name/proxy/proxy.cc b/deps/gyp/test/mac/identical-name/proxy/proxy.cc new file mode 100644 index 0000000000..8e1782da63 --- /dev/null +++ b/deps/gyp/test/mac/identical-name/proxy/proxy.cc @@ -0,0 +1,2 @@ +// Empty file + diff --git a/deps/gyp/test/mac/identical-name/proxy/proxy.gyp b/deps/gyp/test/mac/identical-name/proxy/proxy.gyp new file mode 100644 index 0000000000..38f44af1b5 --- /dev/null +++ b/deps/gyp/test/mac/identical-name/proxy/proxy.gyp @@ -0,0 +1,9 @@ +{ + 'includes': ['../test.gypi'], + 'targets': [{ + 'target_name': 'testlib', + 'type': 'none', + 'dependencies': ['testlib/testlib.gyp:testlib'], + 'sources': ['proxy.cc'], + }], +} diff --git a/deps/gyp/test/mac/identical-name/proxy/testlib/testlib.cc b/deps/gyp/test/mac/identical-name/proxy/testlib/testlib.cc new file mode 100644 index 0000000000..8e1782da63 --- /dev/null +++ b/deps/gyp/test/mac/identical-name/proxy/testlib/testlib.cc @@ -0,0 +1,2 @@ +// Empty file + diff --git a/deps/gyp/test/mac/identical-name/proxy/testlib/testlib.gyp b/deps/gyp/test/mac/identical-name/proxy/testlib/testlib.gyp new file mode 100644 index 0000000000..ed1c62e982 --- /dev/null +++ b/deps/gyp/test/mac/identical-name/proxy/testlib/testlib.gyp @@ -0,0 +1,8 @@ +{ + 'includes': ['../../test.gypi'], + 'targets': [{ + 'target_name': 'testlib', + 'type': 'static_library', + 'sources': ['testlib.cc'], + }], +} diff --git a/deps/gyp/test/mac/identical-name/test-should-fail.gyp b/deps/gyp/test/mac/identical-name/test-should-fail.gyp new file mode 100644 index 0000000000..72bfc7af0f --- /dev/null +++ b/deps/gyp/test/mac/identical-name/test-should-fail.gyp @@ -0,0 +1,10 @@ +{ + 'targets': [{ + 'target_name': 'test', + 'type': 'executable', + 'dependencies': [ + 'testlib/testlib.gyp:proxy', + 'proxy/proxy.gyp:testlib', + ], + }], +} diff --git a/deps/gyp/test/mac/identical-name/test.gyp b/deps/gyp/test/mac/identical-name/test.gyp new file mode 100644 index 0000000000..717220e866 --- /dev/null +++ b/deps/gyp/test/mac/identical-name/test.gyp @@ -0,0 +1,11 @@ +{ + 'includes': ['test.gypi'], + 'targets': [{ + 'target_name': 'test', + 'type': 'executable', + 'dependencies': [ + 'testlib/testlib.gyp:proxy', + 'proxy/proxy.gyp:testlib', + ], + }], +}
\ No newline at end of file diff --git a/deps/gyp/test/mac/identical-name/test.gypi b/deps/gyp/test/mac/identical-name/test.gypi new file mode 100644 index 0000000000..61b7c2badf --- /dev/null +++ b/deps/gyp/test/mac/identical-name/test.gypi @@ -0,0 +1,7 @@ +{ + 'target_defaults': { + 'xcode_settings': { + 'SYMROOT': '<(DEPTH)/$SRCROOT/', + }, + }, +} diff --git a/deps/gyp/test/mac/identical-name/testlib/main.cc b/deps/gyp/test/mac/identical-name/testlib/main.cc new file mode 100644 index 0000000000..5c2fa9bb6a --- /dev/null +++ b/deps/gyp/test/mac/identical-name/testlib/main.cc @@ -0,0 +1,3 @@ +int main(int argc, char **argv) { + return 0; +} diff --git a/deps/gyp/test/mac/identical-name/testlib/testlib.gyp b/deps/gyp/test/mac/identical-name/testlib/testlib.gyp new file mode 100644 index 0000000000..aa8b851004 --- /dev/null +++ b/deps/gyp/test/mac/identical-name/testlib/testlib.gyp @@ -0,0 +1,14 @@ +{ + 'includes': ['../test.gypi'], + 'targets': [{ + 'target_name': 'proxy', + 'type': 'static_library', + 'sources': ['void.cc'], + 'dependencies': ['testlib'], + 'export_dependent_settings': ['testlib'], + }, { + 'target_name': 'testlib', + 'type': 'static_library', + 'sources': ['main.cc'], + }], +} diff --git a/deps/gyp/test/mac/identical-name/testlib/void.cc b/deps/gyp/test/mac/identical-name/testlib/void.cc new file mode 100644 index 0000000000..8e1782da63 --- /dev/null +++ b/deps/gyp/test/mac/identical-name/testlib/void.cc @@ -0,0 +1,2 @@ +// Empty file + diff --git a/deps/gyp/test/mac/infoplist-process/Info.plist b/deps/gyp/test/mac/infoplist-process/Info.plist new file mode 100644 index 0000000000..cb65721f43 --- /dev/null +++ b/deps/gyp/test/mac/infoplist-process/Info.plist @@ -0,0 +1,36 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> +<plist version="1.0"> +<dict> + <key>CFBundleDevelopmentRegion</key> + <string>English</string> + <key>CFBundleExecutable</key> + <string>${EXECUTABLE_NAME}</string> + <key>CFBundleIconFile</key> + <string></string> + <key>CFBundleIdentifier</key> + <string>com.google.${PRODUCT_NAME}</string> + <key>CFBundleInfoDictionaryVersion</key> + <string>6.0</string> + <key>CFBundleName</key> + <string>${PRODUCT_NAME}</string> + <key>CFBundlePackageType</key> + <string>APPL</string> + <key>CFBundleShortVersionString</key> + <string>1.0</string> + <key>CFBundleSignature</key> + <string>????</string> + <key>CFBundleVersion</key> + <string>1</string> + <key>LSMinimumSystemVersion</key> + <string>${MACOSX_DEPLOYMENT_TARGET}</string> + <key>NSMainNibFile</key> + <string>MainMenu</string> + <key>NSPrincipalClass</key> + <string>NSApplication</string> + <key>ProcessedKey1</key> + <string>PROCESSED_KEY1</string> + <key>ProcessedKey2</key> + <string>PROCESSED_KEY2</string> +</dict> +</plist> diff --git a/deps/gyp/test/mac/infoplist-process/main.c b/deps/gyp/test/mac/infoplist-process/main.c new file mode 100644 index 0000000000..1bf4b2a11a --- /dev/null +++ b/deps/gyp/test/mac/infoplist-process/main.c @@ -0,0 +1,7 @@ +// Copyright (c) 2011 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. + +int main() { + return 0; +} diff --git a/deps/gyp/test/mac/infoplist-process/test1.gyp b/deps/gyp/test/mac/infoplist-process/test1.gyp new file mode 100644 index 0000000000..bc625a968b --- /dev/null +++ b/deps/gyp/test/mac/infoplist-process/test1.gyp @@ -0,0 +1,25 @@ +# Copyright (c) 2011 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. +{ + 'targets': [ + { + 'target_name': 'test_app', + 'product_name': 'Test', + 'type': 'executable', + 'mac_bundle': 1, + 'sources': [ + 'main.c', + ], + 'configurations': { + 'One': { + }, + }, + 'xcode_settings': { + 'INFOPLIST_FILE': 'Info.plist', + 'INFOPLIST_PREPROCESS': 'YES', + 'INFOPLIST_PREPROCESSOR_DEFINITIONS': 'PROCESSED_KEY1=Foo PROCESSED_KEY2=Bar', + }, + }, + ], +} diff --git a/deps/gyp/test/mac/infoplist-process/test2.gyp b/deps/gyp/test/mac/infoplist-process/test2.gyp new file mode 100644 index 0000000000..ecfbc9f64c --- /dev/null +++ b/deps/gyp/test/mac/infoplist-process/test2.gyp @@ -0,0 +1,25 @@ +# Copyright (c) 2011 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. +{ + 'targets': [ + { + 'target_name': 'test_app', + 'product_name': 'Test', + 'type': 'executable', + 'mac_bundle': 1, + 'sources': [ + 'main.c', + ], + 'configurations': { + 'Two': { + }, + }, + 'xcode_settings': { + 'INFOPLIST_FILE': 'Info.plist', + 'INFOPLIST_PREPROCESS': 'YES', + 'INFOPLIST_PREPROCESSOR_DEFINITIONS': 'PROCESSED_KEY1="Foo (Bar)"', + }, + }, + ], +} diff --git a/deps/gyp/test/mac/infoplist-process/test3.gyp b/deps/gyp/test/mac/infoplist-process/test3.gyp new file mode 100644 index 0000000000..be8fe75a53 --- /dev/null +++ b/deps/gyp/test/mac/infoplist-process/test3.gyp @@ -0,0 +1,25 @@ +# Copyright (c) 2011 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. +{ + 'targets': [ + { + 'target_name': 'test_app', + 'product_name': 'Test App', + 'type': 'executable', + 'mac_bundle': 1, + 'sources': [ + 'main.c', + ], + 'configurations': { + 'Three': { + }, + }, + 'xcode_settings': { + 'INFOPLIST_FILE': 'Info.plist', + 'INFOPLIST_PREPROCESS': 'NO', + 'INFOPLIST_PREPROCESSOR_DEFINITIONS': 'PROCESSED_KEY1=Foo', + }, + }, + ], +} diff --git a/deps/gyp/test/mac/installname/Info.plist b/deps/gyp/test/mac/installname/Info.plist new file mode 100644 index 0000000000..5e05a5190c --- /dev/null +++ b/deps/gyp/test/mac/installname/Info.plist @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> +<plist version="1.0"> +<dict> + <key>CFBundleDevelopmentRegion</key> + <string>English</string> + <key>CFBundleExecutable</key> + <string>${EXECUTABLE_NAME}</string> + <key>CFBundleIconFile</key> + <string></string> + <key>CFBundleIdentifier</key> + <string>com.yourcompany.${PRODUCT_NAME}</string> + <key>CFBundleInfoDictionaryVersion</key> + <string>6.0</string> + <key>CFBundleName</key> + <string>${PRODUCT_NAME}</string> + <key>CFBundlePackageType</key> + <string>FMWK</string> + <key>CFBundleShortVersionString</key> + <string>1.0</string> + <key>CFBundleSignature</key> + <string>????</string> + <key>CFBundleVersion</key> + <string>1</string> + <key>NSPrincipalClass</key> + <string></string> +</dict> +</plist> diff --git a/deps/gyp/test/mac/installname/file.c b/deps/gyp/test/mac/installname/file.c new file mode 100644 index 0000000000..a39fce095f --- /dev/null +++ b/deps/gyp/test/mac/installname/file.c @@ -0,0 +1 @@ +int f() { return 0; } diff --git a/deps/gyp/test/mac/installname/main.c b/deps/gyp/test/mac/installname/main.c new file mode 100644 index 0000000000..237c8ce181 --- /dev/null +++ b/deps/gyp/test/mac/installname/main.c @@ -0,0 +1 @@ +int main() {} diff --git a/deps/gyp/test/mac/installname/test.gyp b/deps/gyp/test/mac/installname/test.gyp new file mode 100644 index 0000000000..60c867ff12 --- /dev/null +++ b/deps/gyp/test/mac/installname/test.gyp @@ -0,0 +1,93 @@ +# 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. +{ + 'targets': [ + { + 'target_name': 'default_installname', + 'type': 'shared_library', + 'sources': [ 'file.c' ], + }, + { + 'target_name': 'default_bundle_installname', + 'product_name': 'My Framework', + 'type': 'shared_library', + 'mac_bundle': 1, + 'sources': [ 'file.c' ], + }, + { + 'target_name': 'explicit_installname', + 'type': 'shared_library', + 'sources': [ 'file.c' ], + 'xcode_settings': { + 'LD_DYLIB_INSTALL_NAME': 'Trapped in a dynamiclib factory', + }, + }, + { + 'target_name': 'explicit_installname_base', + 'type': 'shared_library', + 'sources': [ 'file.c' ], + 'xcode_settings': { + 'DYLIB_INSTALL_NAME_BASE': '@executable_path/../../..', + + }, + }, + { + 'target_name': 'explicit_installname_base_bundle', + 'product_name': 'My Other Framework', + 'type': 'shared_library', + 'mac_bundle': 1, + 'sources': [ 'file.c' ], + 'xcode_settings': { + 'DYLIB_INSTALL_NAME_BASE': '@executable_path/../../..', + + }, + }, + { + 'target_name': 'both_base_and_installname', + 'type': 'shared_library', + 'sources': [ 'file.c' ], + 'xcode_settings': { + # LD_DYLIB_INSTALL_NAME wins. + 'LD_DYLIB_INSTALL_NAME': 'Still trapped in a dynamiclib factory', + 'DYLIB_INSTALL_NAME_BASE': '@executable_path/../../..', + }, + }, + { + 'target_name': 'explicit_installname_with_base', + 'type': 'shared_library', + 'sources': [ 'file.c' ], + 'xcode_settings': { + 'LD_DYLIB_INSTALL_NAME': '$(DYLIB_INSTALL_NAME_BASE:standardizepath)/$(EXECUTABLE_PATH)', + }, + }, + { + 'target_name': 'explicit_installname_with_explicit_base', + 'type': 'shared_library', + 'sources': [ 'file.c' ], + 'xcode_settings': { + 'DYLIB_INSTALL_NAME_BASE': '@executable_path/..', + 'LD_DYLIB_INSTALL_NAME': '$(DYLIB_INSTALL_NAME_BASE:standardizepath)/$(EXECUTABLE_PATH)', + }, + }, + { + 'target_name': 'executable', + 'type': 'executable', + 'sources': [ 'main.c' ], + 'xcode_settings': { + 'LD_DYLIB_INSTALL_NAME': 'Should be ignored for not shared_lib', + }, + }, + # Regression test for http://crbug.com/113918 + { + 'target_name': 'install_name_with_info_plist', + 'type': 'shared_library', + 'mac_bundle': 1, + 'sources': [ 'file.c' ], + 'xcode_settings': { + 'INFOPLIST_FILE': 'Info.plist', + 'LD_DYLIB_INSTALL_NAME': '$(DYLIB_INSTALL_NAME_BASE:standardizepath)/$(EXECUTABLE_PATH)', + }, + }, + ], +} diff --git a/deps/gyp/test/mac/kext/GypKext/GypKext-Info.plist b/deps/gyp/test/mac/kext/GypKext/GypKext-Info.plist new file mode 100644 index 0000000000..84226099c1 --- /dev/null +++ b/deps/gyp/test/mac/kext/GypKext/GypKext-Info.plist @@ -0,0 +1,35 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> +<plist version="1.0"> +<dict> + <key>BuildMachineOSBuild</key> + <string>Doesn't matter, will be overwritten</string> + <key>CFBundleDevelopmentRegion</key> + <string>English</string> + <key>CFBundleExecutable</key> + <string>${EXECUTABLE_NAME}</string> + <key>CFBundleIconFile</key> + <string></string> + <key>CFBundleIdentifier</key> + <string>com.google.${PRODUCT_NAME:rfc1034identifier}</string> + <key>CFBundleInfoDictionaryVersion</key> + <string>6.0</string> + <key>CFBundleName</key> + <string>${PRODUCT_NAME}</string> + <key>CFBundlePackageType</key> + <string>KEXT</string> + <key>CFBundleShortVersionString</key> + <string>1.0</string> + <key>CFBundleSignature</key> + <string>ause</string> + <key>CFBundleVersion</key> + <string>1</string> + <key>LSMinimumSystemVersion</key> + <string>${MACOSX_DEPLOYMENT_TARGET}</string> + <key>OSBundleLibraries</key> + <dict> + <key>com.apple.kpi.libkern</key> + <string>10.0</string> + </dict> +</dict> +</plist> diff --git a/deps/gyp/test/mac/kext/GypKext/GypKext.c b/deps/gyp/test/mac/kext/GypKext/GypKext.c new file mode 100644 index 0000000000..9b611b0dc5 --- /dev/null +++ b/deps/gyp/test/mac/kext/GypKext/GypKext.c @@ -0,0 +1,16 @@ +// Copyright (c) 2015 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. + +#include <sys/systm.h> +#include <mach/mach_types.h> + +kern_return_t GypKext_start(kmod_info_t* ki, void* d) { + printf("GypKext has started.\n"); + return KERN_SUCCESS; +} + +kern_return_t GypKext_stop(kmod_info_t* ki, void* d) { + printf("GypKext has stopped.\n"); + return KERN_SUCCESS; +} diff --git a/deps/gyp/test/mac/kext/kext.gyp b/deps/gyp/test/mac/kext/kext.gyp new file mode 100644 index 0000000000..5b93087543 --- /dev/null +++ b/deps/gyp/test/mac/kext/kext.gyp @@ -0,0 +1,18 @@ +# Copyright (c) 2015 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. +{ + 'targets': [ + { + 'target_name': 'gypkext', + 'product_name': 'GypKext', + 'type': 'mac_kernel_extension', + 'sources': [ + 'GypKext/GypKext.c', + ], + 'xcode_settings': { + 'INFOPLIST_FILE': 'GypKext/GypKext-Info.plist', + }, + }, + ], +} diff --git a/deps/gyp/test/mac/ldflags-libtool/file.c b/deps/gyp/test/mac/ldflags-libtool/file.c new file mode 100644 index 0000000000..56757a701b --- /dev/null +++ b/deps/gyp/test/mac/ldflags-libtool/file.c @@ -0,0 +1 @@ +void f() {} diff --git a/deps/gyp/test/mac/ldflags-libtool/test.gyp b/deps/gyp/test/mac/ldflags-libtool/test.gyp new file mode 100644 index 0000000000..4e7aa07106 --- /dev/null +++ b/deps/gyp/test/mac/ldflags-libtool/test.gyp @@ -0,0 +1,17 @@ +# 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. +{ + 'targets': [ + { + 'target_name': 'ldflags_passed_to_libtool', + 'type': 'static_library', + 'sources': [ 'file.c', ], + 'xcode_settings': { + 'OTHER_LDFLAGS': [ + '-fblorfen-horf-does-not-exist', + ], + }, + }, + ], +} diff --git a/deps/gyp/test/mac/ldflags/subdirectory/Info.plist b/deps/gyp/test/mac/ldflags/subdirectory/Info.plist new file mode 100644 index 0000000000..5f5e9abfbb --- /dev/null +++ b/deps/gyp/test/mac/ldflags/subdirectory/Info.plist @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> +<plist version="1.0"> +<dict> + <key>CFBundleSignature</key> + <string>????</string> +</dict> +</plist> diff --git a/deps/gyp/test/mac/ldflags/subdirectory/file.c b/deps/gyp/test/mac/ldflags/subdirectory/file.c new file mode 100644 index 0000000000..90c45543bf --- /dev/null +++ b/deps/gyp/test/mac/ldflags/subdirectory/file.c @@ -0,0 +1,2 @@ +void f() {} +void g() {} diff --git a/deps/gyp/test/mac/ldflags/subdirectory/symbol_list.def b/deps/gyp/test/mac/ldflags/subdirectory/symbol_list.def new file mode 100644 index 0000000000..0ab7543b1f --- /dev/null +++ b/deps/gyp/test/mac/ldflags/subdirectory/symbol_list.def @@ -0,0 +1 @@ +_f diff --git a/deps/gyp/test/mac/ldflags/subdirectory/test.gyp b/deps/gyp/test/mac/ldflags/subdirectory/test.gyp new file mode 100644 index 0000000000..db00c7465c --- /dev/null +++ b/deps/gyp/test/mac/ldflags/subdirectory/test.gyp @@ -0,0 +1,66 @@ +# 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. +{ + 'targets': [ + { + 'target_name': 'raw', + 'type': 'shared_library', + 'sources': [ 'file.c', ], + 'xcode_settings': { + 'OTHER_LDFLAGS': [ + '-exported_symbols_list symbol_list.def', + '-sectcreate __TEXT __info_plist Info.plist', + ], + }, + }, + # TODO(thakis): This form should ideally be supported, too. (But + # -Wlfoo,bar,baz is cleaner so people should use that anyway.) + #{ + # 'target_name': 'raw_sep', + # 'type': 'shared_library', + # 'sources': [ 'file.c', ], + # 'xcode_settings': { + # 'OTHER_LDFLAGS': [ + # '-exported_symbols_list', 'symbol_list.def', + # '-sectcreate', '__TEXT', '__info_plist', 'Info.plist', + # ], + # }, + #}, + { + 'target_name': 'wl_space', + 'type': 'shared_library', + 'sources': [ 'file.c', ], + 'xcode_settings': { + 'OTHER_LDFLAGS': [ + # Works because clang passes unknown files on to the linker. + '-Wl,-exported_symbols_list symbol_list.def', + ], + }, + }, + # TODO(thakis): This form should ideally be supported, too. (But + # -Wlfoo,bar,baz is cleaner so people should use that anyway.) + #{ + # 'target_name': 'wl_space_sep', + # 'type': 'shared_library', + # 'sources': [ 'file.c', ], + # 'xcode_settings': { + # 'OTHER_LDFLAGS': [ + # # Works because clang passes unknown files on to the linker. + # '-Wl,-exported_symbols_list', 'symbol_list.def', + # ], + # }, + #}, + { + 'target_name': 'wl_comma', + 'type': 'shared_library', + 'sources': [ 'file.c', ], + 'xcode_settings': { + 'OTHER_LDFLAGS': [ + '-Wl,-exported_symbols_list,symbol_list.def', + '-Wl,-sectcreate,__TEXT,__info_plist,Info.plist', + ], + }, + }, + ], +} diff --git a/deps/gyp/test/mac/libraries/subdir/README.txt b/deps/gyp/test/mac/libraries/subdir/README.txt new file mode 100644 index 0000000000..4031ded85f --- /dev/null +++ b/deps/gyp/test/mac/libraries/subdir/README.txt @@ -0,0 +1 @@ +Make things live in a subdirectory, to make sure that DEPTH works correctly. diff --git a/deps/gyp/test/mac/libraries/subdir/hello.cc b/deps/gyp/test/mac/libraries/subdir/hello.cc new file mode 100644 index 0000000000..a43554c8ca --- /dev/null +++ b/deps/gyp/test/mac/libraries/subdir/hello.cc @@ -0,0 +1,10 @@ +// 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. + +#include <iostream> + +int main() { + std::cout << "Hello, world!" << std::endl; + return 0; +} diff --git a/deps/gyp/test/mac/libraries/subdir/mylib.c b/deps/gyp/test/mac/libraries/subdir/mylib.c new file mode 100644 index 0000000000..e771991e83 --- /dev/null +++ b/deps/gyp/test/mac/libraries/subdir/mylib.c @@ -0,0 +1,7 @@ +// 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. + +int my_foo(int x) { + return x + 1; +} diff --git a/deps/gyp/test/mac/libraries/subdir/test.gyp b/deps/gyp/test/mac/libraries/subdir/test.gyp new file mode 100644 index 0000000000..59fef51017 --- /dev/null +++ b/deps/gyp/test/mac/libraries/subdir/test.gyp @@ -0,0 +1,65 @@ +# 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. + +{ + 'targets': [ + { + 'target_name': 'libraries-test', + 'type': 'executable', + 'sources': [ + 'hello.cc', + ], + 'link_settings': { + 'libraries': [ + 'libcrypto.dylib', + ], + }, + }, + { + # This creates a static library and puts it in a nonstandard location for + # libraries-search-path-test. + 'target_name': 'mylib', + 'type': 'static_library', + 'sources': [ + 'mylib.c', + ], + 'postbuilds': [ + { + 'postbuild_name': 'Make a secret location', + 'action': [ + 'mkdir', + '-p', + '${SRCROOT}/../secret_location', + ], + }, + { + 'postbuild_name': 'Copy to secret location, with secret name', + 'action': [ + 'cp', + '${BUILT_PRODUCTS_DIR}/${EXECUTABLE_PATH}', + '${SRCROOT}/../secret_location/libmysecretlib.a', + ], + }, + ], + }, + { + 'target_name': 'libraries-search-path-test', + 'type': 'executable', + 'dependencies': [ 'mylib' ], + 'sources': [ + 'hello.cc', + ], + 'xcode_settings': { + 'LIBRARY_SEARCH_PATHS': [ + '<(DEPTH)/secret_location', + ], + }, + 'link_settings': { + 'libraries': [ + 'libmysecretlib.a', + ], + }, + }, + ], +} diff --git a/deps/gyp/test/mac/libtool-zero/mylib.c b/deps/gyp/test/mac/libtool-zero/mylib.c new file mode 100644 index 0000000000..b26d61bd6b --- /dev/null +++ b/deps/gyp/test/mac/libtool-zero/mylib.c @@ -0,0 +1,7 @@ +// Copyright (c) 2014 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. + +int my_foo(int x) { + return x + 1; +} diff --git a/deps/gyp/test/mac/libtool-zero/test.gyp b/deps/gyp/test/mac/libtool-zero/test.gyp new file mode 100644 index 0000000000..0d6ee5535e --- /dev/null +++ b/deps/gyp/test/mac/libtool-zero/test.gyp @@ -0,0 +1,18 @@ +# Copyright (c) 2014 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. + +{ + 'targets': [ + { + 'target_name': 'mylib', + 'type': 'static_library', + 'sources': [ + 'mylib.c', + ], + 'xcode_settings': { + 'ARCHS': [ 'i386', 'x86_64' ], + }, + }, + ], +} diff --git a/deps/gyp/test/mac/loadable-module-bundle-product-extension/src.cc b/deps/gyp/test/mac/loadable-module-bundle-product-extension/src.cc new file mode 100644 index 0000000000..3d878e9697 --- /dev/null +++ b/deps/gyp/test/mac/loadable-module-bundle-product-extension/src.cc @@ -0,0 +1,7 @@ +// Copyright (c) 2014 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. + +int test() { + return 1337; +} diff --git a/deps/gyp/test/mac/loadable-module-bundle-product-extension/test.gyp b/deps/gyp/test/mac/loadable-module-bundle-product-extension/test.gyp new file mode 100644 index 0000000000..684a2c02aa --- /dev/null +++ b/deps/gyp/test/mac/loadable-module-bundle-product-extension/test.gyp @@ -0,0 +1,24 @@ +# Copyright (c) 2014 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. +{ + 'targets': [{ + 'target_name': 'test', + 'type': 'none', + 'dependencies': ['child_one', 'child_two'], + }, { + 'target_name': 'child_one', + 'product_name': 'Collide', + 'product_extension': 'bar', + 'sources': ['src.cc'], + 'type': 'loadable_module', + 'mac_bundle': 1, + }, { + 'target_name': 'child_two', + 'product_name': 'Collide', + 'product_extension': 'foo', + 'sources': ['src.cc'], + 'type': 'loadable_module', + 'mac_bundle': 1, + }], +} diff --git a/deps/gyp/test/mac/loadable-module/Info.plist b/deps/gyp/test/mac/loadable-module/Info.plist new file mode 100644 index 0000000000..f6607aebd9 --- /dev/null +++ b/deps/gyp/test/mac/loadable-module/Info.plist @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> +<plist version="1.0"> +<dict> + <key>CFBundleExecutable</key> + <string>${EXECUTABLE_NAME}</string> + <key>CFBundleIdentifier</key> + <string>com.google.test_loadable_module</string> + <key>CFBundleInfoDictionaryVersion</key> + <string>6.0</string> + <key>CFBundleName</key> + <string>${PRODUCT_NAME}</string> + <key>CFBundlePackageType</key> + <string>BRPL</string> + <key>CFBundleShortVersionString</key> + <string>1.0</string> + <key>CFBundleSignature</key> + <string>????</string> + <key>CFBundleVersion</key> + <string>1.0</string> + <key>CFPlugInDynamicRegisterFunction</key> + <string></string> + <key>CFPlugInDynamicRegistration</key> + <string>NO</string> +</dict> +</plist> diff --git a/deps/gyp/test/mac/loadable-module/module.c b/deps/gyp/test/mac/loadable-module/module.c new file mode 100644 index 0000000000..9584538347 --- /dev/null +++ b/deps/gyp/test/mac/loadable-module/module.c @@ -0,0 +1,11 @@ +// Copyright (c) 2011 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. + +int SuperFly() { + return 42; +} + +const char* SuperFoo() { + return "Hello World"; +} diff --git a/deps/gyp/test/mac/loadable-module/test.gyp b/deps/gyp/test/mac/loadable-module/test.gyp new file mode 100644 index 0000000000..3c8a5309d2 --- /dev/null +++ b/deps/gyp/test/mac/loadable-module/test.gyp @@ -0,0 +1,18 @@ +# Copyright (c) 2011 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. + +{ + 'targets': [ + { + 'target_name': 'test_loadable_module', + 'type': 'loadable_module', + 'mac_bundle': 1, + 'sources': [ 'module.c' ], + 'product_extension': 'plugin', + 'xcode_settings': { + 'INFOPLIST_FILE': 'Info.plist', + }, + }, + ], +} diff --git a/deps/gyp/test/mac/lto/asmfile.S b/deps/gyp/test/mac/lto/asmfile.S new file mode 100644 index 0000000000..ea23759a39 --- /dev/null +++ b/deps/gyp/test/mac/lto/asmfile.S @@ -0,0 +1,2 @@ +.globl _asfun +ret diff --git a/deps/gyp/test/mac/lto/ccfile.cc b/deps/gyp/test/mac/lto/ccfile.cc new file mode 100644 index 0000000000..2503afd7b1 --- /dev/null +++ b/deps/gyp/test/mac/lto/ccfile.cc @@ -0,0 +1 @@ +void ccfun() {} diff --git a/deps/gyp/test/mac/lto/cfile.c b/deps/gyp/test/mac/lto/cfile.c new file mode 100644 index 0000000000..d02ef4b8d6 --- /dev/null +++ b/deps/gyp/test/mac/lto/cfile.c @@ -0,0 +1 @@ +void cfun() {} diff --git a/deps/gyp/test/mac/lto/mfile.m b/deps/gyp/test/mac/lto/mfile.m new file mode 100644 index 0000000000..85b7d93afe --- /dev/null +++ b/deps/gyp/test/mac/lto/mfile.m @@ -0,0 +1 @@ +void mfun() {} diff --git a/deps/gyp/test/mac/lto/mmfile.mm b/deps/gyp/test/mac/lto/mmfile.mm new file mode 100644 index 0000000000..beaa3595f8 --- /dev/null +++ b/deps/gyp/test/mac/lto/mmfile.mm @@ -0,0 +1 @@ +void mmfun() {} diff --git a/deps/gyp/test/mac/lto/test.gyp b/deps/gyp/test/mac/lto/test.gyp new file mode 100644 index 0000000000..0a8e85183d --- /dev/null +++ b/deps/gyp/test/mac/lto/test.gyp @@ -0,0 +1,35 @@ +# Copyright (c) 2015 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. +{ + 'targets': [ + { + 'target_name': 'lto', + 'type': 'shared_library', + 'sources': [ + 'cfile.c', + 'mfile.m', + 'ccfile.cc', + 'mmfile.mm', + 'asmfile.S', + ], + 'xcode_settings': { + 'LLVM_LTO': 'YES', + }, + }, + { + 'target_name': 'lto_static', + 'type': 'static_library', + 'sources': [ + 'cfile.c', + 'mfile.m', + 'ccfile.cc', + 'mmfile.mm', + 'asmfile.S', + ], + 'xcode_settings': { + 'LLVM_LTO': 'YES', + }, + }, + ], +} diff --git a/deps/gyp/test/mac/missing-cfbundlesignature/Info.plist b/deps/gyp/test/mac/missing-cfbundlesignature/Info.plist new file mode 100644 index 0000000000..0c31674884 --- /dev/null +++ b/deps/gyp/test/mac/missing-cfbundlesignature/Info.plist @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> +<plist version="1.0"> +<dict> + <key>CFBundleExecutable</key> + <string>${EXECUTABLE_NAME}</string> + <key>CFBundlePackageType</key> + <string>APPL</string> +</dict> +</plist> diff --git a/deps/gyp/test/mac/missing-cfbundlesignature/Other-Info.plist b/deps/gyp/test/mac/missing-cfbundlesignature/Other-Info.plist new file mode 100644 index 0000000000..47095281c8 --- /dev/null +++ b/deps/gyp/test/mac/missing-cfbundlesignature/Other-Info.plist @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> +<plist version="1.0"> +<dict> + <key>CFBundleExecutable</key> + <string>${EXECUTABLE_NAME}</string> + <key>CFBundlePackageType</key> + <string>APPL</string> + <key>CFBundleSignature</key> + <string>F</string> +</dict> +</plist> diff --git a/deps/gyp/test/mac/missing-cfbundlesignature/Third-Info.plist b/deps/gyp/test/mac/missing-cfbundlesignature/Third-Info.plist new file mode 100644 index 0000000000..5b61fe2664 --- /dev/null +++ b/deps/gyp/test/mac/missing-cfbundlesignature/Third-Info.plist @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> +<plist version="1.0"> +<dict> + <key>CFBundleExecutable</key> + <string>${EXECUTABLE_NAME}</string> + <key>CFBundlePackageType</key> + <string>APPL</string> + <key>CFBundleSignature</key> + <string>some really long string</string> +</dict> +</plist> diff --git a/deps/gyp/test/mac/missing-cfbundlesignature/file.c b/deps/gyp/test/mac/missing-cfbundlesignature/file.c new file mode 100644 index 0000000000..237c8ce181 --- /dev/null +++ b/deps/gyp/test/mac/missing-cfbundlesignature/file.c @@ -0,0 +1 @@ +int main() {} diff --git a/deps/gyp/test/mac/missing-cfbundlesignature/test.gyp b/deps/gyp/test/mac/missing-cfbundlesignature/test.gyp new file mode 100644 index 0000000000..b50cc2791a --- /dev/null +++ b/deps/gyp/test/mac/missing-cfbundlesignature/test.gyp @@ -0,0 +1,34 @@ +# 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. +{ + 'targets': [ + { + 'target_name': 'mytarget', + 'type': 'executable', + 'mac_bundle': 1, + 'sources': [ 'file.c', ], + 'xcode_settings': { + 'INFOPLIST_FILE': 'Info.plist', + }, + }, + { + 'target_name': 'myothertarget', + 'type': 'executable', + 'mac_bundle': 1, + 'sources': [ 'file.c', ], + 'xcode_settings': { + 'INFOPLIST_FILE': 'Other-Info.plist', + }, + }, + { + 'target_name': 'thirdtarget', + 'type': 'executable', + 'mac_bundle': 1, + 'sources': [ 'file.c', ], + 'xcode_settings': { + 'INFOPLIST_FILE': 'Third-Info.plist', + }, + }, + ], +} diff --git a/deps/gyp/test/mac/non-strs-flattened-to-env/Info.plist b/deps/gyp/test/mac/non-strs-flattened-to-env/Info.plist new file mode 100644 index 0000000000..11fc4b660d --- /dev/null +++ b/deps/gyp/test/mac/non-strs-flattened-to-env/Info.plist @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> +<plist version="1.0"> +<dict> + <!-- Not a valid plist file since it's missing so much. That's fine. --> + <key>CFBundlePackageType</key> + <string>APPL</string> + <key>CFBundleSignature</key> + <string>????</string> + <key>My Variable</key> + <string>${MY_VAR}</string> + <key>CFlags</key> + <string>${OTHER_CFLAGS}</string> +</dict> +</plist> diff --git a/deps/gyp/test/mac/non-strs-flattened-to-env/main.c b/deps/gyp/test/mac/non-strs-flattened-to-env/main.c new file mode 100644 index 0000000000..1711567ef5 --- /dev/null +++ b/deps/gyp/test/mac/non-strs-flattened-to-env/main.c @@ -0,0 +1,7 @@ +// 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. + +int main() { + return 0; +} diff --git a/deps/gyp/test/mac/non-strs-flattened-to-env/test.gyp b/deps/gyp/test/mac/non-strs-flattened-to-env/test.gyp new file mode 100644 index 0000000000..aaf821c925 --- /dev/null +++ b/deps/gyp/test/mac/non-strs-flattened-to-env/test.gyp @@ -0,0 +1,27 @@ +# 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. +{ + 'targets': [ + { + 'target_name': 'test_app', + 'product_name': 'Test', + 'type': 'executable', + 'mac_bundle': 1, + 'sources': [ 'main.c', ], + 'xcode_settings': { + 'INFOPLIST_FILE': 'Info.plist', + 'MY_VAR': 'some expansion', + 'OTHER_CFLAGS': [ + # Just some (more than one) random flags. + '-fstack-protector-all', + '-fno-strict-aliasing', + '-DS="A Space"', # Would normally be in 'defines' + ], + }, + 'include_dirs': [ + '$(SDKROOT)/usr/include/libxml2', + ], + }, + ], +} diff --git a/deps/gyp/test/mac/objc-arc/c-file.c b/deps/gyp/test/mac/objc-arc/c-file.c new file mode 100644 index 0000000000..653613206e --- /dev/null +++ b/deps/gyp/test/mac/objc-arc/c-file.c @@ -0,0 +1,6 @@ +#if __has_feature(objc_arc) +#error "C files shouldn't be ARC'd!" +#endif + +void c_fun() {} + diff --git a/deps/gyp/test/mac/objc-arc/cc-file.cc b/deps/gyp/test/mac/objc-arc/cc-file.cc new file mode 100644 index 0000000000..95e14ea3e0 --- /dev/null +++ b/deps/gyp/test/mac/objc-arc/cc-file.cc @@ -0,0 +1,5 @@ +#if __has_feature(objc_arc) +#error "C++ files shouldn't be ARC'd!" +#endif + +void cc_fun() {} diff --git a/deps/gyp/test/mac/objc-arc/m-file-no-arc.m b/deps/gyp/test/mac/objc-arc/m-file-no-arc.m new file mode 100644 index 0000000000..8ffaabfaae --- /dev/null +++ b/deps/gyp/test/mac/objc-arc/m-file-no-arc.m @@ -0,0 +1,5 @@ +#if __has_feature(objc_arc) +#error "ObjC files without CLANG_ENABLE_OBJC_ARC should not be ARC'd!" +#endif + +void m_fun() {} diff --git a/deps/gyp/test/mac/objc-arc/m-file.m b/deps/gyp/test/mac/objc-arc/m-file.m new file mode 100644 index 0000000000..9689b1f8e5 --- /dev/null +++ b/deps/gyp/test/mac/objc-arc/m-file.m @@ -0,0 +1,5 @@ +#if !__has_feature(objc_arc) +#error "ObjC files with CLANG_ENABLE_OBJC_ARC should be ARC'd!" +#endif + +void m_fun() {} diff --git a/deps/gyp/test/mac/objc-arc/mm-file-no-arc.mm b/deps/gyp/test/mac/objc-arc/mm-file-no-arc.mm new file mode 100644 index 0000000000..0dac539494 --- /dev/null +++ b/deps/gyp/test/mac/objc-arc/mm-file-no-arc.mm @@ -0,0 +1,5 @@ +#if __has_feature(objc_arc) +#error "ObjC++ files without CLANG_ENABLE_OBJC_ARC should not be ARC'd!" +#endif + +void mm_fun() {} diff --git a/deps/gyp/test/mac/objc-arc/mm-file.mm b/deps/gyp/test/mac/objc-arc/mm-file.mm new file mode 100644 index 0000000000..9467e96563 --- /dev/null +++ b/deps/gyp/test/mac/objc-arc/mm-file.mm @@ -0,0 +1,5 @@ +#if !__has_feature(objc_arc) +#error "ObjC++ files with CLANG_ENABLE_OBJC_ARC should be ARC'd!" +#endif + +void mm_fun() {} diff --git a/deps/gyp/test/mac/objc-arc/test.gyp b/deps/gyp/test/mac/objc-arc/test.gyp new file mode 100644 index 0000000000..59cf0e29ce --- /dev/null +++ b/deps/gyp/test/mac/objc-arc/test.gyp @@ -0,0 +1,45 @@ +# Copyright (c) 2013 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. +{ + 'make_global_settings': [ + ['CC', '/usr/bin/clang'], + ['CXX', '/usr/bin/clang++'], + ], + + 'targets': [ + { + 'target_name': 'arc_enabled', + 'type': 'static_library', + 'sources': [ + 'c-file.c', + 'cc-file.cc', + 'm-file.m', + 'mm-file.mm', + ], + 'xcode_settings': { + 'GCC_VERSION': 'com.apple.compilers.llvm.clang.1_0', + 'MACOSX_DEPLOYMENT_TARGET': '10.6', + 'ARCHS': [ 'x86_64' ], # For the non-fragile objc ABI. + 'CLANG_ENABLE_OBJC_ARC': 'YES', + }, + }, + + { + 'target_name': 'arc_disabled', + 'type': 'static_library', + 'sources': [ + 'c-file.c', + 'cc-file.cc', + 'm-file-no-arc.m', + 'mm-file-no-arc.mm', + ], + 'xcode_settings': { + 'GCC_VERSION': 'com.apple.compilers.llvm.clang.1_0', + 'MACOSX_DEPLOYMENT_TARGET': '10.6', + 'ARCHS': [ 'x86_64' ], # For the non-fragile objc ABI. + }, + }, + ], +} + diff --git a/deps/gyp/test/mac/objc-gc/c-file.c b/deps/gyp/test/mac/objc-gc/c-file.c new file mode 100644 index 0000000000..2855a00eaa --- /dev/null +++ b/deps/gyp/test/mac/objc-gc/c-file.c @@ -0,0 +1 @@ +void c_fun() {} diff --git a/deps/gyp/test/mac/objc-gc/cc-file.cc b/deps/gyp/test/mac/objc-gc/cc-file.cc new file mode 100644 index 0000000000..71e47a0126 --- /dev/null +++ b/deps/gyp/test/mac/objc-gc/cc-file.cc @@ -0,0 +1 @@ +void cc_fun() {} diff --git a/deps/gyp/test/mac/objc-gc/main.m b/deps/gyp/test/mac/objc-gc/main.m new file mode 100644 index 0000000000..1a87f8e70f --- /dev/null +++ b/deps/gyp/test/mac/objc-gc/main.m @@ -0,0 +1,6 @@ +#import <Foundation/Foundation.h> + +int main() { + printf("gc on: %d\n", [NSGarbageCollector defaultCollector] != NULL); + return 0; +} diff --git a/deps/gyp/test/mac/objc-gc/needs-gc-mm.mm b/deps/gyp/test/mac/objc-gc/needs-gc-mm.mm new file mode 100644 index 0000000000..fc3fee9f34 --- /dev/null +++ b/deps/gyp/test/mac/objc-gc/needs-gc-mm.mm @@ -0,0 +1 @@ +void objcpp_fun() { } diff --git a/deps/gyp/test/mac/objc-gc/needs-gc.m b/deps/gyp/test/mac/objc-gc/needs-gc.m new file mode 100644 index 0000000000..ca77976b1d --- /dev/null +++ b/deps/gyp/test/mac/objc-gc/needs-gc.m @@ -0,0 +1 @@ +void objc_fun() { } diff --git a/deps/gyp/test/mac/objc-gc/test.gyp b/deps/gyp/test/mac/objc-gc/test.gyp new file mode 100644 index 0000000000..4d827c1b39 --- /dev/null +++ b/deps/gyp/test/mac/objc-gc/test.gyp @@ -0,0 +1,102 @@ +# 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. +{ + 'targets': [ + # For some reason, static_library targets that are built with gc=required + # and then linked to executables that don't use gc, the linker doesn't + # complain. For shared_libraries it does, so use that. + { + 'target_name': 'no_gc_lib', + 'type': 'shared_library', + 'sources': [ + 'c-file.c', + 'cc-file.cc', + 'needs-gc-mm.mm', + 'needs-gc.m', + ], + }, + { + 'target_name': 'gc_lib', + 'type': 'shared_library', + 'sources': [ + 'c-file.c', + 'cc-file.cc', + 'needs-gc-mm.mm', + 'needs-gc.m', + ], + 'xcode_settings': { + 'GCC_ENABLE_OBJC_GC': 'supported', + }, + }, + { + 'target_name': 'gc_req_lib', + 'type': 'shared_library', + 'sources': [ + 'c-file.c', + 'cc-file.cc', + 'needs-gc-mm.mm', + 'needs-gc.m', + ], + 'xcode_settings': { + 'GCC_ENABLE_OBJC_GC': 'required', + }, + }, + + { + 'target_name': 'gc_exe_fails', + 'type': 'executable', + 'sources': [ 'main.m' ], + 'dependencies': [ 'no_gc_lib' ], + 'xcode_settings': { + 'GCC_ENABLE_OBJC_GC': 'required', + }, + 'libraries': [ 'Foundation.framework' ], + }, + { + 'target_name': 'gc_req_exe', + 'type': 'executable', + 'sources': [ 'main.m' ], + 'dependencies': [ 'gc_lib' ], + 'xcode_settings': { + 'GCC_ENABLE_OBJC_GC': 'required', + }, + 'libraries': [ 'Foundation.framework' ], + }, + { + 'target_name': 'gc_exe_req_lib', + 'type': 'executable', + 'sources': [ 'main.m' ], + 'dependencies': [ 'gc_req_lib' ], + 'xcode_settings': { + 'GCC_ENABLE_OBJC_GC': 'supported', + }, + 'libraries': [ 'Foundation.framework' ], + }, + { + 'target_name': 'gc_exe', + 'type': 'executable', + 'sources': [ 'main.m' ], + 'dependencies': [ 'gc_lib' ], + 'xcode_settings': { + 'GCC_ENABLE_OBJC_GC': 'supported', + }, + 'libraries': [ 'Foundation.framework' ], + }, + { + 'target_name': 'gc_off_exe_req_lib', + 'type': 'executable', + 'sources': [ 'main.m' ], + 'dependencies': [ 'gc_req_lib' ], + 'libraries': [ 'Foundation.framework' ], + }, + { + 'target_name': 'gc_off_exe', + 'type': 'executable', + 'sources': [ 'main.m' ], + 'dependencies': [ 'gc_lib' ], + 'libraries': [ 'Foundation.framework' ], + }, + ], +} + diff --git a/deps/gyp/test/mac/postbuild-copy-bundle/Framework-Info.plist b/deps/gyp/test/mac/postbuild-copy-bundle/Framework-Info.plist new file mode 100644 index 0000000000..ec36829c08 --- /dev/null +++ b/deps/gyp/test/mac/postbuild-copy-bundle/Framework-Info.plist @@ -0,0 +1,30 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> +<plist version="1.0"> +<dict> + <key>CFBundleDevelopmentRegion</key> + <string>English</string> + <key>CFBundleExecutable</key> + <string>${EXECUTABLE_NAME}</string> + <key>CFBundleIconFile</key> + <string></string> + <key>CFBundleIdentifier</key> + <string>com.yourcompany.${PRODUCT_NAME}</string> + <key>CFBundleInfoDictionaryVersion</key> + <string>6.0</string> + <key>CFBundleName</key> + <string>${PRODUCT_NAME}</string> + <key>CFBundlePackageType</key> + <string>FMWK</string> + <key>CFBundleShortVersionString</key> + <string>1.0</string> + <key>CFBundleSignature</key> + <string>????</string> + <key>CFBundleVersion</key> + <string>1</string> + <key>NSPrincipalClass</key> + <string></string> + <key>RandomKey</key> + <string>RandomValue</string> +</dict> +</plist> diff --git a/deps/gyp/test/mac/postbuild-copy-bundle/TestApp-Info.plist b/deps/gyp/test/mac/postbuild-copy-bundle/TestApp-Info.plist new file mode 100644 index 0000000000..98fd515200 --- /dev/null +++ b/deps/gyp/test/mac/postbuild-copy-bundle/TestApp-Info.plist @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> +<plist version="1.0"> +<dict> + <key>CFBundleDevelopmentRegion</key> + <string>English</string> + <key>CFBundleExecutable</key> + <string>${EXECUTABLE_NAME}</string> + <key>CFBundleIconFile</key> + <string></string> + <key>CFBundleIdentifier</key> + <string>com.google.${PRODUCT_NAME}</string> + <key>CFBundleInfoDictionaryVersion</key> + <string>6.0</string> + <key>CFBundleName</key> + <string>${PRODUCT_NAME}</string> + <key>CFBundlePackageType</key> + <string>APPL</string> + <key>CFBundleShortVersionString</key> + <string>1.0</string> + <key>CFBundleSignature</key> + <string>????</string> + <key>CFBundleVersion</key> + <string>1</string> + <key>LSMinimumSystemVersion</key> + <string>${MACOSX_DEPLOYMENT_TARGET}</string> + <key>NSMainNibFile</key> + <string>MainMenu</string> + <key>NSPrincipalClass</key> + <string>NSApplication</string> +</dict> +</plist> diff --git a/deps/gyp/test/mac/postbuild-copy-bundle/copied.txt b/deps/gyp/test/mac/postbuild-copy-bundle/copied.txt new file mode 100644 index 0000000000..178413886a --- /dev/null +++ b/deps/gyp/test/mac/postbuild-copy-bundle/copied.txt @@ -0,0 +1 @@ +old copied file diff --git a/deps/gyp/test/mac/postbuild-copy-bundle/empty.c b/deps/gyp/test/mac/postbuild-copy-bundle/empty.c new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/deps/gyp/test/mac/postbuild-copy-bundle/empty.c diff --git a/deps/gyp/test/mac/postbuild-copy-bundle/main.c b/deps/gyp/test/mac/postbuild-copy-bundle/main.c new file mode 100644 index 0000000000..21c1963526 --- /dev/null +++ b/deps/gyp/test/mac/postbuild-copy-bundle/main.c @@ -0,0 +1,4 @@ +// 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. +int main() {} diff --git a/deps/gyp/test/mac/postbuild-copy-bundle/postbuild-copy-framework.sh b/deps/gyp/test/mac/postbuild-copy-bundle/postbuild-copy-framework.sh new file mode 100755 index 0000000000..930fec6612 --- /dev/null +++ b/deps/gyp/test/mac/postbuild-copy-bundle/postbuild-copy-framework.sh @@ -0,0 +1,9 @@ +#!/bin/bash + +# 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. + +set -e + +rsync -acC --delete "$1" "$2" diff --git a/deps/gyp/test/mac/postbuild-copy-bundle/resource_file.sb b/deps/gyp/test/mac/postbuild-copy-bundle/resource_file.sb new file mode 100644 index 0000000000..42057fa235 --- /dev/null +++ b/deps/gyp/test/mac/postbuild-copy-bundle/resource_file.sb @@ -0,0 +1 @@ +This is included in the framework bundle. diff --git a/deps/gyp/test/mac/postbuild-copy-bundle/test.gyp b/deps/gyp/test/mac/postbuild-copy-bundle/test.gyp new file mode 100644 index 0000000000..a03e6432f2 --- /dev/null +++ b/deps/gyp/test/mac/postbuild-copy-bundle/test.gyp @@ -0,0 +1,49 @@ +# 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. +{ + 'targets': [ + { + 'target_name': 'test_bundle', + 'product_name': 'My Framework', + 'type': 'shared_library', + 'mac_bundle': 1, + 'sources': [ 'empty.c', ], + 'xcode_settings': { + 'INFOPLIST_FILE': 'Framework-Info.plist', + }, + 'mac_bundle_resources': [ + 'resource_file.sb', + ], + 'copies': [ + { + 'destination': '<(PRODUCT_DIR)/$(CONTENTS_FOLDER_PATH)/Libraries', + 'files': [ 'copied.txt' ], + }, + ], + }, + { + 'target_name': 'test_app', + 'product_name': 'Test App', + 'type': 'executable', + 'mac_bundle': 1, + 'dependencies': [ + 'test_bundle', + ], + 'sources': [ 'main.c', ], + 'xcode_settings': { + 'INFOPLIST_FILE': 'TestApp-Info.plist', + }, + 'postbuilds': [ + { + 'postbuild_name': 'Copy dependent framework into app', + 'action': [ + './postbuild-copy-framework.sh', + '${BUILT_PRODUCTS_DIR}/My Framework.framework', + '${BUILT_PRODUCTS_DIR}/${CONTENTS_FOLDER_PATH}/', + ], + }, + ], + }, + ], +} diff --git a/deps/gyp/test/mac/postbuild-defaults/Info.plist b/deps/gyp/test/mac/postbuild-defaults/Info.plist new file mode 100644 index 0000000000..d3f54d76cd --- /dev/null +++ b/deps/gyp/test/mac/postbuild-defaults/Info.plist @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> +<plist version="1.0"> +<dict> + <!-- Not a valid plist file since it's missing so much. That's fine. --> + <key>CFBundlePackageType</key> + <string>APPL</string> + <key>CFBundleSignature</key> + <string>????</string> + <key>CFBundleName</key> + <string>${PRODUCT_NAME}</string> +</dict> +</plist> diff --git a/deps/gyp/test/mac/postbuild-defaults/main.c b/deps/gyp/test/mac/postbuild-defaults/main.c new file mode 100644 index 0000000000..1711567ef5 --- /dev/null +++ b/deps/gyp/test/mac/postbuild-defaults/main.c @@ -0,0 +1,7 @@ +// 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. + +int main() { + return 0; +} diff --git a/deps/gyp/test/mac/postbuild-defaults/postbuild-defaults.sh b/deps/gyp/test/mac/postbuild-defaults/postbuild-defaults.sh new file mode 100755 index 0000000000..56af2a8329 --- /dev/null +++ b/deps/gyp/test/mac/postbuild-defaults/postbuild-defaults.sh @@ -0,0 +1,15 @@ +#!/bin/bash +# 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. + +set -e + +# This is the built Info.plist in the output directory. +PLIST="${BUILT_PRODUCTS_DIR}"/Test.app/Contents/Info # No trailing .plist +echo $(defaults read "${PLIST}" "CFBundleName") > "${BUILT_PRODUCTS_DIR}/result" + +# This is the source Info.plist next to this script file. +PLIST="${SRCROOT}"/Info # No trailing .plist +echo $(defaults read "${PLIST}" "CFBundleName") \ + >> "${BUILT_PRODUCTS_DIR}/result" diff --git a/deps/gyp/test/mac/postbuild-defaults/test.gyp b/deps/gyp/test/mac/postbuild-defaults/test.gyp new file mode 100644 index 0000000000..be0a075efc --- /dev/null +++ b/deps/gyp/test/mac/postbuild-defaults/test.gyp @@ -0,0 +1,26 @@ +# 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. +{ + 'targets': [ + { + 'target_name': 'test_app', + 'product_name': 'Test', + 'type': 'executable', + 'mac_bundle': 1, + 'sources': [ 'main.c', ], + 'xcode_settings': { + 'INFOPLIST_FILE': 'Info.plist', + }, + 'postbuilds': [ + { + 'postbuild_name': 'Postbuild that calls defaults', + 'action': [ + './postbuild-defaults.sh', + '${BUILT_PRODUCTS_DIR}/${EXECUTABLE_PATH}', + ], + }, + ], + }, + ], +} diff --git a/deps/gyp/test/mac/postbuild-fail/file.c b/deps/gyp/test/mac/postbuild-fail/file.c new file mode 100644 index 0000000000..91695b10c6 --- /dev/null +++ b/deps/gyp/test/mac/postbuild-fail/file.c @@ -0,0 +1,6 @@ +// Copyright (c) 2011 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. + +// That's right, this is copyrighted. +void f() {} diff --git a/deps/gyp/test/mac/postbuild-fail/postbuild-fail.sh b/deps/gyp/test/mac/postbuild-fail/postbuild-fail.sh new file mode 100755 index 0000000000..dc1a60d987 --- /dev/null +++ b/deps/gyp/test/mac/postbuild-fail/postbuild-fail.sh @@ -0,0 +1,6 @@ +#!/usr/bin/bash +# Copyright (c) 2011 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. + +exit 1 diff --git a/deps/gyp/test/mac/postbuild-fail/test.gyp b/deps/gyp/test/mac/postbuild-fail/test.gyp new file mode 100644 index 0000000000..e63283db03 --- /dev/null +++ b/deps/gyp/test/mac/postbuild-fail/test.gyp @@ -0,0 +1,38 @@ +# Copyright (c) 2011 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. +{ + 'targets': [ + { + 'target_name': 'nonbundle', + 'type': 'static_library', + 'sources': [ 'file.c', ], + 'postbuilds': [ + { + 'postbuild_name': 'Postbuild Fail', + 'action': [ './postbuild-fail.sh', ], + }, + { + 'postbuild_name': 'Runs after failing postbuild', + 'action': [ './touch-static.sh', ], + }, + ], + }, + { + 'target_name': 'bundle', + 'type': 'shared_library', + 'mac_bundle': 1, + 'sources': [ 'file.c', ], + 'postbuilds': [ + { + 'postbuild_name': 'Postbuild Fail', + 'action': [ './postbuild-fail.sh', ], + }, + { + 'postbuild_name': 'Runs after failing postbuild', + 'action': [ './touch-dynamic.sh', ], + }, + ], + }, + ], +} diff --git a/deps/gyp/test/mac/postbuild-fail/touch-dynamic.sh b/deps/gyp/test/mac/postbuild-fail/touch-dynamic.sh new file mode 100755 index 0000000000..a388a64102 --- /dev/null +++ b/deps/gyp/test/mac/postbuild-fail/touch-dynamic.sh @@ -0,0 +1,7 @@ +#!/bin/bash +# Copyright (c) 2011 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. + +set -e +touch "${BUILT_PRODUCTS_DIR}/dynamic_touch" diff --git a/deps/gyp/test/mac/postbuild-fail/touch-static.sh b/deps/gyp/test/mac/postbuild-fail/touch-static.sh new file mode 100755 index 0000000000..97ecaa6868 --- /dev/null +++ b/deps/gyp/test/mac/postbuild-fail/touch-static.sh @@ -0,0 +1,7 @@ +#!/bin/bash +# Copyright (c) 2011 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. + +set -e +touch "${BUILT_PRODUCTS_DIR}/static_touch" diff --git a/deps/gyp/test/mac/postbuild-multiple-configurations/main.c b/deps/gyp/test/mac/postbuild-multiple-configurations/main.c new file mode 100644 index 0000000000..21c1963526 --- /dev/null +++ b/deps/gyp/test/mac/postbuild-multiple-configurations/main.c @@ -0,0 +1,4 @@ +// 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. +int main() {} diff --git a/deps/gyp/test/mac/postbuild-multiple-configurations/postbuild-touch-file.sh b/deps/gyp/test/mac/postbuild-multiple-configurations/postbuild-touch-file.sh new file mode 100755 index 0000000000..b6170cf7a7 --- /dev/null +++ b/deps/gyp/test/mac/postbuild-multiple-configurations/postbuild-touch-file.sh @@ -0,0 +1,7 @@ +#!/bin/bash + +# 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. + +touch "${BUILT_PRODUCTS_DIR}/postbuild-file" diff --git a/deps/gyp/test/mac/postbuild-multiple-configurations/test.gyp b/deps/gyp/test/mac/postbuild-multiple-configurations/test.gyp new file mode 100644 index 0000000000..c350b20d68 --- /dev/null +++ b/deps/gyp/test/mac/postbuild-multiple-configurations/test.gyp @@ -0,0 +1,26 @@ +# 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. +{ + 'target_defaults': { + 'configurations': { + 'Debug': {}, + 'Release': {}, + }, + }, + 'targets': [ + { + 'target_name': 'random_target', + 'type': 'executable', + 'sources': [ 'main.c', ], + 'postbuilds': [ + { + 'postbuild_name': 'Touch a file.', + 'action': [ + './postbuild-touch-file.sh', + ], + }, + ], + }, + ], +} diff --git a/deps/gyp/test/mac/postbuild-static-library/empty.c b/deps/gyp/test/mac/postbuild-static-library/empty.c new file mode 100644 index 0000000000..9554336c0c --- /dev/null +++ b/deps/gyp/test/mac/postbuild-static-library/empty.c @@ -0,0 +1,4 @@ +// 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. +void f() {} diff --git a/deps/gyp/test/mac/postbuild-static-library/postbuild-touch-file.sh b/deps/gyp/test/mac/postbuild-static-library/postbuild-touch-file.sh new file mode 100755 index 0000000000..37de4de4f6 --- /dev/null +++ b/deps/gyp/test/mac/postbuild-static-library/postbuild-touch-file.sh @@ -0,0 +1,7 @@ +#!/bin/bash + +# 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. + +touch "${BUILT_PRODUCTS_DIR}/$1" diff --git a/deps/gyp/test/mac/postbuild-static-library/test.gyp b/deps/gyp/test/mac/postbuild-static-library/test.gyp new file mode 100644 index 0000000000..9ef55a0afa --- /dev/null +++ b/deps/gyp/test/mac/postbuild-static-library/test.gyp @@ -0,0 +1,34 @@ +# 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. +{ + 'targets': [ + { + 'target_name': 'my_lib', + 'type': 'static_library', + 'sources': [ 'empty.c', ], + 'postbuilds': [ + { + 'postbuild_name': 'Postbuild that touches a file', + 'action': [ + './postbuild-touch-file.sh', 'postbuild-file' + ], + }, + ], + }, + + { + 'target_name': 'my_sourceless_lib', + 'type': 'static_library', + 'dependencies': [ 'my_lib' ], + 'postbuilds': [ + { + 'postbuild_name': 'Postbuild that touches a file', + 'action': [ + './postbuild-touch-file.sh', 'postbuild-file-sourceless' + ], + }, + ], + }, + ], +} diff --git a/deps/gyp/test/mac/postbuilds/copy.sh b/deps/gyp/test/mac/postbuilds/copy.sh new file mode 100755 index 0000000000..ecad0381db --- /dev/null +++ b/deps/gyp/test/mac/postbuilds/copy.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +cp "$@" diff --git a/deps/gyp/test/mac/postbuilds/file.c b/deps/gyp/test/mac/postbuilds/file.c new file mode 100644 index 0000000000..653e71ff7e --- /dev/null +++ b/deps/gyp/test/mac/postbuilds/file.c @@ -0,0 +1,4 @@ +// Copyright (c) 2011 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. +void f() {} diff --git a/deps/gyp/test/mac/postbuilds/file_g.c b/deps/gyp/test/mac/postbuilds/file_g.c new file mode 100644 index 0000000000..0f7849d208 --- /dev/null +++ b/deps/gyp/test/mac/postbuilds/file_g.c @@ -0,0 +1,4 @@ +// 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. +void g() {} diff --git a/deps/gyp/test/mac/postbuilds/file_h.c b/deps/gyp/test/mac/postbuilds/file_h.c new file mode 100644 index 0000000000..521d1f4d56 --- /dev/null +++ b/deps/gyp/test/mac/postbuilds/file_h.c @@ -0,0 +1,4 @@ +// 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. +void h() {} diff --git a/deps/gyp/test/mac/postbuilds/script/shared_library_postbuild.sh b/deps/gyp/test/mac/postbuilds/script/shared_library_postbuild.sh new file mode 100755 index 0000000000..c623c8bf21 --- /dev/null +++ b/deps/gyp/test/mac/postbuilds/script/shared_library_postbuild.sh @@ -0,0 +1,23 @@ +#!/bin/bash +# Copyright (c) 2011 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. + +set -e + +lib="${BUILT_PRODUCTS_DIR}/${EXECUTABLE_PATH}" +nm ${lib} > /dev/null # Just make sure this works. + +pattern="${1}" + +if [ $pattern != "a|b" ]; then + echo "Parameter quoting is broken" + exit 1 +fi + +if [ "${2}" != "arg with spaces" ]; then + echo "Parameter space escaping is broken" + exit 1 +fi + +touch "${lib}"_touch diff --git a/deps/gyp/test/mac/postbuilds/script/static_library_postbuild.sh b/deps/gyp/test/mac/postbuilds/script/static_library_postbuild.sh new file mode 100755 index 0000000000..2bf09b34e1 --- /dev/null +++ b/deps/gyp/test/mac/postbuilds/script/static_library_postbuild.sh @@ -0,0 +1,23 @@ +#!/bin/bash +# Copyright (c) 2011 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. + +set -e + +lib="${BUILT_PRODUCTS_DIR}/${FULL_PRODUCT_NAME}" +nm ${lib} > /dev/null # Just make sure this works. + +pattern="${1}" + +if [ $pattern != "a|b" ]; then + echo "Parameter quote escaping is broken" + exit 1 +fi + +if [ "${2}" != "arg with spaces" ]; then + echo "Parameter space escaping is broken" + exit 1 +fi + +touch "${lib}"_touch.a diff --git a/deps/gyp/test/mac/postbuilds/subdirectory/copied_file.txt b/deps/gyp/test/mac/postbuilds/subdirectory/copied_file.txt new file mode 100644 index 0000000000..a634f85b6c --- /dev/null +++ b/deps/gyp/test/mac/postbuilds/subdirectory/copied_file.txt @@ -0,0 +1 @@ +This file should be copied to the products dir. diff --git a/deps/gyp/test/mac/postbuilds/subdirectory/nested_target.gyp b/deps/gyp/test/mac/postbuilds/subdirectory/nested_target.gyp new file mode 100644 index 0000000000..6d4f2395e3 --- /dev/null +++ b/deps/gyp/test/mac/postbuilds/subdirectory/nested_target.gyp @@ -0,0 +1,53 @@ +# Copyright (c) 2011 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. +{ + 'targets': [ + { + 'target_name': 'nest_el', + 'type': 'static_library', + 'sources': [ '../file_g.c', ], + 'postbuilds': [ + { + 'postbuild_name': 'Static library postbuild', + 'variables': { + 'some_regex': 'a|b', + }, + 'action': [ + '../script/static_library_postbuild.sh', + '<(some_regex)', + 'arg with spaces', + ], + }, + ], + }, + { + 'target_name': 'nest_dyna', + 'type': 'shared_library', + 'mac_bundle': 1, + 'sources': [ '../file_h.c', ], + 'postbuilds': [ + { + 'postbuild_name': 'Dynamic library postbuild', + 'variables': { + 'some_regex': 'a|b', + }, + 'action': [ + '../script/shared_library_postbuild.sh', + '<(some_regex)', + 'arg with spaces', + ], + }, + { + 'postbuild_name': 'Test paths relative to gyp file', + 'action': [ + '../copy.sh', + './copied_file.txt', + '${BUILT_PRODUCTS_DIR}/copied_file_2.txt', + ], + }, + ], + }, + ], +} + diff --git a/deps/gyp/test/mac/postbuilds/test.gyp b/deps/gyp/test/mac/postbuilds/test.gyp new file mode 100644 index 0000000000..7c0b523f86 --- /dev/null +++ b/deps/gyp/test/mac/postbuilds/test.gyp @@ -0,0 +1,93 @@ +# Copyright (c) 2011 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. +{ + 'targets': [ + { + 'target_name': 'el', + 'type': 'static_library', + 'sources': [ 'file.c', ], + 'postbuilds': [ + { + 'postbuild_name': 'Static library postbuild', + 'variables': { + 'some_regex': 'a|b', + }, + 'action': [ + 'script/static_library_postbuild.sh', + '<(some_regex)', + 'arg with spaces', + ], + }, + { + 'postbuild_name': 'Test variable in gyp file', + 'action': [ + 'cp', + '${BUILT_PRODUCTS_DIR}/${EXECUTABLE_PATH}', + '${BUILT_PRODUCTS_DIR}/${EXECUTABLE_PATH}_gyp_touch.a', + ], + }, + ], + }, + { + 'target_name': 'dyna', + 'type': 'shared_library', + 'mac_bundle': 1, + 'sources': [ 'file.c', ], + 'dependencies': [ + 'subdirectory/nested_target.gyp:nest_dyna', + 'subdirectory/nested_target.gyp:nest_el', + ], + 'postbuilds': [ + { + 'postbuild_name': 'Dynamic library postbuild', + 'variables': { + 'some_regex': 'a|b', + }, + 'action': [ + 'script/shared_library_postbuild.sh', + '<(some_regex)', + 'arg with spaces', + ], + }, + { + 'postbuild_name': 'Test variable in gyp file', + 'action': [ + 'cp', + '${BUILT_PRODUCTS_DIR}/${EXECUTABLE_PATH}', + '${BUILT_PRODUCTS_DIR}/${EXECUTABLE_PATH}_gyp_touch', + ], + }, + { + 'postbuild_name': 'Test paths relative to gyp file', + 'action': [ + './copy.sh', + 'subdirectory/copied_file.txt', + '${BUILT_PRODUCTS_DIR}', + ], + }, + ], + }, + { + 'target_name': 'dyna_standalone', + 'type': 'shared_library', + 'sources': [ 'file.c', ], + 'postbuilds': [ + { + 'postbuild_name': 'Test variable in gyp file', + 'action': [ + 'cp', + '${BUILT_PRODUCTS_DIR}/${EXECUTABLE_PATH}', + '${BUILT_PRODUCTS_DIR}/${EXECUTABLE_PATH}_gyp_touch.dylib', + ], + }, + ], + }, + { + 'target_name': 'EmptyBundle', + 'product_extension': 'bundle', + 'type': 'executable', + 'mac_bundle': 1, + }, + ], +} diff --git a/deps/gyp/test/mac/prefixheader/file.c b/deps/gyp/test/mac/prefixheader/file.c new file mode 100644 index 0000000000..d0b39d1f6d --- /dev/null +++ b/deps/gyp/test/mac/prefixheader/file.c @@ -0,0 +1 @@ +MyInt f() { return 0; } diff --git a/deps/gyp/test/mac/prefixheader/file.cc b/deps/gyp/test/mac/prefixheader/file.cc new file mode 100644 index 0000000000..d0b39d1f6d --- /dev/null +++ b/deps/gyp/test/mac/prefixheader/file.cc @@ -0,0 +1 @@ +MyInt f() { return 0; } diff --git a/deps/gyp/test/mac/prefixheader/file.m b/deps/gyp/test/mac/prefixheader/file.m new file mode 100644 index 0000000000..d0b39d1f6d --- /dev/null +++ b/deps/gyp/test/mac/prefixheader/file.m @@ -0,0 +1 @@ +MyInt f() { return 0; } diff --git a/deps/gyp/test/mac/prefixheader/file.mm b/deps/gyp/test/mac/prefixheader/file.mm new file mode 100644 index 0000000000..d0b39d1f6d --- /dev/null +++ b/deps/gyp/test/mac/prefixheader/file.mm @@ -0,0 +1 @@ +MyInt f() { return 0; } diff --git a/deps/gyp/test/mac/prefixheader/header.h b/deps/gyp/test/mac/prefixheader/header.h new file mode 100644 index 0000000000..0716e500c5 --- /dev/null +++ b/deps/gyp/test/mac/prefixheader/header.h @@ -0,0 +1 @@ +typedef int MyInt; diff --git a/deps/gyp/test/mac/prefixheader/test.gyp b/deps/gyp/test/mac/prefixheader/test.gyp new file mode 100644 index 0000000000..7e6b1af807 --- /dev/null +++ b/deps/gyp/test/mac/prefixheader/test.gyp @@ -0,0 +1,82 @@ +# Copyright (c) 2011 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. +{ + 'targets': [ + { + 'target_name': 'prefix_header_c', + 'type': 'static_library', + 'sources': [ 'file.c', ], + 'xcode_settings': { + 'GCC_PREFIX_HEADER': 'header.h', + }, + }, + { + 'target_name': 'precompiled_prefix_header_c', + 'type': 'shared_library', + 'mac_bundle': 1, + 'sources': [ 'file.c', ], + 'xcode_settings': { + 'GCC_PREFIX_HEADER': 'header.h', + 'GCC_PRECOMPILE_PREFIX_HEADER': 'YES', + }, + }, + + { + 'target_name': 'prefix_header_cc', + 'type': 'static_library', + 'sources': [ 'file.cc', ], + 'xcode_settings': { + 'GCC_PREFIX_HEADER': 'header.h', + }, + }, + { + 'target_name': 'precompiled_prefix_header_cc', + 'type': 'shared_library', + 'mac_bundle': 1, + 'sources': [ 'file.cc', ], + 'xcode_settings': { + 'GCC_PREFIX_HEADER': 'header.h', + 'GCC_PRECOMPILE_PREFIX_HEADER': 'YES', + }, + }, + + { + 'target_name': 'prefix_header_m', + 'type': 'static_library', + 'sources': [ 'file.m', ], + 'xcode_settings': { + 'GCC_PREFIX_HEADER': 'header.h', + }, + }, + { + 'target_name': 'precompiled_prefix_header_m', + 'type': 'shared_library', + 'mac_bundle': 1, + 'sources': [ 'file.m', ], + 'xcode_settings': { + 'GCC_PREFIX_HEADER': 'header.h', + 'GCC_PRECOMPILE_PREFIX_HEADER': 'YES', + }, + }, + + { + 'target_name': 'prefix_header_mm', + 'type': 'static_library', + 'sources': [ 'file.mm', ], + 'xcode_settings': { + 'GCC_PREFIX_HEADER': 'header.h', + }, + }, + { + 'target_name': 'precompiled_prefix_header_mm', + 'type': 'shared_library', + 'mac_bundle': 1, + 'sources': [ 'file.mm', ], + 'xcode_settings': { + 'GCC_PREFIX_HEADER': 'header.h', + 'GCC_PRECOMPILE_PREFIX_HEADER': 'YES', + }, + }, + ], +} diff --git a/deps/gyp/test/mac/rebuild/TestApp-Info.plist b/deps/gyp/test/mac/rebuild/TestApp-Info.plist new file mode 100644 index 0000000000..98fd515200 --- /dev/null +++ b/deps/gyp/test/mac/rebuild/TestApp-Info.plist @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> +<plist version="1.0"> +<dict> + <key>CFBundleDevelopmentRegion</key> + <string>English</string> + <key>CFBundleExecutable</key> + <string>${EXECUTABLE_NAME}</string> + <key>CFBundleIconFile</key> + <string></string> + <key>CFBundleIdentifier</key> + <string>com.google.${PRODUCT_NAME}</string> + <key>CFBundleInfoDictionaryVersion</key> + <string>6.0</string> + <key>CFBundleName</key> + <string>${PRODUCT_NAME}</string> + <key>CFBundlePackageType</key> + <string>APPL</string> + <key>CFBundleShortVersionString</key> + <string>1.0</string> + <key>CFBundleSignature</key> + <string>????</string> + <key>CFBundleVersion</key> + <string>1</string> + <key>LSMinimumSystemVersion</key> + <string>${MACOSX_DEPLOYMENT_TARGET}</string> + <key>NSMainNibFile</key> + <string>MainMenu</string> + <key>NSPrincipalClass</key> + <string>NSApplication</string> +</dict> +</plist> diff --git a/deps/gyp/test/mac/rebuild/delay-touch.sh b/deps/gyp/test/mac/rebuild/delay-touch.sh new file mode 100755 index 0000000000..7caf105b6e --- /dev/null +++ b/deps/gyp/test/mac/rebuild/delay-touch.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +set -e + +sleep 1 # mtime resolution is 1 sec on unix. +touch "$1" diff --git a/deps/gyp/test/mac/rebuild/empty.c b/deps/gyp/test/mac/rebuild/empty.c new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/deps/gyp/test/mac/rebuild/empty.c diff --git a/deps/gyp/test/mac/rebuild/main.c b/deps/gyp/test/mac/rebuild/main.c new file mode 100644 index 0000000000..237c8ce181 --- /dev/null +++ b/deps/gyp/test/mac/rebuild/main.c @@ -0,0 +1 @@ +int main() {} diff --git a/deps/gyp/test/mac/rebuild/test.gyp b/deps/gyp/test/mac/rebuild/test.gyp new file mode 100644 index 0000000000..15b4e4ef2f --- /dev/null +++ b/deps/gyp/test/mac/rebuild/test.gyp @@ -0,0 +1,56 @@ +# Copyright (c) 2011 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. +{ + 'targets': [ + { + 'target_name': 'test_app', + 'product_name': 'Test App', + 'type': 'executable', + 'mac_bundle': 1, + 'sources': [ + 'main.c', + ], + 'xcode_settings': { + 'INFOPLIST_FILE': 'TestApp-Info.plist', + }, + }, + { + 'target_name': 'test_app_postbuilds', + 'product_name': 'Test App 2', + 'type': 'executable', + 'mac_bundle': 1, + 'sources': [ + 'main.c', + ], + 'xcode_settings': { + 'INFOPLIST_FILE': 'TestApp-Info.plist', + }, + 'postbuilds': [ + { + 'postbuild_name': 'Postbuild that touches the app binary', + 'action': [ + './delay-touch.sh', '${BUILT_PRODUCTS_DIR}/${EXECUTABLE_PATH}', + ], + }, + ], + }, + { + 'target_name': 'test_framework_postbuilds', + 'product_name': 'Test Framework', + 'type': 'shared_library', + 'mac_bundle': 1, + 'sources': [ + 'empty.c', + ], + 'postbuilds': [ + { + 'postbuild_name': 'Postbuild that touches the framework binary', + 'action': [ + './delay-touch.sh', '${BUILT_PRODUCTS_DIR}/${EXECUTABLE_PATH}', + ], + }, + ], + }, + ], +} diff --git a/deps/gyp/test/mac/rpath/file.c b/deps/gyp/test/mac/rpath/file.c new file mode 100644 index 0000000000..56757a701b --- /dev/null +++ b/deps/gyp/test/mac/rpath/file.c @@ -0,0 +1 @@ +void f() {} diff --git a/deps/gyp/test/mac/rpath/main.c b/deps/gyp/test/mac/rpath/main.c new file mode 100644 index 0000000000..237c8ce181 --- /dev/null +++ b/deps/gyp/test/mac/rpath/main.c @@ -0,0 +1 @@ +int main() {} diff --git a/deps/gyp/test/mac/rpath/test.gyp b/deps/gyp/test/mac/rpath/test.gyp new file mode 100644 index 0000000000..7255cb7cd2 --- /dev/null +++ b/deps/gyp/test/mac/rpath/test.gyp @@ -0,0 +1,48 @@ +# 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. +{ + 'targets': [ + { + 'target_name': 'default_rpath', + 'type': 'shared_library', + 'sources': [ 'file.c' ], + }, + { + 'target_name': 'explicit_rpath', + 'type': 'shared_library', + 'sources': [ 'file.c' ], + 'xcode_settings': { + 'LD_RUNPATH_SEARCH_PATHS': ['@executable_path/.'], + }, + }, + { + 'target_name': 'explicit_rpaths_escaped', + 'type': 'shared_library', + 'sources': [ 'file.c' ], + 'xcode_settings': { + # Xcode requires spaces to be escaped, else it ends up adding two + # independent rpaths. + 'LD_RUNPATH_SEARCH_PATHS': ['First\\ rpath', 'Second\\ rpath'], + }, + }, + { + 'target_name': 'explicit_rpaths_bundle', + 'product_name': 'My Framework', + 'type': 'shared_library', + 'mac_bundle': 1, + 'sources': [ 'file.c' ], + 'xcode_settings': { + 'LD_RUNPATH_SEARCH_PATHS': ['@loader_path/.'], + }, + }, + { + 'target_name': 'executable', + 'type': 'executable', + 'sources': [ 'main.c' ], + 'xcode_settings': { + 'LD_RUNPATH_SEARCH_PATHS': ['@executable_path/.'], + }, + }, + ], +} diff --git a/deps/gyp/test/mac/sdkroot/file.cc b/deps/gyp/test/mac/sdkroot/file.cc new file mode 100644 index 0000000000..13ae971040 --- /dev/null +++ b/deps/gyp/test/mac/sdkroot/file.cc @@ -0,0 +1,5 @@ +#include <map> +using std::map; + +int main() { +} diff --git a/deps/gyp/test/mac/sdkroot/test.gyp b/deps/gyp/test/mac/sdkroot/test.gyp new file mode 100644 index 0000000000..2fc11a0280 --- /dev/null +++ b/deps/gyp/test/mac/sdkroot/test.gyp @@ -0,0 +1,35 @@ +# 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. +{ + 'targets': [ + { + 'target_name': 'mytarget', + 'type': 'executable', + 'sources': [ 'file.cc', ], + 'xcode_settings': { + 'SDKROOT': 'macosx%s', + }, + 'postbuilds': [ + { + 'postbuild_name': 'envtest', + 'action': [ './test_shorthand.sh', ], + }, + ], + }, + { + 'target_name': 'absolute', + 'type': 'executable', + 'sources': [ 'file.cc', ], + 'xcode_settings': { + 'SDKROOT': '<(sdk_path)', + }, + 'postbuilds': [ + { + 'postbuild_name': 'envtest', + 'action': [ './test_shorthand.sh', ], + }, + ], + }, + ], +} diff --git a/deps/gyp/test/mac/sdkroot/test_shorthand.sh b/deps/gyp/test/mac/sdkroot/test_shorthand.sh new file mode 100755 index 0000000000..ac4ac229ae --- /dev/null +++ b/deps/gyp/test/mac/sdkroot/test_shorthand.sh @@ -0,0 +1,20 @@ +#!/bin/bash +# 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. + +set -e + +found=false +for sdk in 10.6 10.7 10.8 10.9 ; do + if expected=$(xcodebuild -version -sdk macosx$sdk Path 2>/dev/null) ; then + found=true + break + fi +done +if ! $found ; then + echo >&2 "cannot find installed SDK" + exit 1 +fi + +test $SDKROOT = $expected diff --git a/deps/gyp/test/mac/sourceless-module/empty.c b/deps/gyp/test/mac/sourceless-module/empty.c new file mode 100644 index 0000000000..237c8ce181 --- /dev/null +++ b/deps/gyp/test/mac/sourceless-module/empty.c @@ -0,0 +1 @@ +int main() {} diff --git a/deps/gyp/test/mac/sourceless-module/empty.txt b/deps/gyp/test/mac/sourceless-module/empty.txt new file mode 100644 index 0000000000..139597f9cb --- /dev/null +++ b/deps/gyp/test/mac/sourceless-module/empty.txt @@ -0,0 +1,2 @@ + + diff --git a/deps/gyp/test/mac/sourceless-module/fun.c b/deps/gyp/test/mac/sourceless-module/fun.c new file mode 100644 index 0000000000..d64ff8ca23 --- /dev/null +++ b/deps/gyp/test/mac/sourceless-module/fun.c @@ -0,0 +1 @@ +int f() { return 42; } diff --git a/deps/gyp/test/mac/sourceless-module/test.gyp b/deps/gyp/test/mac/sourceless-module/test.gyp new file mode 100644 index 0000000000..cbbe63df02 --- /dev/null +++ b/deps/gyp/test/mac/sourceless-module/test.gyp @@ -0,0 +1,96 @@ +# 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. +{ + 'targets': [ + { + 'target_name': 'empty_bundle', + 'type': 'loadable_module', + 'mac_bundle': 1, + }, + { + 'target_name': 'resource_bundle', + 'type': 'loadable_module', + 'mac_bundle': 1, + 'actions': [ + { + 'action_name': 'Add Resource', + 'inputs': [], + 'outputs': [ + '<(INTERMEDIATE_DIR)/app_manifest/foo.manifest', + ], + 'action': [ + 'touch', '<(INTERMEDIATE_DIR)/app_manifest/foo.manifest', + ], + 'process_outputs_as_mac_bundle_resources': 1, + }, + ], + }, + { + 'target_name': 'dependent_on_resource_bundle', + 'type': 'executable', + 'sources': [ 'empty.c' ], + 'dependencies': [ + 'resource_bundle', + ], + }, + + { + 'target_name': 'alib', + 'type': 'static_library', + 'sources': [ 'fun.c' ] + }, + { # No sources, but depends on a static_library so must be linked. + 'target_name': 'resource_framework', + 'type': 'shared_library', + 'mac_bundle': 1, + 'dependencies': [ + 'alib', + ], + 'actions': [ + { + 'action_name': 'Add Resource', + 'inputs': [], + 'outputs': [ + '<(INTERMEDIATE_DIR)/app_manifest/foo.manifest', + ], + 'action': [ + 'touch', '<(INTERMEDIATE_DIR)/app_manifest/foo.manifest', + ], + 'process_outputs_as_mac_bundle_resources': 1, + }, + ], + }, + { + 'target_name': 'dependent_on_resource_framework', + 'type': 'executable', + 'sources': [ 'empty.c' ], + 'dependencies': [ + 'resource_framework', + ], + }, + + { # No actions, but still have resources. + 'target_name': 'mac_resource_bundle_no_actions', + 'product_extension': 'bundle', + 'type': 'executable', + 'mac_bundle': 1, + 'mac_bundle_resources': [ + 'empty.txt', + ], + }, + { + 'target_name': 'bundle_dependent_on_resource_bundle_no_actions', + 'type': 'executable', + 'mac_bundle': 1, + 'sources': [ 'empty.c' ], + 'dependencies': [ + 'mac_resource_bundle_no_actions', + ], + 'mac_bundle_resources': [ + '<(PRODUCT_DIR)/mac_resource_bundle_no_actions.bundle', + ], + }, + ], +} + diff --git a/deps/gyp/test/mac/strip/file.c b/deps/gyp/test/mac/strip/file.c new file mode 100644 index 0000000000..a4c504de71 --- /dev/null +++ b/deps/gyp/test/mac/strip/file.c @@ -0,0 +1,22 @@ +// Copyright (c) 2011 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. + +static void the_static_function() {} +__attribute__((used)) void the_used_function() {} + +__attribute__((visibility("hidden"))) __attribute__((used)) + void the_hidden_function() {} +__attribute__((visibility("default"))) __attribute__((used)) + void the_visible_function() {} + +extern const int eci; +__attribute__((used)) int i; +__attribute__((used)) const int ci = 34623; + +void the_function() { + the_static_function(); + the_used_function(); + the_hidden_function(); + the_visible_function(); +} diff --git a/deps/gyp/test/mac/strip/main.c b/deps/gyp/test/mac/strip/main.c new file mode 100644 index 0000000000..b2291a6b09 --- /dev/null +++ b/deps/gyp/test/mac/strip/main.c @@ -0,0 +1,25 @@ +// Copyright (c) 2013 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. + +static void the_static_function() {} +__attribute__((used)) void the_used_function() {} + +__attribute__((visibility("hidden"))) __attribute__((used)) +void the_hidden_function() {} +__attribute__((visibility("default"))) __attribute__((used)) +void the_visible_function() {} + +void the_function() {} + +extern const int eci; +__attribute__((used)) int i; +__attribute__((used)) const int ci = 34623; + +int main() { + the_function(); + the_static_function(); + the_used_function(); + the_hidden_function(); + the_visible_function(); +} diff --git a/deps/gyp/test/mac/strip/strip.saves b/deps/gyp/test/mac/strip/strip.saves new file mode 100644 index 0000000000..b60ca62857 --- /dev/null +++ b/deps/gyp/test/mac/strip/strip.saves @@ -0,0 +1,5 @@ +# Copyright (c) 2011 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +# This file would list symbols that should not be stripped. diff --git a/deps/gyp/test/mac/strip/subdirectory/nested_file.c b/deps/gyp/test/mac/strip/subdirectory/nested_file.c new file mode 100644 index 0000000000..50daa6c13b --- /dev/null +++ b/deps/gyp/test/mac/strip/subdirectory/nested_file.c @@ -0,0 +1 @@ +void nested_f() {} diff --git a/deps/gyp/test/mac/strip/subdirectory/nested_strip.saves b/deps/gyp/test/mac/strip/subdirectory/nested_strip.saves new file mode 100644 index 0000000000..d434c0ef45 --- /dev/null +++ b/deps/gyp/test/mac/strip/subdirectory/nested_strip.saves @@ -0,0 +1,5 @@ +# Copyright (c) 2012 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +# This file would list symbols that should not be stripped. diff --git a/deps/gyp/test/mac/strip/subdirectory/subdirectory.gyp b/deps/gyp/test/mac/strip/subdirectory/subdirectory.gyp new file mode 100644 index 0000000000..5d0d190914 --- /dev/null +++ b/deps/gyp/test/mac/strip/subdirectory/subdirectory.gyp @@ -0,0 +1,38 @@ +# 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. +{ + 'targets': [ + { + 'target_name': 'nested_strip_save', + 'type': 'shared_library', + 'sources': [ 'nested_file.c', ], + 'xcode_settings': { + 'DEPLOYMENT_POSTPROCESSING': 'YES', + 'STRIP_INSTALLED_PRODUCT': 'YES', + 'STRIPFLAGS': '-s $(CHROMIUM_STRIP_SAVE_FILE)', + 'CHROMIUM_STRIP_SAVE_FILE': 'nested_strip.saves', + }, + }, + { + 'target_name': 'nested_strip_save_postbuild', + 'type': 'shared_library', + 'sources': [ 'nested_file.c', ], + 'xcode_settings': { + 'DEPLOYMENT_POSTPROCESSING': 'YES', + 'STRIP_INSTALLED_PRODUCT': 'YES', + 'STRIPFLAGS': '-s $(CHROMIUM_STRIP_SAVE_FILE)', + 'CHROMIUM_STRIP_SAVE_FILE': 'nested_strip.saves', + }, + 'postbuilds': [ + { + 'postbuild_name': 'Action that reads CHROMIUM_STRIP_SAVE_FILE', + 'action': [ + './test_reading_save_file_from_postbuild.sh', + ], + }, + ], + }, + ], +} + diff --git a/deps/gyp/test/mac/strip/subdirectory/test_reading_save_file_from_postbuild.sh b/deps/gyp/test/mac/strip/subdirectory/test_reading_save_file_from_postbuild.sh new file mode 100755 index 0000000000..976943680e --- /dev/null +++ b/deps/gyp/test/mac/strip/subdirectory/test_reading_save_file_from_postbuild.sh @@ -0,0 +1,5 @@ +#!/bin/bash + +set -e + +test -f ${CHROMIUM_STRIP_SAVE_FILE} diff --git a/deps/gyp/test/mac/strip/test-defaults.gyp b/deps/gyp/test/mac/strip/test-defaults.gyp new file mode 100644 index 0000000000..e688b955a7 --- /dev/null +++ b/deps/gyp/test/mac/strip/test-defaults.gyp @@ -0,0 +1,51 @@ +# Copyright (c) 2013 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. +{ + 'make_global_settings': [ + ['CC', '/usr/bin/clang'], + ], + 'target_defaults': { + 'xcode_settings': { + 'GCC_VERSION': 'com.apple.compilers.llvm.clang.1_0', + 'DEPLOYMENT_POSTPROCESSING': 'YES', + 'STRIP_INSTALLED_PRODUCT': 'YES', + }, + }, + 'targets': [ + { + 'target_name': 'single_dylib', + 'type': 'shared_library', + 'sources': [ 'file.c', ], + }, + { + 'target_name': 'single_so', + 'type': 'loadable_module', + 'sources': [ 'file.c', ], + }, + { + 'target_name': 'single_exe', + 'type': 'executable', + 'sources': [ 'main.c', ], + }, + + { + 'target_name': 'bundle_dylib', + 'type': 'shared_library', + 'mac_bundle': '1', + 'sources': [ 'file.c', ], + }, + { + 'target_name': 'bundle_so', + 'type': 'loadable_module', + 'mac_bundle': '1', + 'sources': [ 'file.c', ], + }, + { + 'target_name': 'bundle_exe', + 'type': 'executable', + 'mac_bundle': '1', + 'sources': [ 'main.c', ], + }, + ], +} diff --git a/deps/gyp/test/mac/strip/test.gyp b/deps/gyp/test/mac/strip/test.gyp new file mode 100644 index 0000000000..2558aa91bb --- /dev/null +++ b/deps/gyp/test/mac/strip/test.gyp @@ -0,0 +1,119 @@ +# Copyright (c) 2011 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. + +# These xcode_settings affect stripping: +# "Deployment postprocessing involves stripping the binary, and setting +# its file mode, owner, and group." +#'DEPLOYMENT_POSTPROCESSING': 'YES', + +# "Specifies whether to strip symbol information from the binary. +# Prerequisite: $DEPLOYMENT_POSTPROCESSING = YES" "Default Value: 'NO'" +#'STRIP_INSTALLED_PRODUCT': 'YES', + +# "Values: +# * all: Strips the binary completely, removing the symbol table and +# relocation information +# * non-global: Strips nonglobal symbols but saves external symbols. +# * debugging: Strips debugging symbols but saves local and global +# symbols." +# (maps to no flag, -x, -S in that order) +#'STRIP_STYLE': 'non-global', + +# "Additional strip flags" +#'STRIPFLAGS': '-c', + +# "YES: Copied binaries are stripped of debugging symbols. This does +# not cause the binary produced by the linker to be stripped. Use +# 'STRIP_INSTALLED_PRODUCT (Strip Linked Product)' to have the linker +# strip the binary." +#'COPY_PHASE_STRIP': 'NO', +{ + 'targets': [ + { + 'target_name': 'no_postprocess', + 'type': 'shared_library', + 'sources': [ 'file.c', ], + 'xcode_settings': { + 'DEPLOYMENT_POSTPROCESSING': 'NO', + 'STRIP_INSTALLED_PRODUCT': 'YES', + }, + }, + { + 'target_name': 'no_strip', + 'type': 'shared_library', + 'sources': [ 'file.c', ], + 'xcode_settings': { + 'DEPLOYMENT_POSTPROCESSING': 'YES', + 'STRIP_INSTALLED_PRODUCT': 'NO', + }, + }, + { + 'target_name': 'strip_all', + 'type': 'shared_library', + 'sources': [ 'file.c', ], + 'xcode_settings': { + 'DEPLOYMENT_POSTPROCESSING': 'YES', + 'STRIP_INSTALLED_PRODUCT': 'YES', + 'STRIP_STYLE': 'all', + }, + }, + { + 'target_name': 'strip_nonglobal', + 'type': 'shared_library', + 'sources': [ 'file.c', ], + 'xcode_settings': { + 'DEPLOYMENT_POSTPROCESSING': 'YES', + 'STRIP_INSTALLED_PRODUCT': 'YES', + 'STRIP_STYLE': 'non-global', + }, + }, + { + 'target_name': 'strip_debugging', + 'type': 'shared_library', + 'sources': [ 'file.c', ], + 'xcode_settings': { + 'DEPLOYMENT_POSTPROCESSING': 'YES', + 'STRIP_INSTALLED_PRODUCT': 'YES', + 'STRIP_STYLE': 'debugging', + }, + }, + { + 'target_name': 'strip_all_custom_flags', + 'type': 'shared_library', + 'sources': [ 'file.c', ], + 'xcode_settings': { + 'DEPLOYMENT_POSTPROCESSING': 'YES', + 'STRIP_INSTALLED_PRODUCT': 'YES', + 'STRIP_STYLE': 'all', + 'STRIPFLAGS': '-c', + }, + }, + { + 'target_name': 'strip_all_bundle', + 'type': 'shared_library', + 'mac_bundle': '1', + 'sources': [ 'file.c', ], + 'xcode_settings': { + 'DEPLOYMENT_POSTPROCESSING': 'YES', + 'STRIP_INSTALLED_PRODUCT': 'YES', + 'STRIP_STYLE': 'all', + }, + }, + { + 'target_name': 'strip_save', + 'type': 'shared_library', + 'sources': [ 'file.c', ], + 'dependencies': [ + 'subdirectory/subdirectory.gyp:nested_strip_save', + 'subdirectory/subdirectory.gyp:nested_strip_save_postbuild', + ], + 'xcode_settings': { + 'DEPLOYMENT_POSTPROCESSING': 'YES', + 'STRIP_INSTALLED_PRODUCT': 'YES', + 'STRIPFLAGS': '-s $(CHROMIUM_STRIP_SAVE_FILE)', + 'CHROMIUM_STRIP_SAVE_FILE': 'strip.saves', + }, + }, + ], +} diff --git a/deps/gyp/test/mac/swift-library/Info.plist b/deps/gyp/test/mac/swift-library/Info.plist new file mode 100644 index 0000000000..804990ca5e --- /dev/null +++ b/deps/gyp/test/mac/swift-library/Info.plist @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> +<plist version="1.0"> +<dict> + <key>CFBundleDevelopmentRegion</key> + <string>English</string> + <key>CFBundleExecutable</key> + <string>${EXECUTABLE_NAME}</string> + <key>CFBundleIconFile</key> + <string></string> + <key>CFBundleIdentifier</key> + <string>com.yourcompany.${PRODUCT_NAME:identifier}</string> + <key>CFBundleInfoDictionaryVersion</key> + <string>6.0</string> + <key>CFBundleName</key> + <string>${PRODUCT_NAME}</string> + <key>CFBundlePackageType</key> + <string>FMWK</string> + <key>CFBundleShortVersionString</key> + <string>1.0</string> + <key>CFBundleSignature</key> + <string>????</string> + <key>CFBundleVersion</key> + <string>1</string> + <key>NSPrincipalClass</key> + <string></string> +</dict> +</plist> diff --git a/deps/gyp/test/mac/swift-library/file.swift b/deps/gyp/test/mac/swift-library/file.swift new file mode 100644 index 0000000000..88db7da5c6 --- /dev/null +++ b/deps/gyp/test/mac/swift-library/file.swift @@ -0,0 +1,9 @@ +import Foundation + +public class GypSwiftTest { + let myProperty = false + + init() { + self.myProperty = true + } +}
\ No newline at end of file diff --git a/deps/gyp/test/mac/swift-library/test.gyp b/deps/gyp/test/mac/swift-library/test.gyp new file mode 100644 index 0000000000..373a677cbd --- /dev/null +++ b/deps/gyp/test/mac/swift-library/test.gyp @@ -0,0 +1,21 @@ +# Copyright (c) 2011 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. +{ + 'targets': [ + { + 'target_name': 'SwiftFramework', + 'product_name': 'SwiftFramework', + 'type': 'shared_library', + 'mac_bundle': 1, + 'xcode_settings': { + 'INFOPLIST_FILE': 'Info.plist', + 'CODE_SIGNING_REQUIRED': 'NO', + 'CONFIGURATION_BUILD_DIR':'build/Default', + }, + 'sources': [ + 'file.swift', + ], + }, + ], +} diff --git a/deps/gyp/test/mac/type_envvars/file.c b/deps/gyp/test/mac/type_envvars/file.c new file mode 100644 index 0000000000..9cddaf1b0b --- /dev/null +++ b/deps/gyp/test/mac/type_envvars/file.c @@ -0,0 +1,6 @@ +// Copyright (c) 2011 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. + +void f() {} +int main() {} diff --git a/deps/gyp/test/mac/type_envvars/test.gyp b/deps/gyp/test/mac/type_envvars/test.gyp new file mode 100644 index 0000000000..465670056b --- /dev/null +++ b/deps/gyp/test/mac/type_envvars/test.gyp @@ -0,0 +1,100 @@ +# Copyright (c) 2011 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. +{ + 'targets': [ + { + 'target_name': 'my_app', + 'product_name': 'My App', + 'type': 'executable', + 'mac_bundle': 1, + 'sources': [ 'file.c', ], + 'postbuilds': [ + { + 'postbuild_name': 'envtest', + 'action': [ './test_bundle_executable.sh', ], + }, + ], + }, + { + 'target_name': 'bundle_loadable_module', + 'type': 'loadable_module', + 'mac_bundle': 1, + 'sources': [ 'file.c', ], + 'postbuilds': [ + { + 'postbuild_name': 'envtest', + 'action': [ './test_bundle_loadable_module.sh', ], + }, + ], + }, + { + 'target_name': 'bundle_shared_library', + 'type': 'shared_library', + 'mac_bundle': 1, + 'sources': [ 'file.c', ], + 'postbuilds': [ + { + 'postbuild_name': 'envtest', + 'action': [ './test_bundle_shared_library.sh', ], + }, + ], + }, + # Types 'static_library' and 'none' can't exist as bundles. + + { + 'target_name': 'nonbundle_executable', + 'type': 'executable', + 'sources': [ 'file.c', ], + 'postbuilds': [ + { + 'postbuild_name': 'envtest', + 'action': [ './test_nonbundle_executable.sh', ], + }, + ], + }, + { + 'target_name': 'nonbundle_loadable_module', + 'type': 'loadable_module', + 'sources': [ 'file.c', ], + 'postbuilds': [ + { + 'postbuild_name': 'envtest', + 'action': [ './test_nonbundle_loadable_module.sh', ], + }, + ], + }, + { + 'target_name': 'nonbundle_shared_library', + 'type': 'shared_library', + 'sources': [ 'file.c', ], + 'postbuilds': [ + { + 'postbuild_name': 'envtest', + 'action': [ './test_nonbundle_shared_library.sh', ], + }, + ], + }, + { + 'target_name': 'nonbundle_static_library', + 'type': 'static_library', + 'sources': [ 'file.c', ], + 'postbuilds': [ + { + 'postbuild_name': 'envtest', + 'action': [ './test_nonbundle_static_library.sh', ], + }, + ], + }, + { + 'target_name': 'nonbundle_none', + 'type': 'none', + 'postbuilds': [ + { + 'postbuild_name': 'envtest', + 'action': [ './test_nonbundle_none.sh', ], + }, + ], + }, + ], +} diff --git a/deps/gyp/test/mac/type_envvars/test_bundle_executable.sh b/deps/gyp/test/mac/type_envvars/test_bundle_executable.sh new file mode 100755 index 0000000000..5cd740c6ba --- /dev/null +++ b/deps/gyp/test/mac/type_envvars/test_bundle_executable.sh @@ -0,0 +1,20 @@ +#!/bin/bash +# 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. + +set -e + +test $MACH_O_TYPE = mh_execute +test $PRODUCT_TYPE = com.apple.product-type.application +test "${PRODUCT_NAME}" = "My App" +test "${FULL_PRODUCT_NAME}" = "My App.app" + +test "${EXECUTABLE_NAME}" = "My App" +test "${EXECUTABLE_PATH}" = "My App.app/Contents/MacOS/My App" +test "${WRAPPER_NAME}" = "My App.app" + +[[ ! $DYLIB_INSTALL_NAME_BASE && ${DYLIB_INSTALL_NAME_BASE-_} ]] +[[ ! $LD_DYLIB_INSTALL_NAME && ${LD_DYLIB_INSTALL_NAME-_} ]] + +"$(dirname "$0")/test_check_sdkroot.sh" diff --git a/deps/gyp/test/mac/type_envvars/test_bundle_loadable_module.sh b/deps/gyp/test/mac/type_envvars/test_bundle_loadable_module.sh new file mode 100755 index 0000000000..ea985f5194 --- /dev/null +++ b/deps/gyp/test/mac/type_envvars/test_bundle_loadable_module.sh @@ -0,0 +1,21 @@ +#!/bin/bash +# 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. + +set -e + +test $MACH_O_TYPE = mh_bundle +test $PRODUCT_TYPE = com.apple.product-type.bundle +test $PRODUCT_NAME = bundle_loadable_module +test $FULL_PRODUCT_NAME = bundle_loadable_module.bundle + +test $EXECUTABLE_NAME = bundle_loadable_module +test $EXECUTABLE_PATH = \ + "bundle_loadable_module.bundle/Contents/MacOS/bundle_loadable_module" +test $WRAPPER_NAME = bundle_loadable_module.bundle + +[[ ! $DYLIB_INSTALL_NAME_BASE && ${DYLIB_INSTALL_NAME_BASE-_} ]] +[[ ! $LD_DYLIB_INSTALL_NAME && ${LD_DYLIB_INSTALL_NAME-_} ]] + +"$(dirname "$0")/test_check_sdkroot.sh" diff --git a/deps/gyp/test/mac/type_envvars/test_bundle_shared_library.sh b/deps/gyp/test/mac/type_envvars/test_bundle_shared_library.sh new file mode 100755 index 0000000000..bf49d45ef0 --- /dev/null +++ b/deps/gyp/test/mac/type_envvars/test_bundle_shared_library.sh @@ -0,0 +1,22 @@ +#!/bin/bash +# 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. + +set -e + +test $MACH_O_TYPE = mh_dylib +test $PRODUCT_TYPE = com.apple.product-type.framework +test $PRODUCT_NAME = bundle_shared_library +test $FULL_PRODUCT_NAME = bundle_shared_library.framework + +test $EXECUTABLE_NAME = bundle_shared_library +test $EXECUTABLE_PATH = \ + "bundle_shared_library.framework/Versions/A/bundle_shared_library" +test $WRAPPER_NAME = bundle_shared_library.framework + +test $DYLIB_INSTALL_NAME_BASE = "/Library/Frameworks" +test $LD_DYLIB_INSTALL_NAME = \ + "/Library/Frameworks/bundle_shared_library.framework/Versions/A/bundle_shared_library" + +"$(dirname "$0")/test_check_sdkroot.sh" diff --git a/deps/gyp/test/mac/type_envvars/test_check_sdkroot.sh b/deps/gyp/test/mac/type_envvars/test_check_sdkroot.sh new file mode 100755 index 0000000000..1297dbeff1 --- /dev/null +++ b/deps/gyp/test/mac/type_envvars/test_check_sdkroot.sh @@ -0,0 +1,47 @@ +#!/bin/bash +# Copyright (c) 2014 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. + +set -e + +# `xcodebuild -version` output looks like +# Xcode 4.6.3 +# Build version 4H1503 +# or like +# Xcode 4.2 +# Build version 4C199 +# or like +# Xcode 3.2.6 +# Component versions: DevToolsCore-1809.0; DevToolsSupport-1806.0 +# BuildVersion: 10M2518 +# Convert that to '0463', '0420' and '0326' respectively. +function xcodeversion() { + xcodebuild -version | awk '/Xcode ([0-9]+\.[0-9]+(\.[0-9]+)?)/ { + version = $2 + gsub(/\./, "", version) + if (length(version) < 3) { + version = version "0" + } + if (length(version) < 4) { + version = "0" version + } + } + END { print version }' +} + +# Returns true if |string1| is smaller than |string2|. +# This function assumes that both strings represent Xcode version numbers +# as returned by |xcodeversion|. +function smaller() { + local min="$(echo -ne "${1}\n${2}\n" | sort -n | head -n1)" + test "${min}" != "${2}" +} + +if [[ "$(xcodeversion)" < "0500" ]]; then + # Xcode version is older than 5.0, check that SDKROOT is set but empty. + [[ -z "${SDKROOT}" && -z "${SDKROOT-_}" ]] +else + # Xcode version is newer than 5.0, check that SDKROOT is set. + [[ "${SDKROOT}" == "$(xcodebuild -version -sdk '' Path)" ]] +fi diff --git a/deps/gyp/test/mac/type_envvars/test_nonbundle_executable.sh b/deps/gyp/test/mac/type_envvars/test_nonbundle_executable.sh new file mode 100755 index 0000000000..25afcbe10a --- /dev/null +++ b/deps/gyp/test/mac/type_envvars/test_nonbundle_executable.sh @@ -0,0 +1,22 @@ +#!/bin/bash +# 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. + +set -e + +# For some reason, Xcode doesn't set MACH_O_TYPE for non-bundle executables. +# Check for "not set", not just "empty": +[[ ! $MACH_O_TYPE && ${MACH_O_TYPE-_} ]] +test $PRODUCT_TYPE = com.apple.product-type.tool +test $PRODUCT_NAME = nonbundle_executable +test $FULL_PRODUCT_NAME = nonbundle_executable + +test $EXECUTABLE_NAME = nonbundle_executable +test $EXECUTABLE_PATH = nonbundle_executable +[[ ! $WRAPPER_NAME && ${WRAPPER_NAME-_} ]] + +[[ ! $DYLIB_INSTALL_NAME_BASE && ${DYLIB_INSTALL_NAME_BASE-_} ]] +[[ ! $LD_DYLIB_INSTALL_NAME && ${LD_DYLIB_INSTALL_NAME-_} ]] + +"$(dirname "$0")/test_check_sdkroot.sh" diff --git a/deps/gyp/test/mac/type_envvars/test_nonbundle_loadable_module.sh b/deps/gyp/test/mac/type_envvars/test_nonbundle_loadable_module.sh new file mode 100755 index 0000000000..9b584269ec --- /dev/null +++ b/deps/gyp/test/mac/type_envvars/test_nonbundle_loadable_module.sh @@ -0,0 +1,20 @@ +#!/bin/bash +# 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. + +set -e + +test $MACH_O_TYPE = mh_bundle +test $PRODUCT_TYPE = com.apple.product-type.library.dynamic +test $PRODUCT_NAME = nonbundle_loadable_module +test $FULL_PRODUCT_NAME = nonbundle_loadable_module.so + +test $EXECUTABLE_NAME = nonbundle_loadable_module.so +test $EXECUTABLE_PATH = nonbundle_loadable_module.so +[[ ! $WRAPPER_NAME && ${WRAPPER_NAME-_} ]] + +test $DYLIB_INSTALL_NAME_BASE = "/usr/local/lib" +test $LD_DYLIB_INSTALL_NAME = "/usr/local/lib/nonbundle_loadable_module.so" + +"$(dirname "$0")/test_check_sdkroot.sh" diff --git a/deps/gyp/test/mac/type_envvars/test_nonbundle_none.sh b/deps/gyp/test/mac/type_envvars/test_nonbundle_none.sh new file mode 100755 index 0000000000..871af1bbda --- /dev/null +++ b/deps/gyp/test/mac/type_envvars/test_nonbundle_none.sh @@ -0,0 +1,21 @@ +#!/bin/bash +# 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. + +set -e + +# Check for "not set", not just "empty": +[[ ! $MACH_O_TYPE && ${MACH_O_TYPE-_} ]] +[[ ! $PRODUCT_TYPE && ${PRODUCT_TYPE-_} ]] +test $PRODUCT_NAME = nonbundle_none +[[ ! $FULL_PRODUCT_NAME && ${FULL_PRODUCT_NAME-_} ]] + +[[ ! $EXECUTABLE_NAME && ${EXECUTABLE_NAME-_} ]] +[[ ! $EXECUTABLE_PATH && ${EXECUTABLE_PATH-_} ]] +[[ ! $WRAPPER_NAME && ${WRAPPER_NAME-_} ]] + +[[ ! $DYLIB_INSTALL_NAME_BASE && ${DYLIB_INSTALL_NAME_BASE-_} ]] +[[ ! $LD_DYLIB_INSTALL_NAME && ${LD_DYLIB_INSTALL_NAME-_} ]] + +"$(dirname "$0")/test_check_sdkroot.sh" diff --git a/deps/gyp/test/mac/type_envvars/test_nonbundle_shared_library.sh b/deps/gyp/test/mac/type_envvars/test_nonbundle_shared_library.sh new file mode 100755 index 0000000000..cbb118b7b2 --- /dev/null +++ b/deps/gyp/test/mac/type_envvars/test_nonbundle_shared_library.sh @@ -0,0 +1,20 @@ +#!/bin/bash +# 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. + +set -e + +test $MACH_O_TYPE = mh_dylib +test $PRODUCT_TYPE = com.apple.product-type.library.dynamic +test $PRODUCT_NAME = nonbundle_shared_library +test $FULL_PRODUCT_NAME = libnonbundle_shared_library.dylib + +test $EXECUTABLE_NAME = libnonbundle_shared_library.dylib +test $EXECUTABLE_PATH = libnonbundle_shared_library.dylib +[[ ! $WRAPPER_NAME && ${WRAPPER_NAME-_} ]] + +test $DYLIB_INSTALL_NAME_BASE = "/usr/local/lib" +test $LD_DYLIB_INSTALL_NAME = "/usr/local/lib/libnonbundle_shared_library.dylib" + +"$(dirname "$0")/test_check_sdkroot.sh" diff --git a/deps/gyp/test/mac/type_envvars/test_nonbundle_static_library.sh b/deps/gyp/test/mac/type_envvars/test_nonbundle_static_library.sh new file mode 100755 index 0000000000..86c04a913b --- /dev/null +++ b/deps/gyp/test/mac/type_envvars/test_nonbundle_static_library.sh @@ -0,0 +1,20 @@ +#!/bin/bash +# 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. + +set -e + +test $MACH_O_TYPE = staticlib +test $PRODUCT_TYPE = com.apple.product-type.library.static +test $PRODUCT_NAME = nonbundle_static_library +test $FULL_PRODUCT_NAME = libnonbundle_static_library.a + +test $EXECUTABLE_NAME = libnonbundle_static_library.a +test $EXECUTABLE_PATH = libnonbundle_static_library.a +[[ ! $WRAPPER_NAME && ${WRAPPER_NAME-_} ]] + +[[ ! $DYLIB_INSTALL_NAME_BASE && ${DYLIB_INSTALL_NAME_BASE-_} ]] +[[ ! $LD_DYLIB_INSTALL_NAME && ${LD_DYLIB_INSTALL_NAME-_} ]] + +"$(dirname "$0")/test_check_sdkroot.sh" diff --git a/deps/gyp/test/mac/unicode-settings/file.cc b/deps/gyp/test/mac/unicode-settings/file.cc new file mode 100644 index 0000000000..b2f997621b --- /dev/null +++ b/deps/gyp/test/mac/unicode-settings/file.cc @@ -0,0 +1,2 @@ +int main() { +} diff --git a/deps/gyp/test/mac/unicode-settings/test.gyp b/deps/gyp/test/mac/unicode-settings/test.gyp new file mode 100644 index 0000000000..b331ae453f --- /dev/null +++ b/deps/gyp/test/mac/unicode-settings/test.gyp @@ -0,0 +1,23 @@ +# Copyright 2013 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. + +{ + 'targets': [ + { + 'target_name': 'myapp', + 'type': 'executable', + 'mac_bundle': 1, + 'sources': [ 'file.cc', ], + 'xcode_settings': { + 'BUNDLE_DISPLAY_NAME': 'α\011', + }, + 'postbuilds': [ + { + 'postbuild_name': 'envtest', + 'action': [ './test_bundle_display_name.sh', ], + }, + ], + }, + ], +} diff --git a/deps/gyp/test/mac/unicode-settings/test_bundle_display_name.sh b/deps/gyp/test/mac/unicode-settings/test_bundle_display_name.sh new file mode 100755 index 0000000000..95dd6267a3 --- /dev/null +++ b/deps/gyp/test/mac/unicode-settings/test_bundle_display_name.sh @@ -0,0 +1,7 @@ +#!/bin/bash + +# Copyright 2013 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. + +test "${BUNDLE_DISPLAY_NAME}" = 'α ' diff --git a/deps/gyp/test/mac/xcode-env-order/Info.plist b/deps/gyp/test/mac/xcode-env-order/Info.plist new file mode 100644 index 0000000000..e11f21e52d --- /dev/null +++ b/deps/gyp/test/mac/xcode-env-order/Info.plist @@ -0,0 +1,56 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> +<plist version="1.0"> +<dict> + <key>CFBundleDevelopmentRegion</key> + <string>English</string> + <key>CFBundleExecutable</key> + <string>${EXECUTABLE_NAME}</string> + <key>CFBundleIconFile</key> + <string></string> + <key>CFBundleIdentifier</key> + <string>com.google.${PRODUCT_NAME}</string> + <key>CFBundleInfoDictionaryVersion</key> + <string>6.0</string> + <key>CFBundleName</key> + <string>${PRODUCT_NAME}</string> + <key>CFBundlePackageType</key> + <string>APPL</string> + <key>CFBundleShortVersionString</key> + <string>1.0</string> + <key>CFBundleSignature</key> + <string>????</string> + <key>CFBundleVersion</key> + <string>1</string> + <key>LSMinimumSystemVersion</key> + <string>${MACOSX_DEPLOYMENT_TARGET}</string> + <key>NSMainNibFile</key> + <string>MainMenu</string> + <key>NSPrincipalClass</key> + <string>NSApplication</string> + + <key>BraceProcessedKey1</key> + <string>${BRACE_DEPENDENT_KEY1}</string> + <key>BraceProcessedKey2</key> + <string>${BRACE_DEPENDENT_KEY2}</string> + <key>BraceProcessedKey3</key> + <string>${BRACE_DEPENDENT_KEY3}</string> + + <key>ParenProcessedKey1</key> + <string>${PAREN_DEPENDENT_KEY1}</string> + <key>ParenProcessedKey2</key> + <string>${PAREN_DEPENDENT_KEY2}</string> + <key>ParenProcessedKey3</key> + <string>${PAREN_DEPENDENT_KEY3}</string> + + <key>BareProcessedKey1</key> + <string>${BARE_DEPENDENT_KEY1}</string> + <key>BareProcessedKey2</key> + <string>${BARE_DEPENDENT_KEY2}</string> + <key>BareProcessedKey3</key> + <string>${BARE_DEPENDENT_KEY3}</string> + + <key>MixedProcessedKey</key> + <string>${MIXED_DEPENDENT_KEY}</string> +</dict> +</plist> diff --git a/deps/gyp/test/mac/xcode-env-order/file.ext1 b/deps/gyp/test/mac/xcode-env-order/file.ext1 new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/deps/gyp/test/mac/xcode-env-order/file.ext1 diff --git a/deps/gyp/test/mac/xcode-env-order/file.ext2 b/deps/gyp/test/mac/xcode-env-order/file.ext2 new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/deps/gyp/test/mac/xcode-env-order/file.ext2 diff --git a/deps/gyp/test/mac/xcode-env-order/file.ext3 b/deps/gyp/test/mac/xcode-env-order/file.ext3 new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/deps/gyp/test/mac/xcode-env-order/file.ext3 diff --git a/deps/gyp/test/mac/xcode-env-order/main.c b/deps/gyp/test/mac/xcode-env-order/main.c new file mode 100644 index 0000000000..1bf4b2a11a --- /dev/null +++ b/deps/gyp/test/mac/xcode-env-order/main.c @@ -0,0 +1,7 @@ +// Copyright (c) 2011 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. + +int main() { + return 0; +} diff --git a/deps/gyp/test/mac/xcode-env-order/test.gyp b/deps/gyp/test/mac/xcode-env-order/test.gyp new file mode 100644 index 0000000000..8f975f7d6b --- /dev/null +++ b/deps/gyp/test/mac/xcode-env-order/test.gyp @@ -0,0 +1,121 @@ +# 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. +{ + 'targets': [ + { + 'target_name': 'test_app', + 'product_name': 'Test', + 'type': 'executable', + 'mac_bundle': 1, + 'sources': [ + 'main.c', + 'file.ext1', + 'file.ext2', + 'file.ext3', + ], + # Env vars in copies. + 'copies': [ + { + 'destination': '<(PRODUCT_DIR)/${PRODUCT_NAME}-copy-brace', + 'files': [ 'main.c', ], # ${SOURCE_ROOT} doesn't work with xcode + }, + { + 'destination': '<(PRODUCT_DIR)/$(PRODUCT_NAME)-copy-paren', + 'files': [ '$(SOURCE_ROOT)/main.c', ], + }, + { + 'destination': '<(PRODUCT_DIR)/$PRODUCT_NAME-copy-bare', + 'files': [ 'main.c', ], # $SOURCE_ROOT doesn't work with xcode + }, + ], + # Env vars in actions. The $FOO's are here to test that env vars that + # aren't defined are handled in some way that doesn't break the build. + 'actions': [ + { + 'action_name': 'Action copy braces ${PRODUCT_NAME} ${FOO}', + 'description': 'Action copy braces ${PRODUCT_NAME} ${FOO}', + 'inputs': [ '${SOURCE_ROOT}/main.c' ], + # Referencing ${PRODUCT_NAME} in action outputs doesn't work with + # the Xcode generator (PRODUCT_NAME expands to "Test Support"). + 'outputs': [ '<(PRODUCT_DIR)/action-copy-brace.txt' ], + 'action': [ 'cp', '${SOURCE_ROOT}/main.c', + '<(PRODUCT_DIR)/action-copy-brace.txt' ], + }, + { + 'action_name': 'Action copy parens $(PRODUCT_NAME) $(FOO)', + 'description': 'Action copy parens $(PRODUCT_NAME) $(FOO)', + 'inputs': [ '$(SOURCE_ROOT)/main.c' ], + # Referencing $(PRODUCT_NAME) in action outputs doesn't work with + # the Xcode generator (PRODUCT_NAME expands to "Test Support"). + 'outputs': [ '<(PRODUCT_DIR)/action-copy-paren.txt' ], + 'action': [ 'cp', '$(SOURCE_ROOT)/main.c', + '<(PRODUCT_DIR)/action-copy-paren.txt' ], + }, + { + 'action_name': 'Action copy bare $PRODUCT_NAME $FOO', + 'description': 'Action copy bare $PRODUCT_NAME $FOO', + 'inputs': [ '$SOURCE_ROOT/main.c' ], + # Referencing $PRODUCT_NAME in action outputs doesn't work with + # the Xcode generator (PRODUCT_NAME expands to "Test Support"). + 'outputs': [ '<(PRODUCT_DIR)/action-copy-bare.txt' ], + 'action': [ 'cp', '$SOURCE_ROOT/main.c', + '<(PRODUCT_DIR)/action-copy-bare.txt' ], + }, + ], + # Env vars in xcode_settings. + 'xcode_settings': { + 'INFOPLIST_FILE': 'Info.plist', + 'STRING_KEY': '/Source/Project', + + 'BRACE_DEPENDENT_KEY2': '${STRING_KEY}/${PRODUCT_NAME}', + 'BRACE_DEPENDENT_KEY1': 'D:${BRACE_DEPENDENT_KEY2}', + 'BRACE_DEPENDENT_KEY3': '${PRODUCT_TYPE}:${BRACE_DEPENDENT_KEY1}', + + 'PAREN_DEPENDENT_KEY2': '$(STRING_KEY)/$(PRODUCT_NAME)', + 'PAREN_DEPENDENT_KEY1': 'D:$(PAREN_DEPENDENT_KEY2)', + 'PAREN_DEPENDENT_KEY3': '$(PRODUCT_TYPE):$(PAREN_DEPENDENT_KEY1)', + + 'BARE_DEPENDENT_KEY2': '$STRING_KEY/$PRODUCT_NAME', + 'BARE_DEPENDENT_KEY1': 'D:$BARE_DEPENDENT_KEY2', + 'BARE_DEPENDENT_KEY3': '$PRODUCT_TYPE:$BARE_DEPENDENT_KEY1', + + 'MIXED_DEPENDENT_KEY': '${STRING_KEY}:$(PRODUCT_NAME):$MACH_O_TYPE', + }, + # Env vars in rules. The $FOO's are here to test that env vars that + # aren't defined are handled in some way that doesn't break the build. + 'rules': [ + { + 'rule_name': 'brace_rule', + 'message': 'Rule braces ${PRODUCT_NAME} ${FOO} <(RULE_INPUT_NAME)', + 'extension': 'ext1', + 'inputs': [ '${SOURCE_ROOT}/main.c' ], + 'outputs': [ '<(PRODUCT_DIR)/rule-copy-brace.txt' ], + 'action': [ 'cp', '${SOURCE_ROOT}/main.c', + '<(PRODUCT_DIR)/rule-copy-brace.txt' ], + }, + { + 'rule_name': 'paren_rule', + 'message': 'Rule parens $(PRODUCT_NAME) $(FOO) <(RULE_INPUT_NAME)', + 'extension': 'ext2', + 'inputs': [ '$(SOURCE_ROOT)/main.c' ], + 'outputs': [ '<(PRODUCT_DIR)/rule-copy-paren.txt' ], + 'action': [ 'cp', '$(SOURCE_ROOT)/main.c', + '<(PRODUCT_DIR)/rule-copy-paren.txt' ], + }, + # TODO: Fails in xcode. Looks like a bug in the xcode generator though + # (which uses makefiles for rules, and thinks $PRODUCT_NAME is + # $(P)RODUCT_NAME). + #{ + # 'rule_name': 'bare_rule', + # 'message': 'Rule copy bare $PRODUCT_NAME $FOO', + # 'extension': 'ext3', + # 'inputs': [ '$SOURCE_ROOT/main.c' ], + # 'outputs': [ '<(PRODUCT_DIR)/rule-copy-bare.txt' ], + # 'action': [ 'cp', '$SOURCE_ROOT/main.c', + # '<(PRODUCT_DIR)/rule-copy-bare.txt' ], + #}, + ], + }, + ], +} diff --git a/deps/gyp/test/mac/xcode-gcc/aliasing.cc b/deps/gyp/test/mac/xcode-gcc/aliasing.cc new file mode 100644 index 0000000000..16a41efb15 --- /dev/null +++ b/deps/gyp/test/mac/xcode-gcc/aliasing.cc @@ -0,0 +1,13 @@ +#include <stdio.h> + +void check(int* h, long* k) { + *h = 1; + *k = 0; + printf("%d\n", *h); +} + +int main(void) { + long k; + check((int*)&k, &k); + return 0; +} diff --git a/deps/gyp/test/mac/xcode-gcc/test-clang.gyp b/deps/gyp/test/mac/xcode-gcc/test-clang.gyp new file mode 100644 index 0000000000..9f4a98ae73 --- /dev/null +++ b/deps/gyp/test/mac/xcode-gcc/test-clang.gyp @@ -0,0 +1,42 @@ +# Copyright (c) 2013 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. +{ + 'make_global_settings': [ + ['CC', '/usr/bin/clang'], + ['CXX', '/usr/bin/clang++'], + ], + + 'targets': [ + { + 'target_name': 'aliasing_yes', + 'type': 'executable', + 'sources': [ 'aliasing.cc', ], + 'xcode_settings': { + 'GCC_VERSION': 'com.apple.compilers.llvm.clang.1_0', + 'GCC_STRICT_ALIASING': 'YES', + 'GCC_OPTIMIZATION_LEVEL': 2, + }, + }, + { + 'target_name': 'aliasing_no', + 'type': 'executable', + 'sources': [ 'aliasing.cc', ], + 'xcode_settings': { + 'GCC_VERSION': 'com.apple.compilers.llvm.clang.1_0', + 'GCC_STRICT_ALIASING': 'NO', + 'GCC_OPTIMIZATION_LEVEL': 2, + }, + }, + { + 'target_name': 'aliasing_default', + 'type': 'executable', + 'sources': [ 'aliasing.cc', ], + 'xcode_settings': { + 'GCC_VERSION': 'com.apple.compilers.llvm.clang.1_0', + 'GCC_OPTIMIZATION_LEVEL': 2, + }, + }, + ], +} + diff --git a/deps/gyp/test/mac/xcode-gcc/test.gyp b/deps/gyp/test/mac/xcode-gcc/test.gyp new file mode 100644 index 0000000000..1ca8b215d8 --- /dev/null +++ b/deps/gyp/test/mac/xcode-gcc/test.gyp @@ -0,0 +1,60 @@ +# 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. +{ + 'target_defaults': { + 'xcode_settings': { + 'GCC_TREAT_WARNINGS_AS_ERRORS': 'YES', + }, + }, + + 'variables': { + # Non-failing tests should check that these trivial files in every language + # still compile correctly. + 'valid_sources': [ + 'valid_c.c', + 'valid_cc.cc', + 'valid_m.m', + 'valid_mm.mm', + ], + }, + + # Targets come in pairs: 'foo' and 'foo-fail', with the former building with + # no warnings and the latter not. + 'targets': [ + # GCC_WARN_ABOUT_INVALID_OFFSETOF_MACRO (default: YES): + { + 'target_name': 'warn_about_invalid_offsetof_macro', + 'type': 'executable', + 'sources': [ + 'warn_about_invalid_offsetof_macro.cc', + '<@(valid_sources)', + ], + 'xcode_settings': { + 'GCC_WARN_ABOUT_INVALID_OFFSETOF_MACRO': 'NO', + }, + }, + { + 'target_name': 'warn_about_invalid_offsetof_macro-fail', + 'type': 'executable', + 'sources': [ 'warn_about_invalid_offsetof_macro.cc', ], + }, + # GCC_WARN_ABOUT_MISSING_NEWLINE (default: NO): + { + 'target_name': 'warn_about_missing_newline', + 'type': 'executable', + 'sources': [ + 'warn_about_missing_newline.c', + '<@(valid_sources)', + ], + }, + { + 'target_name': 'warn_about_missing_newline-fail', + 'type': 'executable', + 'sources': [ 'warn_about_missing_newline.c', ], + 'xcode_settings': { + 'GCC_WARN_ABOUT_MISSING_NEWLINE': 'YES', + }, + }, + ], +} diff --git a/deps/gyp/test/mac/xcode-gcc/valid_c.c b/deps/gyp/test/mac/xcode-gcc/valid_c.c new file mode 100644 index 0000000000..2b10ac3ed7 --- /dev/null +++ b/deps/gyp/test/mac/xcode-gcc/valid_c.c @@ -0,0 +1,8 @@ +// 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. + +// This file exists to test that valid C files compile correctly. + +void FunctionInCFile(void) { +} diff --git a/deps/gyp/test/mac/xcode-gcc/valid_cc.cc b/deps/gyp/test/mac/xcode-gcc/valid_cc.cc new file mode 100644 index 0000000000..31cddc3c9c --- /dev/null +++ b/deps/gyp/test/mac/xcode-gcc/valid_cc.cc @@ -0,0 +1,8 @@ +// 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. + +// This file exists to test that valid C++ files compile correctly. + +void FunctionInCCFile() { +} diff --git a/deps/gyp/test/mac/xcode-gcc/valid_m.m b/deps/gyp/test/mac/xcode-gcc/valid_m.m new file mode 100644 index 0000000000..95bddb2723 --- /dev/null +++ b/deps/gyp/test/mac/xcode-gcc/valid_m.m @@ -0,0 +1,8 @@ +// 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. + +// This file exists to test that valid Objective-C files compile correctly. + +void FunctionInMFile(void) { +} diff --git a/deps/gyp/test/mac/xcode-gcc/valid_mm.mm b/deps/gyp/test/mac/xcode-gcc/valid_mm.mm new file mode 100644 index 0000000000..a7db7e3ad6 --- /dev/null +++ b/deps/gyp/test/mac/xcode-gcc/valid_mm.mm @@ -0,0 +1,8 @@ +// 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. + +// This file exists to test that valid Objective-C++ files compile correctly. + +void FunctionInMMFile() { +} diff --git a/deps/gyp/test/mac/xcode-gcc/warn_about_invalid_offsetof_macro.cc b/deps/gyp/test/mac/xcode-gcc/warn_about_invalid_offsetof_macro.cc new file mode 100644 index 0000000000..4a4612be0d --- /dev/null +++ b/deps/gyp/test/mac/xcode-gcc/warn_about_invalid_offsetof_macro.cc @@ -0,0 +1,15 @@ +// 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. + +#define offsetof(st, m) ((unsigned)((char*)&((st*)0)->m - (char*)0)) + +struct MyStruct { + virtual void MyFunc() = 0; + int my_member; +}; + +int main() { + unsigned x = offsetof(MyStruct, my_member); + return x ? 0 : 1; +} diff --git a/deps/gyp/test/mac/xcode-gcc/warn_about_missing_newline.c b/deps/gyp/test/mac/xcode-gcc/warn_about_missing_newline.c new file mode 100644 index 0000000000..6faf0895db --- /dev/null +++ b/deps/gyp/test/mac/xcode-gcc/warn_about_missing_newline.c @@ -0,0 +1,8 @@ +// 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. + +// Important: Don't terminate this file with a newline. +int main() { + return 0; +}
\ No newline at end of file diff --git a/deps/gyp/test/mac/xcode-support-actions/source.c b/deps/gyp/test/mac/xcode-support-actions/source.c new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/deps/gyp/test/mac/xcode-support-actions/source.c diff --git a/deps/gyp/test/mac/xcode-support-actions/test.gyp b/deps/gyp/test/mac/xcode-support-actions/test.gyp new file mode 100644 index 0000000000..ad81b8c456 --- /dev/null +++ b/deps/gyp/test/mac/xcode-support-actions/test.gyp @@ -0,0 +1,26 @@ +# Copyright (c) 2014 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. +{ + 'targets': [ + { + 'target_name': 'target', + 'product_name': 'Product', + 'type': 'shared_library', + 'mac_bundle': 1, + 'sources': [ + '<(PRODUCT_DIR)/copy.c', + ], + 'actions': [ + { + 'action_name': 'Helper', + 'description': 'Helps', + 'inputs': [ 'source.c' ], + 'outputs': [ '<(PRODUCT_DIR)/copy.c' ], + 'action': [ 'cp', '${SOURCE_ROOT}/source.c', + '<(PRODUCT_DIR)/copy.c' ], + }, + ], + }, + ], +} diff --git a/deps/gyp/test/mac/xctest/MyClass.h b/deps/gyp/test/mac/xctest/MyClass.h new file mode 100644 index 0000000000..dde13aa33d --- /dev/null +++ b/deps/gyp/test/mac/xctest/MyClass.h @@ -0,0 +1,8 @@ +// Copyright (c) 2013 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 <Foundation/Foundation.h> + +@interface MyClass : NSObject +@end diff --git a/deps/gyp/test/mac/xctest/MyClass.m b/deps/gyp/test/mac/xctest/MyClass.m new file mode 100644 index 0000000000..df11471b07 --- /dev/null +++ b/deps/gyp/test/mac/xctest/MyClass.m @@ -0,0 +1,8 @@ +// Copyright (c) 2013 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 "MyClass.h" + +@implementation MyClass +@end diff --git a/deps/gyp/test/mac/xctest/TestCase.m b/deps/gyp/test/mac/xctest/TestCase.m new file mode 100644 index 0000000000..36846a1fda --- /dev/null +++ b/deps/gyp/test/mac/xctest/TestCase.m @@ -0,0 +1,16 @@ +// Copyright (c) 2013 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 <XCTest/XCTest.h> +#import "MyClass.h" + +@interface TestCase : XCTestCase +@end + +@implementation TestCase +- (void)testFoo { + MyClass *foo = [[MyClass alloc] init]; + XCTAssertNotNil(foo, @"expected non-nil object"); +} +@end diff --git a/deps/gyp/test/mac/xctest/resource.txt b/deps/gyp/test/mac/xctest/resource.txt new file mode 100644 index 0000000000..257cc5642c --- /dev/null +++ b/deps/gyp/test/mac/xctest/resource.txt @@ -0,0 +1 @@ +foo diff --git a/deps/gyp/test/mac/xctest/test.gyp b/deps/gyp/test/mac/xctest/test.gyp new file mode 100644 index 0000000000..ac25656b35 --- /dev/null +++ b/deps/gyp/test/mac/xctest/test.gyp @@ -0,0 +1,47 @@ +# Copyright (c) 2013 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. + +{ + 'targets': [ + { + 'target_name': 'classes', + 'type': 'static_library', + 'sources': [ + 'MyClass.h', + 'MyClass.m', + ], + 'link_settings': { + 'libraries': [ + '$(SDKROOT)/System/Library/Frameworks/Foundation.framework', + ], + }, + }, + { + 'target_name': 'tests', + 'type': 'loadable_module', + 'mac_xctest_bundle': 1, + 'sources': [ + 'TestCase.m', + ], + 'dependencies': [ + 'classes', + ], + 'mac_bundle_resources': [ + 'resource.txt', + ], + 'xcode_settings': { + 'WRAPPER_EXTENSION': 'xctest', + 'FRAMEWORK_SEARCH_PATHS': [ + '$(inherited)', + '$(DEVELOPER_FRAMEWORKS_DIR)', + ], + 'OTHER_LDFLAGS': [ + '$(inherited)', + '-ObjC', + ], + }, + }, + ], +} + diff --git a/deps/gyp/test/make/dependencies.gyp b/deps/gyp/test/make/dependencies.gyp new file mode 100644 index 0000000000..e2bee24fce --- /dev/null +++ b/deps/gyp/test/make/dependencies.gyp @@ -0,0 +1,15 @@ +# Copyright (c) 2009 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. + +{ + 'targets': [ + { + 'target_name': 'main', + 'type': 'executable', + 'sources': [ + 'main.cc', + ], + }, + ], +} diff --git a/deps/gyp/test/make/gyptest-dependencies.py b/deps/gyp/test/make/gyptest-dependencies.py new file mode 100755 index 0000000000..d215f76782 --- /dev/null +++ b/deps/gyp/test/make/gyptest-dependencies.py @@ -0,0 +1,26 @@ +#!/usr/bin/env python + +# 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. + +""" +Verifies that .d files and all.deps are properly generated. +""" + +import TestGyp + +# .d files are only used by the make build. +test = TestGyp.TestGyp(formats=['make']) + +test.run_gyp('dependencies.gyp') + +test.build('dependencies.gyp', test.ALL) + +deps_file = test.built_file_path(".deps/out/Default/obj.target/main/main.o.d") +test.must_contain(deps_file, "main.h") + +# Build a second time to make sure we generate all.deps. +test.build('dependencies.gyp', test.ALL) + +test.pass_test() diff --git a/deps/gyp/test/make/gyptest-noload.py b/deps/gyp/test/make/gyptest-noload.py new file mode 100755 index 0000000000..1f5103315c --- /dev/null +++ b/deps/gyp/test/make/gyptest-noload.py @@ -0,0 +1,57 @@ +#!/usr/bin/env python + +# Copyright (c) 2010 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. + +""" +Tests the use of the NO_LOAD flag which makes loading sub .mk files +optional. +""" + +# Python 2.5 needs this for the with statement. +from __future__ import with_statement + +import os +import TestGyp + +test = TestGyp.TestGyp(formats=['make']) + +test.run_gyp('all.gyp', chdir='noload') + +test.relocate('noload', 'relocate/noload') + +test.build('build/all.gyp', test.ALL, chdir='relocate/noload') +test.run_built_executable('exe', chdir='relocate/noload', + stdout='Hello from shared.c.\n') + +# Just sanity test that NO_LOAD=lib doesn't break anything. +test.build('build/all.gyp', test.ALL, chdir='relocate/noload', + arguments=['NO_LOAD=lib']) +test.run_built_executable('exe', chdir='relocate/noload', + stdout='Hello from shared.c.\n') +test.build('build/all.gyp', test.ALL, chdir='relocate/noload', + arguments=['NO_LOAD=z']) +test.run_built_executable('exe', chdir='relocate/noload', + stdout='Hello from shared.c.\n') + +# Make sure we can rebuild without reloading the sub .mk file. +with open('relocate/noload/main.c', 'a') as src_file: + src_file.write("\n") +test.build('build/all.gyp', test.ALL, chdir='relocate/noload', + arguments=['NO_LOAD=lib']) +test.run_built_executable('exe', chdir='relocate/noload', + stdout='Hello from shared.c.\n') + +# Change shared.c, but verify that it doesn't get rebuild if we don't load it. +with open('relocate/noload/lib/shared.c', 'w') as shared_file: + shared_file.write( + '#include "shared.h"\n' + 'const char kSharedStr[] = "modified";\n' + ) +test.build('build/all.gyp', test.ALL, chdir='relocate/noload', + arguments=['NO_LOAD=lib']) +test.run_built_executable('exe', chdir='relocate/noload', + stdout='Hello from shared.c.\n') + +test.pass_test() diff --git a/deps/gyp/test/make/main.cc b/deps/gyp/test/make/main.cc new file mode 100644 index 0000000000..3b9a705c24 --- /dev/null +++ b/deps/gyp/test/make/main.cc @@ -0,0 +1,12 @@ +/* Copyright (c) 2009 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. */ + +#include <stdio.h> + +#include "main.h" + +int main(void) { + printf("hello world\n"); + return 0; +} diff --git a/deps/gyp/test/make/main.h b/deps/gyp/test/make/main.h new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/deps/gyp/test/make/main.h diff --git a/deps/gyp/test/make/noload/all.gyp b/deps/gyp/test/make/noload/all.gyp new file mode 100644 index 0000000000..1617a9e97c --- /dev/null +++ b/deps/gyp/test/make/noload/all.gyp @@ -0,0 +1,18 @@ +# Copyright (c) 2010 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. + +{ + 'targets': [ + { + 'target_name': 'exe', + 'type': 'executable', + 'sources': [ + 'main.c', + ], + 'dependencies': [ + 'lib/shared.gyp:shared', + ], + }, + ], +} diff --git a/deps/gyp/test/make/noload/lib/shared.c b/deps/gyp/test/make/noload/lib/shared.c new file mode 100644 index 0000000000..51776c5acf --- /dev/null +++ b/deps/gyp/test/make/noload/lib/shared.c @@ -0,0 +1,3 @@ +#include "shared.h" + +const char kSharedStr[] = "shared.c"; diff --git a/deps/gyp/test/make/noload/lib/shared.gyp b/deps/gyp/test/make/noload/lib/shared.gyp new file mode 100644 index 0000000000..8a8841b3a0 --- /dev/null +++ b/deps/gyp/test/make/noload/lib/shared.gyp @@ -0,0 +1,16 @@ +# Copyright (c) 2009 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. + +{ + 'targets': [ + { + 'target_name': 'shared', + 'type': 'shared_library', + 'sources': [ + 'shared.c', + 'shared.h', + ], + }, + ], +} diff --git a/deps/gyp/test/make/noload/lib/shared.h b/deps/gyp/test/make/noload/lib/shared.h new file mode 100644 index 0000000000..a21da7538b --- /dev/null +++ b/deps/gyp/test/make/noload/lib/shared.h @@ -0,0 +1 @@ +extern const char kSharedStr[]; diff --git a/deps/gyp/test/make/noload/main.c b/deps/gyp/test/make/noload/main.c new file mode 100644 index 0000000000..26ec1889ad --- /dev/null +++ b/deps/gyp/test/make/noload/main.c @@ -0,0 +1,9 @@ +#include <stdio.h> + +#include "lib/shared.h" + +int main(void) +{ + printf("Hello from %s.\n", kSharedStr); + return 0; +} diff --git a/deps/gyp/test/make_global_settings/ar/gyptest-make_global_settings_ar.py b/deps/gyp/test/make_global_settings/ar/gyptest-make_global_settings_ar.py new file mode 100644 index 0000000000..e6676de6bd --- /dev/null +++ b/deps/gyp/test/make_global_settings/ar/gyptest-make_global_settings_ar.py @@ -0,0 +1,126 @@ +#!/usr/bin/env python + +# Copyright (c) 2014 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. + +""" +Verifies 'AR' in make_global_settings. +""" + +import os +import sys +import TestGyp + +def resolve_path(test, path): + if path is None: + return None + elif test.format == 'make': + return '$(abspath %s)' % path + elif test.format in ['ninja', 'xcode-ninja']: + return os.path.join('..', '..', path) + else: + test.fail_test() + + +def verify_ar_target(test, ar=None, rel_path=False): + if rel_path: + ar_expected = resolve_path(test, ar) + else: + ar_expected = ar + # Resolve default values + if ar_expected is None: + if test.format == 'make': + # Make generator hasn't set the default value for AR. + # You can remove the following assertion as long as it doesn't + # break existing projects. + test.must_not_contain('Makefile', 'AR ?= ') + return + elif test.format in ['ninja', 'xcode-ninja']: + if sys.platform == 'win32': + ar_expected = 'lib.exe' + else: + ar_expected = 'ar' + if test.format == 'make': + test.must_contain('Makefile', 'AR ?= %s' % ar_expected) + elif test.format in ['ninja', 'xcode-ninja']: + test.must_contain('out/Default/build.ninja', 'ar = %s' % ar_expected) + else: + test.fail_test() + + +def verify_ar_host(test, ar=None, rel_path=False): + if rel_path: + ar_expected = resolve_path(test, ar) + else: + ar_expected = ar + # Resolve default values + if ar_expected is None: + if sys.platform == 'win32': + ar_expected = 'lib.exe' + else: + ar_expected = 'ar' + if test.format == 'make': + test.must_contain('Makefile', 'AR.host ?= %s' % ar_expected) + elif test.format in ['ninja', 'xcode-ninja']: + test.must_contain('out/Default/build.ninja', 'ar_host = %s' % ar_expected) + else: + test.fail_test() + + +test_format = ['ninja'] +if sys.platform in ('linux2', 'darwin'): + test_format += ['make'] + +test = TestGyp.TestGyp(formats=test_format) + +# Check default values +test.run_gyp('make_global_settings_ar.gyp') +verify_ar_target(test) + + +# Check default values with GYP_CROSSCOMPILE enabled. +with TestGyp.LocalEnv({'GYP_CROSSCOMPILE': '1'}): + test.run_gyp('make_global_settings_ar.gyp') +verify_ar_target(test) +verify_ar_host(test) + + +# Test 'AR' in 'make_global_settings'. +with TestGyp.LocalEnv({'GYP_CROSSCOMPILE': '1'}): + test.run_gyp('make_global_settings_ar.gyp', '-Dcustom_ar_target=my_ar') +verify_ar_target(test, ar='my_ar', rel_path=True) + + +# Test 'AR'/'AR.host' in 'make_global_settings'. +with TestGyp.LocalEnv({'GYP_CROSSCOMPILE': '1'}): + test.run_gyp('make_global_settings_ar.gyp', + '-Dcustom_ar_target=my_ar_target1', + '-Dcustom_ar_host=my_ar_host1') +verify_ar_target(test, ar='my_ar_target1', rel_path=True) +verify_ar_host(test, ar='my_ar_host1', rel_path=True) + + +# Test $AR and $AR_host environment variables. +with TestGyp.LocalEnv({'AR': 'my_ar_target2', + 'AR_host': 'my_ar_host2'}): + test.run_gyp('make_global_settings_ar.gyp') +# Ninja generator resolves $AR in gyp phase. Make generator doesn't. +if test.format == 'ninja': + if sys.platform == 'win32': + # TODO(yukawa): Make sure if this is an expected result or not. + verify_ar_target(test, ar='lib.exe', rel_path=False) + else: + verify_ar_target(test, ar='my_ar_target2', rel_path=False) +verify_ar_host(test, ar='my_ar_host2', rel_path=False) + + +# Test 'AR' in 'make_global_settings' with $AR_host environment variable. +with TestGyp.LocalEnv({'AR_host': 'my_ar_host3'}): + test.run_gyp('make_global_settings_ar.gyp', + '-Dcustom_ar_target=my_ar_target3') +verify_ar_target(test, ar='my_ar_target3', rel_path=True) +verify_ar_host(test, ar='my_ar_host3', rel_path=False) + + +test.pass_test() diff --git a/deps/gyp/test/make_global_settings/ar/make_global_settings_ar.gyp b/deps/gyp/test/make_global_settings/ar/make_global_settings_ar.gyp new file mode 100644 index 0000000000..3430d82a51 --- /dev/null +++ b/deps/gyp/test/make_global_settings/ar/make_global_settings_ar.gyp @@ -0,0 +1,29 @@ +# Copyright (c) 2014 Google Inc. All rights reserved. +# Use of this source code is governed by a BSD-style licence that can be +# found in the LICENSE file. + +{ + 'variables': { + 'custom_ar_target%': '', + 'custom_ar_host%': '', + }, + 'conditions': [ + ['"<(custom_ar_target)"!=""', { + 'make_global_settings': [ + ['AR', '<(custom_ar_target)'], + ], + }], + ['"<(custom_ar_host)"!=""', { + 'make_global_settings': [ + ['AR.host', '<(custom_ar_host)'], + ], + }], + ], + 'targets': [ + { + 'target_name': 'make_global_settings_ar_test', + 'type': 'static_library', + 'sources': [ 'foo.c' ], + }, + ], +} diff --git a/deps/gyp/test/make_global_settings/basics/gyptest-make_global_settings.py b/deps/gyp/test/make_global_settings/basics/gyptest-make_global_settings.py new file mode 100644 index 0000000000..63d1d0af90 --- /dev/null +++ b/deps/gyp/test/make_global_settings/basics/gyptest-make_global_settings.py @@ -0,0 +1,46 @@ +#!/usr/bin/env python + +# Copyright (c) 2013 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. + +""" +Verifies make_global_settings. +""" + +import os +import sys +import TestGyp + +test_format = ['ninja'] +if sys.platform in ('linux2', 'darwin'): + test_format += ['make'] + +test = TestGyp.TestGyp(formats=test_format) + +test.run_gyp('make_global_settings.gyp') + +if test.format == 'make': + cc_expected = """ifneq (,$(filter $(origin CC), undefined default)) + CC = $(abspath clang) +endif +""" + if sys.platform == 'linux2': + link_expected = """ +LINK ?= $(abspath clang) +""" + elif sys.platform == 'darwin': + link_expected = """ +LINK ?= $(abspath clang) +""" + test.must_contain('Makefile', cc_expected) + test.must_contain('Makefile', link_expected) +if test.format == 'ninja': + cc_expected = 'cc = ' + os.path.join('..', '..', 'clang') + ld_expected = 'ld = $cc' + if sys.platform == 'win32': + ld_expected = 'link.exe' + test.must_contain('out/Default/build.ninja', cc_expected) + test.must_contain('out/Default/build.ninja', ld_expected) + +test.pass_test() diff --git a/deps/gyp/test/make_global_settings/basics/make_global_settings.gyp b/deps/gyp/test/make_global_settings/basics/make_global_settings.gyp new file mode 100644 index 0000000000..47dbc8570f --- /dev/null +++ b/deps/gyp/test/make_global_settings/basics/make_global_settings.gyp @@ -0,0 +1,17 @@ +# Copyright (c) 2013 Google Inc. All rights reserved. +# Use of this source code is governed by a BSD-style licence that can be +# found in the LICENSE file. + +{ + 'make_global_settings': [ + ['CC', 'clang'], + ['LINK', 'clang'], + ], + 'targets': [ + { + 'target_name': 'test', + 'type': 'static_library', + 'sources': [ 'foo.c' ], + }, + ], +} diff --git a/deps/gyp/test/make_global_settings/env-wrapper/gyptest-wrapper.py b/deps/gyp/test/make_global_settings/env-wrapper/gyptest-wrapper.py new file mode 100644 index 0000000000..70d6906cca --- /dev/null +++ b/deps/gyp/test/make_global_settings/env-wrapper/gyptest-wrapper.py @@ -0,0 +1,46 @@ +#!/usr/bin/env python + +# Copyright (c) 2013 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. + +""" +Verifies *_wrapper in environment. +""" + +import os +import sys +import TestGyp + +test_format = ['ninja'] + +os.environ['CC_wrapper'] = 'distcc' +os.environ['LINK_wrapper'] = 'distlink' +os.environ['CC.host_wrapper'] = 'ccache' + +test = TestGyp.TestGyp(formats=test_format) + +old_env = dict(os.environ) +os.environ['GYP_CROSSCOMPILE'] = '1' +test.run_gyp('wrapper.gyp') +os.environ.clear() +os.environ.update(old_env) + +if test.format == 'ninja': + cc_expected = ('cc = ' + os.path.join('..', '..', 'distcc') + ' ' + + os.path.join('..', '..', 'clang')) + cc_host_expected = ('cc_host = ' + os.path.join('..', '..', 'ccache') + ' ' + + os.path.join('..', '..', 'clang')) + ld_expected = 'ld = ../../distlink $cc' + if sys.platform != 'win32': + ldxx_expected = 'ldxx = ../../distlink $cxx' + + if sys.platform == 'win32': + ld_expected = 'link.exe' + test.must_contain('out/Default/build.ninja', cc_expected) + test.must_contain('out/Default/build.ninja', cc_host_expected) + test.must_contain('out/Default/build.ninja', ld_expected) + if sys.platform != 'win32': + test.must_contain('out/Default/build.ninja', ldxx_expected) + +test.pass_test() diff --git a/deps/gyp/test/make_global_settings/env-wrapper/wrapper.gyp b/deps/gyp/test/make_global_settings/env-wrapper/wrapper.gyp new file mode 100644 index 0000000000..1698d71dd4 --- /dev/null +++ b/deps/gyp/test/make_global_settings/env-wrapper/wrapper.gyp @@ -0,0 +1,17 @@ +# Copyright (c) 2013 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. + +{ + 'make_global_settings': [ + ['CC', 'clang'], + ['CC.host', 'clang'], + ], + 'targets': [ + { + 'target_name': 'test', + 'type': 'static_library', + 'sources': [ 'foo.c' ], + }, + ], +} diff --git a/deps/gyp/test/make_global_settings/full-toolchain/bar.cc b/deps/gyp/test/make_global_settings/full-toolchain/bar.cc new file mode 100644 index 0000000000..afb422ba1a --- /dev/null +++ b/deps/gyp/test/make_global_settings/full-toolchain/bar.cc @@ -0,0 +1 @@ +#error Not a real source file diff --git a/deps/gyp/test/make_global_settings/full-toolchain/foo.c b/deps/gyp/test/make_global_settings/full-toolchain/foo.c new file mode 100644 index 0000000000..afb422ba1a --- /dev/null +++ b/deps/gyp/test/make_global_settings/full-toolchain/foo.c @@ -0,0 +1 @@ +#error Not a real source file diff --git a/deps/gyp/test/make_global_settings/full-toolchain/gyptest-make_global_settings.py b/deps/gyp/test/make_global_settings/full-toolchain/gyptest-make_global_settings.py new file mode 100644 index 0000000000..eebda7d497 --- /dev/null +++ b/deps/gyp/test/make_global_settings/full-toolchain/gyptest-make_global_settings.py @@ -0,0 +1,48 @@ +#!/usr/bin/env python + +# Copyright (c) 2014 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. + +""" +Verifies make_global_settings works with the full toolchain. +""" + +import os +import sys +import TestGyp + +if sys.platform == 'win32': + # cross compiling not supported by ninja on windows + # and make not supported on windows at all. + sys.exit(0) + +test = TestGyp.TestGyp(formats=['ninja']) +# Must set the test format to something with a flavor (the part after the '-') +# in order to test the desired behavior. Since we want to run a non-host +# toolchain, we have to set the flavor to something that the ninja generator +# doesn't know about, so it doesn't default to the host-specific tools (e.g., +# 'otool' on mac to generate the .TOC). +# +# Note that we can't just pass format=['ninja-some_toolchain'] to the +# constructor above, because then this test wouldn't be recognized as a ninja +# format test. +test.formats = ['ninja-my_flavor' if f == 'ninja' else f for f in test.formats] + +gyp_file = 'make_global_settings.gyp' + +test.run_gyp(gyp_file, + # Teach the .gyp file about the location of my_nm.py and + # my_readelf.py, and the python executable. + '-Dworkdir=%s' % test.workdir, + '-Dpython=%s' % sys.executable) +test.build(gyp_file, + arguments=['-v'] if test.format == 'ninja-my_flavor' else []) + +expected = ['MY_CC', 'MY_CXX'] +test.must_contain_all_lines(test.stdout(), expected) + +test.must_contain(test.built_file_path('RAN_MY_NM'), 'RAN_MY_NM') +test.must_contain(test.built_file_path('RAN_MY_READELF'), 'RAN_MY_READELF') + +test.pass_test() diff --git a/deps/gyp/test/make_global_settings/full-toolchain/make_global_settings.gyp b/deps/gyp/test/make_global_settings/full-toolchain/make_global_settings.gyp new file mode 100644 index 0000000000..2c3266322d --- /dev/null +++ b/deps/gyp/test/make_global_settings/full-toolchain/make_global_settings.gyp @@ -0,0 +1,22 @@ +# Copyright (c) 2013 Google Inc. All rights reserved. +# Use of this source code is governed by a BSD-style licence that can be +# found in the LICENSE file. + +{ + 'make_global_settings': [ + ['CC', '/bin/echo MY_CC'], + ['CXX', '/bin/echo MY_CXX'], + ['NM', '<(python) <(workdir)/my_nm.py'], + ['READELF', '<(python) <(workdir)/my_readelf.py'], + ], + 'targets': [ + { + 'target_name': 'test', + 'type': 'shared_library', + 'sources': [ + 'foo.c', + 'bar.cc', + ], + }, + ], +} diff --git a/deps/gyp/test/make_global_settings/full-toolchain/my_nm.py b/deps/gyp/test/make_global_settings/full-toolchain/my_nm.py new file mode 100755 index 0000000000..f0f1efcf73 --- /dev/null +++ b/deps/gyp/test/make_global_settings/full-toolchain/my_nm.py @@ -0,0 +1,8 @@ +#!/usr/bin/env python +# Copyright (c) 2014 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 sys +print sys.argv +with open('RAN_MY_NM', 'w') as f: + f.write('RAN_MY_NM') diff --git a/deps/gyp/test/make_global_settings/full-toolchain/my_readelf.py b/deps/gyp/test/make_global_settings/full-toolchain/my_readelf.py new file mode 100755 index 0000000000..40e303cd76 --- /dev/null +++ b/deps/gyp/test/make_global_settings/full-toolchain/my_readelf.py @@ -0,0 +1,8 @@ +#!/usr/bin/env python +# Copyright (c) 2014 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 sys +print sys.argv +with open('RAN_MY_READELF', 'w') as f: + f.write('RAN_MY_READELF') diff --git a/deps/gyp/test/make_global_settings/ld/gyptest-make_global_settings_ld.py b/deps/gyp/test/make_global_settings/ld/gyptest-make_global_settings_ld.py new file mode 100644 index 0000000000..c5a2e96422 --- /dev/null +++ b/deps/gyp/test/make_global_settings/ld/gyptest-make_global_settings_ld.py @@ -0,0 +1,130 @@ +#!/usr/bin/env python + +# Copyright (c) 2014 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. + +""" +Verifies 'LD' in make_global_settings. +""" + +import os +import sys +import TestGyp + +def resolve_path(test, path): + if path is None: + return None + elif test.format == 'make': + return '$(abspath %s)' % path + elif test.format in ['ninja', 'xcode-ninja']: + return os.path.join('..', '..', path) + else: + test.fail_test() + + +def verify_ld_target(test, ld=None, rel_path=False): + if rel_path: + ld_expected = resolve_path(test, ld) + else: + ld_expected = ld + # Resolve default values + if ld_expected is None: + if test.format == 'make': + # Make generator hasn't set the default value for LD. + # You can remove the following assertion as long as it doesn't + # break existing projects. + test.must_not_contain('Makefile', 'LD ?= ') + return + elif test.format in ['ninja', 'xcode-ninja']: + if sys.platform == 'win32': + ld_expected = 'link.exe' + else: + ld_expected = '$cc' + if test.format == 'make': + test.must_contain('Makefile', 'LD ?= %s' % ld_expected) + elif test.format in ['ninja', 'xcode-ninja']: + test.must_contain('out/Default/build.ninja', 'ld = %s' % ld_expected) + else: + test.fail_test() + + +def verify_ld_host(test, ld=None, rel_path=False): + if rel_path: + ld_expected = resolve_path(test, ld) + else: + ld_expected = ld + # Resolve default values + if ld_expected is None: + if test.format == 'make': + # Make generator hasn't set the default value for LD.host. + # You can remove the following assertion as long as it doesn't + # break existing projects. + test.must_not_contain('Makefile', 'LD.host ?= ') + return + elif test.format in ['ninja', 'xcode-ninja']: + if sys.platform == 'win32': + ld_expected = '$ld' + else: + ld_expected = '$cc_host' + if test.format == 'make': + test.must_contain('Makefile', 'LD.host ?= %s' % ld_expected) + elif test.format in ['ninja', 'xcode-ninja']: + test.must_contain('out/Default/build.ninja', 'ld_host = %s' % ld_expected) + else: + test.fail_test() + + +test_format = ['ninja'] +if sys.platform in ('linux2', 'darwin'): + test_format += ['make'] + +test = TestGyp.TestGyp(formats=test_format) + +# Check default values +test.run_gyp('make_global_settings_ld.gyp') +verify_ld_target(test) + + +# Check default values with GYP_CROSSCOMPILE enabled. +with TestGyp.LocalEnv({'GYP_CROSSCOMPILE': '1'}): + test.run_gyp('make_global_settings_ld.gyp') +verify_ld_target(test) +verify_ld_host(test) + + +# Test 'LD' in 'make_global_settings'. +with TestGyp.LocalEnv({'GYP_CROSSCOMPILE': '1'}): + test.run_gyp('make_global_settings_ld.gyp', '-Dcustom_ld_target=my_ld') +verify_ld_target(test, ld='my_ld', rel_path=True) + + +# Test 'LD'/'LD.host' in 'make_global_settings'. +with TestGyp.LocalEnv({'GYP_CROSSCOMPILE': '1'}): + test.run_gyp('make_global_settings_ld.gyp', + '-Dcustom_ld_target=my_ld_target1', + '-Dcustom_ld_host=my_ld_host1') +verify_ld_target(test, ld='my_ld_target1', rel_path=True) +verify_ld_host(test, ld='my_ld_host1', rel_path=True) + + +# Unlike other environment variables such as $AR/$AR_host, $CC/$CC_host, +# and $CXX/$CXX_host, neither Make generator nor Ninja generator recognizes +# $LD/$LD_host environment variables as of r1935. This may or may not be +# intentional, but here we leave a test case to verify this behavior just for +# the record. +# If you want to support $LD/$LD_host, please revise the following test case as +# well as the generator. +with TestGyp.LocalEnv({'GYP_CROSSCOMPILE': '1', + 'LD': 'my_ld_target2', + 'LD_host': 'my_ld_host2'}): + test.run_gyp('make_global_settings_ld.gyp') +if test.format == 'make': + test.must_not_contain('Makefile', 'my_ld_target2') + test.must_not_contain('Makefile', 'my_ld_host2') +elif test.format == 'ninja': + test.must_not_contain('out/Default/build.ninja', 'my_ld_target2') + test.must_not_contain('out/Default/build.ninja', 'my_ld_host2') + + +test.pass_test() diff --git a/deps/gyp/test/make_global_settings/ld/make_global_settings_ld.gyp b/deps/gyp/test/make_global_settings/ld/make_global_settings_ld.gyp new file mode 100644 index 0000000000..6837c77326 --- /dev/null +++ b/deps/gyp/test/make_global_settings/ld/make_global_settings_ld.gyp @@ -0,0 +1,29 @@ +# Copyright (c) 2014 Google Inc. All rights reserved. +# Use of this source code is governed by a BSD-style licence that can be +# found in the LICENSE file. + +{ + 'variables': { + 'custom_ld_target%': '', + 'custom_ld_host%': '', + }, + 'conditions': [ + ['"<(custom_ld_target)"!=""', { + 'make_global_settings': [ + ['LD', '<(custom_ld_target)'], + ], + }], + ['"<(custom_ld_host)"!=""', { + 'make_global_settings': [ + ['LD.host', '<(custom_ld_host)'], + ], + }], + ], + 'targets': [ + { + 'target_name': 'make_global_settings_ld_test', + 'type': 'static_library', + 'sources': [ 'foo.c' ], + }, + ], +} diff --git a/deps/gyp/test/make_global_settings/wrapper/gyptest-wrapper.py b/deps/gyp/test/make_global_settings/wrapper/gyptest-wrapper.py new file mode 100644 index 0000000000..eb1ebfd5a9 --- /dev/null +++ b/deps/gyp/test/make_global_settings/wrapper/gyptest-wrapper.py @@ -0,0 +1,47 @@ +#!/usr/bin/env python + +# Copyright (c) 2013 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. + +""" +Verifies *_wrapper in make_global_settings. +""" + +import os +import sys +import TestGyp + +test_format = ['ninja'] +if sys.platform in ('linux2', 'darwin'): + test_format += ['make'] + +test = TestGyp.TestGyp(formats=test_format) + +old_env = dict(os.environ) +os.environ['GYP_CROSSCOMPILE'] = '1' +test.run_gyp('wrapper.gyp') +os.environ.clear() +os.environ.update(old_env) + +if test.format == 'make': + cc_expected = """ifneq (,$(filter $(origin CC), undefined default)) + CC = $(abspath distcc) $(abspath clang) +endif +""" + link_expected = 'LINK ?= $(abspath distlink) $(abspath clang++)' + test.must_contain('Makefile', cc_expected) + test.must_contain('Makefile', link_expected) +if test.format == 'ninja': + cc_expected = ('cc = ' + os.path.join('..', '..', 'distcc') + ' ' + + os.path.join('..', '..', 'clang')) + cc_host_expected = ('cc_host = ' + os.path.join('..', '..', 'ccache') + ' ' + + os.path.join('..', '..', 'clang')) + ld_expected = 'ld = ../../distlink $cc' + if sys.platform == 'win32': + ld_expected = 'link.exe' + test.must_contain('out/Default/build.ninja', cc_expected) + test.must_contain('out/Default/build.ninja', cc_host_expected) + test.must_contain('out/Default/build.ninja', ld_expected) + +test.pass_test() diff --git a/deps/gyp/test/make_global_settings/wrapper/wrapper.gyp b/deps/gyp/test/make_global_settings/wrapper/wrapper.gyp new file mode 100644 index 0000000000..3d4cd04b16 --- /dev/null +++ b/deps/gyp/test/make_global_settings/wrapper/wrapper.gyp @@ -0,0 +1,21 @@ +# Copyright (c) 2013 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. + +{ + 'make_global_settings': [ + ['CC', 'clang'], + ['CC_wrapper', 'distcc'], + ['LINK', 'clang++'], + ['LINK_wrapper', 'distlink'], + ['CC.host', 'clang'], + ['CC.host_wrapper', 'ccache'], + ], + 'targets': [ + { + 'target_name': 'test', + 'type': 'static_library', + 'sources': [ 'foo.c' ], + }, + ], +} diff --git a/deps/gyp/test/many-actions/file0 b/deps/gyp/test/many-actions/file0 new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/deps/gyp/test/many-actions/file0 diff --git a/deps/gyp/test/many-actions/file1 b/deps/gyp/test/many-actions/file1 new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/deps/gyp/test/many-actions/file1 diff --git a/deps/gyp/test/many-actions/file2 b/deps/gyp/test/many-actions/file2 new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/deps/gyp/test/many-actions/file2 diff --git a/deps/gyp/test/many-actions/file3 b/deps/gyp/test/many-actions/file3 new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/deps/gyp/test/many-actions/file3 diff --git a/deps/gyp/test/many-actions/file4 b/deps/gyp/test/many-actions/file4 new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/deps/gyp/test/many-actions/file4 diff --git a/deps/gyp/test/many-actions/gyptest-many-actions-unsorted.py b/deps/gyp/test/many-actions/gyptest-many-actions-unsorted.py new file mode 100644 index 0000000000..90d3c92e4c --- /dev/null +++ b/deps/gyp/test/many-actions/gyptest-many-actions-unsorted.py @@ -0,0 +1,41 @@ +#!/usr/bin/env python + +# 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. + +""" +Make sure lots of actions in the same target don't cause exceeding command +line length. +""" + +import sys + +if sys.platform == 'win32': + print "This test is currently disabled: https://crbug.com/483696." + sys.exit(0) + +import TestGyp + +test = TestGyp.TestGyp() + +test.run_gyp('many-actions-unsorted.gyp') + +test.build('many-actions-unsorted.gyp', test.ALL) +for i in range(15): + test.built_file_must_exist('generated_%d.h' % i) + +# Make sure the optimized cygwin setup doesn't cause problems for incremental +# builds. +test.touch('file1') +test.build('many-actions-unsorted.gyp', test.ALL) + +test.touch('file0') +test.build('many-actions-unsorted.gyp', test.ALL) + +test.touch('file2') +test.touch('file3') +test.touch('file4') +test.build('many-actions-unsorted.gyp', test.ALL) + +test.pass_test() diff --git a/deps/gyp/test/many-actions/gyptest-many-actions.py b/deps/gyp/test/many-actions/gyptest-many-actions.py new file mode 100644 index 0000000000..f2e719bb70 --- /dev/null +++ b/deps/gyp/test/many-actions/gyptest-many-actions.py @@ -0,0 +1,27 @@ +#!/usr/bin/env python + +# 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. + +""" +Make sure lots of actions in the same target don't cause exceeding command +line length. +""" + +import sys + +if sys.platform == 'win32': + print "This test is currently disabled: https://crbug.com/483696." + sys.exit(0) + + +import TestGyp + +test = TestGyp.TestGyp() + +test.run_gyp('many-actions.gyp') +test.build('many-actions.gyp', test.ALL) +for i in range(200): + test.built_file_must_exist('generated_%d.h' % i) +test.pass_test() diff --git a/deps/gyp/test/many-actions/many-actions-unsorted.gyp b/deps/gyp/test/many-actions/many-actions-unsorted.gyp new file mode 100644 index 0000000000..eec79fe8d8 --- /dev/null +++ b/deps/gyp/test/many-actions/many-actions-unsorted.gyp @@ -0,0 +1,154 @@ +# 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. + +{ + 'target_defaults': { + 'msvs_cygwin_dirs': ['../../../../<(DEPTH)/third_party/cygwin'], + }, + 'targets': [ + { + 'target_name': 'a', + 'type': 'none', + 'actions': [ + # Notice that the inputs go 0, 1, ..., 0, 1, .... This is to test + # a regression in the msvs generator in _AddActions. + { + 'action_name': 'do_0', + 'inputs': ['file0'], + 'outputs': ['<(PRODUCT_DIR)/generated_0.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_0.h', + ], + }, + { + 'action_name': 'do_1', + 'inputs': ['file1'], + 'outputs': ['<(PRODUCT_DIR)/generated_1.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_1.h', + ], + }, + { + 'action_name': 'do_2', + 'inputs': ['file2'], + 'outputs': ['<(PRODUCT_DIR)/generated_2.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_2.h', + ], + }, + { + 'action_name': 'do_3', + 'inputs': ['file3'], + 'outputs': ['<(PRODUCT_DIR)/generated_3.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_3.h', + ], + }, + { + 'action_name': 'do_4', + 'inputs': ['file4'], + 'outputs': ['<(PRODUCT_DIR)/generated_4.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_4.h', + ], + }, + { + 'action_name': 'do_5', + 'inputs': ['file0'], + 'outputs': ['<(PRODUCT_DIR)/generated_5.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_5.h', + ], + }, + { + 'action_name': 'do_6', + 'inputs': ['file1'], + 'outputs': ['<(PRODUCT_DIR)/generated_6.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_6.h', + ], + }, + { + 'action_name': 'do_7', + 'inputs': ['file2'], + 'outputs': ['<(PRODUCT_DIR)/generated_7.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_7.h', + ], + }, + { + 'action_name': 'do_8', + 'inputs': ['file3'], + 'outputs': ['<(PRODUCT_DIR)/generated_8.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_8.h', + ], + }, + { + 'action_name': 'do_9', + 'inputs': ['file4'], + 'outputs': ['<(PRODUCT_DIR)/generated_9.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_9.h', + ], + }, + { + 'action_name': 'do_10', + 'inputs': ['file0'], + 'outputs': ['<(PRODUCT_DIR)/generated_10.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_10.h', + ], + }, + { + 'action_name': 'do_11', + 'inputs': ['file1'], + 'outputs': ['<(PRODUCT_DIR)/generated_11.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_11.h', + ], + }, + { + 'action_name': 'do_12', + 'inputs': ['file2'], + 'outputs': ['<(PRODUCT_DIR)/generated_12.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_12.h', + ], + }, + { + 'action_name': 'do_13', + 'inputs': ['file3'], + 'outputs': ['<(PRODUCT_DIR)/generated_13.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_13.h', + ], + }, + { + 'action_name': 'do_14', + 'inputs': ['file4'], + 'outputs': ['<(PRODUCT_DIR)/generated_14.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_14.h', + ], + }, + ], + }, + ], +} diff --git a/deps/gyp/test/many-actions/many-actions.gyp b/deps/gyp/test/many-actions/many-actions.gyp new file mode 100644 index 0000000000..38545d2d88 --- /dev/null +++ b/deps/gyp/test/many-actions/many-actions.gyp @@ -0,0 +1,1817 @@ +# 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. + +{ + 'target_defaults': { + 'msvs_cygwin_dirs': ['../../../../<(DEPTH)/third_party/cygwin'], + }, + 'targets': [ + { + 'target_name': 'a', + 'type': 'none', + 'actions': [ + { + 'action_name': 'do_0', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_0.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_0.h', + ], + }, + { + 'action_name': 'do_1', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_1.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_1.h', + ], + }, + { + 'action_name': 'do_2', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_2.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_2.h', + ], + }, + { + 'action_name': 'do_3', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_3.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_3.h', + ], + }, + { + 'action_name': 'do_4', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_4.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_4.h', + ], + }, + { + 'action_name': 'do_5', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_5.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_5.h', + ], + }, + { + 'action_name': 'do_6', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_6.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_6.h', + ], + }, + { + 'action_name': 'do_7', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_7.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_7.h', + ], + }, + { + 'action_name': 'do_8', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_8.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_8.h', + ], + }, + { + 'action_name': 'do_9', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_9.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_9.h', + ], + }, + { + 'action_name': 'do_10', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_10.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_10.h', + ], + }, + { + 'action_name': 'do_11', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_11.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_11.h', + ], + }, + { + 'action_name': 'do_12', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_12.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_12.h', + ], + }, + { + 'action_name': 'do_13', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_13.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_13.h', + ], + }, + { + 'action_name': 'do_14', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_14.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_14.h', + ], + }, + { + 'action_name': 'do_15', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_15.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_15.h', + ], + }, + { + 'action_name': 'do_16', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_16.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_16.h', + ], + }, + { + 'action_name': 'do_17', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_17.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_17.h', + ], + }, + { + 'action_name': 'do_18', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_18.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_18.h', + ], + }, + { + 'action_name': 'do_19', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_19.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_19.h', + ], + }, + { + 'action_name': 'do_20', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_20.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_20.h', + ], + }, + { + 'action_name': 'do_21', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_21.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_21.h', + ], + }, + { + 'action_name': 'do_22', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_22.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_22.h', + ], + }, + { + 'action_name': 'do_23', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_23.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_23.h', + ], + }, + { + 'action_name': 'do_24', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_24.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_24.h', + ], + }, + { + 'action_name': 'do_25', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_25.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_25.h', + ], + }, + { + 'action_name': 'do_26', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_26.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_26.h', + ], + }, + { + 'action_name': 'do_27', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_27.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_27.h', + ], + }, + { + 'action_name': 'do_28', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_28.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_28.h', + ], + }, + { + 'action_name': 'do_29', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_29.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_29.h', + ], + }, + { + 'action_name': 'do_30', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_30.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_30.h', + ], + }, + { + 'action_name': 'do_31', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_31.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_31.h', + ], + }, + { + 'action_name': 'do_32', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_32.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_32.h', + ], + }, + { + 'action_name': 'do_33', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_33.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_33.h', + ], + }, + { + 'action_name': 'do_34', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_34.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_34.h', + ], + }, + { + 'action_name': 'do_35', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_35.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_35.h', + ], + }, + { + 'action_name': 'do_36', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_36.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_36.h', + ], + }, + { + 'action_name': 'do_37', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_37.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_37.h', + ], + }, + { + 'action_name': 'do_38', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_38.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_38.h', + ], + }, + { + 'action_name': 'do_39', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_39.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_39.h', + ], + }, + { + 'action_name': 'do_40', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_40.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_40.h', + ], + }, + { + 'action_name': 'do_41', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_41.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_41.h', + ], + }, + { + 'action_name': 'do_42', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_42.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_42.h', + ], + }, + { + 'action_name': 'do_43', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_43.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_43.h', + ], + }, + { + 'action_name': 'do_44', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_44.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_44.h', + ], + }, + { + 'action_name': 'do_45', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_45.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_45.h', + ], + }, + { + 'action_name': 'do_46', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_46.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_46.h', + ], + }, + { + 'action_name': 'do_47', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_47.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_47.h', + ], + }, + { + 'action_name': 'do_48', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_48.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_48.h', + ], + }, + { + 'action_name': 'do_49', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_49.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_49.h', + ], + }, + { + 'action_name': 'do_50', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_50.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_50.h', + ], + }, + { + 'action_name': 'do_51', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_51.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_51.h', + ], + }, + { + 'action_name': 'do_52', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_52.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_52.h', + ], + }, + { + 'action_name': 'do_53', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_53.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_53.h', + ], + }, + { + 'action_name': 'do_54', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_54.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_54.h', + ], + }, + { + 'action_name': 'do_55', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_55.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_55.h', + ], + }, + { + 'action_name': 'do_56', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_56.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_56.h', + ], + }, + { + 'action_name': 'do_57', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_57.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_57.h', + ], + }, + { + 'action_name': 'do_58', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_58.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_58.h', + ], + }, + { + 'action_name': 'do_59', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_59.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_59.h', + ], + }, + { + 'action_name': 'do_60', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_60.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_60.h', + ], + }, + { + 'action_name': 'do_61', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_61.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_61.h', + ], + }, + { + 'action_name': 'do_62', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_62.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_62.h', + ], + }, + { + 'action_name': 'do_63', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_63.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_63.h', + ], + }, + { + 'action_name': 'do_64', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_64.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_64.h', + ], + }, + { + 'action_name': 'do_65', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_65.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_65.h', + ], + }, + { + 'action_name': 'do_66', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_66.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_66.h', + ], + }, + { + 'action_name': 'do_67', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_67.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_67.h', + ], + }, + { + 'action_name': 'do_68', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_68.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_68.h', + ], + }, + { + 'action_name': 'do_69', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_69.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_69.h', + ], + }, + { + 'action_name': 'do_70', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_70.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_70.h', + ], + }, + { + 'action_name': 'do_71', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_71.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_71.h', + ], + }, + { + 'action_name': 'do_72', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_72.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_72.h', + ], + }, + { + 'action_name': 'do_73', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_73.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_73.h', + ], + }, + { + 'action_name': 'do_74', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_74.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_74.h', + ], + }, + { + 'action_name': 'do_75', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_75.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_75.h', + ], + }, + { + 'action_name': 'do_76', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_76.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_76.h', + ], + }, + { + 'action_name': 'do_77', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_77.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_77.h', + ], + }, + { + 'action_name': 'do_78', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_78.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_78.h', + ], + }, + { + 'action_name': 'do_79', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_79.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_79.h', + ], + }, + { + 'action_name': 'do_80', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_80.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_80.h', + ], + }, + { + 'action_name': 'do_81', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_81.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_81.h', + ], + }, + { + 'action_name': 'do_82', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_82.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_82.h', + ], + }, + { + 'action_name': 'do_83', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_83.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_83.h', + ], + }, + { + 'action_name': 'do_84', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_84.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_84.h', + ], + }, + { + 'action_name': 'do_85', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_85.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_85.h', + ], + }, + { + 'action_name': 'do_86', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_86.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_86.h', + ], + }, + { + 'action_name': 'do_87', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_87.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_87.h', + ], + }, + { + 'action_name': 'do_88', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_88.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_88.h', + ], + }, + { + 'action_name': 'do_89', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_89.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_89.h', + ], + }, + { + 'action_name': 'do_90', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_90.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_90.h', + ], + }, + { + 'action_name': 'do_91', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_91.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_91.h', + ], + }, + { + 'action_name': 'do_92', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_92.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_92.h', + ], + }, + { + 'action_name': 'do_93', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_93.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_93.h', + ], + }, + { + 'action_name': 'do_94', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_94.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_94.h', + ], + }, + { + 'action_name': 'do_95', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_95.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_95.h', + ], + }, + { + 'action_name': 'do_96', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_96.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_96.h', + ], + }, + { + 'action_name': 'do_97', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_97.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_97.h', + ], + }, + { + 'action_name': 'do_98', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_98.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_98.h', + ], + }, + { + 'action_name': 'do_99', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_99.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_99.h', + ], + }, + { + 'action_name': 'do_100', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_100.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_100.h', + ], + }, + { + 'action_name': 'do_101', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_101.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_101.h', + ], + }, + { + 'action_name': 'do_102', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_102.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_102.h', + ], + }, + { + 'action_name': 'do_103', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_103.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_103.h', + ], + }, + { + 'action_name': 'do_104', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_104.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_104.h', + ], + }, + { + 'action_name': 'do_105', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_105.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_105.h', + ], + }, + { + 'action_name': 'do_106', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_106.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_106.h', + ], + }, + { + 'action_name': 'do_107', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_107.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_107.h', + ], + }, + { + 'action_name': 'do_108', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_108.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_108.h', + ], + }, + { + 'action_name': 'do_109', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_109.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_109.h', + ], + }, + { + 'action_name': 'do_110', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_110.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_110.h', + ], + }, + { + 'action_name': 'do_111', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_111.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_111.h', + ], + }, + { + 'action_name': 'do_112', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_112.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_112.h', + ], + }, + { + 'action_name': 'do_113', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_113.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_113.h', + ], + }, + { + 'action_name': 'do_114', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_114.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_114.h', + ], + }, + { + 'action_name': 'do_115', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_115.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_115.h', + ], + }, + { + 'action_name': 'do_116', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_116.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_116.h', + ], + }, + { + 'action_name': 'do_117', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_117.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_117.h', + ], + }, + { + 'action_name': 'do_118', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_118.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_118.h', + ], + }, + { + 'action_name': 'do_119', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_119.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_119.h', + ], + }, + { + 'action_name': 'do_120', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_120.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_120.h', + ], + }, + { + 'action_name': 'do_121', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_121.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_121.h', + ], + }, + { + 'action_name': 'do_122', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_122.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_122.h', + ], + }, + { + 'action_name': 'do_123', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_123.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_123.h', + ], + }, + { + 'action_name': 'do_124', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_124.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_124.h', + ], + }, + { + 'action_name': 'do_125', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_125.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_125.h', + ], + }, + { + 'action_name': 'do_126', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_126.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_126.h', + ], + }, + { + 'action_name': 'do_127', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_127.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_127.h', + ], + }, + { + 'action_name': 'do_128', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_128.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_128.h', + ], + }, + { + 'action_name': 'do_129', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_129.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_129.h', + ], + }, + { + 'action_name': 'do_130', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_130.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_130.h', + ], + }, + { + 'action_name': 'do_131', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_131.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_131.h', + ], + }, + { + 'action_name': 'do_132', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_132.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_132.h', + ], + }, + { + 'action_name': 'do_133', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_133.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_133.h', + ], + }, + { + 'action_name': 'do_134', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_134.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_134.h', + ], + }, + { + 'action_name': 'do_135', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_135.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_135.h', + ], + }, + { + 'action_name': 'do_136', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_136.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_136.h', + ], + }, + { + 'action_name': 'do_137', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_137.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_137.h', + ], + }, + { + 'action_name': 'do_138', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_138.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_138.h', + ], + }, + { + 'action_name': 'do_139', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_139.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_139.h', + ], + }, + { + 'action_name': 'do_140', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_140.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_140.h', + ], + }, + { + 'action_name': 'do_141', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_141.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_141.h', + ], + }, + { + 'action_name': 'do_142', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_142.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_142.h', + ], + }, + { + 'action_name': 'do_143', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_143.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_143.h', + ], + }, + { + 'action_name': 'do_144', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_144.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_144.h', + ], + }, + { + 'action_name': 'do_145', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_145.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_145.h', + ], + }, + { + 'action_name': 'do_146', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_146.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_146.h', + ], + }, + { + 'action_name': 'do_147', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_147.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_147.h', + ], + }, + { + 'action_name': 'do_148', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_148.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_148.h', + ], + }, + { + 'action_name': 'do_149', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_149.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_149.h', + ], + }, + { + 'action_name': 'do_150', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_150.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_150.h', + ], + }, + { + 'action_name': 'do_151', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_151.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_151.h', + ], + }, + { + 'action_name': 'do_152', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_152.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_152.h', + ], + }, + { + 'action_name': 'do_153', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_153.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_153.h', + ], + }, + { + 'action_name': 'do_154', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_154.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_154.h', + ], + }, + { + 'action_name': 'do_155', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_155.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_155.h', + ], + }, + { + 'action_name': 'do_156', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_156.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_156.h', + ], + }, + { + 'action_name': 'do_157', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_157.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_157.h', + ], + }, + { + 'action_name': 'do_158', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_158.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_158.h', + ], + }, + { + 'action_name': 'do_159', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_159.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_159.h', + ], + }, + { + 'action_name': 'do_160', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_160.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_160.h', + ], + }, + { + 'action_name': 'do_161', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_161.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_161.h', + ], + }, + { + 'action_name': 'do_162', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_162.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_162.h', + ], + }, + { + 'action_name': 'do_163', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_163.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_163.h', + ], + }, + { + 'action_name': 'do_164', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_164.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_164.h', + ], + }, + { + 'action_name': 'do_165', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_165.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_165.h', + ], + }, + { + 'action_name': 'do_166', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_166.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_166.h', + ], + }, + { + 'action_name': 'do_167', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_167.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_167.h', + ], + }, + { + 'action_name': 'do_168', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_168.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_168.h', + ], + }, + { + 'action_name': 'do_169', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_169.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_169.h', + ], + }, + { + 'action_name': 'do_170', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_170.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_170.h', + ], + }, + { + 'action_name': 'do_171', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_171.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_171.h', + ], + }, + { + 'action_name': 'do_172', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_172.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_172.h', + ], + }, + { + 'action_name': 'do_173', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_173.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_173.h', + ], + }, + { + 'action_name': 'do_174', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_174.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_174.h', + ], + }, + { + 'action_name': 'do_175', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_175.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_175.h', + ], + }, + { + 'action_name': 'do_176', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_176.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_176.h', + ], + }, + { + 'action_name': 'do_177', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_177.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_177.h', + ], + }, + { + 'action_name': 'do_178', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_178.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_178.h', + ], + }, + { + 'action_name': 'do_179', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_179.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_179.h', + ], + }, + { + 'action_name': 'do_180', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_180.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_180.h', + ], + }, + { + 'action_name': 'do_181', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_181.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_181.h', + ], + }, + { + 'action_name': 'do_182', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_182.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_182.h', + ], + }, + { + 'action_name': 'do_183', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_183.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_183.h', + ], + }, + { + 'action_name': 'do_184', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_184.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_184.h', + ], + }, + { + 'action_name': 'do_185', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_185.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_185.h', + ], + }, + { + 'action_name': 'do_186', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_186.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_186.h', + ], + }, + { + 'action_name': 'do_187', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_187.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_187.h', + ], + }, + { + 'action_name': 'do_188', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_188.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_188.h', + ], + }, + { + 'action_name': 'do_189', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_189.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_189.h', + ], + }, + { + 'action_name': 'do_190', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_190.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_190.h', + ], + }, + { + 'action_name': 'do_191', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_191.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_191.h', + ], + }, + { + 'action_name': 'do_192', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_192.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_192.h', + ], + }, + { + 'action_name': 'do_193', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_193.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_193.h', + ], + }, + { + 'action_name': 'do_194', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_194.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_194.h', + ], + }, + { + 'action_name': 'do_195', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_195.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_195.h', + ], + }, + { + 'action_name': 'do_196', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_196.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_196.h', + ], + }, + { + 'action_name': 'do_197', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_197.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_197.h', + ], + }, + { + 'action_name': 'do_198', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_198.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_198.h', + ], + }, + { + 'action_name': 'do_199', + 'inputs': [], + 'outputs': ['<(PRODUCT_DIR)/generated_199.h'], + 'action': [ + 'touch', + '<(PRODUCT_DIR)/generated_199.h', + ], + }, + ], + }, + ], +} diff --git a/deps/gyp/test/module/gyptest-default.py b/deps/gyp/test/module/gyptest-default.py new file mode 100755 index 0000000000..7fecf3ca4d --- /dev/null +++ b/deps/gyp/test/module/gyptest-default.py @@ -0,0 +1,28 @@ +#!/usr/bin/env python + +# 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. + +""" +Verifies simple build of a "Hello, world!" program with loadable modules. The +default for all platforms should be to output the loadable modules to the same +path as the executable. +""" + +import TestGyp + +test = TestGyp.TestGyp() + +test.run_gyp('module.gyp', chdir='src') + +test.build('module.gyp', test.ALL, chdir='src') + +expect = """\ +Hello from program.c +Hello from lib1.c +Hello from lib2.c +""" +test.run_built_executable('program', chdir='src', stdout=expect) + +test.pass_test() diff --git a/deps/gyp/test/module/src/lib1.c b/deps/gyp/test/module/src/lib1.c new file mode 100644 index 0000000000..8de0e94bee --- /dev/null +++ b/deps/gyp/test/module/src/lib1.c @@ -0,0 +1,10 @@ +#include <stdio.h> + +#ifdef _WIN32 +__declspec(dllexport) +#endif +void module_main(void) +{ + fprintf(stdout, "Hello from lib1.c\n"); + fflush(stdout); +} diff --git a/deps/gyp/test/module/src/lib2.c b/deps/gyp/test/module/src/lib2.c new file mode 100644 index 0000000000..266396dc91 --- /dev/null +++ b/deps/gyp/test/module/src/lib2.c @@ -0,0 +1,10 @@ +#include <stdio.h> + +#ifdef _WIN32 +__declspec(dllexport) +#endif +void module_main(void) +{ + fprintf(stdout, "Hello from lib2.c\n"); + fflush(stdout); +} diff --git a/deps/gyp/test/module/src/module.gyp b/deps/gyp/test/module/src/module.gyp new file mode 100644 index 0000000000..2bc398bb3b --- /dev/null +++ b/deps/gyp/test/module/src/module.gyp @@ -0,0 +1,53 @@ +# Copyright (c) 2009 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. + +{ + 'target_defaults': { + 'conditions': [ + ['OS=="win"', { + 'defines': ['PLATFORM_WIN'], + }], + ['OS=="mac" or OS=="ios"', { + 'defines': ['PLATFORM_MAC'], + }], + ['OS=="linux"', { + 'defines': ['PLATFORM_LINUX'], + # Support 64-bit shared libs (also works fine for 32-bit). + 'cflags': ['-fPIC'], + 'libraries': ['-ldl'], + }], + ], + }, + 'targets': [ + { + 'target_name': 'program', + 'type': 'executable', + 'dependencies': [ + 'lib1', + 'lib2', + ], + 'sources': [ + 'program.c', + ], + }, + { + 'target_name': 'lib1', + 'type': 'loadable_module', + 'product_name': 'lib1', + 'product_prefix': '', + 'sources': [ + 'lib1.c', + ], + }, + { + 'target_name': 'lib2', + 'product_name': 'lib2', + 'product_prefix': '', + 'type': 'loadable_module', + 'sources': [ + 'lib2.c', + ], + }, + ], +} diff --git a/deps/gyp/test/module/src/program.c b/deps/gyp/test/module/src/program.c new file mode 100644 index 0000000000..7cc3dd3466 --- /dev/null +++ b/deps/gyp/test/module/src/program.c @@ -0,0 +1,111 @@ +#include <stdio.h> +#include <stdlib.h> + +#if defined(PLATFORM_WIN) +#include <windows.h> +#elif defined(PLATFORM_MAC) || defined(PLATFORM_LINUX) +#include <dlfcn.h> +#include <libgen.h> +#include <string.h> +#include <sys/param.h> +#define MAX_PATH PATH_MAX +#endif + +#if defined(PLATFORM_WIN) +#define MODULE_SUFFIX ".dll" +#elif defined(PLATFORM_MAC) +#define MODULE_SUFFIX ".so" +#elif defined(PLATFORM_LINUX) +#define MODULE_SUFFIX ".so" +#endif + +typedef void (*module_symbol)(void); +char bin_path[MAX_PATH + 1]; + + +void CallModule(const char* module) { + char module_path[MAX_PATH + 1]; + const char* module_function = "module_main"; + module_symbol funcptr; +#if defined(PLATFORM_WIN) + HMODULE dl; + char drive[_MAX_DRIVE]; + char dir[_MAX_DIR]; + + if (_splitpath_s(bin_path, drive, _MAX_DRIVE, dir, _MAX_DIR, + NULL, 0, NULL, 0)) { + fprintf(stderr, "Failed to split executable path.\n"); + return; + } + if (_makepath_s(module_path, MAX_PATH, drive, dir, module, MODULE_SUFFIX)) { + fprintf(stderr, "Failed to calculate module path.\n"); + return; + } + + dl = LoadLibrary(module_path); + if (!dl) { + fprintf(stderr, "Failed to open module: %s\n", module_path); + return; + } + + funcptr = (module_symbol) GetProcAddress(dl, module_function); + if (!funcptr) { + fprintf(stderr, "Failed to find symbol: %s\n", module_function); + return; + } + funcptr(); + + FreeLibrary(dl); +#elif defined(PLATFORM_MAC) || defined(PLATFORM_LINUX) + void* dl; + char* path_copy = strdup(bin_path); + char* bin_dir = dirname(path_copy); + int path_size = snprintf(module_path, MAX_PATH, "%s/%s%s", bin_dir, module, + MODULE_SUFFIX); + free(path_copy); + if (path_size < 0 || path_size > MAX_PATH) { + fprintf(stderr, "Failed to calculate module path.\n"); + return; + } + module_path[path_size] = 0; + + dl = dlopen(module_path, RTLD_LAZY); + if (!dl) { + fprintf(stderr, "Failed to open module: %s\n", module_path); + return; + } + + funcptr = dlsym(dl, module_function); + if (!funcptr) { + fprintf(stderr, "Failed to find symbol: %s\n", module_function); + return; + } + funcptr(); + + dlclose(dl); +#endif +} + +int main(int argc, char *argv[]) +{ + fprintf(stdout, "Hello from program.c\n"); + fflush(stdout); + +#if defined(PLATFORM_WIN) + if (!GetModuleFileName(NULL, bin_path, MAX_PATH)) { + fprintf(stderr, "Failed to determine executable path.\n"); + return 1; + } +#elif defined(PLATFORM_MAC) || defined(PLATFORM_LINUX) + // Using argv[0] should be OK here since we control how the tests run, and + // can avoid exec and such issues that make it unreliable. + if (!realpath(argv[0], bin_path)) { + fprintf(stderr, "Failed to determine executable path (%s).\n", argv[0]); + return 1; + } +#endif + + CallModule("lib1"); + CallModule("lib2"); + return 0; +} diff --git a/deps/gyp/test/msvs/buildevents/buildevents.gyp b/deps/gyp/test/msvs/buildevents/buildevents.gyp new file mode 100644 index 0000000000..e0304dd5c6 --- /dev/null +++ b/deps/gyp/test/msvs/buildevents/buildevents.gyp @@ -0,0 +1,14 @@ +# Copyright (c) 2011 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. +{ + 'targets': [ + { + 'target_name': 'main', + 'type': 'executable', + 'sources': [ 'main.cc', ], + 'msvs_prebuild': r'echo starting', + 'msvs_postbuild': r'echo finished', + }, + ], +} diff --git a/deps/gyp/test/msvs/buildevents/gyptest-msbuild-supports-prepostbuild.py b/deps/gyp/test/msvs/buildevents/gyptest-msbuild-supports-prepostbuild.py new file mode 100755 index 0000000000..208f434560 --- /dev/null +++ b/deps/gyp/test/msvs/buildevents/gyptest-msbuild-supports-prepostbuild.py @@ -0,0 +1,24 @@ +#!/usr/bin/env python + +# Copyright (c) 2011 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. + +""" +Verifies that msvs_prebuild and msvs_postbuild can be specified in both +VS 2008 and 2010. +""" + +import TestGyp + +test = TestGyp.TestGyp(formats=['msvs'], workdir='workarea_all') + +test.run_gyp('buildevents.gyp', '-G', 'msvs_version=2008') +test.must_contain('main.vcproj', 'Name="VCPreBuildEventTool"') +test.must_contain('main.vcproj', 'Name="VCPostBuildEventTool"') + +test.run_gyp('buildevents.gyp', '-G', 'msvs_version=2010') +test.must_contain('main.vcxproj', '<PreBuildEvent>') +test.must_contain('main.vcxproj', '<PostBuildEvent>') + +test.pass_test() diff --git a/deps/gyp/test/msvs/buildevents/gyptest-ninja-warnings.py b/deps/gyp/test/msvs/buildevents/gyptest-ninja-warnings.py new file mode 100755 index 0000000000..be4ec9921a --- /dev/null +++ b/deps/gyp/test/msvs/buildevents/gyptest-ninja-warnings.py @@ -0,0 +1,29 @@ +#!/usr/bin/env python + +# Copyright (c) 2014 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. + +""" +Verifies that ninja errors out when encountering msvs_prebuild/msvs_postbuild. +""" + +import sys +import TestCmd +import TestGyp + + +if sys.platform == 'win32': + test = TestGyp.TestGyp(formats=['ninja']) + + test.run_gyp('buildevents.gyp', + status=1, + stderr=r'.*msvs_prebuild not supported \(target main\).*', + match=TestCmd.match_re_dotall) + + test.run_gyp('buildevents.gyp', + status=1, + stderr=r'.*msvs_postbuild not supported \(target main\).*', + match=TestCmd.match_re_dotall) + + test.pass_test() diff --git a/deps/gyp/test/msvs/buildevents/main.cc b/deps/gyp/test/msvs/buildevents/main.cc new file mode 100644 index 0000000000..03c0285a6c --- /dev/null +++ b/deps/gyp/test/msvs/buildevents/main.cc @@ -0,0 +1,5 @@ +// Copyright (c) 2014 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. + +int main() {} diff --git a/deps/gyp/test/msvs/config_attrs/gyptest-config_attrs.py b/deps/gyp/test/msvs/config_attrs/gyptest-config_attrs.py new file mode 100644 index 0000000000..d5603744db --- /dev/null +++ b/deps/gyp/test/msvs/config_attrs/gyptest-config_attrs.py @@ -0,0 +1,39 @@ +#!/usr/bin/env python + +# 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. + +""" +Verifies that msvs_configuration_attributes and +msbuild_configuration_attributes are applied by using +them to set the OutputDirectory. +""" + +import TestGyp +import os + +import sys + +if sys.platform == 'win32': + print "This test is currently disabled: https://crbug.com/483696." + sys.exit(0) + + + +test = TestGyp.TestGyp(workdir='workarea_all',formats=['msvs']) + +vc_version = 'VC90' + +if os.getenv('GYP_MSVS_VERSION'): + vc_version = ['VC90','VC100'][int(os.getenv('GYP_MSVS_VERSION')) >= 2010] + +expected_exe_file = os.path.join(test.workdir, vc_version, 'hello.exe') + +test.run_gyp('hello.gyp') + +test.build('hello.gyp') + +test.must_exist(expected_exe_file) + +test.pass_test() diff --git a/deps/gyp/test/msvs/config_attrs/hello.c b/deps/gyp/test/msvs/config_attrs/hello.c new file mode 100644 index 0000000000..faadc75e2c --- /dev/null +++ b/deps/gyp/test/msvs/config_attrs/hello.c @@ -0,0 +1,11 @@ +/* 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. */ + +#include <stdio.h> + +int main(void) +{ + printf("Hello, world!\n"); + return 0; +} diff --git a/deps/gyp/test/msvs/config_attrs/hello.gyp b/deps/gyp/test/msvs/config_attrs/hello.gyp new file mode 100644 index 0000000000..810a80edd8 --- /dev/null +++ b/deps/gyp/test/msvs/config_attrs/hello.gyp @@ -0,0 +1,21 @@ +# 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. + +{ + 'targets': [ + { + 'target_name': 'hello', + 'type': 'executable', + 'sources': [ + 'hello.c', + ], + 'msvs_configuration_attributes': { + 'OutputDirectory':'$(SolutionDir)VC90/' + }, + 'msbuild_configuration_attributes': { + 'OutputDirectory':'$(SolutionDir)VC100/', + }, + }, + ], +} diff --git a/deps/gyp/test/msvs/express/base/base.gyp b/deps/gyp/test/msvs/express/base/base.gyp new file mode 100644 index 0000000000..b7c9fc6d81 --- /dev/null +++ b/deps/gyp/test/msvs/express/base/base.gyp @@ -0,0 +1,22 @@ +# Copyright (c) 2009 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. + +{ + 'targets': [ + { + 'target_name': 'a', + 'type': 'static_library', + 'sources': [ + 'a.c', + ], + }, + { + 'target_name': 'b', + 'type': 'static_library', + 'sources': [ + 'b.c', + ], + }, + ], +} diff --git a/deps/gyp/test/msvs/express/express.gyp b/deps/gyp/test/msvs/express/express.gyp new file mode 100644 index 0000000000..917abe2cc0 --- /dev/null +++ b/deps/gyp/test/msvs/express/express.gyp @@ -0,0 +1,19 @@ +# Copyright (c) 2009 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. + +{ + 'targets': [ + { + 'target_name': 'express', + 'type': 'executable', + 'dependencies': [ + 'base/base.gyp:a', + 'base/base.gyp:b', + ], + 'sources': [ + 'main.c', + ], + }, + ], +} diff --git a/deps/gyp/test/msvs/express/gyptest-express.py b/deps/gyp/test/msvs/express/gyptest-express.py new file mode 100755 index 0000000000..54c06f664a --- /dev/null +++ b/deps/gyp/test/msvs/express/gyptest-express.py @@ -0,0 +1,29 @@ +#!/usr/bin/env python + +# Copyright (c) 2009 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. + +""" +Verifies that flat solutions get generated for Express versions of +Visual Studio. +""" + +import TestGyp + +test = TestGyp.TestGyp(formats=['msvs']) + +test.run_gyp('express.gyp', '-G', 'msvs_version=2005') +test.must_contain('express.sln', '(base)') + +test.run_gyp('express.gyp', '-G', 'msvs_version=2008') +test.must_contain('express.sln', '(base)') + +test.run_gyp('express.gyp', '-G', 'msvs_version=2005e') +test.must_not_contain('express.sln', '(base)') + +test.run_gyp('express.gyp', '-G', 'msvs_version=2008e') +test.must_not_contain('express.sln', '(base)') + + +test.pass_test() diff --git a/deps/gyp/test/msvs/external_builder/external.gyp b/deps/gyp/test/msvs/external_builder/external.gyp new file mode 100644 index 0000000000..abe5b5889c --- /dev/null +++ b/deps/gyp/test/msvs/external_builder/external.gyp @@ -0,0 +1,68 @@ +# Copyright (c) 2013 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. + +{ + 'variables': { + # the test driver switches this flag when testing external builder + 'use_external_builder%': 0, + }, + 'targets': [ + { + 'target_name': 'external', + 'type': 'executable', + 'sources': [ + 'hello.cpp', + 'hello.z', + ], + 'rules': [ + { + 'rule_name': 'test_rule', + 'extension': 'z', + 'outputs': [ + 'msbuild_rule.out', + ], + 'action': [ + 'python', + 'msbuild_rule.py', + '<(RULE_INPUT_PATH)', + 'a', 'b', 'c', + ], + 'msvs_cygwin_shell': 0, + }, + ], + 'actions': [ + { + 'action_name': 'test action', + 'inputs': [ + 'msbuild_action.py', + ], + 'outputs': [ + 'msbuild_action.out', + ], + 'action': [ + 'python', + '<@(_inputs)', + 'x', 'y', 'z', + ], + 'msvs_cygwin_shell': 0, + }, + ], + 'conditions': [ + ['use_external_builder==1', { + 'msvs_external_builder': 'test', + 'msvs_external_builder_build_cmd': [ + 'python', + 'external_builder.py', + 'build', '1', '2', '3', + ], + 'msvs_external_builder_clean_cmd': [ + 'python', + 'external_builder.py', + 'clean', '4', '5', + ], + }], + ], + }, + ], +} diff --git a/deps/gyp/test/msvs/external_builder/external_builder.py b/deps/gyp/test/msvs/external_builder/external_builder.py new file mode 100644 index 0000000000..ddfc1e5e33 --- /dev/null +++ b/deps/gyp/test/msvs/external_builder/external_builder.py @@ -0,0 +1,9 @@ +# Copyright (c) 2013 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 sys + +with open('external_builder.out', 'w') as f: + f.write(' '.join(sys.argv)) + diff --git a/deps/gyp/test/msvs/external_builder/gyptest-all.py b/deps/gyp/test/msvs/external_builder/gyptest-all.py new file mode 100644 index 0000000000..72faa7ab7f --- /dev/null +++ b/deps/gyp/test/msvs/external_builder/gyptest-all.py @@ -0,0 +1,59 @@ +#!/usr/bin/env python + +# Copyright (c) 2013 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. + +""" +Verifies that msvs_external_builder being set will invoke the provided +msvs_external_builder_build_cmd and msvs_external_builder_clean_cmd, and will +not invoke MSBuild actions and rules. +""" + +import os +import sys +import TestGyp + +if int(os.environ.get('GYP_MSVS_VERSION', 0)) < 2010: + sys.exit(0) + +test = TestGyp.TestGyp(formats=['msvs'], workdir='workarea_all') + +# without the flag set +test.run_gyp('external.gyp') +test.build('external.gyp', target='external') +test.must_not_exist('external_builder.out') +test.must_exist('msbuild_rule.out') +test.must_exist('msbuild_action.out') +test.must_match('msbuild_rule.out', 'msbuild_rule.py hello.z a b c') +test.must_match('msbuild_action.out', 'msbuild_action.py x y z') +os.remove('msbuild_rule.out') +os.remove('msbuild_action.out') + +# with the flag set, using Build +try: + os.environ['GYP_DEFINES'] = 'use_external_builder=1' + test.run_gyp('external.gyp') + test.build('external.gyp', target='external') +finally: + del os.environ['GYP_DEFINES'] +test.must_not_exist('msbuild_rule.out') +test.must_not_exist('msbuild_action.out') +test.must_exist('external_builder.out') +test.must_match('external_builder.out', 'external_builder.py build 1 2 3') +os.remove('external_builder.out') + +# with the flag set, using Clean +try: + os.environ['GYP_DEFINES'] = 'use_external_builder=1' + test.run_gyp('external.gyp') + test.build('external.gyp', target='external', clean=True) +finally: + del os.environ['GYP_DEFINES'] +test.must_not_exist('msbuild_rule.out') +test.must_not_exist('msbuild_action.out') +test.must_exist('external_builder.out') +test.must_match('external_builder.out', 'external_builder.py clean 4 5') +os.remove('external_builder.out') + +test.pass_test() diff --git a/deps/gyp/test/msvs/external_builder/hello.cpp b/deps/gyp/test/msvs/external_builder/hello.cpp new file mode 100644 index 0000000000..bc0c0265b5 --- /dev/null +++ b/deps/gyp/test/msvs/external_builder/hello.cpp @@ -0,0 +1,10 @@ +// 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. + +#include <stdio.h> + +int main(void) { + printf("Hello, world!\n"); + return 0; +} diff --git a/deps/gyp/test/msvs/external_builder/hello.z b/deps/gyp/test/msvs/external_builder/hello.z new file mode 100644 index 0000000000..aa478827b5 --- /dev/null +++ b/deps/gyp/test/msvs/external_builder/hello.z @@ -0,0 +1,6 @@ +# Copyright (c) 2013 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. + +This file will be passed to the test rule. + diff --git a/deps/gyp/test/msvs/external_builder/msbuild_action.py b/deps/gyp/test/msvs/external_builder/msbuild_action.py new file mode 100644 index 0000000000..632d786922 --- /dev/null +++ b/deps/gyp/test/msvs/external_builder/msbuild_action.py @@ -0,0 +1,9 @@ +# Copyright (c) 2013 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 sys + +with open('msbuild_action.out', 'w') as f: + f.write(' '.join(sys.argv)) + diff --git a/deps/gyp/test/msvs/external_builder/msbuild_rule.py b/deps/gyp/test/msvs/external_builder/msbuild_rule.py new file mode 100644 index 0000000000..0d6e315775 --- /dev/null +++ b/deps/gyp/test/msvs/external_builder/msbuild_rule.py @@ -0,0 +1,11 @@ +# Copyright (c) 2013 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 sys, os.path + +sys.argv[1] = os.path.basename(sys.argv[1]) + +with open('msbuild_rule.out', 'w') as f: + f.write(' '.join(sys.argv)) + diff --git a/deps/gyp/test/msvs/filters/filters.gyp b/deps/gyp/test/msvs/filters/filters.gyp new file mode 100644 index 0000000000..a4106dc8eb --- /dev/null +++ b/deps/gyp/test/msvs/filters/filters.gyp @@ -0,0 +1,47 @@ +# Copyright (c) 2014 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. + +{ + 'targets': [ + { + 'target_name': 'no_source_files', + 'type': 'none', + 'sources': [ ], + }, + { + 'target_name': 'one_source_file', + 'type': 'executable', + 'sources': [ + '../folder/a.c', + ], + }, + { + 'target_name': 'two_source_files', + 'type': 'executable', + 'sources': [ + '../folder/a.c', + '../folder/b.c', + ], + }, + { + 'target_name': 'three_files_in_two_folders', + 'type': 'executable', + 'sources': [ + '../folder1/a.c', + '../folder1/b.c', + '../folder2/c.c', + ], + }, + { + 'target_name': 'nested_folders', + 'type': 'executable', + 'sources': [ + '../folder1/nested/a.c', + '../folder2/d.c', + '../folder1/nested/b.c', + '../folder1/other/c.c', + ], + }, + ], +} diff --git a/deps/gyp/test/msvs/filters/gyptest-filters-2008.py b/deps/gyp/test/msvs/filters/gyptest-filters-2008.py new file mode 100644 index 0000000000..41ca085823 --- /dev/null +++ b/deps/gyp/test/msvs/filters/gyptest-filters-2008.py @@ -0,0 +1,68 @@ +#!/usr/bin/env python + +# Copyright (c) 2014 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. + +""" +Verifies that extra filters are pruned correctly for Visual Studio 2008. +""" + +import re +import TestGyp + + +def strip_ws(str): + return re.sub('^ +', '', str, flags=re.M).replace('\n', '') + + +test = TestGyp.TestGyp(formats=['msvs']) + +test.run_gyp('filters.gyp', '-G', 'standalone', '-G', 'msvs_version=2008') + +test.must_contain('no_source_files.vcproj', '<Files/>') + +test.must_contain('one_source_file.vcproj', strip_ws('''\ +<Files> + <File RelativePath="..\\folder\\a.c"/> +</Files> +''')) + +test.must_contain('two_source_files.vcproj', strip_ws('''\ +<Files> + <File RelativePath="..\\folder\\a.c"/> + <File RelativePath="..\\folder\\b.c"/> +</Files> +''')) + +test.must_contain('three_files_in_two_folders.vcproj', strip_ws('''\ +<Files> + <Filter Name="folder1"> + <File RelativePath="..\\folder1\\a.c"/> + <File RelativePath="..\\folder1\\b.c"/> + </Filter> + <Filter Name="folder2"> + <File RelativePath="..\\folder2\\c.c"/> + </Filter> +</Files> +''')) + +test.must_contain('nested_folders.vcproj', strip_ws('''\ +<Files> + <Filter Name="folder1"> + <Filter Name="nested"> + <File RelativePath="..\\folder1\\nested\\a.c"/> + <File RelativePath="..\\folder1\\nested\\b.c"/> + </Filter> + <Filter Name="other"> + <File RelativePath="..\\folder1\\other\\c.c"/> + </Filter> + </Filter> + <Filter Name="folder2"> + <File RelativePath="..\\folder2\\d.c"/> + </Filter> +</Files> +''')) + + +test.pass_test() diff --git a/deps/gyp/test/msvs/filters/gyptest-filters-2010.py b/deps/gyp/test/msvs/filters/gyptest-filters-2010.py new file mode 100644 index 0000000000..d8131d5d7b --- /dev/null +++ b/deps/gyp/test/msvs/filters/gyptest-filters-2010.py @@ -0,0 +1,57 @@ +#!/usr/bin/env python + +# Copyright (c) 2014 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. + +""" +Verifies that extra filters are pruned correctly for Visual Studio 2010 +and later. +""" + +import TestGyp + + +test = TestGyp.TestGyp(formats=['msvs']) + +test.run_gyp('filters.gyp', '-G', 'standalone', '-G', 'msvs_version=2010') + +test.must_not_exist('no_source_files.vcxproj.filters') + +test.must_not_exist('one_source_file.vcxproj.filters') + +test.must_not_exist('two_source_files.vcxproj.filters') + +test.must_contain('three_files_in_two_folders.vcxproj.filters', '''\ + <ItemGroup> + <ClCompile Include="..\\folder1\\a.c"> + <Filter>folder1</Filter> + </ClCompile> + <ClCompile Include="..\\folder1\\b.c"> + <Filter>folder1</Filter> + </ClCompile> + <ClCompile Include="..\\folder2\\c.c"> + <Filter>folder2</Filter> + </ClCompile> + </ItemGroup> +'''.replace('\n', '\r\n')) + +test.must_contain('nested_folders.vcxproj.filters', '''\ + <ItemGroup> + <ClCompile Include="..\\folder1\\nested\\a.c"> + <Filter>folder1\\nested</Filter> + </ClCompile> + <ClCompile Include="..\\folder2\\d.c"> + <Filter>folder2</Filter> + </ClCompile> + <ClCompile Include="..\\folder1\\nested\\b.c"> + <Filter>folder1\\nested</Filter> + </ClCompile> + <ClCompile Include="..\\folder1\\other\\c.c"> + <Filter>folder1\\other</Filter> + </ClCompile> + </ItemGroup> +'''.replace('\n', '\r\n')) + + +test.pass_test() diff --git a/deps/gyp/test/msvs/list_excluded/gyptest-all.py b/deps/gyp/test/msvs/list_excluded/gyptest-all.py new file mode 100644 index 0000000000..5a370f6b47 --- /dev/null +++ b/deps/gyp/test/msvs/list_excluded/gyptest-all.py @@ -0,0 +1,51 @@ +#!/usr/bin/env python + +# 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. + +""" +Verifies that msvs_list_excluded_files=0 doesn't list files that would +normally be in _excluded_files, and that if that flag is not set, then they +are still listed. +""" + +import os +import TestGyp + +test = TestGyp.TestGyp(formats=['msvs'], workdir='workarea_all') + + +# with the flag set to 0 +try: + os.environ['GYP_GENERATOR_FLAGS'] = 'msvs_list_excluded_files=0' + test.run_gyp('hello_exclude.gyp') +finally: + del os.environ['GYP_GENERATOR_FLAGS'] +if test.uses_msbuild: + test.must_not_contain('hello.vcxproj', 'hello_mac') +else: + test.must_not_contain('hello.vcproj', 'hello_mac') + + +# with the flag not set +test.run_gyp('hello_exclude.gyp') +if test.uses_msbuild: + test.must_contain('hello.vcxproj', 'hello_mac') +else: + test.must_contain('hello.vcproj', 'hello_mac') + + +# with the flag explicitly set to 1 +try: + os.environ['GYP_GENERATOR_FLAGS'] = 'msvs_list_excluded_files=1' + test.run_gyp('hello_exclude.gyp') +finally: + del os.environ['GYP_GENERATOR_FLAGS'] +if test.uses_msbuild: + test.must_contain('hello.vcxproj', 'hello_mac') +else: + test.must_contain('hello.vcproj', 'hello_mac') + + +test.pass_test() diff --git a/deps/gyp/test/msvs/list_excluded/hello.cpp b/deps/gyp/test/msvs/list_excluded/hello.cpp new file mode 100644 index 0000000000..bc0c0265b5 --- /dev/null +++ b/deps/gyp/test/msvs/list_excluded/hello.cpp @@ -0,0 +1,10 @@ +// 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. + +#include <stdio.h> + +int main(void) { + printf("Hello, world!\n"); + return 0; +} diff --git a/deps/gyp/test/msvs/list_excluded/hello_exclude.gyp b/deps/gyp/test/msvs/list_excluded/hello_exclude.gyp new file mode 100644 index 0000000000..aa160f2367 --- /dev/null +++ b/deps/gyp/test/msvs/list_excluded/hello_exclude.gyp @@ -0,0 +1,19 @@ +# 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. + +{ + 'targets': [ + { + 'target_name': 'hello', + 'type': 'executable', + 'sources': [ + 'hello.cpp', + 'hello_mac.cpp', + ], + 'conditions': [ + ['OS!="mac"', {'sources!': ['hello_mac.cpp']}], + ] + }, + ], +} diff --git a/deps/gyp/test/msvs/list_excluded/hello_mac.cpp b/deps/gyp/test/msvs/list_excluded/hello_mac.cpp new file mode 100644 index 0000000000..b9f6242c4b --- /dev/null +++ b/deps/gyp/test/msvs/list_excluded/hello_mac.cpp @@ -0,0 +1,10 @@ +// 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. + +#include <stdio.h> + +int hello2() { + printf("Hello, two!\n"); + return 0; +} diff --git a/deps/gyp/test/msvs/missing_sources/gyptest-missing.py b/deps/gyp/test/msvs/missing_sources/gyptest-missing.py new file mode 100644 index 0000000000..62a99ef0f1 --- /dev/null +++ b/deps/gyp/test/msvs/missing_sources/gyptest-missing.py @@ -0,0 +1,43 @@ +#!/usr/bin/env python + +# 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. + +""" +Verifies that missing 'sources' files are treated as fatal errors when the +the generator flag 'msvs_error_on_missing_sources' is set. +""" + +import TestGyp +import os +import sys + +if sys.platform == 'win32': + test = TestGyp.TestGyp(formats=['msvs', 'ninja'], workdir='workarea_all') + + # With the flag not set + test.run_gyp('hello_missing.gyp') + + # With the flag explicitly set to 0 + try: + os.environ['GYP_GENERATOR_FLAGS'] = 'msvs_error_on_missing_sources=0' + test.run_gyp('hello_missing.gyp') + finally: + del os.environ['GYP_GENERATOR_FLAGS'] + + # With the flag explicitly set to 1 + try: + os.environ['GYP_GENERATOR_FLAGS'] = 'msvs_error_on_missing_sources=1' + # Test to make sure GYP raises an exception (exit status 1). Since this will + # also print a backtrace, ensure that TestGyp is not checking that stderr is + # empty by specifying None, which means do not perform any checking. + # Instead, stderr is checked below to ensure it contains the expected + # output. + test.run_gyp('hello_missing.gyp', status=1, stderr=None) + finally: + del os.environ['GYP_GENERATOR_FLAGS'] + test.must_contain_any_line(test.stderr(), + ["Missing input files:"]) + + test.pass_test() diff --git a/deps/gyp/test/msvs/missing_sources/hello_missing.gyp b/deps/gyp/test/msvs/missing_sources/hello_missing.gyp new file mode 100644 index 0000000000..c08926bbff --- /dev/null +++ b/deps/gyp/test/msvs/missing_sources/hello_missing.gyp @@ -0,0 +1,15 @@ +# 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. + +{ + 'targets': [ + { + 'target_name': 'hello', + 'type': 'executable', + 'sources': [ + 'hello_missing.cpp', + ], + }, + ], +} diff --git a/deps/gyp/test/msvs/multiple_actions_error_handling/action_fail.py b/deps/gyp/test/msvs/multiple_actions_error_handling/action_fail.py new file mode 100644 index 0000000000..286fc4e132 --- /dev/null +++ b/deps/gyp/test/msvs/multiple_actions_error_handling/action_fail.py @@ -0,0 +1,7 @@ +# Copyright (c) 2014 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 sys + +sys.exit(1) diff --git a/deps/gyp/test/msvs/multiple_actions_error_handling/action_succeed.py b/deps/gyp/test/msvs/multiple_actions_error_handling/action_succeed.py new file mode 100644 index 0000000000..3554373197 --- /dev/null +++ b/deps/gyp/test/msvs/multiple_actions_error_handling/action_succeed.py @@ -0,0 +1,7 @@ +# Copyright (c) 2014 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 sys + +sys.exit(0) diff --git a/deps/gyp/test/msvs/multiple_actions_error_handling/actions.gyp b/deps/gyp/test/msvs/multiple_actions_error_handling/actions.gyp new file mode 100644 index 0000000000..ab99e929e2 --- /dev/null +++ b/deps/gyp/test/msvs/multiple_actions_error_handling/actions.gyp @@ -0,0 +1,40 @@ +# Copyright (c) 2014 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. + +{ + 'targets': [ + { + 'target_name': 'actions-test', + 'type': 'none', + 'actions': [ + { + 'action_name': 'first action (fails)', + 'inputs': [ + 'action_fail.py', + ], + 'outputs': [ + 'ALWAYS_OUT_OF_DATE', + ], + 'action': [ + 'python', '<@(_inputs)' + ], + 'msvs_cygwin_shell': 0, + }, + { + 'action_name': 'second action (succeeds)', + 'inputs': [ + 'action_succeed.py', + ], + 'outputs': [ + 'ALWAYS_OUT_OF_DATE', + ], + 'action': [ + 'python', '<@(_inputs)' + ], + 'msvs_cygwin_shell': 0, + }, + ], + }, + ], +} diff --git a/deps/gyp/test/msvs/multiple_actions_error_handling/gyptest.py b/deps/gyp/test/msvs/multiple_actions_error_handling/gyptest.py new file mode 100644 index 0000000000..3aa6b8fdb2 --- /dev/null +++ b/deps/gyp/test/msvs/multiple_actions_error_handling/gyptest.py @@ -0,0 +1,26 @@ +#!/usr/bin/env python + +# Copyright (c) 2014 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. + +""" +Verifies that failing actions make the build fail reliably, even when there +are multiple actions in one project. +""" + +import os +import sys +import TestGyp +import TestCmd + +test = TestGyp.TestGyp(formats=['msvs'], workdir='workarea_all') + +test.run_gyp('actions.gyp') +test.build('actions.gyp', + target='actions-test', + status=1, + stdout=r'.*"cmd\.exe" exited with code 1\..*', + match=TestCmd.match_re_dotall) + +test.pass_test() diff --git a/deps/gyp/test/msvs/props/AppName.props b/deps/gyp/test/msvs/props/AppName.props new file mode 100644 index 0000000000..b688f663d5 --- /dev/null +++ b/deps/gyp/test/msvs/props/AppName.props @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <PropertyGroup Label="UserMacros"> + <AppName>Greet</AppName> + </PropertyGroup> + <PropertyGroup> + <_ProjectFileVersion>10.0.40219.1</_ProjectFileVersion> + </PropertyGroup> + <ItemGroup> + <BuildMacro Include="AppName"> + <Value>$(AppName)</Value> + </BuildMacro> + </ItemGroup> +</Project> diff --git a/deps/gyp/test/msvs/props/AppName.vsprops b/deps/gyp/test/msvs/props/AppName.vsprops new file mode 100644 index 0000000000..84b9af3800 --- /dev/null +++ b/deps/gyp/test/msvs/props/AppName.vsprops @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="Windows-1252"?> +<VisualStudioPropertySheet + ProjectType="Visual C++" + Version="8.00" + Name="Common" + > + <UserMacro + Name="AppName" + Value="Greet" + /> +</VisualStudioPropertySheet> diff --git a/deps/gyp/test/msvs/props/gyptest-props.py b/deps/gyp/test/msvs/props/gyptest-props.py new file mode 100644 index 0000000000..abd4df2241 --- /dev/null +++ b/deps/gyp/test/msvs/props/gyptest-props.py @@ -0,0 +1,22 @@ +#!/usr/bin/env python + +# 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. + +""" +Verifies props files are added by using a +props file to set the name of the built executable. +""" + +import TestGyp + +test = TestGyp.TestGyp(workdir='workarea_all', formats=['msvs']) + +test.run_gyp('hello.gyp') + +test.build('hello.gyp') + +test.built_file_must_exist('Greet.exe') + +test.pass_test() diff --git a/deps/gyp/test/msvs/props/hello.c b/deps/gyp/test/msvs/props/hello.c new file mode 100644 index 0000000000..faadc75e2c --- /dev/null +++ b/deps/gyp/test/msvs/props/hello.c @@ -0,0 +1,11 @@ +/* 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. */ + +#include <stdio.h> + +int main(void) +{ + printf("Hello, world!\n"); + return 0; +} diff --git a/deps/gyp/test/msvs/props/hello.gyp b/deps/gyp/test/msvs/props/hello.gyp new file mode 100644 index 0000000000..5a58317fa7 --- /dev/null +++ b/deps/gyp/test/msvs/props/hello.gyp @@ -0,0 +1,22 @@ +# 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. +{ + 'targets': [ + { + 'target_name': 'hello', + 'product_name': '$(AppName)', + 'type': 'executable', + 'sources': [ + 'hello.c', + ], + 'msvs_props': [ + '$(SolutionDir)AppName.vsprops' + ], + 'msbuild_props': [ + '$(SolutionDir)AppName.props' + ], + }, + ], +} + diff --git a/deps/gyp/test/msvs/rules_stdout_stderr/dummy.bar b/deps/gyp/test/msvs/rules_stdout_stderr/dummy.bar new file mode 100644 index 0000000000..25178696d2 --- /dev/null +++ b/deps/gyp/test/msvs/rules_stdout_stderr/dummy.bar @@ -0,0 +1,5 @@ +# Copyright (c) 2015 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. + +A dummy file with the .bar extension (used for stderr rule). diff --git a/deps/gyp/test/msvs/rules_stdout_stderr/dummy.foo b/deps/gyp/test/msvs/rules_stdout_stderr/dummy.foo new file mode 100644 index 0000000000..6a7990bb98 --- /dev/null +++ b/deps/gyp/test/msvs/rules_stdout_stderr/dummy.foo @@ -0,0 +1,5 @@ +# Copyright (c) 2015 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. + +A dummy file with the .foo extension (used for stdout rule). diff --git a/deps/gyp/test/msvs/rules_stdout_stderr/gyptest-rules-stdout-stderr.py b/deps/gyp/test/msvs/rules_stdout_stderr/gyptest-rules-stdout-stderr.py new file mode 100644 index 0000000000..804505a23d --- /dev/null +++ b/deps/gyp/test/msvs/rules_stdout_stderr/gyptest-rules-stdout-stderr.py @@ -0,0 +1,29 @@ +#!/usr/bin/env python + +# Copyright (c) 2015 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. + +""" Verifies that stdout and stderr from rules get logged in the build's +stdout.""" + +import sys +import TestGyp + +if sys.platform == 'win32': + test = TestGyp.TestGyp(formats=['msvs']) + + test.run_gyp('rules-stdout-stderr.gyp') + test.build('rules-stdout-stderr.gyp', test.ALL) + + expected_stdout_lines = [ + 'testing stdout', + 'This will go to stdout', + + # Note: stderr output from rules will go to the build's stdout. + 'testing stderr', + 'This will go to stderr', + ] + test.must_contain_all_lines(test.stdout(), expected_stdout_lines) + + test.pass_test() diff --git a/deps/gyp/test/msvs/rules_stdout_stderr/rule_stderr.py b/deps/gyp/test/msvs/rules_stdout_stderr/rule_stderr.py new file mode 100644 index 0000000000..f4860624f3 --- /dev/null +++ b/deps/gyp/test/msvs/rules_stdout_stderr/rule_stderr.py @@ -0,0 +1,7 @@ +#!/usr/bin/env python +# Copyright (c) 2015 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 sys +print >>sys.stderr, "This will go to stderr" diff --git a/deps/gyp/test/msvs/rules_stdout_stderr/rule_stdout.py b/deps/gyp/test/msvs/rules_stdout_stderr/rule_stdout.py new file mode 100644 index 0000000000..2b58d2a374 --- /dev/null +++ b/deps/gyp/test/msvs/rules_stdout_stderr/rule_stdout.py @@ -0,0 +1,6 @@ +#!/usr/bin/env python +# Copyright (c) 2015 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. + +print "This will go to stdout" diff --git a/deps/gyp/test/msvs/rules_stdout_stderr/rules-stdout-stderr.gyp b/deps/gyp/test/msvs/rules_stdout_stderr/rules-stdout-stderr.gyp new file mode 100644 index 0000000000..ce93643f8e --- /dev/null +++ b/deps/gyp/test/msvs/rules_stdout_stderr/rules-stdout-stderr.gyp @@ -0,0 +1,52 @@ +# Copyright (c) 2015 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. + +{ + 'targets': [ + { + 'target_name': 'test', + 'type': 'none', + 'sources': [ + 'dummy.foo', + 'dummy.bar', + ], + 'rules': [ + { + 'rule_name': 'test_stdout', + 'extension': 'foo', + 'message': 'testing stdout', + 'msvs_cygwin_shell': 0, + 'inputs': [ + 'rule_stdout.py', + ], + 'outputs': [ + 'dummy.foo_output', + ], + 'action': [ + 'python', + 'rule_stdout.py', + '<(RULE_INPUT_PATH)', + ], + }, + { + 'rule_name': 'test_stderr', + 'extension': 'bar', + 'message': 'testing stderr', + 'msvs_cygwin_shell': 0, + 'inputs': [ + 'rule_stderr.py', + ], + 'outputs': [ + 'dummy.bar_output', + ], + 'action': [ + 'python', + 'rule_stderr.py', + '<(RULE_INPUT_PATH)', + ], + }, + ], + }, + ], +} diff --git a/deps/gyp/test/msvs/shared_output/common.gypi b/deps/gyp/test/msvs/shared_output/common.gypi new file mode 100644 index 0000000000..c6fa341d68 --- /dev/null +++ b/deps/gyp/test/msvs/shared_output/common.gypi @@ -0,0 +1,17 @@ +# 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. + +{ + 'target_defaults': { + 'default_configuration': 'Baz', + 'configurations': { + 'Baz': { + 'msvs_configuration_attributes': { + 'OutputDirectory': '<(DEPTH)/foo', + 'IntermediateDirectory': '$(OutDir)/bar', + }, + }, + }, + }, +} diff --git a/deps/gyp/test/msvs/shared_output/gyptest-shared_output.py b/deps/gyp/test/msvs/shared_output/gyptest-shared_output.py new file mode 100644 index 0000000000..270b280e6b --- /dev/null +++ b/deps/gyp/test/msvs/shared_output/gyptest-shared_output.py @@ -0,0 +1,41 @@ +#!/usr/bin/env python + +# 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. + +""" +Test checking that IntermediateDirectory can be defined in terms of +OutputDirectory. We previously had emitted the definition of +IntermediateDirectory before the definition of OutputDirectory. +This is required so that $(IntDir) can be based on $(OutDir). +""" + +import TestGyp +import os + +# NOTE: This test really is vcbuild/msbuild specific (not applicable to windows +# ninja), as it is testing the msvs output location when opening an .sln +# other than all.sln. +test = TestGyp.TestGyp(workdir='workarea_shared_output', formats=['msvs']) + +test.run_gyp('hello.gyp') +test.set_configuration('Baz') + +test.build('there/there.gyp', test.ALL) +test.must_exist(os.path.join(test.workdir, 'foo', 'there.exe')) +test.must_exist(os.path.join(test.workdir, 'foo', 'bar', 'there.obj')) + +test.build('hello.gyp', test.ALL) +test.must_exist(os.path.join(test.workdir, 'foo', 'hello.exe')) +test.must_exist(os.path.join(test.workdir, 'foo', 'bar', 'hello.obj')) + +if test.format == 'msvs': + if test.uses_msbuild: + test.must_contain('pull_in_there.vcxproj', + '<IntDir>$(OutDir)bar\\</IntDir>') + else: + test.must_contain('pull_in_there.vcproj', + 'IntermediateDirectory="$(OutDir)bar\\"') + +test.pass_test() diff --git a/deps/gyp/test/msvs/shared_output/hello.c b/deps/gyp/test/msvs/shared_output/hello.c new file mode 100644 index 0000000000..698e4fd36c --- /dev/null +++ b/deps/gyp/test/msvs/shared_output/hello.c @@ -0,0 +1,12 @@ +/* + * 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. + */ + +#include <stdio.h> + +int main(void) { + printf("Hello, world!\n"); + return 0; +} diff --git a/deps/gyp/test/msvs/shared_output/hello.gyp b/deps/gyp/test/msvs/shared_output/hello.gyp new file mode 100644 index 0000000000..f80e5cfca1 --- /dev/null +++ b/deps/gyp/test/msvs/shared_output/hello.gyp @@ -0,0 +1,21 @@ +# 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. + +{ + 'includes': ['common.gypi'], + 'targets': [ + { + 'target_name': 'pull_in_there', + 'type': 'none', + 'dependencies': ['there/there.gyp:*'], + }, + { + 'target_name': 'hello', + 'type': 'executable', + 'sources': [ + 'hello.c', + ], + }, + ], +} diff --git a/deps/gyp/test/msvs/shared_output/there/there.c b/deps/gyp/test/msvs/shared_output/there/there.c new file mode 100644 index 0000000000..698e4fd36c --- /dev/null +++ b/deps/gyp/test/msvs/shared_output/there/there.c @@ -0,0 +1,12 @@ +/* + * 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. + */ + +#include <stdio.h> + +int main(void) { + printf("Hello, world!\n"); + return 0; +} diff --git a/deps/gyp/test/msvs/shared_output/there/there.gyp b/deps/gyp/test/msvs/shared_output/there/there.gyp new file mode 100644 index 0000000000..56feff326c --- /dev/null +++ b/deps/gyp/test/msvs/shared_output/there/there.gyp @@ -0,0 +1,16 @@ +# 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. + +{ + 'includes': ['../common.gypi'], + 'targets': [ + { + 'target_name': 'there', + 'type': 'executable', + 'sources': [ + 'there.c', + ], + }, + ], +} diff --git a/deps/gyp/test/msvs/uldi2010/gyptest-all.py b/deps/gyp/test/msvs/uldi2010/gyptest-all.py new file mode 100644 index 0000000000..cc248fbd63 --- /dev/null +++ b/deps/gyp/test/msvs/uldi2010/gyptest-all.py @@ -0,0 +1,20 @@ +#!/usr/bin/env python + +# 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. + +""" +Verifies that uldi can be disabled on a per-project-reference basis in vs2010. +""" + +import TestGyp + +test = TestGyp.TestGyp(formats=['msvs'], workdir='workarea_all') + +test.run_gyp('hello.gyp') + +if test.uses_msbuild: + test.must_contain('hello.vcxproj', '<UseLibraryDependencyInputs>false') + +test.pass_test() diff --git a/deps/gyp/test/msvs/uldi2010/hello.c b/deps/gyp/test/msvs/uldi2010/hello.c new file mode 100644 index 0000000000..06e6a02905 --- /dev/null +++ b/deps/gyp/test/msvs/uldi2010/hello.c @@ -0,0 +1,13 @@ +/* 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. */ + +#include <stdio.h> + +extern int hello2(); + +int main(void) { + printf("Hello, world!\n"); + hello2(); + return 0; +} diff --git a/deps/gyp/test/msvs/uldi2010/hello.gyp b/deps/gyp/test/msvs/uldi2010/hello.gyp new file mode 100644 index 0000000000..a2bf2badb1 --- /dev/null +++ b/deps/gyp/test/msvs/uldi2010/hello.gyp @@ -0,0 +1,26 @@ +# 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. + +{ + 'targets': [ + { + 'target_name': 'hello', + 'type': 'executable', + 'sources': [ + 'hello.c', + ], + 'dependencies': [ + 'hellolib', + ] + }, + { + 'target_name': 'hellolib', + 'type': 'static_library', + 'sources': [ + 'hello2.c', + ], + 'msvs_2010_disable_uldi_when_referenced': 1, + }, + ], +} diff --git a/deps/gyp/test/msvs/uldi2010/hello2.c b/deps/gyp/test/msvs/uldi2010/hello2.c new file mode 100644 index 0000000000..e2f23238d1 --- /dev/null +++ b/deps/gyp/test/msvs/uldi2010/hello2.c @@ -0,0 +1,10 @@ +/* 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. */ + +#include <stdio.h> + +int hello2() { + printf("Hello, two!\n"); + return 0; +} diff --git a/deps/gyp/test/multiple-targets/gyptest-all.py b/deps/gyp/test/multiple-targets/gyptest-all.py new file mode 100755 index 0000000000..3ef50090d1 --- /dev/null +++ b/deps/gyp/test/multiple-targets/gyptest-all.py @@ -0,0 +1,30 @@ +#!/usr/bin/env python + +# Copyright (c) 2009 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 TestGyp + +test = TestGyp.TestGyp() + +test.run_gyp('multiple.gyp', chdir='src') + +test.relocate('src', 'relocate/src') + +test.build('multiple.gyp', test.ALL, chdir='relocate/src', stderr=None) + +expect1 = """\ +hello from prog1.c +hello from common.c +""" + +expect2 = """\ +hello from prog2.c +hello from common.c +""" + +test.run_built_executable('prog1', stdout=expect1, chdir='relocate/src') +test.run_built_executable('prog2', stdout=expect2, chdir='relocate/src') + +test.pass_test() diff --git a/deps/gyp/test/multiple-targets/gyptest-default.py b/deps/gyp/test/multiple-targets/gyptest-default.py new file mode 100755 index 0000000000..db15d794c3 --- /dev/null +++ b/deps/gyp/test/multiple-targets/gyptest-default.py @@ -0,0 +1,30 @@ +#!/usr/bin/env python + +# Copyright (c) 2009 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 TestGyp + +test = TestGyp.TestGyp() + +test.run_gyp('multiple.gyp', chdir='src') + +test.relocate('src', 'relocate/src') + +test.build('multiple.gyp', chdir='relocate/src') + +expect1 = """\ +hello from prog1.c +hello from common.c +""" + +expect2 = """\ +hello from prog2.c +hello from common.c +""" + +test.run_built_executable('prog1', stdout=expect1, chdir='relocate/src') +test.run_built_executable('prog2', stdout=expect2, chdir='relocate/src') + +test.pass_test() diff --git a/deps/gyp/test/multiple-targets/src/common.c b/deps/gyp/test/multiple-targets/src/common.c new file mode 100644 index 0000000000..f1df7c1431 --- /dev/null +++ b/deps/gyp/test/multiple-targets/src/common.c @@ -0,0 +1,7 @@ +#include <stdio.h> + +void common(void) +{ + printf("hello from common.c\n"); + return; +} diff --git a/deps/gyp/test/multiple-targets/src/multiple.gyp b/deps/gyp/test/multiple-targets/src/multiple.gyp new file mode 100644 index 0000000000..3db4ea30cd --- /dev/null +++ b/deps/gyp/test/multiple-targets/src/multiple.gyp @@ -0,0 +1,24 @@ +# Copyright (c) 2009 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. + +{ + 'targets': [ + { + 'target_name': 'prog1', + 'type': 'executable', + 'sources': [ + 'prog1.c', + 'common.c', + ], + }, + { + 'target_name': 'prog2', + 'type': 'executable', + 'sources': [ + 'prog2.c', + 'common.c', + ], + }, + ], +} diff --git a/deps/gyp/test/multiple-targets/src/prog1.c b/deps/gyp/test/multiple-targets/src/prog1.c new file mode 100644 index 0000000000..fbf8d4cd7c --- /dev/null +++ b/deps/gyp/test/multiple-targets/src/prog1.c @@ -0,0 +1,10 @@ +#include <stdio.h> + +extern void common(void); + +int main(void) +{ + printf("hello from prog1.c\n"); + common(); + return 0; +} diff --git a/deps/gyp/test/multiple-targets/src/prog2.c b/deps/gyp/test/multiple-targets/src/prog2.c new file mode 100644 index 0000000000..a94b5c155e --- /dev/null +++ b/deps/gyp/test/multiple-targets/src/prog2.c @@ -0,0 +1,10 @@ +#include <stdio.h> + +extern void common(void); + +int main(void) +{ + printf("hello from prog2.c\n"); + common(); + return 0; +} diff --git a/deps/gyp/test/ninja/action-rule-hash/gyptest-action-rule-hash.py b/deps/gyp/test/ninja/action-rule-hash/gyptest-action-rule-hash.py new file mode 100644 index 0000000000..7147fd2fc3 --- /dev/null +++ b/deps/gyp/test/ninja/action-rule-hash/gyptest-action-rule-hash.py @@ -0,0 +1,32 @@ +#!/usr/bin/env python + +# Copyright (c) 2014 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. + +""" +Verify that running gyp in a different directory does not cause actions and +rules to rerun. +""" + +import os +import sys +import TestGyp + +test = TestGyp.TestGyp(formats=['ninja']) +# The xcode-ninja generator handles gypfiles which are not at the +# project root incorrectly. +# cf. https://code.google.com/p/gyp/issues/detail?id=460 +if test.format == 'xcode-ninja': + test.skip_test() + +test.run_gyp('subdir/action-rule-hash.gyp') +test.build('subdir/action-rule-hash.gyp', test.ALL) +test.up_to_date('subdir/action-rule-hash.gyp') + +# Verify that everything is still up-to-date when we re-invoke gyp from a +# different directory. +test.run_gyp('action-rule-hash.gyp', '--depth=../', chdir='subdir') +test.up_to_date('subdir/action-rule-hash.gyp') + +test.pass_test() diff --git a/deps/gyp/test/ninja/action-rule-hash/subdir/action-rule-hash.gyp b/deps/gyp/test/ninja/action-rule-hash/subdir/action-rule-hash.gyp new file mode 100644 index 0000000000..0e88a3019f --- /dev/null +++ b/deps/gyp/test/ninja/action-rule-hash/subdir/action-rule-hash.gyp @@ -0,0 +1,29 @@ +# Copyright (c) 2014 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. + +{ + 'targets': [ + { + 'target_name': 'program', + 'type': 'executable', + 'sources': [ + '<(INTERMEDIATE_DIR)/main.cc', + ], + 'actions': [ + { + 'action_name': 'emit_main_cc', + 'inputs': ['emit.py'], + 'outputs': ['<(INTERMEDIATE_DIR)/main.cc'], + 'action': [ + 'python', + 'emit.py', + '<(INTERMEDIATE_DIR)/main.cc', + ], + # Allows the test to run without hermetic cygwin on windows. + 'msvs_cygwin_shell': 0, + }, + ], + }, + ], +} diff --git a/deps/gyp/test/ninja/action-rule-hash/subdir/emit.py b/deps/gyp/test/ninja/action-rule-hash/subdir/emit.py new file mode 100644 index 0000000000..fcb715a9fa --- /dev/null +++ b/deps/gyp/test/ninja/action-rule-hash/subdir/emit.py @@ -0,0 +1,13 @@ +#!/usr/bin/env python + +# Copyright (c) 2014 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 sys + +f = open(sys.argv[1], 'wb') +f.write('int main() {\n') +f.write(' return 0;\n') +f.write('}\n') +f.close() diff --git a/deps/gyp/test/ninja/action_dependencies/gyptest-action-dependencies.py b/deps/gyp/test/ninja/action_dependencies/gyptest-action-dependencies.py new file mode 100755 index 0000000000..cb59d7e3c1 --- /dev/null +++ b/deps/gyp/test/ninja/action_dependencies/gyptest-action-dependencies.py @@ -0,0 +1,62 @@ +#!/usr/bin/env python + +# 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. + +""" +Verify that building an object file correctly depends on running actions in +dependent targets, but not the targets themselves. +""" + +import os +import sys + +if sys.platform == 'win32': + print "This test is currently disabled: https://crbug.com/483696." + sys.exit(0) + + +import TestGyp + +# NOTE(piman): This test will not work with other generators because: +# - it explicitly tests the optimization, which is not implemented (yet?) on +# other generators +# - it relies on the exact path to output object files, which is generator +# dependent, and actually, relies on the ability to build only that object file, +# which I don't think is available on all generators. +# TODO(piman): Extend to other generators when possible. +test = TestGyp.TestGyp(formats=['ninja']) +# xcode-ninja doesn't support building single object files by design. +if test.format == 'xcode-ninja': + test.skip_test() + +test.run_gyp('action_dependencies.gyp', chdir='src') + +chdir = 'relocate/src' +test.relocate('src', chdir) + +objext = '.obj' if sys.platform == 'win32' else '.o' + +test.build('action_dependencies.gyp', + os.path.join('obj', 'b.b' + objext), + chdir=chdir) + +# The 'a' actions should be run (letting b.c compile), but the a static library +# should not be built. +test.built_file_must_not_exist('a', type=test.STATIC_LIB, chdir=chdir) +test.built_file_must_not_exist('b', type=test.STATIC_LIB, chdir=chdir) +test.built_file_must_exist(os.path.join('obj', 'b.b' + objext), chdir=chdir) + +test.build('action_dependencies.gyp', + os.path.join('obj', 'c.c' + objext), + chdir=chdir) + +# 'a' and 'b' should be built, so that the 'c' action succeeds, letting c.c +# compile +test.built_file_must_exist('a', type=test.STATIC_LIB, chdir=chdir) +test.built_file_must_exist('b', type=test.EXECUTABLE, chdir=chdir) +test.built_file_must_exist(os.path.join('obj', 'c.c' + objext), chdir=chdir) + + +test.pass_test() diff --git a/deps/gyp/test/ninja/action_dependencies/src/a.c b/deps/gyp/test/ninja/action_dependencies/src/a.c new file mode 100644 index 0000000000..4d7af9b26c --- /dev/null +++ b/deps/gyp/test/ninja/action_dependencies/src/a.c @@ -0,0 +1,10 @@ +/* Copyright (c) 2011 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. + */ + +#include "a.h" + +int funcA() { + return 42; +} diff --git a/deps/gyp/test/ninja/action_dependencies/src/a.h b/deps/gyp/test/ninja/action_dependencies/src/a.h new file mode 100644 index 0000000000..335db56739 --- /dev/null +++ b/deps/gyp/test/ninja/action_dependencies/src/a.h @@ -0,0 +1,13 @@ +/* Copyright (c) 2011 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. + */ + +#ifndef A_H_ +#define A_H_ + +#include "a/generated.h" + +int funcA(); + +#endif // A_H_ diff --git a/deps/gyp/test/ninja/action_dependencies/src/action_dependencies.gyp b/deps/gyp/test/ninja/action_dependencies/src/action_dependencies.gyp new file mode 100644 index 0000000000..5baa7a7d47 --- /dev/null +++ b/deps/gyp/test/ninja/action_dependencies/src/action_dependencies.gyp @@ -0,0 +1,88 @@ +# Copyright (c) 2011 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. + +{ + 'targets': [ + { + 'target_name': 'a', + 'type': 'static_library', + 'sources': [ + 'a.c', + 'a.h', + ], + 'actions': [ + { + 'action_name': 'generate_headers', + 'inputs': [ + 'emit.py' + ], + 'outputs': [ + '<(SHARED_INTERMEDIATE_DIR)/a/generated.h' + ], + 'action': [ + 'python', + 'emit.py', + '<(SHARED_INTERMEDIATE_DIR)/a/generated.h', + ], + # Allows the test to run without hermetic cygwin on windows. + 'msvs_cygwin_shell': 0, + }, + ], + 'include_dirs': [ + '<(SHARED_INTERMEDIATE_DIR)', + ], + 'direct_dependent_settings': { + 'include_dirs': [ + '<(SHARED_INTERMEDIATE_DIR)', + ], + }, + }, + { + 'target_name': 'b', + 'type': 'executable', + 'sources': [ + 'b.c', + 'b.h', + ], + 'dependencies': [ + 'a', + ], + }, + { + 'target_name': 'c', + 'type': 'static_library', + 'sources': [ + 'c.c', + 'c.h', + ], + 'dependencies': [ + 'b', + ], + 'actions': [ + { + 'action_name': 'generate_headers', + 'inputs': [ + ], + 'outputs': [ + '<(SHARED_INTERMEDIATE_DIR)/c/generated.h' + ], + 'action': [ + '<(PRODUCT_DIR)/b', + '<(SHARED_INTERMEDIATE_DIR)/c/generated.h', + ], + # Allows the test to run without hermetic cygwin on windows. + 'msvs_cygwin_shell': 0, + }, + ], + 'include_dirs': [ + '<(SHARED_INTERMEDIATE_DIR)', + ], + 'direct_dependent_settings': { + 'include_dirs': [ + '<(SHARED_INTERMEDIATE_DIR)', + ], + }, + }, + ], +} diff --git a/deps/gyp/test/ninja/action_dependencies/src/b.c b/deps/gyp/test/ninja/action_dependencies/src/b.c new file mode 100644 index 0000000000..824464695a --- /dev/null +++ b/deps/gyp/test/ninja/action_dependencies/src/b.c @@ -0,0 +1,18 @@ +/* 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. + */ + +#include <stdio.h> + +#include "b.h" + +int main(int argc, char** argv) { + FILE* f; + if (argc < 2) + return 1; + f = fopen(argv[1], "wt"); + fprintf(f, "#define VALUE %d\n", funcA()); + fclose(f); + return 0; +} diff --git a/deps/gyp/test/ninja/action_dependencies/src/b.h b/deps/gyp/test/ninja/action_dependencies/src/b.h new file mode 100644 index 0000000000..91362cd899 --- /dev/null +++ b/deps/gyp/test/ninja/action_dependencies/src/b.h @@ -0,0 +1,13 @@ +/* Copyright (c) 2011 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. + */ + +#ifndef B_H_ +#define B_H_ + +#include "a.h" + +int funcB(); + +#endif // B_H_ diff --git a/deps/gyp/test/ninja/action_dependencies/src/c.c b/deps/gyp/test/ninja/action_dependencies/src/c.c new file mode 100644 index 0000000000..b412087ec8 --- /dev/null +++ b/deps/gyp/test/ninja/action_dependencies/src/c.c @@ -0,0 +1,10 @@ +/* Copyright (c) 2011 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. + */ + +#include "c.h" + +int funcC() { + return VALUE; +} diff --git a/deps/gyp/test/ninja/action_dependencies/src/c.h b/deps/gyp/test/ninja/action_dependencies/src/c.h new file mode 100644 index 0000000000..c81a45bbe7 --- /dev/null +++ b/deps/gyp/test/ninja/action_dependencies/src/c.h @@ -0,0 +1,13 @@ +/* Copyright (c) 2011 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. + */ + +#ifndef C_H_ +#define C_H_ + +#include "c/generated.h" + +int funcC(); + +#endif // C_H_ diff --git a/deps/gyp/test/ninja/action_dependencies/src/emit.py b/deps/gyp/test/ninja/action_dependencies/src/emit.py new file mode 100755 index 0000000000..2df74b79a1 --- /dev/null +++ b/deps/gyp/test/ninja/action_dependencies/src/emit.py @@ -0,0 +1,11 @@ +#!/usr/bin/env python + +# Copyright (c) 2011 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 sys + +f = open(sys.argv[1], 'wb') +f.write('/* Hello World */\n') +f.close() diff --git a/deps/gyp/test/ninja/chained-dependency/chained-dependency.gyp b/deps/gyp/test/ninja/chained-dependency/chained-dependency.gyp new file mode 100644 index 0000000000..3fe68ae85a --- /dev/null +++ b/deps/gyp/test/ninja/chained-dependency/chained-dependency.gyp @@ -0,0 +1,53 @@ +# Copyright (c) 2010 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. + +{ + 'targets': [ + # This first target generates a header. + { + 'target_name': 'generate_header', + 'type': 'none', + 'msvs_cygwin_shell': '0', + 'actions': [ + { + 'action_name': 'generate header', + 'inputs': [], + 'outputs': ['<(SHARED_INTERMEDIATE_DIR)/generated/header.h'], + 'action': [ + 'python', '-c', 'open(<(_outputs), "w")' + ] + }, + ], + 'all_dependent_settings': { + 'include_dirs': [ + '<(SHARED_INTERMEDIATE_DIR)', + ], + }, + }, + + # This intermediate target does nothing other than pull in a + # dependency on the above generated target. + { + 'target_name': 'chain', + 'type': 'none', + 'dependencies': [ + 'generate_header', + ], + }, + + # This final target is: + # - a static library (so gyp doesn't transitively pull in dependencies); + # - that relies on the generated file two dependencies away. + { + 'target_name': 'chained', + 'type': 'static_library', + 'dependencies': [ + 'chain', + ], + 'sources': [ + 'chained.c', + ], + }, + ], +} diff --git a/deps/gyp/test/ninja/chained-dependency/chained.c b/deps/gyp/test/ninja/chained-dependency/chained.c new file mode 100644 index 0000000000..c1ff1a7b12 --- /dev/null +++ b/deps/gyp/test/ninja/chained-dependency/chained.c @@ -0,0 +1,5 @@ +#include "generated/header.h" + +int main(void) { + return 0; +} diff --git a/deps/gyp/test/ninja/chained-dependency/gyptest-chained-dependency.py b/deps/gyp/test/ninja/chained-dependency/gyptest-chained-dependency.py new file mode 100755 index 0000000000..d8763f1d3d --- /dev/null +++ b/deps/gyp/test/ninja/chained-dependency/gyptest-chained-dependency.py @@ -0,0 +1,30 @@ +#!/usr/bin/env python + +# 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. + +""" +Verifies that files generated by two-steps-removed actions are built before +dependent compile steps. +""" + +import os +import sys +import TestGyp + +# This test is Ninja-specific in that: +# - the bug only showed nondeterministically in parallel builds; +# - it relies on a ninja-specific output file path. + +test = TestGyp.TestGyp(formats=['ninja']) +# xcode-ninja doesn't support building single object files by design. +if test.format == 'xcode-ninja': + test.skip_test() + +test.run_gyp('chained-dependency.gyp') +objext = '.obj' if sys.platform == 'win32' else '.o' +test.build('chained-dependency.gyp', + os.path.join('obj', 'chained.chained' + objext)) +# The test passes if the .o file builds successfully. +test.pass_test() diff --git a/deps/gyp/test/ninja/empty-and-non-empty-duplicate-name/gyptest-empty-and-non-empty-duplicate-name.py b/deps/gyp/test/ninja/empty-and-non-empty-duplicate-name/gyptest-empty-and-non-empty-duplicate-name.py new file mode 100644 index 0000000000..0bdca66cdc --- /dev/null +++ b/deps/gyp/test/ninja/empty-and-non-empty-duplicate-name/gyptest-empty-and-non-empty-duplicate-name.py @@ -0,0 +1,23 @@ +#!/usr/bin/env python + +# Copyright (c) 2014 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. + +""" +Verifies a phony target isn't output if a target exists with the same name that +was output. +""" + +import TestGyp + +test = TestGyp.TestGyp(formats=['ninja']) + +# Reset xcode_ninja_target_pattern to its default for this test. +test.run_gyp('test.gyp', '-G', 'xcode_ninja_target_pattern=^$') + +# Check for both \r and \n to cover both windows and linux. +test.must_not_contain('out/Default/build.ninja', 'build empty_target: phony\r') +test.must_not_contain('out/Default/build.ninja', 'build empty_target: phony\n') + +test.pass_test() diff --git a/deps/gyp/test/ninja/empty-and-non-empty-duplicate-name/subdir/included.gyp b/deps/gyp/test/ninja/empty-and-non-empty-duplicate-name/subdir/included.gyp new file mode 100644 index 0000000000..1b9fc42f3f --- /dev/null +++ b/deps/gyp/test/ninja/empty-and-non-empty-duplicate-name/subdir/included.gyp @@ -0,0 +1,19 @@ +# Copyright (c) 2014 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. + +{ + 'targets': [ + { + 'target_name': 'empty_target', + 'type': 'executable', + 'sources': [ + 'test.cc', + ], + }, + { + 'target_name': 'included_empty_target', + 'type': 'none', + }, + ], +} diff --git a/deps/gyp/test/ninja/empty-and-non-empty-duplicate-name/test.gyp b/deps/gyp/test/ninja/empty-and-non-empty-duplicate-name/test.gyp new file mode 100644 index 0000000000..9aa6287c7c --- /dev/null +++ b/deps/gyp/test/ninja/empty-and-non-empty-duplicate-name/test.gyp @@ -0,0 +1,19 @@ +# Copyright (c) 2014 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. + +{ + 'targets': [ + { + 'target_name': 'All', + 'type': 'none', + 'dependencies': [ + 'subdir/included.gyp:included_empty_target' + ] + }, + { + 'target_name': 'empty_target', + 'type': 'none', + }, + ], +} diff --git a/deps/gyp/test/ninja/normalize-paths-win/gyptest-normalize-paths.py b/deps/gyp/test/ninja/normalize-paths-win/gyptest-normalize-paths.py new file mode 100644 index 0000000000..f56dbe5921 --- /dev/null +++ b/deps/gyp/test/ninja/normalize-paths-win/gyptest-normalize-paths.py @@ -0,0 +1,46 @@ +#!/usr/bin/env python + +# 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. + +""" +Make sure paths are normalized with VS macros properly expanded on Windows. +""" + +import TestGyp + +import sys + +if sys.platform == 'win32': + test = TestGyp.TestGyp(formats=['ninja']) + + test.run_gyp('normalize-paths.gyp') + + # We can't use existence tests because any case will pass, so we check the + # contents of ninja files directly since that's what we're most concerned + # with anyway. + subninja = open(test.built_file_path('obj/some_target.ninja')).read() + if '$!product_dir' in subninja: + test.fail_test() + if 'out\\Default' in subninja: + test.fail_test() + + second = open(test.built_file_path('obj/second.ninja')).read() + if ('..\\..\\things\\AnotherName.exe' in second or + 'AnotherName.exe' not in second): + test.fail_test() + + copytarget = open(test.built_file_path('obj/copy_target.ninja')).read() + if '$(VSInstallDir)' in copytarget: + test.fail_test() + + action = open(test.built_file_path('obj/action.ninja')).read() + if '..\\..\\out\\Default' in action: + test.fail_test() + if '..\\..\\SomethingElse' in action or 'SomethingElse' not in action: + test.fail_test() + if '..\\..\\SomeOtherInput' in action or 'SomeOtherInput' not in action: + test.fail_test() + + test.pass_test() diff --git a/deps/gyp/test/ninja/normalize-paths-win/hello.cc b/deps/gyp/test/ninja/normalize-paths-win/hello.cc new file mode 100644 index 0000000000..1711567ef5 --- /dev/null +++ b/deps/gyp/test/ninja/normalize-paths-win/hello.cc @@ -0,0 +1,7 @@ +// 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. + +int main() { + return 0; +} diff --git a/deps/gyp/test/ninja/normalize-paths-win/normalize-paths.gyp b/deps/gyp/test/ninja/normalize-paths-win/normalize-paths.gyp new file mode 100644 index 0000000000..544d06456d --- /dev/null +++ b/deps/gyp/test/ninja/normalize-paths-win/normalize-paths.gyp @@ -0,0 +1,68 @@ +# Copyright (c) 2010 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. + +{ + 'targets': [ + { + 'target_name': 'Some_Target', + 'type': 'executable', + 'msvs_settings': { + 'VCLinkerTool': { + 'OutputFile': '<(PRODUCT_DIR)/stuff/AnotherName.exe', + }, + }, + 'sources': [ + 'HeLLo.cc', + 'blOrP.idl', + ], + }, + { + 'target_name': 'second', + 'type': 'executable', + 'msvs_settings': { + 'VCLinkerTool': { + 'OutputFile': '$(OutDir)\\things\\AnotherName.exe', + }, + }, + 'sources': [ + 'HeLLo.cc', + ], + }, + { + 'target_name': 'Copy_Target', + 'type': 'none', + 'copies': [ + { + 'destination': '<(PRODUCT_DIR)', + 'files': [ + '$(VSInstallDir)\\bin\\cl.exe', + ], + }, + ], + }, + { + 'target_name': 'action', + 'type': 'none', + 'msvs_cygwin_shell': '0', + 'actions': [ + { + 'inputs': [ + '$(IntDir)\\SomeInput', + '$(OutDir)\\SomeOtherInput', + ], + 'outputs': [ + '<(PRODUCT_DIR)/ReSuLt', + '<(SHARED_INTERMEDIATE_DIR)/TempFile', + '$(OutDir)\SomethingElse', + ], + 'action_name': 'Test action', + # Unfortunately, we can't normalize this field because it's + # free-form. Fortunately, ninja doesn't inspect it at all (only the + # inputs and outputs) so it's not mandatory. + 'action': [], + }, + ], + }, + ], +} diff --git a/deps/gyp/test/ninja/s-needs-no-depfiles/empty.s b/deps/gyp/test/ninja/s-needs-no-depfiles/empty.s new file mode 100644 index 0000000000..218d8921e5 --- /dev/null +++ b/deps/gyp/test/ninja/s-needs-no-depfiles/empty.s @@ -0,0 +1 @@ +# This file intentionally left blank. diff --git a/deps/gyp/test/ninja/s-needs-no-depfiles/gyptest-s-needs-no-depfiles.py b/deps/gyp/test/ninja/s-needs-no-depfiles/gyptest-s-needs-no-depfiles.py new file mode 100755 index 0000000000..77a3245d46 --- /dev/null +++ b/deps/gyp/test/ninja/s-needs-no-depfiles/gyptest-s-needs-no-depfiles.py @@ -0,0 +1,42 @@ +#!/usr/bin/env python + +# 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. + +""" +Verify that .s files don't always trigger a rebuild, as would happen if depfiles +were used for them (since clang & gcc ignore -MMD when building .s->.o on +linux). +""" + +import os +import sys +import TestCommon +import TestGyp + +# NOTE(fischman): Each generator uses depfiles (or not) differently, so this is +# a ninja-specific test. +test = TestGyp.TestGyp(formats=['ninja']) + +if sys.platform == 'win32' or sys.platform == 'win64': + # This test is about clang/gcc vs. depfiles; VS gets a pass. + test.pass_test() + sys.exit(0) + +test.run_gyp('s-needs-no-depfiles.gyp') + +# Build the library, grab its timestamp, rebuild the library, ensure timestamp +# hasn't changed. +test.build('s-needs-no-depfiles.gyp', 'empty') +empty_dll = test.built_file_path('empty', test.SHARED_LIB) +test.built_file_must_exist(empty_dll) +pre_stat = os.stat(test.built_file_path(empty_dll)) +test.sleep() +test.build('s-needs-no-depfiles.gyp', 'empty') +post_stat = os.stat(test.built_file_path(empty_dll)) + +if pre_stat.st_mtime != post_stat.st_mtime: + test.fail_test() +else: + test.pass_test() diff --git a/deps/gyp/test/ninja/s-needs-no-depfiles/s-needs-no-depfiles.gyp b/deps/gyp/test/ninja/s-needs-no-depfiles/s-needs-no-depfiles.gyp new file mode 100644 index 0000000000..bd66b1a70a --- /dev/null +++ b/deps/gyp/test/ninja/s-needs-no-depfiles/s-needs-no-depfiles.gyp @@ -0,0 +1,13 @@ +# 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. + +{ + 'targets': [ + { + 'target_name': 'empty', + 'type': 'shared_library', + 'sources': [ 'empty.s' ], + }, + ], +} diff --git a/deps/gyp/test/ninja/solibs_avoid_relinking/gyptest-solibs-avoid-relinking.py b/deps/gyp/test/ninja/solibs_avoid_relinking/gyptest-solibs-avoid-relinking.py new file mode 100755 index 0000000000..1b8e812eb2 --- /dev/null +++ b/deps/gyp/test/ninja/solibs_avoid_relinking/gyptest-solibs-avoid-relinking.py @@ -0,0 +1,46 @@ +#!/usr/bin/env python + +# 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. + +""" +Verify that relinking a solib doesn't relink a dependent executable if the +solib's public API hasn't changed. +""" + +import os +import sys +import TestCommon +import TestGyp + +# NOTE(fischman): This test will not work with other generators because the +# API-hash-based-mtime-preservation optimization is only implemented in +# ninja.py. It could be extended to the make.py generator as well pretty +# easily, probably. +# (also, it tests ninja-specific out paths, which would have to be generalized +# if this was extended to other generators). +test = TestGyp.TestGyp(formats=['ninja']) + +if not os.environ.get('ProgramFiles(x86)'): + # TODO(scottmg) + print 'Skipping test on x86, http://crbug.com/365833' + test.pass_test() + +test.run_gyp('solibs_avoid_relinking.gyp') + +# Build the executable, grab its timestamp, touch the solib's source, rebuild +# executable, ensure timestamp hasn't changed. +test.build('solibs_avoid_relinking.gyp', 'b') +test.built_file_must_exist('b' + TestCommon.exe_suffix) +pre_stat = os.stat(test.built_file_path('b' + TestCommon.exe_suffix)) +os.utime(os.path.join(test.workdir, 'solib.cc'), + (pre_stat.st_atime, pre_stat.st_mtime + 100)) +test.sleep() +test.build('solibs_avoid_relinking.gyp', 'b') +post_stat = os.stat(test.built_file_path('b' + TestCommon.exe_suffix)) + +if pre_stat.st_mtime != post_stat.st_mtime: + test.fail_test() +else: + test.pass_test() diff --git a/deps/gyp/test/ninja/solibs_avoid_relinking/main.cc b/deps/gyp/test/ninja/solibs_avoid_relinking/main.cc new file mode 100644 index 0000000000..2cd74d3c77 --- /dev/null +++ b/deps/gyp/test/ninja/solibs_avoid_relinking/main.cc @@ -0,0 +1,5 @@ +extern int foo(); + +int main() { + return foo(); +} diff --git a/deps/gyp/test/ninja/solibs_avoid_relinking/solib.cc b/deps/gyp/test/ninja/solibs_avoid_relinking/solib.cc new file mode 100644 index 0000000000..0856cd4e00 --- /dev/null +++ b/deps/gyp/test/ninja/solibs_avoid_relinking/solib.cc @@ -0,0 +1,8 @@ +#ifdef _MSC_VER +__declspec(dllexport) +#else +__attribute__((visibility("default"))) +#endif +int foo() { + return 42; +} diff --git a/deps/gyp/test/ninja/solibs_avoid_relinking/solibs_avoid_relinking.gyp b/deps/gyp/test/ninja/solibs_avoid_relinking/solibs_avoid_relinking.gyp new file mode 100644 index 0000000000..e816351d68 --- /dev/null +++ b/deps/gyp/test/ninja/solibs_avoid_relinking/solibs_avoid_relinking.gyp @@ -0,0 +1,38 @@ +# 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. + +{ + 'targets': [ + { + 'target_name': 'a', + 'type': 'shared_library', + 'sources': [ 'solib.cc' ], + # Incremental linking enabled so that .lib timestamp is maintained when + # exports are unchanged. + 'msvs_settings': { + 'VCLinkerTool': { + 'LinkIncremental': '2', + } + }, + }, + { + 'target_name': 'b', + 'type': 'executable', + 'sources': [ 'main.cc' ], + 'dependencies': [ 'a' ], + 'msvs_settings': { + 'VCLinkerTool': { + 'LinkIncremental': '2', + } + }, + }, + ], + 'conditions': [ + ['OS=="linux"', { + 'target_defaults': { + 'cflags': ['-fPIC'], + }, + }], + ], +} diff --git a/deps/gyp/test/ninja/use-console/foo.bar b/deps/gyp/test/ninja/use-console/foo.bar new file mode 100644 index 0000000000..07c476a866 --- /dev/null +++ b/deps/gyp/test/ninja/use-console/foo.bar @@ -0,0 +1,5 @@ +# Copyright (c) 2014 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. + +This is a dummy file for rule/action input. diff --git a/deps/gyp/test/ninja/use-console/gyptest-use-console.py b/deps/gyp/test/ninja/use-console/gyptest-use-console.py new file mode 100644 index 0000000000..f76fcd9829 --- /dev/null +++ b/deps/gyp/test/ninja/use-console/gyptest-use-console.py @@ -0,0 +1,29 @@ +#!/usr/bin/env python + +# Copyright (c) 2014 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. + +""" +Make sure 'ninja_use_console' is supported in actions and rules. +""" + +import TestGyp + +test = TestGyp.TestGyp(formats=['ninja']) + +test.run_gyp('use-console.gyp') + +no_pool = open(test.built_file_path('obj/no_pool.ninja')).read() +if 'pool =' in no_pool: + test.fail_test() + +action_pool = open(test.built_file_path('obj/action_pool.ninja')).read() +if 'pool = console' not in action_pool: + test.fail_test() + +rule_pool = open(test.built_file_path('obj/rule_pool.ninja')).read() +if 'pool = console' not in rule_pool: + test.fail_test() + +test.pass_test() diff --git a/deps/gyp/test/ninja/use-console/use-console.gyp b/deps/gyp/test/ninja/use-console/use-console.gyp new file mode 100644 index 0000000000..84e63184c6 --- /dev/null +++ b/deps/gyp/test/ninja/use-console/use-console.gyp @@ -0,0 +1,60 @@ +# Copyright (c) 2014 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. + +{ + 'targets': [ + { + 'target_name': 'no_pool', + 'type': 'none', + 'actions': [ + { + 'action_name': 'some_action', + 'action': ['echo', 'hello'], + 'inputs': ['foo.bar'], + 'outputs': ['dummy'], + }, + ], + 'rules': [ + { + 'rule_name': 'some_rule', + 'extension': 'bar', + 'action': ['echo', 'hello'], + 'outputs': ['dummy'], + }, + ], + 'sources': [ + 'foo.bar', + ], + }, + { + 'target_name': 'action_pool', + 'type': 'none', + 'actions': [ + { + 'action_name': 'some_action', + 'action': ['echo', 'hello'], + 'inputs': ['foo.bar'], + 'outputs': ['dummy'], + 'ninja_use_console': 1, + }, + ], + }, + { + 'target_name': 'rule_pool', + 'type': 'none', + 'rules': [ + { + 'rule_name': 'some_rule', + 'extension': 'bar', + 'action': ['echo', 'hello'], + 'outputs': ['dummy'], + 'ninja_use_console': 1, + }, + ], + 'sources': [ + 'foo.bar', + ], + }, + ], +} diff --git a/deps/gyp/test/ninja/use-custom-environment-files/gyptest-use-custom-environment-files.py b/deps/gyp/test/ninja/use-custom-environment-files/gyptest-use-custom-environment-files.py new file mode 100644 index 0000000000..0c44b1d1c9 --- /dev/null +++ b/deps/gyp/test/ninja/use-custom-environment-files/gyptest-use-custom-environment-files.py @@ -0,0 +1,28 @@ +#!/usr/bin/env python + +# 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. + +""" +Make sure environment files can be suppressed. +""" + +import TestGyp + +import os +import sys + +if sys.platform == 'win32': + test = TestGyp.TestGyp(formats=['ninja']) + + test.run_gyp('use-custom-environment-files.gyp', + '-G', 'ninja_use_custom_environment_files') + + # Make sure environment files do not exist. + if os.path.exists(test.built_file_path('environment.x86')): + test.fail_test() + if os.path.exists(test.built_file_path('environment.x64')): + test.fail_test() + + test.pass_test() diff --git a/deps/gyp/test/ninja/use-custom-environment-files/use-custom-environment-files.cc b/deps/gyp/test/ninja/use-custom-environment-files/use-custom-environment-files.cc new file mode 100644 index 0000000000..1711567ef5 --- /dev/null +++ b/deps/gyp/test/ninja/use-custom-environment-files/use-custom-environment-files.cc @@ -0,0 +1,7 @@ +// 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. + +int main() { + return 0; +} diff --git a/deps/gyp/test/ninja/use-custom-environment-files/use-custom-environment-files.gyp b/deps/gyp/test/ninja/use-custom-environment-files/use-custom-environment-files.gyp new file mode 100644 index 0000000000..dbc95a9439 --- /dev/null +++ b/deps/gyp/test/ninja/use-custom-environment-files/use-custom-environment-files.gyp @@ -0,0 +1,15 @@ +# Copyright (c) 2010 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. + +{ + 'targets': [ + { + 'target_name': 'test_use_custom_environment_files', + 'type': 'executable', + 'sources': [ + 'use-custom-environment-files.cc', + ], + }, + ], +} diff --git a/deps/gyp/test/no-cpp/gyptest-no-cpp.py b/deps/gyp/test/no-cpp/gyptest-no-cpp.py new file mode 100644 index 0000000000..d37e3c194b --- /dev/null +++ b/deps/gyp/test/no-cpp/gyptest-no-cpp.py @@ -0,0 +1,51 @@ +#!/usr/bin/env python + +# 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. + +""" +Checks that C-only targets aren't linked against libstdc++. +""" + +import TestGyp + +import re +import subprocess +import sys + +# set |match| to ignore build stderr output. +test = TestGyp.TestGyp(match = lambda a, b: True) +if sys.platform != 'win32' and test.format != 'make': + # TODO: This doesn't pass with make. + # TODO: Does a test like this make sense with Windows? + + CHDIR = 'src' + test.run_gyp('test.gyp', chdir=CHDIR) + test.build('test.gyp', 'no_cpp', chdir=CHDIR) + + def LinksLibStdCpp(path): + path = test.built_file_path(path, chdir=CHDIR) + if sys.platform == 'darwin': + proc = subprocess.Popen(['otool', '-L', path], stdout=subprocess.PIPE) + else: + proc = subprocess.Popen(['ldd', path], stdout=subprocess.PIPE) + output = proc.communicate()[0] + assert not proc.returncode + return 'libstdc++' in output or 'libc++' in output + + if LinksLibStdCpp('no_cpp'): + test.fail_test() + + build_error_code = { + 'xcode': [1, 65], # 1 for xcode 3, 65 for xcode 4 (see `man sysexits`) + 'make': 2, + 'ninja': 1, + 'cmake': 0, # CMake picks the compiler driver based on transitive checks. + 'xcode-ninja': [1, 65], + }[test.format] + + test.build('test.gyp', 'no_cpp_dep_on_cc_lib', chdir=CHDIR, + status=build_error_code) + + test.pass_test() diff --git a/deps/gyp/test/no-cpp/src/call-f-main.c b/deps/gyp/test/no-cpp/src/call-f-main.c new file mode 100644 index 0000000000..8b95c5910e --- /dev/null +++ b/deps/gyp/test/no-cpp/src/call-f-main.c @@ -0,0 +1,2 @@ +void* f(); +int main() { f(); } diff --git a/deps/gyp/test/no-cpp/src/empty-main.c b/deps/gyp/test/no-cpp/src/empty-main.c new file mode 100644 index 0000000000..237c8ce181 --- /dev/null +++ b/deps/gyp/test/no-cpp/src/empty-main.c @@ -0,0 +1 @@ +int main() {} diff --git a/deps/gyp/test/no-cpp/src/f.cc b/deps/gyp/test/no-cpp/src/f.cc new file mode 100644 index 0000000000..02f50f21a0 --- /dev/null +++ b/deps/gyp/test/no-cpp/src/f.cc @@ -0,0 +1,3 @@ +extern "C" { void* f(); } + +void* f() { return new int; } diff --git a/deps/gyp/test/no-cpp/src/test.gyp b/deps/gyp/test/no-cpp/src/test.gyp new file mode 100644 index 0000000000..417015ec80 --- /dev/null +++ b/deps/gyp/test/no-cpp/src/test.gyp @@ -0,0 +1,25 @@ +# Copyright (c) 2013 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. +{ + 'targets': [ + { + 'target_name': 'no_cpp', + 'type': 'executable', + 'sources': [ 'empty-main.c' ], + }, + # A static_library with a cpp file and a linkable with only .c files + # depending on it causes a linker error: + { + 'target_name': 'cpp_lib', + 'type': 'static_library', + 'sources': [ 'f.cc' ], + }, + { + 'target_name': 'no_cpp_dep_on_cc_lib', + 'type': 'executable', + 'dependencies': [ 'cpp_lib' ], + 'sources': [ 'call-f-main.c' ], + }, + ], +} diff --git a/deps/gyp/test/no-output/gyptest-no-output.py b/deps/gyp/test/no-output/gyptest-no-output.py new file mode 100755 index 0000000000..bf9a0b5aaa --- /dev/null +++ b/deps/gyp/test/no-output/gyptest-no-output.py @@ -0,0 +1,21 @@ +#!/usr/bin/env python + +# Copyright (c) 2009 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. + +""" +Verified things don't explode when there are targets without outputs. +""" + +import TestGyp + +# TODO(evan): in ninja when there are no targets, there is no 'all' +# target either. Disabling this test for now. +test = TestGyp.TestGyp(formats=['!ninja']) + +test.run_gyp('nooutput.gyp', chdir='src') +test.relocate('src', 'relocate/src') +test.build('nooutput.gyp', chdir='relocate/src') + +test.pass_test() diff --git a/deps/gyp/test/no-output/src/nooutput.gyp b/deps/gyp/test/no-output/src/nooutput.gyp new file mode 100644 index 0000000000..c40124efc1 --- /dev/null +++ b/deps/gyp/test/no-output/src/nooutput.gyp @@ -0,0 +1,17 @@ +# Copyright (c) 2009 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. + +{ + 'targets': [ + { + 'target_name': 'no_output', + 'type': 'none', + 'direct_dependent_settings': { + 'defines': [ + 'NADA', + ], + }, + }, + ], +} diff --git a/deps/gyp/test/product/gyptest-product.py b/deps/gyp/test/product/gyptest-product.py new file mode 100755 index 0000000000..53eb5c376b --- /dev/null +++ b/deps/gyp/test/product/gyptest-product.py @@ -0,0 +1,43 @@ +#!/usr/bin/env python + +# 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. + +""" +Verifies simplest-possible build of a "Hello, world!" program +using the default build target. +""" + +import TestGyp + +test = TestGyp.TestGyp() + +test.run_gyp('product.gyp') +test.build('product.gyp') + +# executables +test.built_file_must_exist('alt1' + test._exe, test.EXECUTABLE, bare=True) +test.built_file_must_exist('hello2.stuff', test.EXECUTABLE, bare=True) +test.built_file_must_exist('yoalt3.stuff', test.EXECUTABLE, bare=True) + +# shared libraries +test.built_file_must_exist(test.dll_ + 'alt4' + test._dll, + test.SHARED_LIB, bare=True) +test.built_file_must_exist(test.dll_ + 'hello5.stuff', + test.SHARED_LIB, bare=True) +test.built_file_must_exist('yoalt6.stuff', test.SHARED_LIB, bare=True) + +# static libraries +test.built_file_must_exist(test.lib_ + 'alt7' + test._lib, + test.STATIC_LIB, bare=True) +test.built_file_must_exist(test.lib_ + 'hello8.stuff', + test.STATIC_LIB, bare=True) +test.built_file_must_exist('yoalt9.stuff', test.STATIC_LIB, bare=True) + +# alternate product_dir +test.built_file_must_exist('bob/yoalt10.stuff', test.EXECUTABLE, bare=True) +test.built_file_must_exist('bob/yoalt11.stuff', test.EXECUTABLE, bare=True) +test.built_file_must_exist('bob/yoalt12.stuff', test.EXECUTABLE, bare=True) + +test.pass_test() diff --git a/deps/gyp/test/product/hello.c b/deps/gyp/test/product/hello.c new file mode 100644 index 0000000000..41fdff0e38 --- /dev/null +++ b/deps/gyp/test/product/hello.c @@ -0,0 +1,15 @@ +/* Copyright (c) 2009 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. */ + +#include <stdio.h> + +int func1(void) { + return 42; +} + +int main(void) { + printf("Hello, world!\n"); + printf("%d\n", func1()); + return 0; +} diff --git a/deps/gyp/test/product/product.gyp b/deps/gyp/test/product/product.gyp new file mode 100644 index 0000000000..c25eaaacb5 --- /dev/null +++ b/deps/gyp/test/product/product.gyp @@ -0,0 +1,128 @@ +# Copyright (c) 2009 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. + +{ + 'targets': [ + { + 'target_name': 'hello1', + 'product_name': 'alt1', + 'type': 'executable', + 'sources': [ + 'hello.c', + ], + }, + { + 'target_name': 'hello2', + 'product_extension': 'stuff', + 'type': 'executable', + 'sources': [ + 'hello.c', + ], + }, + { + 'target_name': 'hello3', + 'product_name': 'alt3', + 'product_extension': 'stuff', + 'product_prefix': 'yo', + 'type': 'executable', + 'sources': [ + 'hello.c', + ], + }, + + { + 'target_name': 'hello4', + 'product_name': 'alt4', + 'type': 'shared_library', + 'sources': [ + 'hello.c', + ], + }, + { + 'target_name': 'hello5', + 'product_extension': 'stuff', + 'type': 'shared_library', + 'sources': [ + 'hello.c', + ], + }, + { + 'target_name': 'hello6', + 'product_name': 'alt6', + 'product_extension': 'stuff', + 'product_prefix': 'yo', + 'type': 'shared_library', + 'sources': [ + 'hello.c', + ], + }, + + { + 'target_name': 'hello7', + 'product_name': 'alt7', + 'type': 'static_library', + 'sources': [ + 'hello.c', + ], + }, + { + 'target_name': 'hello8', + 'product_extension': 'stuff', + 'type': 'static_library', + 'sources': [ + 'hello.c', + ], + }, + { + 'target_name': 'hello9', + 'product_name': 'alt9', + 'product_extension': 'stuff', + 'product_prefix': 'yo', + 'type': 'static_library', + 'sources': [ + 'hello.c', + ], + }, + { + 'target_name': 'hello10', + 'product_name': 'alt10', + 'product_extension': 'stuff', + 'product_prefix': 'yo', + 'product_dir': '<(PRODUCT_DIR)/bob', + 'type': 'executable', + 'sources': [ + 'hello.c', + ], + }, + { + 'target_name': 'hello11', + 'product_name': 'alt11', + 'product_extension': 'stuff', + 'product_prefix': 'yo', + 'product_dir': '<(PRODUCT_DIR)/bob', + 'type': 'shared_library', + 'sources': [ + 'hello.c', + ], + }, + { + 'target_name': 'hello12', + 'product_name': 'alt12', + 'product_extension': 'stuff', + 'product_prefix': 'yo', + 'product_dir': '<(PRODUCT_DIR)/bob', + 'type': 'static_library', + 'sources': [ + 'hello.c', + ], + }, + ], + 'conditions': [ + ['OS=="linux"', { + 'target_defaults': { + 'cflags': ['-fPIC'], + }, + }], + ], +} diff --git a/deps/gyp/test/prune_targets/gyptest-prune-targets.py b/deps/gyp/test/prune_targets/gyptest-prune-targets.py new file mode 100644 index 0000000000..b2c90f717e --- /dev/null +++ b/deps/gyp/test/prune_targets/gyptest-prune-targets.py @@ -0,0 +1,66 @@ +#!/usr/bin/env python + +# Copyright (c) 2013 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. + +""" +Verifies --root-target removes the unnecessary targets. +""" + +import TestGyp + +test = TestGyp.TestGyp() +# The xcode-ninja generator has its own logic for which targets to include +if test.format == 'xcode-ninja': + test.skip_test() + +build_error_code = { + 'cmake': 1, + 'make': 2, + 'msvs': 1, + 'ninja': 1, + 'xcode': 65, +}[test.format] + +# By default, everything will be included. +test.run_gyp('test1.gyp') +test.build('test2.gyp', 'lib1') +test.build('test2.gyp', 'lib2') +test.build('test2.gyp', 'lib3') +test.build('test2.gyp', 'lib_indirect') +test.build('test1.gyp', 'program1') +test.build('test1.gyp', 'program2') +test.build('test1.gyp', 'program3') + +# With deep dependencies of program1 only. +test.run_gyp('test1.gyp', '--root-target=program1') +test.build('test2.gyp', 'lib1') +test.build('test2.gyp', 'lib2', status=build_error_code, stderr=None) +test.build('test2.gyp', 'lib3', status=build_error_code, stderr=None) +test.build('test2.gyp', 'lib_indirect') +test.build('test1.gyp', 'program1') +test.build('test1.gyp', 'program2', status=build_error_code, stderr=None) +test.build('test1.gyp', 'program3', status=build_error_code, stderr=None) + +# With deep dependencies of program2 only. +test.run_gyp('test1.gyp', '--root-target=program2') +test.build('test2.gyp', 'lib1', status=build_error_code, stderr=None) +test.build('test2.gyp', 'lib2') +test.build('test2.gyp', 'lib3', status=build_error_code, stderr=None) +test.build('test2.gyp', 'lib_indirect') +test.build('test1.gyp', 'program1', status=build_error_code, stderr=None) +test.build('test1.gyp', 'program2') +test.build('test1.gyp', 'program3', status=build_error_code, stderr=None) + +# With deep dependencies of program1 and program2. +test.run_gyp('test1.gyp', '--root-target=program1', '--root-target=program2') +test.build('test2.gyp', 'lib1') +test.build('test2.gyp', 'lib2') +test.build('test2.gyp', 'lib3', status=build_error_code, stderr=None) +test.build('test2.gyp', 'lib_indirect') +test.build('test1.gyp', 'program1') +test.build('test1.gyp', 'program2') +test.build('test1.gyp', 'program3', status=build_error_code, stderr=None) + +test.pass_test() diff --git a/deps/gyp/test/prune_targets/lib1.cc b/deps/gyp/test/prune_targets/lib1.cc new file mode 100644 index 0000000000..692b7de6d8 --- /dev/null +++ b/deps/gyp/test/prune_targets/lib1.cc @@ -0,0 +1,6 @@ +// Copyright (c) 2013 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. + +void libfunc1() { +} diff --git a/deps/gyp/test/prune_targets/lib2.cc b/deps/gyp/test/prune_targets/lib2.cc new file mode 100644 index 0000000000..aed394afcf --- /dev/null +++ b/deps/gyp/test/prune_targets/lib2.cc @@ -0,0 +1,6 @@ +// Copyright (c) 2013 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. + +void libfunc2() { +} diff --git a/deps/gyp/test/prune_targets/lib3.cc b/deps/gyp/test/prune_targets/lib3.cc new file mode 100644 index 0000000000..af0f717b02 --- /dev/null +++ b/deps/gyp/test/prune_targets/lib3.cc @@ -0,0 +1,6 @@ +// Copyright (c) 2013 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. + +void libfunc3() { +} diff --git a/deps/gyp/test/prune_targets/lib_indirect.cc b/deps/gyp/test/prune_targets/lib_indirect.cc new file mode 100644 index 0000000000..92d9ea40db --- /dev/null +++ b/deps/gyp/test/prune_targets/lib_indirect.cc @@ -0,0 +1,6 @@ +// Copyright (c) 2013 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. + +void libfunc_indirect() { +} diff --git a/deps/gyp/test/prune_targets/program.cc b/deps/gyp/test/prune_targets/program.cc new file mode 100644 index 0000000000..c9ac070ecd --- /dev/null +++ b/deps/gyp/test/prune_targets/program.cc @@ -0,0 +1,7 @@ +// Copyright (c) 2013 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. + +int main() { + return 0; +} diff --git a/deps/gyp/test/prune_targets/test1.gyp b/deps/gyp/test/prune_targets/test1.gyp new file mode 100644 index 0000000000..b65ec19fa4 --- /dev/null +++ b/deps/gyp/test/prune_targets/test1.gyp @@ -0,0 +1,26 @@ +# Copyright (c) 2013 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. + +{ + 'targets': [ + { + 'target_name': 'program1', + 'type': 'executable', + 'sources': [ 'program.cc' ], + 'dependencies': [ 'test2.gyp:lib1' ], + }, + { + 'target_name': 'program2', + 'type': 'executable', + 'sources': [ 'program.cc' ], + 'dependencies': [ 'test2.gyp:lib2' ], + }, + { + 'target_name': 'program3', + 'type': 'executable', + 'sources': [ 'program.cc' ], + 'dependencies': [ 'test2.gyp:lib3' ], + }, + ], +} diff --git a/deps/gyp/test/prune_targets/test2.gyp b/deps/gyp/test/prune_targets/test2.gyp new file mode 100644 index 0000000000..16f0fd3290 --- /dev/null +++ b/deps/gyp/test/prune_targets/test2.gyp @@ -0,0 +1,30 @@ +# Copyright (c) 2013 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. + +{ + 'targets': [ + { + 'target_name': 'lib1', + 'type': 'static_library', + 'sources': [ 'lib1.cc' ], + 'dependencies': [ 'lib_indirect' ], + }, + { + 'target_name': 'lib2', + 'type': 'static_library', + 'sources': [ 'lib2.cc' ], + 'dependencies': [ 'lib_indirect' ], + }, + { + 'target_name': 'lib3', + 'type': 'static_library', + 'sources': [ 'lib3.cc' ], + }, + { + 'target_name': 'lib_indirect', + 'type': 'static_library', + 'sources': [ 'lib_indirect.cc' ], + }, + ], +} diff --git a/deps/gyp/test/relative/foo/a/a.cc b/deps/gyp/test/relative/foo/a/a.cc new file mode 100644 index 0000000000..7d1c953448 --- /dev/null +++ b/deps/gyp/test/relative/foo/a/a.cc @@ -0,0 +1,9 @@ +/* + * Copyright (c) 2011 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. + */ + +int main() { + return 0; +} diff --git a/deps/gyp/test/relative/foo/a/a.gyp b/deps/gyp/test/relative/foo/a/a.gyp new file mode 100644 index 0000000000..66316ac681 --- /dev/null +++ b/deps/gyp/test/relative/foo/a/a.gyp @@ -0,0 +1,13 @@ +{ + 'targets': [ + { + 'target_name': 'a', + 'type': 'executable', + 'sources': ['a.cc'], + 'dependencies': [ + '../../foo/b/b.gyp:b', + 'c/c.gyp:c', + ], + }, + ], +} diff --git a/deps/gyp/test/relative/foo/a/c/c.cc b/deps/gyp/test/relative/foo/a/c/c.cc new file mode 100644 index 0000000000..9d22471684 --- /dev/null +++ b/deps/gyp/test/relative/foo/a/c/c.cc @@ -0,0 +1,9 @@ +/* + * Copyright (c) 2011 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. + */ + +int func() { + return 0; +} diff --git a/deps/gyp/test/relative/foo/a/c/c.gyp b/deps/gyp/test/relative/foo/a/c/c.gyp new file mode 100644 index 0000000000..c1f087db99 --- /dev/null +++ b/deps/gyp/test/relative/foo/a/c/c.gyp @@ -0,0 +1,12 @@ +{ + 'targets': [ + { + 'target_name': 'c', + 'type': 'static_library', + 'sources': ['c.cc'], + 'dependencies': [ + '../../b/b.gyp:b', + ], + }, + ], +} diff --git a/deps/gyp/test/relative/foo/b/b.cc b/deps/gyp/test/relative/foo/b/b.cc new file mode 100644 index 0000000000..011d59cebb --- /dev/null +++ b/deps/gyp/test/relative/foo/b/b.cc @@ -0,0 +1,9 @@ +/* + * Copyright (c) 2011 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. + */ + +int func2() { + return 0; +} diff --git a/deps/gyp/test/relative/foo/b/b.gyp b/deps/gyp/test/relative/foo/b/b.gyp new file mode 100644 index 0000000000..0ebe4533d3 --- /dev/null +++ b/deps/gyp/test/relative/foo/b/b.gyp @@ -0,0 +1,9 @@ +{ + 'targets': [ + { + 'target_name': 'b', + 'type': 'static_library', + 'sources': ['b.cc'], + }, + ], +} diff --git a/deps/gyp/test/relative/gyptest-default.py b/deps/gyp/test/relative/gyptest-default.py new file mode 100755 index 0000000000..2d657aa675 --- /dev/null +++ b/deps/gyp/test/relative/gyptest-default.py @@ -0,0 +1,25 @@ +#!/usr/bin/env python + +# Copyright (c) 2011 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. + +""" +Verifies simplest-possible build of a "Hello, world!" program +using the default build target. +""" + +import TestGyp + +test = TestGyp.TestGyp(workdir='workarea_default', formats=['msvs']) + +# Run from down in foo. +test.run_gyp('a.gyp', chdir='foo/a') +sln = test.workpath('foo/a/a.sln') +sln_data = open(sln, 'rb').read() +vcproj = sln_data.count('b.vcproj') +vcxproj = sln_data.count('b.vcxproj') +if (vcproj, vcxproj) not in [(1, 0), (0, 1)]: + test.fail_test() + +test.pass_test() diff --git a/deps/gyp/test/rename/filecase/file.c b/deps/gyp/test/rename/filecase/file.c new file mode 100644 index 0000000000..76e8197013 --- /dev/null +++ b/deps/gyp/test/rename/filecase/file.c @@ -0,0 +1 @@ +int main() { return 0; } diff --git a/deps/gyp/test/rename/filecase/test-casesensitive.gyp b/deps/gyp/test/rename/filecase/test-casesensitive.gyp new file mode 100644 index 0000000000..48eaa6eb67 --- /dev/null +++ b/deps/gyp/test/rename/filecase/test-casesensitive.gyp @@ -0,0 +1,15 @@ +# 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. +{ + 'targets': [ + { + 'target_name': 'filecaserename_sensitive', + 'type': 'executable', + 'sources': [ + 'FiLe.c', + 'fIlE.c', + ], + }, + ], +} diff --git a/deps/gyp/test/rename/filecase/test.gyp b/deps/gyp/test/rename/filecase/test.gyp new file mode 100644 index 0000000000..eaee9337b6 --- /dev/null +++ b/deps/gyp/test/rename/filecase/test.gyp @@ -0,0 +1,14 @@ +# 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. +{ + 'targets': [ + { + 'target_name': 'filecaserename', + 'type': 'executable', + 'sources': [ + 'file.c', + ], + }, + ], +} diff --git a/deps/gyp/test/rename/gyptest-filecase.py b/deps/gyp/test/rename/gyptest-filecase.py new file mode 100644 index 0000000000..daed5180d3 --- /dev/null +++ b/deps/gyp/test/rename/gyptest-filecase.py @@ -0,0 +1,35 @@ +#!/usr/bin/env python + +# 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. + +""" +Checks that files whose file case changes get rebuilt correctly. +""" + +import os +import TestGyp + +test = TestGyp.TestGyp() +CHDIR = 'filecase' +test.run_gyp('test.gyp', chdir=CHDIR) +test.build('test.gyp', test.ALL, chdir=CHDIR) + +os.rename('filecase/file.c', 'filecase/fIlE.c') +test.write('filecase/test.gyp', + test.read('filecase/test.gyp').replace('file.c', 'fIlE.c')) +test.run_gyp('test.gyp', chdir=CHDIR) +test.build('test.gyp', test.ALL, chdir=CHDIR) + + +# Check that having files that differ just in their case still work on +# case-sensitive file systems. +test.write('filecase/FiLe.c', 'int f(); int main() { return f(); }') +test.write('filecase/fIlE.c', 'int f() { return 42; }') +is_case_sensitive = test.read('filecase/FiLe.c') != test.read('filecase/fIlE.c') +if is_case_sensitive: + test.run_gyp('test-casesensitive.gyp', chdir=CHDIR) + test.build('test-casesensitive.gyp', test.ALL, chdir=CHDIR) + +test.pass_test() diff --git a/deps/gyp/test/restat/gyptest-restat.py b/deps/gyp/test/restat/gyptest-restat.py new file mode 100644 index 0000000000..87379044dd --- /dev/null +++ b/deps/gyp/test/restat/gyptest-restat.py @@ -0,0 +1,31 @@ +#!/usr/bin/env python + +# 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. + +""" +Verify that dependent rules are executed iff a dependency action modifies its +outputs. +""" + +import TestGyp +import os + +test = TestGyp.TestGyp(formats=['ninja', 'make', 'xcode']) + +test.run_gyp('restat.gyp', chdir='src') + +chdir = 'relocate/src' +test.relocate('src', chdir) + +# Building 'dependent' the first time generates 'side_effect', but building it +# the second time doesn't, because 'create_intermediate' doesn't update its +# output. +test.build('restat.gyp', 'dependent', chdir=chdir) +test.built_file_must_exist('side_effect', chdir=chdir) +os.remove(test.built_file_path('side_effect', chdir=chdir)) +test.build('restat.gyp', 'dependent', chdir=chdir) +test.built_file_must_not_exist('side_effect', chdir=chdir) + +test.pass_test() diff --git a/deps/gyp/test/restat/src/create_intermediate.py b/deps/gyp/test/restat/src/create_intermediate.py new file mode 100644 index 0000000000..a4d7450371 --- /dev/null +++ b/deps/gyp/test/restat/src/create_intermediate.py @@ -0,0 +1,17 @@ +#!/usr/bin/env python + +# 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 os +import sys + +""" +Create argv[1] iff it doesn't already exist. +""" + +outfile = sys.argv[1] +if os.path.exists(outfile): + sys.exit() +open(outfile, "wb").close() diff --git a/deps/gyp/test/restat/src/restat.gyp b/deps/gyp/test/restat/src/restat.gyp new file mode 100644 index 0000000000..ff020e0ce6 --- /dev/null +++ b/deps/gyp/test/restat/src/restat.gyp @@ -0,0 +1,50 @@ +# 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. + +{ + 'targets': [ + { + 'target_name': 'create_intermediate', + 'type': 'none', + 'msvs_cygwin_shell': '0', + 'actions': [ + { + 'action_name': 'create_intermediate', + 'inputs': [ + 'create_intermediate.py', + ], + 'outputs': [ + '<(PRODUCT_DIR)/intermediate', + 'ALWAYS.run.ALWAYS', + ], + 'action': [ + 'python', 'create_intermediate.py', '<(PRODUCT_DIR)/intermediate', + ], + }, + ], + }, + { + 'target_name': 'dependent', + 'type': 'none', + 'msvs_cygwin_shell': '0', + 'dependencies': [ + 'create_intermediate', + ], + 'actions': [ + { + 'action_name': 'dependent', + 'inputs': [ + '<(PRODUCT_DIR)/intermediate', + ], + 'outputs': [ + '<(PRODUCT_DIR)/dependent' + ], + 'action': [ + 'python', 'touch.py', '<(PRODUCT_DIR)/dependent', '<(PRODUCT_DIR)/side_effect', + ], + }, + ], + }, + ], +} diff --git a/deps/gyp/test/restat/src/touch.py b/deps/gyp/test/restat/src/touch.py new file mode 100644 index 0000000000..7cd781a90c --- /dev/null +++ b/deps/gyp/test/restat/src/touch.py @@ -0,0 +1,16 @@ +#!/usr/bin/env python +# +# 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 os +import sys + +"""Cross-platform touch.""" + +for fname in sys.argv[1:]: + if os.path.exists(fname): + os.utime(fname, None) + else: + open(fname, 'w').close() diff --git a/deps/gyp/test/rules-dirname/gyptest-dirname.py b/deps/gyp/test/rules-dirname/gyptest-dirname.py new file mode 100755 index 0000000000..9b8949b32c --- /dev/null +++ b/deps/gyp/test/rules-dirname/gyptest-dirname.py @@ -0,0 +1,55 @@ +#!/usr/bin/env python + +# Copyright (c) 2011 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. + +""" +Verifies simple rules when using an explicit build target of 'all'. +""" + +import TestGyp +import os +import sys + +if sys.platform == 'win32': + print "This test is currently disabled: https://crbug.com/483696." + sys.exit(0) + + +test = TestGyp.TestGyp(formats=['make', 'ninja', 'xcode', 'msvs']) + +test.run_gyp('actions.gyp', chdir='src') + +test.relocate('src', 'relocate/src') + +test.build('actions.gyp', chdir='relocate/src') + +expect = """\ +no dir here +hi c +hello baz +""" +if test.format == 'xcode': + chdir = 'relocate/src/subdir' +else: + chdir = 'relocate/src' +test.run_built_executable('gencc_int_output', chdir=chdir, stdout=expect) +if test.format == 'msvs': + test.run_built_executable('gencc_int_output_external', chdir=chdir, + stdout=expect) + +test.must_match('relocate/src/subdir/foo/bar/baz.dirname', + os.path.join('foo', 'bar')) +test.must_match('relocate/src/subdir/a/b/c.dirname', + os.path.join('a', 'b')) + +# FIXME the xcode and make generators incorrectly convert RULE_INPUT_PATH +# to an absolute path, making the tests below fail! +if test.format != 'xcode' and test.format != 'make': + test.must_match('relocate/src/subdir/foo/bar/baz.path', + os.path.join('foo', 'bar', 'baz.printvars')) + test.must_match('relocate/src/subdir/a/b/c.path', + os.path.join('a', 'b', 'c.printvars')) + +test.pass_test() diff --git a/deps/gyp/test/rules-dirname/src/actions.gyp b/deps/gyp/test/rules-dirname/src/actions.gyp new file mode 100644 index 0000000000..c5693c6c9e --- /dev/null +++ b/deps/gyp/test/rules-dirname/src/actions.gyp @@ -0,0 +1,15 @@ +# Copyright (c) 2011 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. + +{ + 'targets': [ + { + 'target_name': 'pull_in_all_actions', + 'type': 'none', + 'dependencies': [ + 'subdir/input-rule-dirname.gyp:*', + ], + }, + ], +} diff --git a/deps/gyp/test/rules-dirname/src/copy-file.py b/deps/gyp/test/rules-dirname/src/copy-file.py new file mode 100755 index 0000000000..9774ccc960 --- /dev/null +++ b/deps/gyp/test/rules-dirname/src/copy-file.py @@ -0,0 +1,11 @@ +#!/usr/bin/env python + +# Copyright (c) 2011 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 sys + +contents = open(sys.argv[1], 'r').read() +open(sys.argv[2], 'wb').write(contents) + +sys.exit(0) diff --git a/deps/gyp/test/rules-dirname/src/subdir/a/b/c.gencc b/deps/gyp/test/rules-dirname/src/subdir/a/b/c.gencc new file mode 100644 index 0000000000..29cb5f79ad --- /dev/null +++ b/deps/gyp/test/rules-dirname/src/subdir/a/b/c.gencc @@ -0,0 +1,8 @@ +// -*- mode: c++ -*- +#include <stdio.h> + +namespace gen { + void c() { + printf("hi c\n"); + } +} diff --git a/deps/gyp/test/rules-dirname/src/subdir/a/b/c.printvars b/deps/gyp/test/rules-dirname/src/subdir/a/b/c.printvars new file mode 100644 index 0000000000..cc4561dc41 --- /dev/null +++ b/deps/gyp/test/rules-dirname/src/subdir/a/b/c.printvars @@ -0,0 +1 @@ +# Empty file for testing build rules diff --git a/deps/gyp/test/rules-dirname/src/subdir/foo/bar/baz.gencc b/deps/gyp/test/rules-dirname/src/subdir/foo/bar/baz.gencc new file mode 100644 index 0000000000..90b4ce9243 --- /dev/null +++ b/deps/gyp/test/rules-dirname/src/subdir/foo/bar/baz.gencc @@ -0,0 +1,8 @@ +// -*- mode: c++ -*- +#include <stdio.h> + +namespace gen { + void baz() { + printf("hello baz\n"); + } +} diff --git a/deps/gyp/test/rules-dirname/src/subdir/foo/bar/baz.printvars b/deps/gyp/test/rules-dirname/src/subdir/foo/bar/baz.printvars new file mode 100644 index 0000000000..cc4561dc41 --- /dev/null +++ b/deps/gyp/test/rules-dirname/src/subdir/foo/bar/baz.printvars @@ -0,0 +1 @@ +# Empty file for testing build rules diff --git a/deps/gyp/test/rules-dirname/src/subdir/input-rule-dirname.gyp b/deps/gyp/test/rules-dirname/src/subdir/input-rule-dirname.gyp new file mode 100644 index 0000000000..da749a2231 --- /dev/null +++ b/deps/gyp/test/rules-dirname/src/subdir/input-rule-dirname.gyp @@ -0,0 +1,140 @@ +# Copyright (c) 2011 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. + +{ + 'targets': [ + { + 'target_name': 'print_rule_input_dirname', + 'type': 'none', + 'msvs_cygwin_shell': 0, + 'sources': [ + 'foo/bar/baz.printvars', + 'a/b/c.printvars', + ], + 'rules': [ + { + 'rule_name': 'printvars', + 'extension': 'printvars', + 'inputs': [ + 'printvars.py', + ], + 'outputs': [ + '<(RULE_INPUT_DIRNAME)/<(RULE_INPUT_ROOT).dirname', + ], + 'action': [ + 'python', '<@(_inputs)', '<(RULE_INPUT_DIRNAME)', '<@(_outputs)', + ], + }, + ], + }, + { + 'target_name': 'print_rule_input_path', + 'type': 'none', + 'msvs_cygwin_shell': 0, + 'sources': [ + 'foo/bar/baz.printvars', + 'a/b/c.printvars', + ], + 'rules': [ + { + 'rule_name': 'printvars', + 'extension': 'printvars', + 'inputs': [ + 'printvars.py', + ], + 'outputs': [ + '<(RULE_INPUT_DIRNAME)/<(RULE_INPUT_ROOT).path', + ], + 'action': [ + 'python', '<@(_inputs)', '<(RULE_INPUT_PATH)', '<@(_outputs)', + ], + }, + ], + }, + { + 'target_name': 'gencc_int_output', + 'type': 'executable', + 'msvs_cygwin_shell': 0, + 'sources': [ + 'nodir.gencc', + 'foo/bar/baz.gencc', + 'a/b/c.gencc', + 'main.cc', + ], + 'rules': [ + { + 'rule_name': 'gencc', + 'extension': 'gencc', + 'inputs': [ + '<(DEPTH)/copy-file.py', + ], + 'outputs': [ + '<(INTERMEDIATE_DIR)/<(RULE_INPUT_DIRNAME)/<(RULE_INPUT_ROOT).cc', + ], + 'action': [ + 'python', '<@(_inputs)', '<(RULE_INPUT_PATH)', '<@(_outputs)', + ], + 'process_outputs_as_sources': 1, + }, + ], + }, + ], + 'conditions': [ + ['OS=="win"', { + 'targets': [ + { + 'target_name': 'gencc_int_output_external', + 'type': 'executable', + 'msvs_cygwin_shell': 0, + 'msvs_cygwin_dirs': ['../../../../../../<(DEPTH)/third_party/cygwin'], + 'sources': [ + 'nodir.gencc', + 'foo/bar/baz.gencc', + 'a/b/c.gencc', + 'main.cc', + ], + 'dependencies': [ + 'cygwin', + ], + 'rules': [ + { + 'rule_name': 'gencc', + 'extension': 'gencc', + 'msvs_external_rule': 1, + 'inputs': [ + '<(DEPTH)/copy-file.py', + ], + 'outputs': [ + '<(INTERMEDIATE_DIR)/<(RULE_INPUT_DIRNAME)/<(RULE_INPUT_ROOT).cc', + ], + 'action': [ + 'python', '<@(_inputs)', '<(RULE_INPUT_PATH)', '<@(_outputs)', + ], + 'process_outputs_as_sources': 1, + }, + ], + }, + { + 'target_name': 'cygwin', + 'type': 'none', + 'actions': [ + { + 'action_name': 'setup_mount', + 'msvs_cygwin_shell': 0, + 'inputs': [ + '../../../../../../<(DEPTH)/third_party/cygwin/setup_mount.bat', + ], + # Visual Studio requires an output file, or else the + # custom build step won't run. + 'outputs': [ + '<(INTERMEDIATE_DIR)/_always_run_setup_mount.marker', + ], + 'action': ['<@(_inputs)'], + }, + ], + }, + ], + }], + ], +} diff --git a/deps/gyp/test/rules-dirname/src/subdir/main.cc b/deps/gyp/test/rules-dirname/src/subdir/main.cc new file mode 100644 index 0000000000..3bb8e01395 --- /dev/null +++ b/deps/gyp/test/rules-dirname/src/subdir/main.cc @@ -0,0 +1,14 @@ +// Copyright (c) 2011 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. +namespace gen { + extern void nodir(); + extern void c(); + extern void baz(); +} + +int main() { + gen::nodir(); + gen::c(); + gen::baz(); +} diff --git a/deps/gyp/test/rules-dirname/src/subdir/nodir.gencc b/deps/gyp/test/rules-dirname/src/subdir/nodir.gencc new file mode 100644 index 0000000000..720f589bc2 --- /dev/null +++ b/deps/gyp/test/rules-dirname/src/subdir/nodir.gencc @@ -0,0 +1,8 @@ +// -*- mode: c++ -*- +#include <stdio.h> + +namespace gen { + void nodir() { + printf("no dir here\n"); + } +} diff --git a/deps/gyp/test/rules-dirname/src/subdir/printvars.py b/deps/gyp/test/rules-dirname/src/subdir/printvars.py new file mode 100755 index 0000000000..ef3d92e8cf --- /dev/null +++ b/deps/gyp/test/rules-dirname/src/subdir/printvars.py @@ -0,0 +1,14 @@ +#!/usr/bin/env python + +# Copyright (c) 2011 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. + +""" +Prints interesting vars +""" + +import sys; + +out = open(sys.argv[2], 'w') +out.write(sys.argv[1]); diff --git a/deps/gyp/test/rules-rebuild/gyptest-all.py b/deps/gyp/test/rules-rebuild/gyptest-all.py new file mode 100755 index 0000000000..aaaa2a6e6f --- /dev/null +++ b/deps/gyp/test/rules-rebuild/gyptest-all.py @@ -0,0 +1,70 @@ +#!/usr/bin/env python + +# Copyright (c) 2009 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. + +""" +Verifies that a rule that generates multiple outputs rebuilds +correctly when the inputs change. +""" + +import TestGyp + +test = TestGyp.TestGyp(workdir='workarea_all') + +test.run_gyp('same_target.gyp', chdir='src') + +test.relocate('src', 'relocate/src') + + +test.build('same_target.gyp', test.ALL, chdir='relocate/src') + +expect = """\ +Hello from main.c +Hello from prog1.in! +Hello from prog2.in! +""" + +test.run_built_executable('program', chdir='relocate/src', stdout=expect) + +test.up_to_date('same_target.gyp', 'program', chdir='relocate/src') + + +test.sleep() +contents = test.read(['relocate', 'src', 'prog1.in']) +contents = contents.replace('!', ' AGAIN!') +test.write(['relocate', 'src', 'prog1.in'], contents) + +test.build('same_target.gyp', test.ALL, chdir='relocate/src') + +expect = """\ +Hello from main.c +Hello from prog1.in AGAIN! +Hello from prog2.in! +""" + +test.run_built_executable('program', chdir='relocate/src', stdout=expect) + +test.up_to_date('same_target.gyp', 'program', chdir='relocate/src') + + +test.sleep() +contents = test.read(['relocate', 'src', 'prog2.in']) +contents = contents.replace('!', ' AGAIN!') +test.write(['relocate', 'src', 'prog2.in'], contents) + +test.build('same_target.gyp', test.ALL, chdir='relocate/src') + +expect = """\ +Hello from main.c +Hello from prog1.in AGAIN! +Hello from prog2.in AGAIN! +""" + +test.run_built_executable('program', chdir='relocate/src', stdout=expect) + +test.up_to_date('same_target.gyp', 'program', chdir='relocate/src') + + +test.pass_test() diff --git a/deps/gyp/test/rules-rebuild/gyptest-default.py b/deps/gyp/test/rules-rebuild/gyptest-default.py new file mode 100755 index 0000000000..ac3f0209aa --- /dev/null +++ b/deps/gyp/test/rules-rebuild/gyptest-default.py @@ -0,0 +1,91 @@ +#!/usr/bin/env python + +# 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. + +""" +Verifies that a rule that generates multiple outputs rebuilds +correctly when the inputs change. +""" + +import TestGyp + +test = TestGyp.TestGyp(workdir='workarea_default') + +test.run_gyp('same_target.gyp', chdir='src') + +test.relocate('src', 'relocate/src') + + +test.build('same_target.gyp', chdir='relocate/src') + +expect = """\ +Hello from main.c +Hello from prog1.in! +Hello from prog2.in! +""" + +test.run_built_executable('program', chdir='relocate/src', stdout=expect) + +test.up_to_date('same_target.gyp', 'program', chdir='relocate/src') + + +test.sleep() +contents = test.read(['relocate', 'src', 'prog1.in']) +contents = contents.replace('!', ' AGAIN!') +test.write(['relocate', 'src', 'prog1.in'], contents) + +test.build('same_target.gyp', chdir='relocate/src') + +expect = """\ +Hello from main.c +Hello from prog1.in AGAIN! +Hello from prog2.in! +""" + +test.run_built_executable('program', chdir='relocate/src', stdout=expect) + +test.up_to_date('same_target.gyp', 'program', chdir='relocate/src') + + +test.sleep() +contents = test.read(['relocate', 'src', 'prog2.in']) +contents = contents.replace('!', ' AGAIN!') +test.write(['relocate', 'src', 'prog2.in'], contents) + +test.build('same_target.gyp', chdir='relocate/src') + +expect = """\ +Hello from main.c +Hello from prog1.in AGAIN! +Hello from prog2.in AGAIN! +""" + +test.run_built_executable('program', chdir='relocate/src', stdout=expect) + +test.up_to_date('same_target.gyp', 'program', chdir='relocate/src') + + +# Test that modifying a rule's inputs (specifically, make-sources.py) causes +# the targets to be built. + +test.sleep() +contents = test.read(['relocate', 'src', 'make-sources.py']) +contents = contents.replace('%s', 'the amazing %s') +test.write(['relocate', 'src', 'make-sources.py'], contents) + +test.build('same_target.gyp', chdir='relocate/src') + +expect = """\ +Hello from main.c +Hello from the amazing prog1.in AGAIN! +Hello from the amazing prog2.in AGAIN! +""" + +test.run_built_executable('program', chdir='relocate/src', stdout=expect) + +test.up_to_date('same_target.gyp', 'program', chdir='relocate/src') + + +test.pass_test() diff --git a/deps/gyp/test/rules-rebuild/src/main.c b/deps/gyp/test/rules-rebuild/src/main.c new file mode 100644 index 0000000000..bd8fbb20ea --- /dev/null +++ b/deps/gyp/test/rules-rebuild/src/main.c @@ -0,0 +1,12 @@ +#include <stdio.h> + +extern void prog1(void); +extern void prog2(void); + +int main(void) +{ + printf("Hello from main.c\n"); + prog1(); + prog2(); + return 0; +} diff --git a/deps/gyp/test/rules-rebuild/src/make-sources.py b/deps/gyp/test/rules-rebuild/src/make-sources.py new file mode 100755 index 0000000000..7ec022780c --- /dev/null +++ b/deps/gyp/test/rules-rebuild/src/make-sources.py @@ -0,0 +1,19 @@ +#!/usr/bin/env python +# Copyright (c) 2011 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 sys + +assert len(sys.argv) == 4, sys.argv + +(in_file, c_file, h_file) = sys.argv[1:] + +def write_file(filename, contents): + open(filename, 'wb').write(contents) + +write_file(c_file, open(in_file, 'rb').read()) + +write_file(h_file, '#define NAME "%s"\n' % in_file) + +sys.exit(0) diff --git a/deps/gyp/test/rules-rebuild/src/prog1.in b/deps/gyp/test/rules-rebuild/src/prog1.in new file mode 100644 index 0000000000..191b00ef1e --- /dev/null +++ b/deps/gyp/test/rules-rebuild/src/prog1.in @@ -0,0 +1,7 @@ +#include <stdio.h> +#include "prog1.h" + +void prog1(void) +{ + printf("Hello from %s!\n", NAME); +} diff --git a/deps/gyp/test/rules-rebuild/src/prog2.in b/deps/gyp/test/rules-rebuild/src/prog2.in new file mode 100644 index 0000000000..7bfac5104c --- /dev/null +++ b/deps/gyp/test/rules-rebuild/src/prog2.in @@ -0,0 +1,7 @@ +#include <stdio.h> +#include "prog2.h" + +void prog2(void) +{ + printf("Hello from %s!\n", NAME); +} diff --git a/deps/gyp/test/rules-rebuild/src/same_target.gyp b/deps/gyp/test/rules-rebuild/src/same_target.gyp new file mode 100644 index 0000000000..22ba56056d --- /dev/null +++ b/deps/gyp/test/rules-rebuild/src/same_target.gyp @@ -0,0 +1,31 @@ +{ + 'targets': [ + { + 'target_name': 'program', + 'type': 'executable', + 'msvs_cygwin_shell': 0, + 'sources': [ + 'main.c', + 'prog1.in', + 'prog2.in', + ], + 'rules': [ + { + 'rule_name': 'make_sources', + 'extension': 'in', + 'inputs': [ + 'make-sources.py', + ], + 'outputs': [ + '<(INTERMEDIATE_DIR)/<(RULE_INPUT_ROOT).c', + '<(INTERMEDIATE_DIR)/<(RULE_INPUT_ROOT).h', + ], + 'action': [ + 'python', '<(_inputs)', '<(RULE_INPUT_NAME)', '<@(_outputs)', + ], + 'process_outputs_as_sources': 1, + }, + ], + }, + ], +} diff --git a/deps/gyp/test/rules-use-built-dependencies/gyptest-use-built-dependencies.py b/deps/gyp/test/rules-use-built-dependencies/gyptest-use-built-dependencies.py new file mode 100755 index 0000000000..a57c36d5b0 --- /dev/null +++ b/deps/gyp/test/rules-use-built-dependencies/gyptest-use-built-dependencies.py @@ -0,0 +1,23 @@ +#!/usr/bin/env python + +# Copyright (c) 2013 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. + +""" +Verifies that rules which use built dependencies work correctly. +""" + +import TestGyp + +test = TestGyp.TestGyp() + +test.run_gyp('use-built-dependencies-rule.gyp', chdir='src') + +test.relocate('src', 'relocate/src') +test.build('use-built-dependencies-rule.gyp', chdir='relocate/src') + +test.built_file_must_exist('main_output', chdir='relocate/src') +test.built_file_must_match('main_output', 'output', chdir='relocate/src') + +test.pass_test() diff --git a/deps/gyp/test/rules-use-built-dependencies/src/main.cc b/deps/gyp/test/rules-use-built-dependencies/src/main.cc new file mode 100644 index 0000000000..937d284599 --- /dev/null +++ b/deps/gyp/test/rules-use-built-dependencies/src/main.cc @@ -0,0 +1,17 @@ +// Copyright (c) 2013 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. +#include <stdio.h> + +int main(int argc, char *argv[]) { + if (argc < 2) { + return 2; + } + FILE* file; + file = fopen(argv[1], "wb"); + const char output[] = "output"; + fwrite(output, 1, sizeof(output) - 1, file); + fclose(file); + return 0; +} + diff --git a/deps/gyp/test/rules-use-built-dependencies/src/use-built-dependencies-rule.gyp b/deps/gyp/test/rules-use-built-dependencies/src/use-built-dependencies-rule.gyp new file mode 100644 index 0000000000..92bfeda392 --- /dev/null +++ b/deps/gyp/test/rules-use-built-dependencies/src/use-built-dependencies-rule.gyp @@ -0,0 +1,42 @@ +# Copyright (c) 2013 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. + +{ + 'targets': [ + { + 'target_name': 'main', + 'toolsets': ['host'], + 'type': 'executable', + 'sources': [ + 'main.cc', + ], + }, + { + 'target_name': 'post', + 'toolsets': ['host'], + 'type': 'none', + 'dependencies': [ + 'main', + ], + 'sources': [ + # As this test is written it could easily be made into an action. + # An acutal use case would have a number of these 'sources'. + '<(PRODUCT_DIR)/<(EXECUTABLE_PREFIX)main<(EXECUTABLE_SUFFIX)', + ], + 'rules': [ + { + 'rule_name': 'generate_output', + 'extension': '<(EXECUTABLE_SUFFIX)', + 'outputs': [ '<(RULE_INPUT_DIRNAME)/<(RULE_INPUT_ROOT)_output', ], + 'msvs_cygwin_shell': 0, + 'action': [ + '<(RULE_INPUT_PATH)', + '<(RULE_INPUT_DIRNAME)/<(RULE_INPUT_ROOT)_output', + ], + 'message': 'Generating output for <(RULE_INPUT_ROOT)' + }, + ], + }, + ], +} diff --git a/deps/gyp/test/rules-variables/gyptest-rules-variables.py b/deps/gyp/test/rules-variables/gyptest-rules-variables.py new file mode 100755 index 0000000000..c1825e0c13 --- /dev/null +++ b/deps/gyp/test/rules-variables/gyptest-rules-variables.py @@ -0,0 +1,33 @@ +#!/usr/bin/env python + +# Copyright (c) 2011 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. + +""" +Verifies rules related variables are expanded. +""" + +import sys + +if sys.platform == 'win32': + print "This test is currently disabled: https://crbug.com/483696." + sys.exit(0) + + +import TestGyp + +test = TestGyp.TestGyp(formats=['ninja']) + +test.relocate('src', 'relocate/src') + +test.run_gyp('variables.gyp', chdir='relocate/src') + +test.build('variables.gyp', chdir='relocate/src') + +test.run_built_executable('all_rule_variables', + chdir='relocate/src', + stdout="input_root\ninput_dirname\ninput_path\n" + + "input_ext\ninput_name\n") + +test.pass_test() diff --git a/deps/gyp/test/rules-variables/src/input_ext.c b/deps/gyp/test/rules-variables/src/input_ext.c new file mode 100644 index 0000000000..f41e73ef8a --- /dev/null +++ b/deps/gyp/test/rules-variables/src/input_ext.c @@ -0,0 +1,9 @@ +// Copyright (c) 2011 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. + +#include <stdio.h> + +void input_ext() { + printf("input_ext\n"); +} diff --git a/deps/gyp/test/rules-variables/src/input_name/test.c b/deps/gyp/test/rules-variables/src/input_name/test.c new file mode 100644 index 0000000000..e28b74d115 --- /dev/null +++ b/deps/gyp/test/rules-variables/src/input_name/test.c @@ -0,0 +1,9 @@ +// Copyright (c) 2011 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. + +#include <stdio.h> + +void input_name() { + printf("input_name\n"); +} diff --git a/deps/gyp/test/rules-variables/src/input_path/subdir/test.c b/deps/gyp/test/rules-variables/src/input_path/subdir/test.c new file mode 100644 index 0000000000..403dbbda4c --- /dev/null +++ b/deps/gyp/test/rules-variables/src/input_path/subdir/test.c @@ -0,0 +1,9 @@ +// Copyright (c) 2011 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. + +#include <stdio.h> + +void input_path() { + printf("input_path\n"); +} diff --git a/deps/gyp/test/rules-variables/src/subdir/input_dirname.c b/deps/gyp/test/rules-variables/src/subdir/input_dirname.c new file mode 100644 index 0000000000..40cecd87d9 --- /dev/null +++ b/deps/gyp/test/rules-variables/src/subdir/input_dirname.c @@ -0,0 +1,9 @@ +// Copyright (c) 2011 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. + +#include <stdio.h> + +void input_dirname() { + printf("input_dirname\n"); +} diff --git a/deps/gyp/test/rules-variables/src/subdir/test.c b/deps/gyp/test/rules-variables/src/subdir/test.c new file mode 100644 index 0000000000..6c0280b8ad --- /dev/null +++ b/deps/gyp/test/rules-variables/src/subdir/test.c @@ -0,0 +1,18 @@ +// Copyright (c) 2011 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. + +extern void input_root(); +extern void input_dirname(); +extern void input_path(); +extern void input_ext(); +extern void input_name(); + +int main() { + input_root(); + input_dirname(); + input_path(); + input_ext(); + input_name(); + return 0; +} diff --git a/deps/gyp/test/rules-variables/src/test.input_root.c b/deps/gyp/test/rules-variables/src/test.input_root.c new file mode 100644 index 0000000000..33a7740a5c --- /dev/null +++ b/deps/gyp/test/rules-variables/src/test.input_root.c @@ -0,0 +1,9 @@ +// Copyright (c) 2011 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. + +#include <stdio.h> + +void input_root() { + printf("input_root\n"); +} diff --git a/deps/gyp/test/rules-variables/src/variables.gyp b/deps/gyp/test/rules-variables/src/variables.gyp new file mode 100644 index 0000000000..6debba12e3 --- /dev/null +++ b/deps/gyp/test/rules-variables/src/variables.gyp @@ -0,0 +1,40 @@ +# Copyright (c) 2011 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. + +{ + 'target_defaults': { + # This test shouldn't ever actually need to execute its rules: there's no + # command line that generates any output anyway. However, there's something + # slightly broken in either ninja or (maybe more likely?) on the win32 VM + # gypbots that breaks dependency checking and causes this rule to want to + # run. When it does run, the cygwin path is wrong, so the do-nothing step + # fails. + # TODO: Investigate and fix whatever's actually failing and remove this. + 'msvs_cygwin_dirs': ['../../../../../../<(DEPTH)/third_party/cygwin'], + }, + 'targets': [ + { + 'target_name': 'all_rule_variables', + 'type': 'executable', + 'sources': [ + 'subdir/test.c', + ], + 'rules': [ + { + 'rule_name': 'rule_variable', + 'extension': 'c', + 'outputs': [ + '<(RULE_INPUT_ROOT).input_root.c', + '<(RULE_INPUT_DIRNAME)/input_dirname.c', + 'input_path/<(RULE_INPUT_PATH)', + 'input_ext<(RULE_INPUT_EXT)', + 'input_name/<(RULE_INPUT_NAME)', + ], + 'action': [], + 'process_outputs_as_sources': 1, + }, + ], + }, + ], +} diff --git a/deps/gyp/test/rules/gyptest-all.py b/deps/gyp/test/rules/gyptest-all.py new file mode 100755 index 0000000000..e6e637ebbf --- /dev/null +++ b/deps/gyp/test/rules/gyptest-all.py @@ -0,0 +1,82 @@ +#!/usr/bin/env python + +# Copyright (c) 2011 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. + +""" +Verifies simple rules when using an explicit build target of 'all'. +""" + +import sys + +if sys.platform == 'win32': + print "This test is currently disabled: https://crbug.com/483696." + sys.exit(0) + + +import TestGyp + +test = TestGyp.TestGyp() + +test.run_gyp('no_action_with_rules_fails.gyp', chdir='src/noaction', status=1, + stderr=None) + +test.run_gyp('actions.gyp', + '-G', 'xcode_ninja_target_pattern=^pull_in_all_actions$', + chdir='src') + +test.relocate('src', 'relocate/src') + +test.build('actions.gyp', test.ALL, chdir='relocate/src') + +expect = """\ +Hello from program.c +Hello from function1.in +Hello from function2.in +""" + +if test.format == 'xcode': + chdir = 'relocate/src/subdir1' +else: + chdir = 'relocate/src' +test.run_built_executable('program', chdir=chdir, stdout=expect) + +expect = """\ +Hello from program.c +Hello from function3.in +""" + +if test.format == 'xcode': + chdir = 'relocate/src/subdir3' +else: + chdir = 'relocate/src' +test.run_built_executable('program2', chdir=chdir, stdout=expect) + +test.must_match('relocate/src/subdir2/file1.out', 'Hello from file1.in\n') +test.must_match('relocate/src/subdir2/file2.out', 'Hello from file2.in\n') + +test.must_match('relocate/src/subdir2/file1.out2', 'Hello from file1.in\n') +test.must_match('relocate/src/subdir2/file2.out2', 'Hello from file2.in\n') + +test.must_match('relocate/src/subdir2/file1.out4', 'Hello from file1.in\n') +test.must_match('relocate/src/subdir2/file2.out4', 'Hello from file2.in\n') +test.must_match('relocate/src/subdir2/file1.copy', 'Hello from file1.in\n') + +test.must_match('relocate/src/external/file1.external_rules.out', + 'Hello from file1.in\n') +test.must_match('relocate/src/external/file2.external_rules.out', + 'Hello from file2.in\n') + +expect = """\ +Hello from program.c +Got 41. +""" + +if test.format == 'xcode': + chdir = 'relocate/src/subdir4' +else: + chdir = 'relocate/src' +test.run_built_executable('program4', chdir=chdir, stdout=expect) + +test.pass_test() diff --git a/deps/gyp/test/rules/gyptest-default.py b/deps/gyp/test/rules/gyptest-default.py new file mode 100755 index 0000000000..65b79dacd6 --- /dev/null +++ b/deps/gyp/test/rules/gyptest-default.py @@ -0,0 +1,68 @@ +#!/usr/bin/env python + +# Copyright (c) 2011 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. + +""" +Verifies simple rules when using an explicit build target of 'all'. +""" + +import sys + +if sys.platform == 'win32': + print "This test is currently disabled: https://crbug.com/483696." + sys.exit(0) + + +import TestGyp + +test = TestGyp.TestGyp() + +test.run_gyp('actions.gyp', + '-G', 'xcode_ninja_target_pattern=^pull_in_all_actions$', + chdir='src') + +test.relocate('src', 'relocate/src') + +test.build('actions.gyp', chdir='relocate/src') + +expect = """\ +Hello from program.c +Hello from function1.in +Hello from function2.in +""" + +if test.format == 'xcode': + chdir = 'relocate/src/subdir1' +else: + chdir = 'relocate/src' +test.run_built_executable('program', chdir=chdir, stdout=expect) + +expect = """\ +Hello from program.c +Hello from function3.in +""" + +if test.format == 'xcode': + chdir = 'relocate/src/subdir3' +else: + chdir = 'relocate/src' +test.run_built_executable('program2', chdir=chdir, stdout=expect) + +test.must_match('relocate/src/subdir2/file1.out', 'Hello from file1.in\n') +test.must_match('relocate/src/subdir2/file2.out', 'Hello from file2.in\n') + +test.must_match('relocate/src/subdir2/file1.out2', 'Hello from file1.in\n') +test.must_match('relocate/src/subdir2/file2.out2', 'Hello from file2.in\n') + +test.must_match('relocate/src/subdir2/file1.out4', 'Hello from file1.in\n') +test.must_match('relocate/src/subdir2/file2.out4', 'Hello from file2.in\n') +test.must_match('relocate/src/subdir2/file1.copy', 'Hello from file1.in\n') + +test.must_match('relocate/src/external/file1.external_rules.out', + 'Hello from file1.in\n') +test.must_match('relocate/src/external/file2.external_rules.out', + 'Hello from file2.in\n') + +test.pass_test() diff --git a/deps/gyp/test/rules/gyptest-input-root.py b/deps/gyp/test/rules/gyptest-input-root.py new file mode 100755 index 0000000000..92bade6d48 --- /dev/null +++ b/deps/gyp/test/rules/gyptest-input-root.py @@ -0,0 +1,26 @@ +#!/usr/bin/env python + +# Copyright (c) 2011 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. + +""" +Verifies that RULE_INPUT_ROOT isn't turned into a path in rule actions +""" + +import TestGyp + +test = TestGyp.TestGyp() + +test.run_gyp('input-root.gyp', chdir='src') + +test.relocate('src', 'relocate/src') + +test.build('input-root.gyp', target='test', chdir='relocate/src') + +expect = """\ +Hello somefile +""" + +test.run_built_executable('test', chdir='relocate/src', stdout=expect) +test.pass_test() diff --git a/deps/gyp/test/rules/gyptest-special-variables.py b/deps/gyp/test/rules/gyptest-special-variables.py new file mode 100644 index 0000000000..05ea7cee16 --- /dev/null +++ b/deps/gyp/test/rules/gyptest-special-variables.py @@ -0,0 +1,18 @@ +#!/usr/bin/env python + +# 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. + +""" Verifies that VS variables that require special variables are expanded +correctly. """ + +import sys +import TestGyp + +if sys.platform == 'win32': + test = TestGyp.TestGyp() + + test.run_gyp('special-variables.gyp', chdir='src') + test.build('special-variables.gyp', test.ALL, chdir='src') + test.pass_test() diff --git a/deps/gyp/test/rules/src/actions.gyp b/deps/gyp/test/rules/src/actions.gyp new file mode 100644 index 0000000000..84376a7193 --- /dev/null +++ b/deps/gyp/test/rules/src/actions.gyp @@ -0,0 +1,23 @@ +# Copyright (c) 2011 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. + +{ + 'targets': [ + { + 'target_name': 'pull_in_all_actions', + 'type': 'none', + 'dependencies': [ + 'subdir1/executable.gyp:*', + 'subdir2/both_rule_and_action_input.gyp:*', + 'subdir2/never_used.gyp:*', + 'subdir2/no_inputs.gyp:*', + 'subdir2/no_action.gyp:*', + 'subdir2/none.gyp:*', + 'subdir3/executable2.gyp:*', + 'subdir4/build-asm.gyp:*', + 'external/external.gyp:*', + ], + }, + ], +} diff --git a/deps/gyp/test/rules/src/an_asm.S b/deps/gyp/test/rules/src/an_asm.S new file mode 100644 index 0000000000..eeb1345550 --- /dev/null +++ b/deps/gyp/test/rules/src/an_asm.S @@ -0,0 +1,6 @@ +// 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. + +// Fake asm file. +int main() {} diff --git a/deps/gyp/test/rules/src/as.bat b/deps/gyp/test/rules/src/as.bat new file mode 100644 index 0000000000..903c31a726 --- /dev/null +++ b/deps/gyp/test/rules/src/as.bat @@ -0,0 +1,7 @@ +@echo off
+:: Copyright (c) 2011 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.
+
+:: Fake assembler for Windows
+cl /TP /c %1 /Fo%2
diff --git a/deps/gyp/test/rules/src/copy-file.py b/deps/gyp/test/rules/src/copy-file.py new file mode 100755 index 0000000000..5a5feae1f2 --- /dev/null +++ b/deps/gyp/test/rules/src/copy-file.py @@ -0,0 +1,11 @@ +#!/usr/bin/env python + +# Copyright (c) 2009 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 sys + +contents = open(sys.argv[1], 'r').read() +open(sys.argv[2], 'wb').write(contents) + +sys.exit(0) diff --git a/deps/gyp/test/rules/src/external/external.gyp b/deps/gyp/test/rules/src/external/external.gyp new file mode 100644 index 0000000000..b28174f57c --- /dev/null +++ b/deps/gyp/test/rules/src/external/external.gyp @@ -0,0 +1,66 @@ +# Copyright (c) 2009 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. + +# Test that the case where there are no inputs (other than the +# file the rule applies to). +{ + 'target_defaults': { + 'msvs_cygwin_dirs': ['../../../../../../<(DEPTH)/third_party/cygwin'], + }, + 'targets': [ + { + 'target_name': 'external_rules', + 'type': 'none', + 'sources': [ + 'file1.in', + 'file2.in', + ], + 'conditions': [ + ['OS=="win"', { + 'dependencies': [ + 'cygwin', + ], + }], + ], + 'rules': [ + { + 'rule_name': 'copy_file', + 'extension': 'in', + 'msvs_external_rule': 1, + 'outputs': [ + '<(RULE_INPUT_ROOT).external_rules.out', + ], + 'action': [ + 'python', '../copy-file.py', '<(RULE_INPUT_PATH)', '<@(_outputs)', + ], + }, + ], + }, + ], + 'conditions': [ + ['OS=="win"', { + 'targets': [ + { + 'target_name': 'cygwin', + 'type': 'none', + 'actions': [ + { + 'action_name': 'setup_mount', + 'msvs_cygwin_shell': 0, + 'inputs': [ + '../../../../../../<(DEPTH)/third_party/cygwin/setup_mount.bat', + ], + # Visual Studio requires an output file, or else the + # custom build step won't run. + 'outputs': [ + '<(INTERMEDIATE_DIR)/_always_run_setup_mount.marker', + ], + 'action': ['<@(_inputs)'], + }, + ], + }, + ], + }], + ], +} diff --git a/deps/gyp/test/rules/src/external/file1.in b/deps/gyp/test/rules/src/external/file1.in new file mode 100644 index 0000000000..86ac3ad389 --- /dev/null +++ b/deps/gyp/test/rules/src/external/file1.in @@ -0,0 +1 @@ +Hello from file1.in diff --git a/deps/gyp/test/rules/src/external/file2.in b/deps/gyp/test/rules/src/external/file2.in new file mode 100644 index 0000000000..bf83d8ecec --- /dev/null +++ b/deps/gyp/test/rules/src/external/file2.in @@ -0,0 +1 @@ +Hello from file2.in diff --git a/deps/gyp/test/rules/src/input-root.gyp b/deps/gyp/test/rules/src/input-root.gyp new file mode 100644 index 0000000000..b6600e767c --- /dev/null +++ b/deps/gyp/test/rules/src/input-root.gyp @@ -0,0 +1,24 @@ +# Copyright (c) 2011 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. + +{ + 'targets': [ + { + 'target_name': 'test', + 'type': 'executable', + 'sources': [ 'somefile.ext', ], + 'rules': [{ + 'rule_name': 'rule', + 'extension': 'ext', + 'inputs': [ 'rule.py', ], + 'outputs': [ '<(RULE_INPUT_ROOT).cc', ], + 'action': [ 'python', 'rule.py', '<(RULE_INPUT_ROOT)', ], + 'message': 'Processing <(RULE_INPUT_PATH)', + 'process_outputs_as_sources': 1, + # Allows the test to run without hermetic cygwin on windows. + 'msvs_cygwin_shell': 0, + }], + }, + ], +} diff --git a/deps/gyp/test/rules/src/noaction/file1.in b/deps/gyp/test/rules/src/noaction/file1.in new file mode 100644 index 0000000000..86ac3ad389 --- /dev/null +++ b/deps/gyp/test/rules/src/noaction/file1.in @@ -0,0 +1 @@ +Hello from file1.in diff --git a/deps/gyp/test/rules/src/noaction/no_action_with_rules_fails.gyp b/deps/gyp/test/rules/src/noaction/no_action_with_rules_fails.gyp new file mode 100644 index 0000000000..9b6a65629f --- /dev/null +++ b/deps/gyp/test/rules/src/noaction/no_action_with_rules_fails.gyp @@ -0,0 +1,37 @@ +# 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. + +# Test the case where there's no action but there are input rules that should +# be processed results in a gyp failure. +{ + 'targets': [ + { + 'target_name': 'extension_does_match_sources_but_no_action', + 'type': 'none', + 'msvs_cygwin_shell': 0, + 'sources': [ + 'file1.in', + ], + 'rules': [ + { + 'rule_name': 'assembled', + 'extension': 'in', + 'outputs': [ + '<(RULE_INPUT_ROOT).in', + ], + 'conditions': [ + # Always fails. + [ '"true"=="false"', { + 'action': [ + 'python', '../copy-file.py', '<(RULE_INPUT_PATH)', '<@(_outputs)', + ], + 'process_outputs_as_sources': 1, + 'message': 'test_rule', + }], + ], + }, + ], + }, + ], +} diff --git a/deps/gyp/test/rules/src/rule.py b/deps/gyp/test/rules/src/rule.py new file mode 100755 index 0000000000..8a1f36dedb --- /dev/null +++ b/deps/gyp/test/rules/src/rule.py @@ -0,0 +1,17 @@ +#!/usr/bin/env python +# Copyright (c) 2011 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 sys + +f = open(sys.argv[1] + ".cc", "w") +f.write("""\ +#include <stdio.h> + +int main() { + puts("Hello %s"); + return 0; +} +""" % sys.argv[1]) +f.close() diff --git a/deps/gyp/test/rules/src/somefile.ext b/deps/gyp/test/rules/src/somefile.ext new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/deps/gyp/test/rules/src/somefile.ext diff --git a/deps/gyp/test/rules/src/special-variables.gyp b/deps/gyp/test/rules/src/special-variables.gyp new file mode 100644 index 0000000000..d1443af5ba --- /dev/null +++ b/deps/gyp/test/rules/src/special-variables.gyp @@ -0,0 +1,34 @@ +# 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. + +{ + 'targets': [ + { + 'rules': [ + { + 'rule_name': 'assembler (gnu-compatible)', + 'msvs_cygwin_shell': 0, + 'msvs_quote_cmd': 0, + 'extension': 'S', + 'inputs': [ + 'as.bat', + ], + 'outputs': [ + '$(IntDir)/$(InputName).obj', + ], + 'action': [ + 'as.bat', + '$(InputPath)', + '$(IntDir)/$(InputName).obj', + ], + 'message': 'Building assembly language file $(InputPath)', + 'process_outputs_as_sources': 1, + }, + ], + 'target_name': 'test', + 'type': 'static_library', + 'sources': [ 'an_asm.S' ], + }, + ], +} diff --git a/deps/gyp/test/rules/src/subdir1/executable.gyp b/deps/gyp/test/rules/src/subdir1/executable.gyp new file mode 100644 index 0000000000..c34cce5a92 --- /dev/null +++ b/deps/gyp/test/rules/src/subdir1/executable.gyp @@ -0,0 +1,37 @@ +# Copyright (c) 2009 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. + +{ + 'targets': [ + { + 'target_name': 'program', + 'type': 'executable', + 'msvs_cygwin_shell': 0, + 'sources': [ + 'program.c', + 'function1.in', + 'function2.in', + ], + 'rules': [ + { + 'rule_name': 'copy_file', + 'extension': 'in', + 'inputs': [ + '../copy-file.py', + ], + 'outputs': [ + # TODO: fix Make to support generated files not + # in a variable-named path like <(INTERMEDIATE_DIR) + #'<(RULE_INPUT_ROOT).c', + '<(INTERMEDIATE_DIR)/<(RULE_INPUT_ROOT).c', + ], + 'action': [ + 'python', '<(_inputs)', '<(RULE_INPUT_PATH)', '<@(_outputs)', + ], + 'process_outputs_as_sources': 1, + }, + ], + }, + ], +} diff --git a/deps/gyp/test/rules/src/subdir1/function1.in b/deps/gyp/test/rules/src/subdir1/function1.in new file mode 100644 index 0000000000..60ff28949b --- /dev/null +++ b/deps/gyp/test/rules/src/subdir1/function1.in @@ -0,0 +1,6 @@ +#include <stdio.h> + +void function1(void) +{ + printf("Hello from function1.in\n"); +} diff --git a/deps/gyp/test/rules/src/subdir1/function2.in b/deps/gyp/test/rules/src/subdir1/function2.in new file mode 100644 index 0000000000..0fcfc03fdb --- /dev/null +++ b/deps/gyp/test/rules/src/subdir1/function2.in @@ -0,0 +1,6 @@ +#include <stdio.h> + +void function2(void) +{ + printf("Hello from function2.in\n"); +} diff --git a/deps/gyp/test/rules/src/subdir1/program.c b/deps/gyp/test/rules/src/subdir1/program.c new file mode 100644 index 0000000000..6b11ff9f67 --- /dev/null +++ b/deps/gyp/test/rules/src/subdir1/program.c @@ -0,0 +1,12 @@ +#include <stdio.h> + +extern void function1(void); +extern void function2(void); + +int main(void) +{ + printf("Hello from program.c\n"); + function1(); + function2(); + return 0; +} diff --git a/deps/gyp/test/rules/src/subdir2/both_rule_and_action_input.gyp b/deps/gyp/test/rules/src/subdir2/both_rule_and_action_input.gyp new file mode 100644 index 0000000000..e5e6f3ec2b --- /dev/null +++ b/deps/gyp/test/rules/src/subdir2/both_rule_and_action_input.gyp @@ -0,0 +1,50 @@ +# Copyright (c) 2014 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. + +# Tests that if a rule input is also an action input, both the rule and action +# are executed +{ + 'targets': [ + { + 'target_name': 'files_both_rule_and_action_input', + 'type': 'executable', + 'msvs_cygwin_shell': 0, + 'sources': [ + 'program.c', + 'file1.in', + 'file2.in', + ], + 'rules': [ + { + 'rule_name': 'copy_file', + 'extension': 'in', + 'inputs': [ + '../copy-file.py', + ], + 'outputs': [ + '<(RULE_INPUT_ROOT).out4', + ], + 'action': [ + 'python', '<(_inputs)', '<(RULE_INPUT_PATH)', '<@(_outputs)', + ], + }, + ], + 'actions': [ + { + 'action_name': 'copy_file1_in', + 'inputs': [ + '../copy-file.py', + 'file1.in', + ], + 'outputs': [ + 'file1.copy', + ], + 'action': [ + 'python', '<@(_inputs)', '<(_outputs)' + ], + }, + ], + }, + ], +} diff --git a/deps/gyp/test/rules/src/subdir2/file1.in b/deps/gyp/test/rules/src/subdir2/file1.in new file mode 100644 index 0000000000..86ac3ad389 --- /dev/null +++ b/deps/gyp/test/rules/src/subdir2/file1.in @@ -0,0 +1 @@ +Hello from file1.in diff --git a/deps/gyp/test/rules/src/subdir2/file2.in b/deps/gyp/test/rules/src/subdir2/file2.in new file mode 100644 index 0000000000..bf83d8ecec --- /dev/null +++ b/deps/gyp/test/rules/src/subdir2/file2.in @@ -0,0 +1 @@ +Hello from file2.in diff --git a/deps/gyp/test/rules/src/subdir2/never_used.gyp b/deps/gyp/test/rules/src/subdir2/never_used.gyp new file mode 100644 index 0000000000..17f6f55371 --- /dev/null +++ b/deps/gyp/test/rules/src/subdir2/never_used.gyp @@ -0,0 +1,31 @@ +# Copyright (c) 2009 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. + +# Test that the case where there is a rule that doesn't apply to anything. +{ + 'targets': [ + { + 'target_name': 'files_no_input2', + 'type': 'none', + 'msvs_cygwin_shell': 0, + 'sources': [ + 'file1.in', + 'file2.in', + ], + 'rules': [ + { + 'rule_name': 'copy_file3', + 'extension': 'in2', + 'outputs': [ + '<(RULE_INPUT_ROOT).out3', + ], + 'action': [ + 'python', '../copy-file.py', '<(RULE_INPUT_PATH)', '<@(_outputs)', + ], + 'process_outputs_as_sources': 1, + }, + ], + }, + ], +} diff --git a/deps/gyp/test/rules/src/subdir2/no_action.gyp b/deps/gyp/test/rules/src/subdir2/no_action.gyp new file mode 100644 index 0000000000..ffa1cefe18 --- /dev/null +++ b/deps/gyp/test/rules/src/subdir2/no_action.gyp @@ -0,0 +1,38 @@ +# 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. + +# Test that the case where an action is only specified under a conditional is +# evaluated appropriately. +{ + 'targets': [ + { + 'target_name': 'extension_does_not_match_sources_and_no_action', + 'type': 'none', + 'msvs_cygwin_shell': 0, + 'sources': [ + 'file1.in', + 'file2.in', + ], + 'rules': [ + { + 'rule_name': 'assemble', + 'extension': 'asm', + 'outputs': [ + '<(RULE_INPUT_ROOT).fail', + ], + 'conditions': [ + # Always fails. + [ '"true"=="false"', { + 'action': [ + 'python', '../copy-file.py', '<(RULE_INPUT_PATH)', '<@(_outputs)', + ], + 'process_outputs_as_sources': 1, + 'message': 'test_rule', + }], + ], + }, + ], + }, + ], +} diff --git a/deps/gyp/test/rules/src/subdir2/no_inputs.gyp b/deps/gyp/test/rules/src/subdir2/no_inputs.gyp new file mode 100644 index 0000000000..e61a1a3ff6 --- /dev/null +++ b/deps/gyp/test/rules/src/subdir2/no_inputs.gyp @@ -0,0 +1,32 @@ +# Copyright (c) 2009 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. + +# Test that the case where there are no inputs (other than the +# file the rule applies to). +{ + 'targets': [ + { + 'target_name': 'files_no_input', + 'type': 'none', + 'msvs_cygwin_shell': 0, + 'sources': [ + 'file1.in', + 'file2.in', + ], + 'rules': [ + { + 'rule_name': 'copy_file2', + 'extension': 'in', + 'outputs': [ + '<(RULE_INPUT_ROOT).out2', + ], + 'action': [ + 'python', '../copy-file.py', '<(RULE_INPUT_PATH)', '<@(_outputs)', + ], + 'process_outputs_as_sources': 1, + }, + ], + }, + ], +} diff --git a/deps/gyp/test/rules/src/subdir2/none.gyp b/deps/gyp/test/rules/src/subdir2/none.gyp new file mode 100644 index 0000000000..38bcdabdf6 --- /dev/null +++ b/deps/gyp/test/rules/src/subdir2/none.gyp @@ -0,0 +1,33 @@ +# Copyright (c) 2009 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. + +{ + 'targets': [ + { + 'target_name': 'files', + 'type': 'none', + 'msvs_cygwin_shell': 0, + 'sources': [ + 'file1.in', + 'file2.in', + ], + 'rules': [ + { + 'rule_name': 'copy_file', + 'extension': 'in', + 'inputs': [ + '../copy-file.py', + ], + 'outputs': [ + '<(RULE_INPUT_ROOT).out', + ], + 'action': [ + 'python', '<(_inputs)', '<(RULE_INPUT_PATH)', '<@(_outputs)', + ], + 'process_outputs_as_sources': 1, + }, + ], + }, + ], +} diff --git a/deps/gyp/test/rules/src/subdir2/program.c b/deps/gyp/test/rules/src/subdir2/program.c new file mode 100644 index 0000000000..e5db175148 --- /dev/null +++ b/deps/gyp/test/rules/src/subdir2/program.c @@ -0,0 +1,12 @@ +/* Copyright (c) 2014 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. + */ + +#include <stdio.h> + +int main(void) +{ + printf("Hello from program.c\n"); + return 0; +} diff --git a/deps/gyp/test/rules/src/subdir3/executable2.gyp b/deps/gyp/test/rules/src/subdir3/executable2.gyp new file mode 100644 index 0000000000..a2a528fc7b --- /dev/null +++ b/deps/gyp/test/rules/src/subdir3/executable2.gyp @@ -0,0 +1,37 @@ +# Copyright (c) 2009 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. + +# This one tests that rules are properly written if extensions are different +# between the target's sources (program.c) and the generated files +# (function3.cc) + +{ + 'targets': [ + { + 'target_name': 'program2', + 'type': 'executable', + 'msvs_cygwin_shell': 0, + 'sources': [ + 'program.c', + 'function3.in', + ], + 'rules': [ + { + 'rule_name': 'copy_file', + 'extension': 'in', + 'inputs': [ + '../copy-file.py', + ], + 'outputs': [ + '<(SHARED_INTERMEDIATE_DIR)/<(RULE_INPUT_ROOT).cc', + ], + 'action': [ + 'python', '<(_inputs)', '<(RULE_INPUT_PATH)', '<@(_outputs)', + ], + 'process_outputs_as_sources': 1, + }, + ], + }, + ], +} diff --git a/deps/gyp/test/rules/src/subdir3/function3.in b/deps/gyp/test/rules/src/subdir3/function3.in new file mode 100644 index 0000000000..99f46ab05e --- /dev/null +++ b/deps/gyp/test/rules/src/subdir3/function3.in @@ -0,0 +1,6 @@ +#include <stdio.h> + +extern "C" void function3(void) +{ + printf("Hello from function3.in\n"); +} diff --git a/deps/gyp/test/rules/src/subdir3/program.c b/deps/gyp/test/rules/src/subdir3/program.c new file mode 100644 index 0000000000..c38eead50e --- /dev/null +++ b/deps/gyp/test/rules/src/subdir3/program.c @@ -0,0 +1,10 @@ +#include <stdio.h> + +extern void function3(void); + +int main(void) +{ + printf("Hello from program.c\n"); + function3(); + return 0; +} diff --git a/deps/gyp/test/rules/src/subdir4/asm-function.assem b/deps/gyp/test/rules/src/subdir4/asm-function.assem new file mode 100644 index 0000000000..ed47cade95 --- /dev/null +++ b/deps/gyp/test/rules/src/subdir4/asm-function.assem @@ -0,0 +1,10 @@ +#if PLATFORM_WINDOWS || PLATFORM_MAC +# define IDENTIFIER(n) _##n +#else /* Linux */ +# define IDENTIFIER(n) n +#endif + +.globl IDENTIFIER(asm_function) +IDENTIFIER(asm_function): + movl $41, %eax + ret diff --git a/deps/gyp/test/rules/src/subdir4/build-asm.gyp b/deps/gyp/test/rules/src/subdir4/build-asm.gyp new file mode 100644 index 0000000000..fe0fe93787 --- /dev/null +++ b/deps/gyp/test/rules/src/subdir4/build-asm.gyp @@ -0,0 +1,49 @@ +# Copyright (c) 2009 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. + +# This one tests that assembly files ended as .s and .S are compiled. + +{ + 'target_defaults': { + 'conditions': [ + ['OS=="win"', { + 'defines': ['PLATFORM_WIN'], + }], + ['OS=="mac"', { + 'defines': ['PLATFORM_MAC'], + }], + ['OS=="linux"', { + 'defines': ['PLATFORM_LINUX'], + }], + ], + }, + 'targets': [ + { + 'target_name': 'program4', + 'type': 'executable', + 'sources': [ + 'asm-function.assem', + 'program.c', + ], + 'conditions': [ + ['OS=="linux" or OS=="mac"', { + 'rules': [ + { + 'rule_name': 'convert_assem', + 'extension': 'assem', + 'inputs': [], + 'outputs': [ + '<(SHARED_INTERMEDIATE_DIR)/<(RULE_INPUT_ROOT).S', + ], + 'action': [ + 'bash', '-c', 'cp <(RULE_INPUT_PATH) <@(_outputs)', + ], + 'process_outputs_as_sources': 1, + }, + ], + }], + ], + }, + ], +} diff --git a/deps/gyp/test/rules/src/subdir4/program.c b/deps/gyp/test/rules/src/subdir4/program.c new file mode 100644 index 0000000000..ad647f4eb9 --- /dev/null +++ b/deps/gyp/test/rules/src/subdir4/program.c @@ -0,0 +1,19 @@ +#include <stdio.h> + +// Use the assembly function in linux and mac where it is built. +#if PLATFORM_LINUX || PLATFORM_MAC +extern int asm_function(void); +#else +int asm_function() { + return 41; +} +#endif + +int main(void) +{ + fprintf(stdout, "Hello from program.c\n"); + fflush(stdout); + fprintf(stdout, "Got %d.\n", asm_function()); + fflush(stdout); + return 0; +} diff --git a/deps/gyp/test/same-gyp-name/gyptest-all.py b/deps/gyp/test/same-gyp-name/gyptest-all.py new file mode 100755 index 0000000000..cda1a72d4d --- /dev/null +++ b/deps/gyp/test/same-gyp-name/gyptest-all.py @@ -0,0 +1,38 @@ +#!/usr/bin/env python + +# 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. + +""" +Build a .gyp that depends on 2 gyp files with the same name. +""" + +import TestGyp + +test = TestGyp.TestGyp() + +test.run_gyp('all.gyp', chdir='src') + +test.relocate('src', 'relocate/src') + +test.build('all.gyp', test.ALL, chdir='relocate/src') + +expect1 = """\ +Hello from main1.cc +""" + +expect2 = """\ +Hello from main2.cc +""" + +if test.format == 'xcode': + chdir1 = 'relocate/src/subdir1' + chdir2 = 'relocate/src/subdir2' +else: + chdir1 = chdir2 = 'relocate/src' + +test.run_built_executable('program1', chdir=chdir1, stdout=expect1) +test.run_built_executable('program2', chdir=chdir2, stdout=expect2) + +test.pass_test() diff --git a/deps/gyp/test/same-gyp-name/gyptest-default.py b/deps/gyp/test/same-gyp-name/gyptest-default.py new file mode 100755 index 0000000000..5e4bba0012 --- /dev/null +++ b/deps/gyp/test/same-gyp-name/gyptest-default.py @@ -0,0 +1,38 @@ +#!/usr/bin/env python + +# 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. + +""" +Build a .gyp that depends on 2 gyp files with the same name. +""" + +import TestGyp + +test = TestGyp.TestGyp() + +test.run_gyp('all.gyp', chdir='src') + +test.relocate('src', 'relocate/src') + +test.build('all.gyp', chdir='relocate/src') + +expect1 = """\ +Hello from main1.cc +""" + +expect2 = """\ +Hello from main2.cc +""" + +if test.format == 'xcode': + chdir1 = 'relocate/src/subdir1' + chdir2 = 'relocate/src/subdir2' +else: + chdir1 = chdir2 = 'relocate/src' + +test.run_built_executable('program1', chdir=chdir1, stdout=expect1) +test.run_built_executable('program2', chdir=chdir2, stdout=expect2) + +test.pass_test() diff --git a/deps/gyp/test/same-gyp-name/gyptest-library.py b/deps/gyp/test/same-gyp-name/gyptest-library.py new file mode 100644 index 0000000000..957a4a52d6 --- /dev/null +++ b/deps/gyp/test/same-gyp-name/gyptest-library.py @@ -0,0 +1,20 @@ +#!/usr/bin/env python + +# 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. + +""" +Verifies that a dependency on two gyp files with the same name do not create a +uid collision in the resulting generated xcode file. +""" + +import TestGyp + +import sys + +test = TestGyp.TestGyp() + +test.run_gyp('test.gyp', chdir='library') + +test.pass_test() diff --git a/deps/gyp/test/same-gyp-name/library/one/sub.gyp b/deps/gyp/test/same-gyp-name/library/one/sub.gyp new file mode 100644 index 0000000000..1bed941e54 --- /dev/null +++ b/deps/gyp/test/same-gyp-name/library/one/sub.gyp @@ -0,0 +1,11 @@ +# 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. +{ + 'targets': [ + { + 'target_name': 'one', + 'type': 'static_library', + }, + ], +} diff --git a/deps/gyp/test/same-gyp-name/library/test.gyp b/deps/gyp/test/same-gyp-name/library/test.gyp new file mode 100644 index 0000000000..552a77ed7e --- /dev/null +++ b/deps/gyp/test/same-gyp-name/library/test.gyp @@ -0,0 +1,15 @@ +# 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. +{ + 'targets': [ + { + 'target_name': 'duplicate_names', + 'type': 'shared_library', + 'dependencies': [ + 'one/sub.gyp:one', + 'two/sub.gyp:two', + ], + }, + ], +} diff --git a/deps/gyp/test/same-gyp-name/library/two/sub.gyp b/deps/gyp/test/same-gyp-name/library/two/sub.gyp new file mode 100644 index 0000000000..934c98a496 --- /dev/null +++ b/deps/gyp/test/same-gyp-name/library/two/sub.gyp @@ -0,0 +1,11 @@ +# 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. +{ + 'targets': [ + { + 'target_name': 'two', + 'type': 'static_library', + }, + ], +} diff --git a/deps/gyp/test/same-gyp-name/src/all.gyp b/deps/gyp/test/same-gyp-name/src/all.gyp new file mode 100644 index 0000000000..229f02ea84 --- /dev/null +++ b/deps/gyp/test/same-gyp-name/src/all.gyp @@ -0,0 +1,16 @@ +# Copyright (c) 2009 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. + +{ + 'targets': [ + { + 'target_name': 'all_exes', + 'type': 'none', + 'dependencies': [ + 'subdir1/executable.gyp:*', + 'subdir2/executable.gyp:*', + ], + }, + ], +} diff --git a/deps/gyp/test/same-gyp-name/src/subdir1/executable.gyp b/deps/gyp/test/same-gyp-name/src/subdir1/executable.gyp new file mode 100644 index 0000000000..82483b4c69 --- /dev/null +++ b/deps/gyp/test/same-gyp-name/src/subdir1/executable.gyp @@ -0,0 +1,15 @@ +# Copyright (c) 2009 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. + +{ + 'targets': [ + { + 'target_name': 'program1', + 'type': 'executable', + 'sources': [ + 'main1.cc', + ], + }, + ], +} diff --git a/deps/gyp/test/same-gyp-name/src/subdir1/main1.cc b/deps/gyp/test/same-gyp-name/src/subdir1/main1.cc new file mode 100644 index 0000000000..3645558324 --- /dev/null +++ b/deps/gyp/test/same-gyp-name/src/subdir1/main1.cc @@ -0,0 +1,6 @@ +#include <stdio.h> + +int main() { + printf("Hello from main1.cc\n"); + return 0; +} diff --git a/deps/gyp/test/same-gyp-name/src/subdir2/executable.gyp b/deps/gyp/test/same-gyp-name/src/subdir2/executable.gyp new file mode 100644 index 0000000000..e3537013eb --- /dev/null +++ b/deps/gyp/test/same-gyp-name/src/subdir2/executable.gyp @@ -0,0 +1,15 @@ +# Copyright (c) 2009 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. + +{ + 'targets': [ + { + 'target_name': 'program2', + 'type': 'executable', + 'sources': [ + 'main2.cc', + ], + }, + ], +} diff --git a/deps/gyp/test/same-gyp-name/src/subdir2/main2.cc b/deps/gyp/test/same-gyp-name/src/subdir2/main2.cc new file mode 100644 index 0000000000..0c724dee35 --- /dev/null +++ b/deps/gyp/test/same-gyp-name/src/subdir2/main2.cc @@ -0,0 +1,6 @@ +#include <stdio.h> + +int main() { + printf("Hello from main2.cc\n"); + return 0; +} diff --git a/deps/gyp/test/same-rule-output-file-name/gyptest-all.py b/deps/gyp/test/same-rule-output-file-name/gyptest-all.py new file mode 100644 index 0000000000..964e6b7721 --- /dev/null +++ b/deps/gyp/test/same-rule-output-file-name/gyptest-all.py @@ -0,0 +1,23 @@ +#!/usr/bin/env python + +# 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. + +""" +Tests the use of rules with the same output file name. +""" + +import TestGyp + +test = TestGyp.TestGyp() + +test.run_gyp('subdirs.gyp', chdir='src') + +test.relocate('src', 'relocate/src') + +test.build('subdirs.gyp', test.ALL, chdir='relocate/src') +test.must_exist('relocate/src/subdir1/rule.txt') +test.must_exist('relocate/src/subdir2/rule.txt') + +test.pass_test() diff --git a/deps/gyp/test/same-rule-output-file-name/src/subdir1/subdir1.gyp b/deps/gyp/test/same-rule-output-file-name/src/subdir1/subdir1.gyp new file mode 100644 index 0000000000..bff381a5a5 --- /dev/null +++ b/deps/gyp/test/same-rule-output-file-name/src/subdir1/subdir1.gyp @@ -0,0 +1,30 @@ +# 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. + +{ + 'targets': [ + { + 'target_name': 'target1', + 'type': 'none', + 'sources': [ + '../touch.py' + ], + 'rules': [ + { + 'rule_name': 'rule1', + 'extension': 'py', + 'inputs': [], + 'outputs': [ + 'rule.txt', + ], + 'action': [ + 'python', '../touch.py', '<(_outputs)', + ], + # Allows the test to run without hermetic cygwin on windows. + 'msvs_cygwin_shell': 0, + }, + ], + }, + ], +} diff --git a/deps/gyp/test/same-rule-output-file-name/src/subdir2/subdir2.gyp b/deps/gyp/test/same-rule-output-file-name/src/subdir2/subdir2.gyp new file mode 100644 index 0000000000..12a35600a3 --- /dev/null +++ b/deps/gyp/test/same-rule-output-file-name/src/subdir2/subdir2.gyp @@ -0,0 +1,30 @@ +# 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. + +{ + 'targets': [ + { + 'target_name': 'target2', + 'type': 'none', + 'sources': [ + '../touch.py' + ], + 'rules': [ + { + 'rule_name': 'rule2', + 'extension': 'py', + 'inputs': [], + 'outputs': [ + 'rule.txt', + ], + 'action': [ + 'python', '../touch.py', '<(_outputs)', + ], + # Allows the test to run without hermetic cygwin on windows. + 'msvs_cygwin_shell': 0, + }, + ], + }, + ], +} diff --git a/deps/gyp/test/same-rule-output-file-name/src/subdirs.gyp b/deps/gyp/test/same-rule-output-file-name/src/subdirs.gyp new file mode 100644 index 0000000000..25259a38f4 --- /dev/null +++ b/deps/gyp/test/same-rule-output-file-name/src/subdirs.gyp @@ -0,0 +1,16 @@ +# 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. + +{ + 'targets': [ + { + 'target_name': 'subdirs', + 'type': 'none', + 'dependencies': [ + 'subdir1/subdir1.gyp:*', + 'subdir2/subdir2.gyp:*', + ], + }, + ], +} diff --git a/deps/gyp/test/same-rule-output-file-name/src/touch.py b/deps/gyp/test/same-rule-output-file-name/src/touch.py new file mode 100644 index 0000000000..2291e9cc56 --- /dev/null +++ b/deps/gyp/test/same-rule-output-file-name/src/touch.py @@ -0,0 +1,11 @@ +#!/usr/bin/env python + +# 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 sys + +f = open(sys.argv[1], 'w+') +f.write('Hello from touch.py\n') +f.close() diff --git a/deps/gyp/test/same-source-file-name/gyptest-all.py b/deps/gyp/test/same-source-file-name/gyptest-all.py new file mode 100755 index 0000000000..4c215027c2 --- /dev/null +++ b/deps/gyp/test/same-source-file-name/gyptest-all.py @@ -0,0 +1,34 @@ +#!/usr/bin/env python + +# Copyright (c) 2009 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. + +""" +Build a .gyp with two targets that share a common .c source file. +""" + +import TestGyp + +test = TestGyp.TestGyp() + +test.run_gyp('all.gyp', chdir='src') + +test.relocate('src', 'relocate/src') + +test.build('all.gyp', test.ALL, chdir='relocate/src') + +expect1 = """\ +Hello from prog1.c +Hello prog1 from func.c +""" + +expect2 = """\ +Hello from prog2.c +Hello prog2 from func.c +""" + +test.run_built_executable('prog1', chdir='relocate/src', stdout=expect1) +test.run_built_executable('prog2', chdir='relocate/src', stdout=expect2) + +test.pass_test() diff --git a/deps/gyp/test/same-source-file-name/gyptest-default.py b/deps/gyp/test/same-source-file-name/gyptest-default.py new file mode 100755 index 0000000000..98757c2697 --- /dev/null +++ b/deps/gyp/test/same-source-file-name/gyptest-default.py @@ -0,0 +1,34 @@ +#!/usr/bin/env python + +# Copyright (c) 2009 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. + +""" +Build a .gyp with two targets that share a common .c source file. +""" + +import TestGyp + +test = TestGyp.TestGyp() + +test.run_gyp('all.gyp', chdir='src') + +test.relocate('src', 'relocate/src') + +test.build('all.gyp', chdir='relocate/src') + +expect1 = """\ +Hello from prog1.c +Hello prog1 from func.c +""" + +expect2 = """\ +Hello from prog2.c +Hello prog2 from func.c +""" + +test.run_built_executable('prog1', chdir='relocate/src', stdout=expect1) +test.run_built_executable('prog2', chdir='relocate/src', stdout=expect2) + +test.pass_test() diff --git a/deps/gyp/test/same-source-file-name/gyptest-pass-executable.py b/deps/gyp/test/same-source-file-name/gyptest-pass-executable.py new file mode 100755 index 0000000000..1a3dcda23d --- /dev/null +++ b/deps/gyp/test/same-source-file-name/gyptest-pass-executable.py @@ -0,0 +1,33 @@ +#!/usr/bin/env python + +# 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. + +""" +Checks that gyp does not fail on executable targets which have several files +with the same basename. +""" + +import TestGyp + +# While MSVS supports building executables that contain several files with the +# same name, the msvs gyp generator does not. +test = TestGyp.TestGyp(formats=['!msvs']) + +test.run_gyp('double-executable.gyp', chdir='src') + +test.relocate('src', 'relocate/src') + +test.build('double-executable.gyp', test.ALL, chdir='relocate/src') + +expect = """\ +Hello from prog3.c +Hello prog3 from func.c +Hello prog3 from subdir1/func.c +Hello prog3 from subdir2/func.c +""" + +test.run_built_executable('prog3', chdir='relocate/src', stdout=expect) + +test.pass_test() diff --git a/deps/gyp/test/same-source-file-name/gyptest-pass-shared.py b/deps/gyp/test/same-source-file-name/gyptest-pass-shared.py new file mode 100755 index 0000000000..a498f1a846 --- /dev/null +++ b/deps/gyp/test/same-source-file-name/gyptest-pass-shared.py @@ -0,0 +1,18 @@ +#!/usr/bin/env python + +# 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. + +""" +Checks that gyp does not fail on shared_library targets which have several files +with the same basename. +""" + +import TestGyp + +test = TestGyp.TestGyp() + +test.run_gyp('double-shared.gyp', chdir='src') + +test.pass_test() diff --git a/deps/gyp/test/same-source-file-name/gyptest-static.py b/deps/gyp/test/same-source-file-name/gyptest-static.py new file mode 100755 index 0000000000..7fa2772040 --- /dev/null +++ b/deps/gyp/test/same-source-file-name/gyptest-static.py @@ -0,0 +1,34 @@ +#!/usr/bin/env python + +# 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. + +""" +Checks that gyp fails on static_library targets which have several files with +the same basename. +""" + +import os +import sys + +import TestGyp + +test = TestGyp.TestGyp() + +# Fails by default for the compatibility with legacy generators such as +# VCProj generator for Visual C++ 2008 and Makefile generator on Mac. +# TODO: Update expected behavior when these legacy generators are deprecated. +test.run_gyp('double-static.gyp', chdir='src', status=1, stderr=None) + +if ((test.format == 'make' and sys.platform == 'darwin') or + (test.format == 'msvs' and + int(os.environ.get('GYP_MSVS_VERSION', 2010)) < 2010)): + test.run_gyp('double-static.gyp', '--no-duplicate-basename-check', + chdir='src', status=1, stderr=None) +else: + test.run_gyp('double-static.gyp', '--no-duplicate-basename-check', + chdir='src') + test.build('double-static.gyp', test.ALL, chdir='src') + +test.pass_test() diff --git a/deps/gyp/test/same-source-file-name/src/all.gyp b/deps/gyp/test/same-source-file-name/src/all.gyp new file mode 100644 index 0000000000..4fe052c668 --- /dev/null +++ b/deps/gyp/test/same-source-file-name/src/all.gyp @@ -0,0 +1,30 @@ +# Copyright (c) 2009 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. + +{ + 'targets': [ + { + 'target_name': 'prog1', + 'type': 'executable', + 'defines': [ + 'PROG="prog1"', + ], + 'sources': [ + 'prog1.c', + 'func.c', + ], + }, + { + 'target_name': 'prog2', + 'type': 'executable', + 'defines': [ + 'PROG="prog2"', + ], + 'sources': [ + 'prog2.c', + 'func.c', + ], + }, + ], +} diff --git a/deps/gyp/test/same-source-file-name/src/double-executable.gyp b/deps/gyp/test/same-source-file-name/src/double-executable.gyp new file mode 100644 index 0000000000..477bd87e0d --- /dev/null +++ b/deps/gyp/test/same-source-file-name/src/double-executable.gyp @@ -0,0 +1,21 @@ +# 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. + +{ + 'targets': [ + { + 'target_name': 'prog3', + 'type': 'executable', + 'sources': [ + 'prog3.c', + 'func.c', + 'subdir1/func.c', + 'subdir2/func.c', + ], + 'defines': [ + 'PROG="prog3"', + ], + }, + ], +} diff --git a/deps/gyp/test/same-source-file-name/src/double-shared.gyp b/deps/gyp/test/same-source-file-name/src/double-shared.gyp new file mode 100644 index 0000000000..438b50f3f1 --- /dev/null +++ b/deps/gyp/test/same-source-file-name/src/double-shared.gyp @@ -0,0 +1,27 @@ +# 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. + +{ + 'targets': [ + { + 'target_name': 'lib', + 'product_name': 'test_shared_lib', + 'type': 'shared_library', + 'sources': [ + 'prog2.c', + 'func.c', + 'subdir1/func.c', + 'subdir2/func.c', + ], + 'defines': [ + 'PROG="prog2"', + ], + 'conditions': [ + ['OS=="linux"', { + 'cflags': ['-fPIC'], + }], + ], + }, + ], +} diff --git a/deps/gyp/test/same-source-file-name/src/double-static.gyp b/deps/gyp/test/same-source-file-name/src/double-static.gyp new file mode 100644 index 0000000000..e49c0e1251 --- /dev/null +++ b/deps/gyp/test/same-source-file-name/src/double-static.gyp @@ -0,0 +1,22 @@ +# 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. + +{ + 'targets': [ + { + 'target_name': 'lib', + 'product_name': 'test_static_lib', + 'type': 'static_library', + 'sources': [ + 'prog1.c', + 'func.c', + 'subdir1/func.c', + 'subdir2/func.c', + ], + 'defines': [ + 'PROG="prog1"', + ], + }, + ], +} diff --git a/deps/gyp/test/same-source-file-name/src/func.c b/deps/gyp/test/same-source-file-name/src/func.c new file mode 100644 index 0000000000..e069c692a6 --- /dev/null +++ b/deps/gyp/test/same-source-file-name/src/func.c @@ -0,0 +1,6 @@ +#include <stdio.h> + +void func(void) +{ + printf("Hello %s from func.c\n", PROG); +} diff --git a/deps/gyp/test/same-source-file-name/src/prog1.c b/deps/gyp/test/same-source-file-name/src/prog1.c new file mode 100644 index 0000000000..604e2b9c98 --- /dev/null +++ b/deps/gyp/test/same-source-file-name/src/prog1.c @@ -0,0 +1,16 @@ +#include <stdio.h> + +extern void func(void); + +int main(void) +{ + printf("Hello from prog1.c\n"); + func(); + /* + * Uncomment to test same-named files in different directories, + * which Visual Studio doesn't support. + subdir1_func(); + subdir2_func(); + */ + return 0; +} diff --git a/deps/gyp/test/same-source-file-name/src/prog2.c b/deps/gyp/test/same-source-file-name/src/prog2.c new file mode 100644 index 0000000000..466ee35003 --- /dev/null +++ b/deps/gyp/test/same-source-file-name/src/prog2.c @@ -0,0 +1,16 @@ +#include <stdio.h> + +extern void func(void); + +int main(void) +{ + printf("Hello from prog2.c\n"); + func(); + /* + * Uncomment to test same-named files in different directories, + * which Visual Studio doesn't support. + subdir1_func(); + subdir2_func(); + */ + return 0; +} diff --git a/deps/gyp/test/same-source-file-name/src/prog3.c b/deps/gyp/test/same-source-file-name/src/prog3.c new file mode 100644 index 0000000000..34d495ce08 --- /dev/null +++ b/deps/gyp/test/same-source-file-name/src/prog3.c @@ -0,0 +1,18 @@ +// 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. + +#include <stdio.h> + +extern void func(void); +extern void subdir1_func(void); +extern void subdir2_func(void); + +int main(void) +{ + printf("Hello from prog3.c\n"); + func(); + subdir1_func(); + subdir2_func(); + return 0; +} diff --git a/deps/gyp/test/same-source-file-name/src/subdir1/func.c b/deps/gyp/test/same-source-file-name/src/subdir1/func.c new file mode 100644 index 0000000000..b73450d105 --- /dev/null +++ b/deps/gyp/test/same-source-file-name/src/subdir1/func.c @@ -0,0 +1,6 @@ +#include <stdio.h> + +void subdir1_func(void) +{ + printf("Hello %s from subdir1/func.c\n", PROG); +} diff --git a/deps/gyp/test/same-source-file-name/src/subdir2/func.c b/deps/gyp/test/same-source-file-name/src/subdir2/func.c new file mode 100644 index 0000000000..0248b5720e --- /dev/null +++ b/deps/gyp/test/same-source-file-name/src/subdir2/func.c @@ -0,0 +1,6 @@ +#include <stdio.h> + +void subdir2_func(void) +{ + printf("Hello %s from subdir2/func.c\n", PROG); +} diff --git a/deps/gyp/test/same-target-name-different-directory/gyptest-all.py b/deps/gyp/test/same-target-name-different-directory/gyptest-all.py new file mode 100644 index 0000000000..755691b576 --- /dev/null +++ b/deps/gyp/test/same-target-name-different-directory/gyptest-all.py @@ -0,0 +1,41 @@ +#!/usr/bin/env python + +# 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. + +""" +Test cases when multiple targets in different directories have the same name. +""" + +import TestGyp + +test = TestGyp.TestGyp(formats=['ninja', 'make']) + +# xcode-ninja fails to generate a project due to id collisions +# cf. https://code.google.com/p/gyp/issues/detail?id=461 +if test.format == 'xcode-ninja': + test.skip_test() + +test.run_gyp('subdirs.gyp', chdir='src') + +test.relocate('src', 'relocate/src') + +# Test that we build all targets. +test.build('subdirs.gyp', 'target', chdir='relocate/src') +test.must_exist('relocate/src/subdir1/action1.txt') +test.must_exist('relocate/src/subdir2/action2.txt') + +# Test that we build all targets using the correct actions, even if they have +# the same names. +test.build('subdirs.gyp', 'target_same_action_name', chdir='relocate/src') +test.must_exist('relocate/src/subdir1/action.txt') +test.must_exist('relocate/src/subdir2/action.txt') + +# Test that we build all targets using the correct rules, even if they have +# the same names. +test.build('subdirs.gyp', 'target_same_rule_name', chdir='relocate/src') +test.must_exist('relocate/src/subdir1/rule.txt') +test.must_exist('relocate/src/subdir2/rule.txt') + +test.pass_test() diff --git a/deps/gyp/test/same-target-name-different-directory/src/subdir1/subdir1.gyp b/deps/gyp/test/same-target-name-different-directory/src/subdir1/subdir1.gyp new file mode 100644 index 0000000000..d4ec2e679a --- /dev/null +++ b/deps/gyp/test/same-target-name-different-directory/src/subdir1/subdir1.gyp @@ -0,0 +1,66 @@ +# 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. + +{ + 'targets': [ + { + 'target_name': 'target', + 'type': 'none', + 'actions': [ + { + 'action_name': 'action1', + 'inputs': [], + 'outputs': [ + 'action1.txt', + ], + 'action': [ + 'python', '../touch.py', '<(_outputs)', + ], + # Allows the test to run without hermetic cygwin on windows. + 'msvs_cygwin_shell': 0, + }, + ], + }, + { + 'target_name': 'target_same_action_name', + 'type': 'none', + 'actions': [ + { + 'action_name': 'action', + 'inputs': [], + 'outputs': [ + 'action.txt', + ], + 'action': [ + 'python', '../touch.py', '<(_outputs)', + ], + # Allows the test to run without hermetic cygwin on windows. + 'msvs_cygwin_shell': 0, + }, + ], + }, + { + 'target_name': 'target_same_rule_name', + 'type': 'none', + 'sources': [ + '../touch.py' + ], + 'rules': [ + { + 'rule_name': 'rule', + 'extension': 'py', + 'inputs': [], + 'outputs': [ + 'rule.txt', + ], + 'action': [ + 'python', '../touch.py', '<(_outputs)', + ], + # Allows the test to run without hermetic cygwin on windows. + 'msvs_cygwin_shell': 0, + }, + ], + }, + ], +} diff --git a/deps/gyp/test/same-target-name-different-directory/src/subdir2/subdir2.gyp b/deps/gyp/test/same-target-name-different-directory/src/subdir2/subdir2.gyp new file mode 100644 index 0000000000..9006d450b2 --- /dev/null +++ b/deps/gyp/test/same-target-name-different-directory/src/subdir2/subdir2.gyp @@ -0,0 +1,66 @@ +# 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. + +{ + 'targets': [ + { + 'target_name': 'target', + 'type': 'none', + 'actions': [ + { + 'action_name': 'action2', + 'inputs': [], + 'outputs': [ + 'action2.txt', + ], + 'action': [ + 'python', '../touch.py', '<(_outputs)', + ], + # Allows the test to run without hermetic cygwin on windows. + 'msvs_cygwin_shell': 0, + }, + ], + }, + { + 'target_name': 'target_same_action_name', + 'type': 'none', + 'actions': [ + { + 'action_name': 'action', + 'inputs': [], + 'outputs': [ + 'action.txt', + ], + 'action': [ + 'python', '../touch.py', '<(_outputs)', + ], + # Allows the test to run without hermetic cygwin on windows. + 'msvs_cygwin_shell': 0, + }, + ], + }, + { + 'target_name': 'target_same_rule_name', + 'type': 'none', + 'sources': [ + '../touch.py' + ], + 'rules': [ + { + 'rule_name': 'rule', + 'extension': 'py', + 'inputs': [], + 'outputs': [ + 'rule.txt', + ], + 'action': [ + 'python', '../touch.py', '<(_outputs)', + ], + # Allows the test to run without hermetic cygwin on windows. + 'msvs_cygwin_shell': 0, + }, + ], + }, + ], +} diff --git a/deps/gyp/test/same-target-name-different-directory/src/subdirs.gyp b/deps/gyp/test/same-target-name-different-directory/src/subdirs.gyp new file mode 100644 index 0000000000..65413e73b2 --- /dev/null +++ b/deps/gyp/test/same-target-name-different-directory/src/subdirs.gyp @@ -0,0 +1,16 @@ +# Copyright (c) 2010 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. + +{ + 'targets': [ + { + 'target_name': 'subdirs', + 'type': 'none', + 'dependencies': [ + 'subdir1/subdir1.gyp:*', + 'subdir2/subdir2.gyp:*', + ], + }, + ], +} diff --git a/deps/gyp/test/same-target-name-different-directory/src/touch.py b/deps/gyp/test/same-target-name-different-directory/src/touch.py new file mode 100644 index 0000000000..2291e9cc56 --- /dev/null +++ b/deps/gyp/test/same-target-name-different-directory/src/touch.py @@ -0,0 +1,11 @@ +#!/usr/bin/env python + +# 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 sys + +f = open(sys.argv[1], 'w+') +f.write('Hello from touch.py\n') +f.close() diff --git a/deps/gyp/test/same-target-name/gyptest-same-target-name.py b/deps/gyp/test/same-target-name/gyptest-same-target-name.py new file mode 100755 index 0000000000..bfe5540f31 --- /dev/null +++ b/deps/gyp/test/same-target-name/gyptest-same-target-name.py @@ -0,0 +1,18 @@ +#!/usr/bin/env python + +# Copyright (c) 2010 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. + +""" +Check that duplicate targets in a directory gives an error. +""" + +import TestGyp + +test = TestGyp.TestGyp() + +# Require that gyp files with duplicate targets spit out an error. +test.run_gyp('all.gyp', chdir='src', status=1, stderr=None) + +test.pass_test() diff --git a/deps/gyp/test/same-target-name/src/all.gyp b/deps/gyp/test/same-target-name/src/all.gyp new file mode 100644 index 0000000000..ac16976da6 --- /dev/null +++ b/deps/gyp/test/same-target-name/src/all.gyp @@ -0,0 +1,16 @@ +# Copyright (c) 2010 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. + +{ + 'targets': [ + { + 'target_name': 'all_exes', + 'type': 'none', + 'dependencies': [ + 'executable1.gyp:*', + 'executable2.gyp:*', + ], + }, + ], +} diff --git a/deps/gyp/test/same-target-name/src/executable1.gyp b/deps/gyp/test/same-target-name/src/executable1.gyp new file mode 100644 index 0000000000..3c492c1b37 --- /dev/null +++ b/deps/gyp/test/same-target-name/src/executable1.gyp @@ -0,0 +1,15 @@ +# Copyright (c) 2010 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. + +{ + 'targets': [ + { + 'target_name': 'program', + 'type': 'executable', + 'sources': [ + 'main1.cc', + ], + }, + ], +} diff --git a/deps/gyp/test/same-target-name/src/executable2.gyp b/deps/gyp/test/same-target-name/src/executable2.gyp new file mode 100644 index 0000000000..41e84a61c6 --- /dev/null +++ b/deps/gyp/test/same-target-name/src/executable2.gyp @@ -0,0 +1,15 @@ +# Copyright (c) 2010 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. + +{ + 'targets': [ + { + 'target_name': 'program', + 'type': 'executable', + 'sources': [ + 'main2.cc', + ], + }, + ], +} diff --git a/deps/gyp/test/sanitize-rule-names/blah.S b/deps/gyp/test/sanitize-rule-names/blah.S new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/deps/gyp/test/sanitize-rule-names/blah.S diff --git a/deps/gyp/test/sanitize-rule-names/gyptest-sanitize-rule-names.py b/deps/gyp/test/sanitize-rule-names/gyptest-sanitize-rule-names.py new file mode 100644 index 0000000000..968a0ce5ce --- /dev/null +++ b/deps/gyp/test/sanitize-rule-names/gyptest-sanitize-rule-names.py @@ -0,0 +1,17 @@ +#!/usr/bin/env python + +# 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. + +""" +Make sure rule names with non-"normal" characters in them don't cause +broken build files. This test was originally causing broken .ninja files. +""" + +import TestGyp + +test = TestGyp.TestGyp() +test.run_gyp('sanitize-rule-names.gyp') +test.build('sanitize-rule-names.gyp', test.ALL) +test.pass_test() diff --git a/deps/gyp/test/sanitize-rule-names/hello.cc b/deps/gyp/test/sanitize-rule-names/hello.cc new file mode 100644 index 0000000000..1711567ef5 --- /dev/null +++ b/deps/gyp/test/sanitize-rule-names/hello.cc @@ -0,0 +1,7 @@ +// 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. + +int main() { + return 0; +} diff --git a/deps/gyp/test/sanitize-rule-names/sanitize-rule-names.gyp b/deps/gyp/test/sanitize-rule-names/sanitize-rule-names.gyp new file mode 100644 index 0000000000..184253e966 --- /dev/null +++ b/deps/gyp/test/sanitize-rule-names/sanitize-rule-names.gyp @@ -0,0 +1,27 @@ +# 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. + +{ + 'targets': [ + { + 'target_name': 's_test', + 'type': 'executable', + 'rules': [ + { + # Make sure this rule name doesn't cause an invalid ninja file. + 'rule_name': 'rule name with odd characters ()/', + 'extension': 'S', + 'outputs': ['outfile'], + 'msvs_cygwin_shell': 0, + 'msvs_quote_cmd': 0, + 'action': ['python', 'script.py', '<(RULE_INPUT_PATH)', 'outfile'], + }, + ], + 'sources': [ + 'blah.S', + 'hello.cc', + ], + }, + ], +} diff --git a/deps/gyp/test/sanitize-rule-names/script.py b/deps/gyp/test/sanitize-rule-names/script.py new file mode 100644 index 0000000000..ae2efa1df4 --- /dev/null +++ b/deps/gyp/test/sanitize-rule-names/script.py @@ -0,0 +1,10 @@ +#!/usr/bin/env python + +# 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 shutil +import sys + +shutil.copyfile(*sys.argv[1:]) diff --git a/deps/gyp/test/self-dependency/common.gypi b/deps/gyp/test/self-dependency/common.gypi new file mode 100644 index 0000000000..aae221a5dd --- /dev/null +++ b/deps/gyp/test/self-dependency/common.gypi @@ -0,0 +1,13 @@ +# Copyright (c) 2013 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. + +# A common file that other .gyp files include. +# Makes every target in the project depend on dep.gyp:dep. +{ + 'target_defaults': { + 'dependencies': [ + 'dep.gyp:dep', + ], + }, +} diff --git a/deps/gyp/test/self-dependency/dep.gyp b/deps/gyp/test/self-dependency/dep.gyp new file mode 100644 index 0000000000..2b6c9dda85 --- /dev/null +++ b/deps/gyp/test/self-dependency/dep.gyp @@ -0,0 +1,23 @@ +# Copyright (c) 2013 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. + +# dep.gyp contains a target dep, on which all the targets in the project +# depend. This means there's a self-dependency of dep on itself, which is +# pruned by setting prune_self_dependency to 1. + +{ + 'includes': [ + 'common.gypi', + ], + 'targets': [ + { + 'target_name': 'dep', + 'type': 'none', + 'variables': { + # Without this GYP will report a cycle in dependency graph. + 'prune_self_dependency': 1, + }, + }, + ], +} diff --git a/deps/gyp/test/self-dependency/gyptest-self-dependency.py b/deps/gyp/test/self-dependency/gyptest-self-dependency.py new file mode 100755 index 0000000000..82fab271c5 --- /dev/null +++ b/deps/gyp/test/self-dependency/gyptest-self-dependency.py @@ -0,0 +1,19 @@ +#!/usr/bin/env python + +# Copyright (c) 2013 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. + +""" +Verify that pulling in a dependency a second time in a conditional works for +shared_library targets. Regression test for http://crbug.com/122588 +""" + +import TestGyp + +test = TestGyp.TestGyp() + +test.run_gyp('self_dependency.gyp') + +# If running gyp worked, all is well. +test.pass_test() diff --git a/deps/gyp/test/self-dependency/self_dependency.gyp b/deps/gyp/test/self-dependency/self_dependency.gyp new file mode 100644 index 0000000000..0ca76c669b --- /dev/null +++ b/deps/gyp/test/self-dependency/self_dependency.gyp @@ -0,0 +1,15 @@ +# Copyright (c) 2013 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. + +{ + 'includes': [ + 'common.gypi', + ], + 'targets': [ + { + 'target_name': 'a', + 'type': 'none', + }, + ], +} diff --git a/deps/gyp/test/sibling/gyptest-all.py b/deps/gyp/test/sibling/gyptest-all.py new file mode 100755 index 0000000000..318e1a3d84 --- /dev/null +++ b/deps/gyp/test/sibling/gyptest-all.py @@ -0,0 +1,42 @@ +#!/usr/bin/env python + +# 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 TestGyp + +test = TestGyp.TestGyp() + +# The xcode-ninja generator handles gypfiles which are not at the +# project root incorrectly. +# cf. https://code.google.com/p/gyp/issues/detail?id=460 +if test.format == 'xcode-ninja': + test.skip_test() + +test.run_gyp('build/all.gyp', chdir='src') + +test.build('build/all.gyp', test.ALL, chdir='src') + +chdir = 'src/build' + +# The top-level Makefile is in the directory where gyp was run. +# TODO(mmoss) Should the Makefile go in the directory of the passed in .gyp +# file? What about when passing in multiple .gyp files? Would sub-project +# Makefiles (see http://codereview.chromium.org/340008 comments) solve this? +if test.format in ('make', 'ninja', 'cmake'): + chdir = 'src' + +if test.format == 'xcode': + chdir = 'src/prog1' +test.run_built_executable('program1', + chdir=chdir, + stdout="Hello from prog1.c\n") + +if test.format == 'xcode': + chdir = 'src/prog2' +test.run_built_executable('program2', + chdir=chdir, + stdout="Hello from prog2.c\n") + +test.pass_test() diff --git a/deps/gyp/test/sibling/gyptest-relocate.py b/deps/gyp/test/sibling/gyptest-relocate.py new file mode 100755 index 0000000000..05fa9d96fe --- /dev/null +++ b/deps/gyp/test/sibling/gyptest-relocate.py @@ -0,0 +1,44 @@ +#!/usr/bin/env python + +# 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 TestGyp + +test = TestGyp.TestGyp() + +# The xcode-ninja generator handles gypfiles which are not at the +# project root incorrectly. +# cf. https://code.google.com/p/gyp/issues/detail?id=460 +if test.format == 'xcode-ninja': + test.skip_test() + +test.run_gyp('build/all.gyp', chdir='src') + +test.relocate('src', 'relocate/src') + +test.build('build/all.gyp', test.ALL, chdir='relocate/src') + +chdir = 'relocate/src/build' + +# The top-level Makefile is in the directory where gyp was run. +# TODO(mmoss) Should the Makefile go in the directory of the passed in .gyp +# file? What about when passing in multiple .gyp files? Would sub-project +# Makefiles (see http://codereview.chromium.org/340008 comments) solve this? +if test.format in ('make', 'ninja', 'cmake'): + chdir = 'relocate/src' + +if test.format == 'xcode': + chdir = 'relocate/src/prog1' +test.run_built_executable('program1', + chdir=chdir, + stdout="Hello from prog1.c\n") + +if test.format == 'xcode': + chdir = 'relocate/src/prog2' +test.run_built_executable('program2', + chdir=chdir, + stdout="Hello from prog2.c\n") + +test.pass_test() diff --git a/deps/gyp/test/sibling/src/build/all.gyp b/deps/gyp/test/sibling/src/build/all.gyp new file mode 100644 index 0000000000..79c80c9363 --- /dev/null +++ b/deps/gyp/test/sibling/src/build/all.gyp @@ -0,0 +1,16 @@ +# Copyright (c) 2009 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. + +{ + 'targets': [ + { + 'target_name': 'All', + 'type': 'none', + 'dependencies': [ + '../prog1/prog1.gyp:*', + '../prog2/prog2.gyp:*', + ], + }, + ], +} diff --git a/deps/gyp/test/sibling/src/prog1/prog1.c b/deps/gyp/test/sibling/src/prog1/prog1.c new file mode 100644 index 0000000000..218e99401c --- /dev/null +++ b/deps/gyp/test/sibling/src/prog1/prog1.c @@ -0,0 +1,7 @@ +#include <stdio.h> + +int main(void) +{ + printf("Hello from prog1.c\n"); + return 0; +} diff --git a/deps/gyp/test/sibling/src/prog1/prog1.gyp b/deps/gyp/test/sibling/src/prog1/prog1.gyp new file mode 100644 index 0000000000..4532e4be10 --- /dev/null +++ b/deps/gyp/test/sibling/src/prog1/prog1.gyp @@ -0,0 +1,15 @@ +# Copyright (c) 2009 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. + +{ + 'targets': [ + { + 'target_name': 'program1', + 'type': 'executable', + 'sources': [ + 'prog1.c', + ], + }, + ], +} diff --git a/deps/gyp/test/sibling/src/prog2/prog2.c b/deps/gyp/test/sibling/src/prog2/prog2.c new file mode 100644 index 0000000000..12a31883b9 --- /dev/null +++ b/deps/gyp/test/sibling/src/prog2/prog2.c @@ -0,0 +1,7 @@ +#include <stdio.h> + +int main(void) +{ + printf("Hello from prog2.c\n"); + return 0; +} diff --git a/deps/gyp/test/sibling/src/prog2/prog2.gyp b/deps/gyp/test/sibling/src/prog2/prog2.gyp new file mode 100644 index 0000000000..4cf7f6eb2f --- /dev/null +++ b/deps/gyp/test/sibling/src/prog2/prog2.gyp @@ -0,0 +1,15 @@ +# Copyright (c) 2009 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. + +{ + 'targets': [ + { + 'target_name': 'program2', + 'type': 'executable', + 'sources': [ + 'prog2.c', + ], + }, + ], +} diff --git a/deps/gyp/test/small/gyptest-small.py b/deps/gyp/test/small/gyptest-small.py new file mode 100755 index 0000000000..e7562cb797 --- /dev/null +++ b/deps/gyp/test/small/gyptest-small.py @@ -0,0 +1,55 @@ +#!/usr/bin/env python + +# 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. + +""" +Runs small tests. +""" + +import imp +import os +import sys +import unittest + +import TestGyp + + +test = TestGyp.TestGyp() + +# Add pylib to the import path (so tests can import their dependencies). +# This is consistant with the path.append done in the top file "gyp". +sys.path.insert(0, os.path.join(test._cwd, 'pylib')) + +# Add new test suites here. +files_to_test = [ + 'pylib/gyp/MSVSSettings_test.py', + 'pylib/gyp/easy_xml_test.py', + 'pylib/gyp/generator/msvs_test.py', + 'pylib/gyp/generator/ninja_test.py', + 'pylib/gyp/generator/xcode_test.py', + 'pylib/gyp/common_test.py', + 'pylib/gyp/input_test.py', +] + +# Collect all the suites from the above files. +suites = [] +for filename in files_to_test: + # Carve the module name out of the path. + name = os.path.splitext(os.path.split(filename)[1])[0] + # Find the complete module path. + full_filename = os.path.join(test._cwd, filename) + # Load the module. + module = imp.load_source(name, full_filename) + # Add it to the list of test suites. + suites.append(unittest.defaultTestLoader.loadTestsFromModule(module)) +# Create combined suite. +all_tests = unittest.TestSuite(suites) + +# Run all the tests. +result = unittest.TextTestRunner(verbosity=2).run(all_tests) +if result.failures or result.errors: + test.fail_test() + +test.pass_test() diff --git a/deps/gyp/test/standalone-static-library/gyptest-standalone-static-library.py b/deps/gyp/test/standalone-static-library/gyptest-standalone-static-library.py new file mode 100644 index 0000000000..50535abfc7 --- /dev/null +++ b/deps/gyp/test/standalone-static-library/gyptest-standalone-static-library.py @@ -0,0 +1,50 @@ +#!/usr/bin/env python + +# 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. + +""" +Verifies build of a static_library with the standalone_static_library flag set. +""" + +import os +import subprocess +import sys +import TestGyp + +# standalone_static_library currently means two things: a specific output +# location for the built target and non-thin archive files. +test = TestGyp.TestGyp() + +# Verify that types other than static_library cause a failure. +test.run_gyp('invalid.gyp', status=1, stderr=None) +target_str = 'invalid.gyp:bad#target' +err = ['gyp: Target %s has type executable but standalone_static_library flag ' + 'is only valid for static_library type.' % target_str] +test.must_contain_all_lines(test.stderr(), err) + +# Build a valid standalone_static_library. +test.run_gyp('mylib.gyp') +test.build('mylib.gyp', target='prog') + +# Verify that the static library is copied to the correct location. +# We expect the library to be copied to $PRODUCT_DIR. +standalone_static_library_dir = test.EXECUTABLE +path_to_lib = os.path.split( + test.built_file_path('mylib', type=standalone_static_library_dir))[0] +lib_name = test.built_file_basename('mylib', type=test.STATIC_LIB) +path = os.path.join(path_to_lib, lib_name) +test.must_exist(path) + +# Verify that the program runs properly. +expect = 'hello from mylib.c\n' +test.run_built_executable('prog', stdout=expect) + +# Verify that libmylib.a contains symbols. "ar -x" fails on a 'thin' archive. +supports_thick = ('make', 'ninja', 'cmake') +if test.format in supports_thick and sys.platform.startswith('linux'): + retcode = subprocess.call(['ar', '-x', path]) + assert retcode == 0 + +test.pass_test() diff --git a/deps/gyp/test/standalone-static-library/invalid.gyp b/deps/gyp/test/standalone-static-library/invalid.gyp new file mode 100644 index 0000000000..54b32117e0 --- /dev/null +++ b/deps/gyp/test/standalone-static-library/invalid.gyp @@ -0,0 +1,16 @@ +# 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. + +{ + 'targets': [ + { + 'target_name': 'bad', + 'type': 'executable', + 'standalone_static_library': 1, + 'sources': [ + 'prog.c', + ], + }, + ], +}
\ No newline at end of file diff --git a/deps/gyp/test/standalone-static-library/mylib.c b/deps/gyp/test/standalone-static-library/mylib.c new file mode 100644 index 0000000000..108be618c2 --- /dev/null +++ b/deps/gyp/test/standalone-static-library/mylib.c @@ -0,0 +1,7 @@ +#include <stdio.h> + +void print(void) +{ + printf("hello from mylib.c\n"); + return; +} diff --git a/deps/gyp/test/standalone-static-library/mylib.gyp b/deps/gyp/test/standalone-static-library/mylib.gyp new file mode 100644 index 0000000000..2d191de319 --- /dev/null +++ b/deps/gyp/test/standalone-static-library/mylib.gyp @@ -0,0 +1,26 @@ +# 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. + +{ + 'targets': [ + { + 'target_name': 'mylib', + 'type': 'static_library', + 'standalone_static_library': 1, + 'sources': [ + 'mylib.c', + ], + }, + { + 'target_name': 'prog', + 'type': 'executable', + 'sources': [ + 'prog.c', + ], + 'dependencies': [ + 'mylib', + ], + }, + ], +} diff --git a/deps/gyp/test/standalone-static-library/prog.c b/deps/gyp/test/standalone-static-library/prog.c new file mode 100644 index 0000000000..8af5c90844 --- /dev/null +++ b/deps/gyp/test/standalone-static-library/prog.c @@ -0,0 +1,7 @@ +extern void print(void); + +int main(void) +{ + print(); + return 0; +} diff --git a/deps/gyp/test/standalone/gyptest-standalone.py b/deps/gyp/test/standalone/gyptest-standalone.py new file mode 100644 index 0000000000..87143706ab --- /dev/null +++ b/deps/gyp/test/standalone/gyptest-standalone.py @@ -0,0 +1,33 @@ +#!/usr/bin/env python + +# 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. + +""" +Verifies that a project hierarchy created with the --generator-output= +option can be built even when it's relocated to a different path. +""" + +import TestGyp +import os + +test = TestGyp.TestGyp() + +test.run_gyp('standalone.gyp', '-Gstandalone') + +# Look at all the files in the tree to make sure none +# of them reference the gyp file. +for root, dirs, files in os.walk("."): + for file in files: + # ignore ourself + if os.path.splitext(__file__)[0] in file: + continue + file = os.path.join(root, file) + contents = open(file).read() + if 'standalone.gyp' in contents: + print 'gyp file referenced in generated output: %s' % file + test.fail_test() + + +test.pass_test() diff --git a/deps/gyp/test/standalone/standalone.gyp b/deps/gyp/test/standalone/standalone.gyp new file mode 100644 index 0000000000..b2a6785430 --- /dev/null +++ b/deps/gyp/test/standalone/standalone.gyp @@ -0,0 +1,12 @@ +# Copyright (c) 2009 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. + +{ + 'targets': [ + { + 'target_name' : 'foo', + 'type' : 'executable' + }, + ] +} diff --git a/deps/gyp/test/subdirectory/gyptest-SYMROOT-all.py b/deps/gyp/test/subdirectory/gyptest-SYMROOT-all.py new file mode 100755 index 0000000000..9dfb8b05d4 --- /dev/null +++ b/deps/gyp/test/subdirectory/gyptest-SYMROOT-all.py @@ -0,0 +1,36 @@ +#!/usr/bin/env python + +# Copyright (c) 2009 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. + +""" +Verifies building a target and a subsidiary dependent target from a +.gyp file in a subdirectory, without specifying an explicit output build +directory, and using the generated solution or project file at the top +of the tree as the entry point. + +The configuration sets the Xcode SYMROOT variable and uses --depth= +to make Xcode behave like the other build tools--that is, put all +built targets in a single output build directory at the top of the tree. +""" + +import TestGyp + +test = TestGyp.TestGyp() + +test.run_gyp('prog1.gyp', '-Dset_symroot=1', '--depth=.', chdir='src') + +test.relocate('src', 'relocate/src') + +# Suppress the test infrastructure's setting SYMROOT on the command line. +test.build('prog1.gyp', test.ALL, SYMROOT=None, chdir='relocate/src') + +test.run_built_executable('prog1', + stdout="Hello from prog1.c\n", + chdir='relocate/src') +test.run_built_executable('prog2', + stdout="Hello from prog2.c\n", + chdir='relocate/src') + +test.pass_test() diff --git a/deps/gyp/test/subdirectory/gyptest-SYMROOT-default.py b/deps/gyp/test/subdirectory/gyptest-SYMROOT-default.py new file mode 100755 index 0000000000..8796650905 --- /dev/null +++ b/deps/gyp/test/subdirectory/gyptest-SYMROOT-default.py @@ -0,0 +1,37 @@ +#!/usr/bin/env python + +# Copyright (c) 2009 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. + +""" +Verifies building a target and a subsidiary dependent target from a +.gyp file in a subdirectory, without specifying an explicit output build +directory, and using the generated solution or project file at the top +of the tree as the entry point. + +The configuration sets the Xcode SYMROOT variable and uses --depth= +to make Xcode behave like the other build tools--that is, put all +built targets in a single output build directory at the top of the tree. +""" + +import TestGyp + +test = TestGyp.TestGyp() + +test.run_gyp('prog1.gyp', '-Dset_symroot=1', '--depth=.', chdir='src') + +test.relocate('src', 'relocate/src') + +# Suppress the test infrastructure's setting SYMROOT on the command line. +test.build('prog1.gyp', SYMROOT=None, chdir='relocate/src') + +test.run_built_executable('prog1', + stdout="Hello from prog1.c\n", + chdir='relocate/src') + +test.run_built_executable('prog2', + stdout="Hello from prog2.c\n", + chdir='relocate/src') + +test.pass_test() diff --git a/deps/gyp/test/subdirectory/gyptest-subdir-all.py b/deps/gyp/test/subdirectory/gyptest-subdir-all.py new file mode 100755 index 0000000000..d5c458454e --- /dev/null +++ b/deps/gyp/test/subdirectory/gyptest-subdir-all.py @@ -0,0 +1,34 @@ +#!/usr/bin/env python + +# 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. + +""" +Verifies building a subsidiary dependent target from a .gyp file in a +subdirectory, without specifying an explicit output build directory, +and using the subdirectory's solution or project file as the entry point. +""" + +import TestGyp + +# Ninja doesn't support relocation. +# CMake produces a single CMakeLists.txt in the output directory. +test = TestGyp.TestGyp(formats=['!ninja', '!cmake']) + +test.run_gyp('prog1.gyp', chdir='src') + +test.relocate('src', 'relocate/src') + +chdir = 'relocate/src/subdir' +target = test.ALL + +test.build('prog2.gyp', target, chdir=chdir) + +test.built_file_must_not_exist('prog1', type=test.EXECUTABLE, chdir=chdir) + +test.run_built_executable('prog2', + chdir=chdir, + stdout="Hello from prog2.c\n") + +test.pass_test() diff --git a/deps/gyp/test/subdirectory/gyptest-subdir-default.py b/deps/gyp/test/subdirectory/gyptest-subdir-default.py new file mode 100755 index 0000000000..2cb6659beb --- /dev/null +++ b/deps/gyp/test/subdirectory/gyptest-subdir-default.py @@ -0,0 +1,34 @@ +#!/usr/bin/env python + +# 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. + +""" +Verifies building a subsidiary dependent target from a .gyp file in a +subdirectory, without specifying an explicit output build directory, +and using the subdirectory's solution or project file as the entry point. +""" + +import TestGyp +import errno + +# Ninja doesn't support relocation. +# CMake produces a single CMakeLists.txt in the output directory. +test = TestGyp.TestGyp(formats=['!ninja', '!cmake']) + +test.run_gyp('prog1.gyp', chdir='src') + +test.relocate('src', 'relocate/src') + +chdir = 'relocate/src/subdir' + +test.build('prog2.gyp', chdir=chdir) + +test.built_file_must_not_exist('prog1', type=test.EXECUTABLE, chdir=chdir) + +test.run_built_executable('prog2', + chdir=chdir, + stdout="Hello from prog2.c\n") + +test.pass_test() diff --git a/deps/gyp/test/subdirectory/gyptest-subdir2-deep.py b/deps/gyp/test/subdirectory/gyptest-subdir2-deep.py new file mode 100755 index 0000000000..48548982f8 --- /dev/null +++ b/deps/gyp/test/subdirectory/gyptest-subdir2-deep.py @@ -0,0 +1,25 @@ +#!/usr/bin/env python + +# Copyright (c) 2009 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. + +""" +Verifies building a project rooted several layers under src_dir works. +""" + +import TestGyp + +test = TestGyp.TestGyp() + +test.run_gyp('prog3.gyp', chdir='src/subdir/subdir2') + +test.relocate('src', 'relocate/src') + +test.build('prog3.gyp', test.ALL, chdir='relocate/src/subdir/subdir2') + +test.run_built_executable('prog3', + chdir='relocate/src/subdir/subdir2', + stdout="Hello from prog3.c\n") + +test.pass_test() diff --git a/deps/gyp/test/subdirectory/gyptest-top-all.py b/deps/gyp/test/subdirectory/gyptest-top-all.py new file mode 100755 index 0000000000..b3c25b1f8d --- /dev/null +++ b/deps/gyp/test/subdirectory/gyptest-top-all.py @@ -0,0 +1,43 @@ +#!/usr/bin/env python + +# Copyright (c) 2009 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. + +""" +Verifies building a target and a subsidiary dependent target from a +.gyp file in a subdirectory, without specifying an explicit output build +directory, and using the generated solution or project file at the top +of the tree as the entry point. + +There is a difference here in the default behavior of the underlying +build tools. Specifically, when building the entire "solution", Xcode +puts the output of each project relative to the .xcodeproj directory, +while Visual Studio (and our implementation of Make) put it +in a build directory relative to the "solution"--that is, the entry-point +from which you built the entire tree. +""" + +import TestGyp + +test = TestGyp.TestGyp() + +test.run_gyp('prog1.gyp', chdir='src') + +test.relocate('src', 'relocate/src') + +test.build('prog1.gyp', test.ALL, chdir='relocate/src') + +test.run_built_executable('prog1', + stdout="Hello from prog1.c\n", + chdir='relocate/src') + +if test.format == 'xcode': + chdir = 'relocate/src/subdir' +else: + chdir = 'relocate/src' +test.run_built_executable('prog2', + chdir=chdir, + stdout="Hello from prog2.c\n") + +test.pass_test() diff --git a/deps/gyp/test/subdirectory/gyptest-top-default.py b/deps/gyp/test/subdirectory/gyptest-top-default.py new file mode 100755 index 0000000000..2448dd98ea --- /dev/null +++ b/deps/gyp/test/subdirectory/gyptest-top-default.py @@ -0,0 +1,43 @@ +#!/usr/bin/env python + +# Copyright (c) 2009 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. + +""" +Verifies building a target and a subsidiary dependent target from a +.gyp file in a subdirectory, without specifying an explicit output build +directory, and using the generated solution or project file at the top +of the tree as the entry point. + +There is a difference here in the default behavior of the underlying +build tools. Specifically, when building the entire "solution", Xcode +puts the output of each project relative to the .xcodeproj directory, +while Visual Studio (and our implementation of Make) put it +in a build directory relative to the "solution"--that is, the entry-point +from which you built the entire tree. +""" + +import TestGyp + +test = TestGyp.TestGyp() + +test.run_gyp('prog1.gyp', chdir='src') + +test.relocate('src', 'relocate/src') + +test.build('prog1.gyp', chdir='relocate/src') + +test.run_built_executable('prog1', + stdout="Hello from prog1.c\n", + chdir='relocate/src') + +if test.format == 'xcode': + chdir = 'relocate/src/subdir' +else: + chdir = 'relocate/src' +test.run_built_executable('prog2', + chdir=chdir, + stdout="Hello from prog2.c\n") + +test.pass_test() diff --git a/deps/gyp/test/subdirectory/src/prog1.c b/deps/gyp/test/subdirectory/src/prog1.c new file mode 100644 index 0000000000..218e99401c --- /dev/null +++ b/deps/gyp/test/subdirectory/src/prog1.c @@ -0,0 +1,7 @@ +#include <stdio.h> + +int main(void) +{ + printf("Hello from prog1.c\n"); + return 0; +} diff --git a/deps/gyp/test/subdirectory/src/prog1.gyp b/deps/gyp/test/subdirectory/src/prog1.gyp new file mode 100644 index 0000000000..2aa66ce7d7 --- /dev/null +++ b/deps/gyp/test/subdirectory/src/prog1.gyp @@ -0,0 +1,21 @@ +# Copyright (c) 2009 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. + +{ + 'includes': [ + 'symroot.gypi', + ], + 'targets': [ + { + 'target_name': 'prog1', + 'type': 'executable', + 'dependencies': [ + 'subdir/prog2.gyp:prog2', + ], + 'sources': [ + 'prog1.c', + ], + }, + ], +} diff --git a/deps/gyp/test/subdirectory/src/subdir/prog2.c b/deps/gyp/test/subdirectory/src/subdir/prog2.c new file mode 100644 index 0000000000..12a31883b9 --- /dev/null +++ b/deps/gyp/test/subdirectory/src/subdir/prog2.c @@ -0,0 +1,7 @@ +#include <stdio.h> + +int main(void) +{ + printf("Hello from prog2.c\n"); + return 0; +} diff --git a/deps/gyp/test/subdirectory/src/subdir/prog2.gyp b/deps/gyp/test/subdirectory/src/subdir/prog2.gyp new file mode 100644 index 0000000000..c6cd35f7f8 --- /dev/null +++ b/deps/gyp/test/subdirectory/src/subdir/prog2.gyp @@ -0,0 +1,18 @@ +# Copyright (c) 2009 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. + +{ + 'includes': [ + '../symroot.gypi', + ], + 'targets': [ + { + 'target_name': 'prog2', + 'type': 'executable', + 'sources': [ + 'prog2.c', + ], + }, + ], +} diff --git a/deps/gyp/test/subdirectory/src/subdir/subdir2/prog3.c b/deps/gyp/test/subdirectory/src/subdir/subdir2/prog3.c new file mode 100644 index 0000000000..a326dc61b6 --- /dev/null +++ b/deps/gyp/test/subdirectory/src/subdir/subdir2/prog3.c @@ -0,0 +1,7 @@ +#include <stdio.h> + +int main(void) +{ + printf("Hello from prog3.c\n"); + return 0; +} diff --git a/deps/gyp/test/subdirectory/src/subdir/subdir2/prog3.gyp b/deps/gyp/test/subdirectory/src/subdir/subdir2/prog3.gyp new file mode 100644 index 0000000000..b49fb59113 --- /dev/null +++ b/deps/gyp/test/subdirectory/src/subdir/subdir2/prog3.gyp @@ -0,0 +1,18 @@ +# Copyright (c) 2009 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. + +{ + 'includes': [ + '../../symroot.gypi', + ], + 'targets': [ + { + 'target_name': 'prog3', + 'type': 'executable', + 'sources': [ + 'prog3.c', + ], + }, + ], +} diff --git a/deps/gyp/test/subdirectory/src/symroot.gypi b/deps/gyp/test/subdirectory/src/symroot.gypi new file mode 100644 index 0000000000..519916427c --- /dev/null +++ b/deps/gyp/test/subdirectory/src/symroot.gypi @@ -0,0 +1,16 @@ +# Copyright (c) 2009 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. + +{ + 'variables': { + 'set_symroot%': 0, + }, + 'conditions': [ + ['set_symroot == 1', { + 'xcode_settings': { + 'SYMROOT': '<(DEPTH)/build', + }, + }], + ], +} diff --git a/deps/gyp/test/symlinks/gyptest-symlinks.py b/deps/gyp/test/symlinks/gyptest-symlinks.py new file mode 100755 index 0000000000..f0c2d51564 --- /dev/null +++ b/deps/gyp/test/symlinks/gyptest-symlinks.py @@ -0,0 +1,66 @@ +#!/usr/bin/env python + +# Copyright (c) 2015 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. + +""" +Test that RelativePath(s, d) doesn't return a path starting with '..' when +s is textually below d, but is also a symlink to a file that is not below d. + +Returning .. in this case would break the Ninja generator in such a case, +because it computes output directories by concatenating paths, and concat'ing +a path starting with .. can unexpectedly erase other parts of the path. It's +difficult to test this directly since the test harness assumes toplevel_dir is +the root of the repository, but this test should at least verify that the +required behavior doesn't change. +""" + +import TestGyp +import os +import sys +import tempfile + +if sys.platform != 'win32': + test = TestGyp.TestGyp() + + # Copy hello.gyp and hello.c to temporary named files, which will then be + # symlinked back and processed. Note that we don't ask gyp to touch the + # original files at all; they are only there as source material for the copy. + # That's why hello.gyp references symlink_hello.c instead of hello.c. + with tempfile.NamedTemporaryFile() as gyp_file: + with tempfile.NamedTemporaryFile() as c_file: + with open('hello.gyp') as orig_gyp_file: + gyp_file.write(orig_gyp_file.read()) + gyp_file.flush() + with open('hello.c') as orig_c_file: + c_file.write(orig_c_file.read()) + c_file.flush() + # We need to flush the files because we want to read them before closing + # them, since when they are closed they will be deleted. + + # Don't proceed with the test on a system that doesn't let you read from + # a still-open temporary file. + if os.path.getsize(gyp_file.name) == 0: + raise OSError("Copy to temporary file didn't work.") + + symlink_gyp = test.built_file_path('symlink_hello.gyp') + symlink_c = test.built_file_path('symlink_hello.c') + outdir = os.path.dirname(symlink_gyp) + + # Make sure the outdir exists. + try: + os.makedirs(outdir) + except OSError: + if not os.path.isdir(outdir): + raise + os.symlink(gyp_file.name, symlink_gyp) + os.symlink(c_file.name, symlink_c) + + # Run gyp on the symlinked files. + test.run_gyp(symlink_gyp, chdir=outdir) + test.build(symlink_gyp, chdir=outdir) + test.run_built_executable('symlink_hello', stdout="Hello, world!\n", + chdir=outdir) + + test.pass_test() diff --git a/deps/gyp/test/symlinks/hello.c b/deps/gyp/test/symlinks/hello.c new file mode 100644 index 0000000000..c63204b948 --- /dev/null +++ b/deps/gyp/test/symlinks/hello.c @@ -0,0 +1,12 @@ +/* Copyright (c) 2015 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. +*/ + +#include <stdio.h> + +int main(void) +{ + printf("Hello, world!\n"); + return 0; +} diff --git a/deps/gyp/test/symlinks/hello.gyp b/deps/gyp/test/symlinks/hello.gyp new file mode 100644 index 0000000000..81d9f18e09 --- /dev/null +++ b/deps/gyp/test/symlinks/hello.gyp @@ -0,0 +1,15 @@ +# Copyright (c) 2015 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. + +{ + 'targets': [ + { + 'target_name': 'symlink_hello', + 'type': 'executable', + 'sources': [ + 'symlink_hello.c', + ], + }, + ], +} diff --git a/deps/gyp/test/target/gyptest-target.py b/deps/gyp/test/target/gyptest-target.py new file mode 100644 index 0000000000..4338db739c --- /dev/null +++ b/deps/gyp/test/target/gyptest-target.py @@ -0,0 +1,37 @@ +#!/usr/bin/env python + +# Copyright (c) 2009 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. + +""" +Verifies simplest-possible build of a "Hello, world!" program +using non-default extension. In particular, verifies how +target_extension is used to avoid MSB8012 for msvs. +""" + +import sys +import TestGyp + +if sys.platform in ('win32', 'cygwin'): + test = TestGyp.TestGyp() + + test.run_gyp('target.gyp') + test.build('target.gyp') + + # executables + test.built_file_must_exist('hello1.stuff', test.EXECUTABLE, bare=True) + test.built_file_must_exist('hello2.exe', test.EXECUTABLE, bare=True) + test.built_file_must_not_exist('hello2.stuff', test.EXECUTABLE, bare=True) + + # check msvs log for errors + if test.format == "msvs": + log_file = "obj\\hello1\\hello1.log" + test.built_file_must_exist(log_file) + test.built_file_must_not_contain(log_file, "MSB8012") + + log_file = "obj\\hello2\\hello2.log" + test.built_file_must_exist(log_file) + test.built_file_must_not_contain(log_file, "MSB8012") + + test.pass_test() diff --git a/deps/gyp/test/target/hello.c b/deps/gyp/test/target/hello.c new file mode 100644 index 0000000000..3d535d3ec6 --- /dev/null +++ b/deps/gyp/test/target/hello.c @@ -0,0 +1,7 @@ +/* Copyright (c) 2009 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. */ + +void main(void) { + printf("Hello, world!\n"); +} diff --git a/deps/gyp/test/target/target.gyp b/deps/gyp/test/target/target.gyp new file mode 100644 index 0000000000..c87e30f533 --- /dev/null +++ b/deps/gyp/test/target/target.gyp @@ -0,0 +1,24 @@ +# Copyright (c) 2009 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. + +{ + 'targets': [ + { + 'target_name': 'hello1', + 'product_extension': 'stuff', + 'type': 'executable', + 'sources': [ + 'hello.c', + ], + }, + { + 'target_name': 'hello2', + 'target_extension': 'stuff', + 'type': 'executable', + 'sources': [ + 'hello.c', + ], + } + ] +} diff --git a/deps/gyp/test/toolsets/gyptest-toolsets.py b/deps/gyp/test/toolsets/gyptest-toolsets.py new file mode 100755 index 0000000000..f80fce70a2 --- /dev/null +++ b/deps/gyp/test/toolsets/gyptest-toolsets.py @@ -0,0 +1,31 @@ +#!/usr/bin/env python + +# Copyright (c) 2009 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. + +""" +Verifies that toolsets are correctly applied +""" +import os +import sys +import TestGyp + +if sys.platform.startswith('linux'): + + test = TestGyp.TestGyp(formats=['make', 'ninja']) + + oldenv = os.environ.copy() + try: + os.environ['GYP_CROSSCOMPILE'] = '1' + test.run_gyp('toolsets.gyp') + finally: + os.environ.clear() + os.environ.update(oldenv) + + test.build('toolsets.gyp', test.ALL) + + test.run_built_executable('host-main', stdout="Host\nShared: Host\n") + test.run_built_executable('target-main', stdout="Target\nShared: Target\n") + + test.pass_test() diff --git a/deps/gyp/test/toolsets/main.cc b/deps/gyp/test/toolsets/main.cc new file mode 100644 index 0000000000..bc47da9978 --- /dev/null +++ b/deps/gyp/test/toolsets/main.cc @@ -0,0 +1,13 @@ +/* Copyright (c) 2009 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. */ + +#include <stdio.h> + +const char *GetToolset(); +const char *GetToolsetShared(); + +int main(void) { + printf("%s\n", GetToolset()); + printf("Shared: %s\n", GetToolsetShared()); +} diff --git a/deps/gyp/test/toolsets/toolsets.cc b/deps/gyp/test/toolsets/toolsets.cc new file mode 100644 index 0000000000..a45fa029cb --- /dev/null +++ b/deps/gyp/test/toolsets/toolsets.cc @@ -0,0 +1,11 @@ +/* Copyright (c) 2009 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. */ + +const char *GetToolset() { +#ifdef TARGET + return "Target"; +#else + return "Host"; +#endif +} diff --git a/deps/gyp/test/toolsets/toolsets.gyp b/deps/gyp/test/toolsets/toolsets.gyp new file mode 100644 index 0000000000..3bc3a784ea --- /dev/null +++ b/deps/gyp/test/toolsets/toolsets.gyp @@ -0,0 +1,62 @@ +# Copyright (c) 2009 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. + +{ + 'target_defaults': { + 'target_conditions': [ + ['_toolset=="target"', {'defines': ['TARGET']}] + ] + }, + 'targets': [ + { + 'target_name': 'toolsets', + 'type': 'static_library', + 'toolsets': ['target', 'host'], + 'sources': [ + 'toolsets.cc', + ], + }, + { + 'target_name': 'host-main', + 'type': 'executable', + 'toolsets': ['host'], + 'dependencies': ['toolsets', 'toolsets_shared'], + 'sources': [ + 'main.cc', + ], + }, + { + 'target_name': 'target-main', + 'type': 'executable', + 'dependencies': ['toolsets', 'toolsets_shared'], + 'sources': [ + 'main.cc', + ], + }, + # This tests that build systems can handle a shared library being build for + # both host and target. + { + 'target_name': 'janus', + 'type': 'shared_library', + 'toolsets': ['target', 'host'], + 'sources': [ + 'toolsets.cc', + ], + 'cflags': [ '-fPIC' ], + }, + { + 'target_name': 'toolsets_shared', + 'type': 'shared_library', + 'toolsets': ['target', 'host'], + 'target_conditions': [ + # Ensure target and host have different shared_library names + ['_toolset=="host"', {'product_extension': 'host'}], + ], + 'sources': [ + 'toolsets_shared.cc', + ], + 'cflags': [ '-fPIC' ], + }, + ], +} diff --git a/deps/gyp/test/toolsets/toolsets_shared.cc b/deps/gyp/test/toolsets/toolsets_shared.cc new file mode 100644 index 0000000000..794af2c0bd --- /dev/null +++ b/deps/gyp/test/toolsets/toolsets_shared.cc @@ -0,0 +1,11 @@ +/* Copyright (c) 2013 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. */ + +const char *GetToolsetShared() { +#ifdef TARGET + return "Target"; +#else + return "Host"; +#endif +} diff --git a/deps/gyp/test/toplevel-dir/gyptest-toplevel-dir.py b/deps/gyp/test/toplevel-dir/gyptest-toplevel-dir.py new file mode 100755 index 0000000000..9e69512dd3 --- /dev/null +++ b/deps/gyp/test/toplevel-dir/gyptest-toplevel-dir.py @@ -0,0 +1,31 @@ +#!/usr/bin/env python + +# Copyright (c) 2009 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. + +""" +Verifies building a subsidiary dependent target from a .gyp file in a +subdirectory, without specifying an explicit output build directory, +and using the subdirectory's solution or project file as the entry point. +""" + +import TestGyp +import errno + +test = TestGyp.TestGyp(formats=['ninja', 'make']) + +# We want our Makefile to be one dir up from main.gyp. +test.run_gyp('main.gyp', '--toplevel-dir=..', chdir='src/sub1') + +toplevel_dir = 'src' + +test.build('sub1/main.gyp', test.ALL, chdir=toplevel_dir) + +test.built_file_must_exist('prog1', type=test.EXECUTABLE, chdir=toplevel_dir) + +test.run_built_executable('prog1', + chdir=toplevel_dir, + stdout="Hello from prog1.c\n") + +test.pass_test() diff --git a/deps/gyp/test/toplevel-dir/src/sub1/main.gyp b/deps/gyp/test/toplevel-dir/src/sub1/main.gyp new file mode 100644 index 0000000000..33219010e4 --- /dev/null +++ b/deps/gyp/test/toplevel-dir/src/sub1/main.gyp @@ -0,0 +1,18 @@ +# Copyright (c) 2009 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. + +{ + 'targets': [ + { + 'target_name': 'prog1', + 'type': 'executable', + 'dependencies': [ + '<(DEPTH)/../sub2/prog2.gyp:prog2', + ], + 'sources': [ + 'prog1.c', + ], + }, + ], +} diff --git a/deps/gyp/test/toplevel-dir/src/sub1/prog1.c b/deps/gyp/test/toplevel-dir/src/sub1/prog1.c new file mode 100644 index 0000000000..218e99401c --- /dev/null +++ b/deps/gyp/test/toplevel-dir/src/sub1/prog1.c @@ -0,0 +1,7 @@ +#include <stdio.h> + +int main(void) +{ + printf("Hello from prog1.c\n"); + return 0; +} diff --git a/deps/gyp/test/toplevel-dir/src/sub2/prog2.c b/deps/gyp/test/toplevel-dir/src/sub2/prog2.c new file mode 100644 index 0000000000..12a31883b9 --- /dev/null +++ b/deps/gyp/test/toplevel-dir/src/sub2/prog2.c @@ -0,0 +1,7 @@ +#include <stdio.h> + +int main(void) +{ + printf("Hello from prog2.c\n"); + return 0; +} diff --git a/deps/gyp/test/toplevel-dir/src/sub2/prog2.gyp b/deps/gyp/test/toplevel-dir/src/sub2/prog2.gyp new file mode 100644 index 0000000000..5934548369 --- /dev/null +++ b/deps/gyp/test/toplevel-dir/src/sub2/prog2.gyp @@ -0,0 +1,15 @@ +# Copyright (c) 2009 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. + +{ + 'targets': [ + { + 'target_name': 'prog2', + 'type': 'executable', + 'sources': [ + 'prog2.c', + ], + }, + ], +} diff --git a/deps/gyp/test/variables/commands/commands-repeated.gyp b/deps/gyp/test/variables/commands/commands-repeated.gyp new file mode 100644 index 0000000000..822ae4f05d --- /dev/null +++ b/deps/gyp/test/variables/commands/commands-repeated.gyp @@ -0,0 +1,128 @@ +# Copyright (c) 2009 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. + +# This is a simple test file to make sure that variable substitution +# happens correctly. Run "run_tests.py" using python to generate the +# output from this gyp file. + +{ + 'variables': { + 'pi': 'import math; print math.pi', + 'third_letters': "<(other_letters)HIJK", + 'letters_list': 'ABCD', + 'other_letters': '<(letters_list)EFG', + 'check_included': '<(included_variable)', + 'check_lists': [ + '<(included_variable)', + '<(third_letters)', + ], + 'check_int': 5, + 'check_str_int': '6', + 'check_list_int': [ + 7, + '8', + 9, + ], + 'not_int_1': ' 10', + 'not_int_2': '11 ', + 'not_int_3': '012', + 'not_int_4': '13.0', + 'not_int_5': '+14', + 'negative_int': '-15', + 'zero_int': '0', + }, + 'includes': [ + 'commands.gypi', + ], + 'targets': [ + { + 'target_name': 'foo', + 'type': 'none', + 'variables': { + 'var1': '<!(["python", "-c", "<(pi)"])', + 'var2': '<!(python -c "print \'<!(python -c "<(pi)") <(letters_list)\'")', + 'var3': '<!(python -c "print \'<(letters_list)\'")', + 'var4': '<(<!(python -c "print \'letters_list\'"))', + 'var5': 'letters_', + 'var6': 'list', + 'var7': '<(check_int)', + 'var8': '<(check_int)blah', + 'var9': '<(check_str_int)', + 'var10': '<(check_list_int)', + 'var11': ['<@(check_list_int)'], + 'var12': '<(not_int_1)', + 'var13': '<(not_int_2)', + 'var14': '<(not_int_3)', + 'var15': '<(not_int_4)', + 'var16': '<(not_int_5)', + 'var17': '<(negative_int)', + 'var18': '<(zero_int)', + # A second set with different names to make sure they only execute the + # commands once. + 'var1prime': '<!(["python", "-c", "<(pi)"])', + 'var2prime': '<!(python -c "print \'<!(python -c "<(pi)") <(letters_list)\'")', + 'var3prime': '<!(python -c "print \'<(letters_list)\'")', + 'var4prime': '<(<!(python -c "print \'letters_list\'"))', + }, + 'actions': [ + { + 'action_name': 'test_action', + 'variables': { + 'var7': '<!(echo <(var5)<(var6))', + }, + 'inputs' : [ + '<(var2)', + ], + 'outputs': [ + '<(var4)', + '<(var7)', + ], + 'action': [ + 'echo', + '<(_inputs)', + '<(_outputs)', + ], + }, + # Again with the same vars to make sure the right things happened. + { + 'action_name': 'test_action_prime', + 'variables': { + 'var7': '<!(echo <(var5)<(var6))', + }, + 'inputs' : [ + '<(var2)', + ], + 'outputs': [ + '<(var4)', + '<(var7)', + ], + 'action': [ + 'echo', + '<(_inputs)', + '<(_outputs)', + ], + }, + # And one more time with the other vars... + { + 'action_name': 'test_action_prime_prime', + 'variables': { + 'var7': '<!(echo <(var5)<(var6))', + }, + 'inputs' : [ + '<(var2prime)', + ], + 'outputs': [ + '<(var4prime)', + '<(var7)', + ], + 'action': [ + 'echo', + '<(_inputs)', + '<(_outputs)', + ], + }, + ], + }, + ], +} diff --git a/deps/gyp/test/variables/commands/commands-repeated.gyp.stdout b/deps/gyp/test/variables/commands/commands-repeated.gyp.stdout new file mode 100644 index 0000000000..56c393fde5 --- /dev/null +++ b/deps/gyp/test/variables/commands/commands-repeated.gyp.stdout @@ -0,0 +1,136 @@ +VARIABLES:input.py:724:ExpandVariables Matches: {'content': 'other_letters', 'is_array': '', 'replace': '<(other_letters)', 'type': '<', 'command_string': None} +VARIABLES:input.py:964:ExpandVariables Found output '<(letters_list)EFGHIJK', recursing. +VARIABLES:input.py:724:ExpandVariables Matches: {'content': 'letters_list', 'is_array': '', 'replace': '<(letters_list)', 'type': '<', 'command_string': None} +VARIABLES:input.py:964:ExpandVariables Found output 'ABCDEFGHIJK', recursing. +VARIABLES:input.py:724:ExpandVariables Matches: {'content': 'letters_list', 'is_array': '', 'replace': '<(letters_list)', 'type': '<', 'command_string': None} +VARIABLES:input.py:964:ExpandVariables Found output 'ABCDEFG', recursing. +VARIABLES:input.py:724:ExpandVariables Matches: {'content': 'included_variable', 'is_array': '', 'replace': '<(included_variable)', 'type': '<', 'command_string': None} +VARIABLES:input.py:964:ExpandVariables Found output 'XYZ', recursing. +VARIABLES:input.py:724:ExpandVariables Matches: {'content': 'included_variable', 'is_array': '', 'replace': '<(included_variable)', 'type': '<', 'command_string': None} +VARIABLES:input.py:964:ExpandVariables Found output 'XYZ', recursing. +VARIABLES:input.py:724:ExpandVariables Matches: {'content': 'third_letters', 'is_array': '', 'replace': '<(third_letters)', 'type': '<', 'command_string': None} +VARIABLES:input.py:964:ExpandVariables Found output '<(other_letters)HIJK', recursing. +VARIABLES:input.py:724:ExpandVariables Matches: {'content': 'other_letters', 'is_array': '', 'replace': '<(other_letters)', 'type': '<', 'command_string': None} +VARIABLES:input.py:964:ExpandVariables Found output '<(letters_list)EFGHIJK', recursing. +VARIABLES:input.py:724:ExpandVariables Matches: {'content': 'letters_list', 'is_array': '', 'replace': '<(letters_list)', 'type': '<', 'command_string': None} +VARIABLES:input.py:964:ExpandVariables Found output 'ABCDEFGHIJK', recursing. +VARIABLES:input.py:724:ExpandVariables Matches: {'content': 'letters_list', 'is_array': '', 'replace': '<(letters_list)', 'type': '<', 'command_string': None} +VARIABLES:input.py:724:ExpandVariables Matches: {'content': 'python -c "print \'<!(python -c "<(pi', 'is_array': '', 'replace': '<!(python -c "print \'<!(python -c "<(pi)', 'type': '<!', 'command_string': None} +VARIABLES:input.py:724:ExpandVariables Matches: {'content': 'python -c "<(pi', 'is_array': '', 'replace': '<!(python -c "<(pi)', 'type': '<!', 'command_string': None} +VARIABLES:input.py:724:ExpandVariables Matches: {'content': 'pi', 'is_array': '', 'replace': '<(pi)', 'type': '<', 'command_string': None} +VARIABLES:input.py:964:ExpandVariables Found output 'python -c "import math; print math.pi"', recursing. +VARIABLES:input.py:838:ExpandVariables Executing command 'python -c "import math; print math.pi"' in directory 'None' +VARIABLES:input.py:964:ExpandVariables Found output 'python -c "print \'3.14159265359 ABCD\'"', recursing. +VARIABLES:input.py:838:ExpandVariables Executing command 'python -c "print '3.14159265359 ABCD'"' in directory 'None' +VARIABLES:input.py:964:ExpandVariables Found output '3.14159265359 ABCD', recursing. +VARIABLES:input.py:724:ExpandVariables Matches: {'content': '"python", "-c", "<(pi', 'is_array': '[', 'replace': '<!(["python", "-c", "<(pi)', 'type': '<!', 'command_string': None} +VARIABLES:input.py:724:ExpandVariables Matches: {'content': 'pi', 'is_array': '', 'replace': '<(pi)', 'type': '<', 'command_string': None} +VARIABLES:input.py:964:ExpandVariables Found output '["python", "-c", "import math; print math.pi"]', recursing. +VARIABLES:input.py:838:ExpandVariables Executing command '['python', '-c', 'import math; print math.pi']' in directory 'None' +VARIABLES:input.py:964:ExpandVariables Found output '3.14159265359', recursing. +VARIABLES:input.py:724:ExpandVariables Matches: {'content': '<!(python -c "print \'letters_list\'"', 'is_array': '', 'replace': '<(<!(python -c "print \'letters_list\'")', 'type': '<', 'command_string': None} +VARIABLES:input.py:724:ExpandVariables Matches: {'content': 'python -c "print \'letters_list\'"', 'is_array': '', 'replace': '<!(python -c "print \'letters_list\'")', 'type': '<!', 'command_string': None} +VARIABLES:input.py:838:ExpandVariables Executing command 'python -c "print 'letters_list'"' in directory 'None' +VARIABLES:input.py:964:ExpandVariables Found output 'letters_list', recursing. +VARIABLES:input.py:964:ExpandVariables Found output 'ABCD', recursing. +VARIABLES:input.py:724:ExpandVariables Matches: {'content': 'check_int', 'is_array': '', 'replace': '<(check_int)', 'type': '<', 'command_string': None} +VARIABLES:input.py:964:ExpandVariables Found output '5', recursing. +VARIABLES:input.py:724:ExpandVariables Matches: {'content': '"python", "-c", "<(pi', 'is_array': '[', 'replace': '<!(["python", "-c", "<(pi)', 'type': '<!', 'command_string': None} +VARIABLES:input.py:724:ExpandVariables Matches: {'content': 'pi', 'is_array': '', 'replace': '<(pi)', 'type': '<', 'command_string': None} +VARIABLES:input.py:964:ExpandVariables Found output '["python", "-c", "import math; print math.pi"]', recursing. +VARIABLES:input.py:889:ExpandVariables Had cache value for command '['python', '-c', 'import math; print math.pi']' in directory 'None' +VARIABLES:input.py:964:ExpandVariables Found output '3.14159265359', recursing. +VARIABLES:input.py:724:ExpandVariables Matches: {'content': 'python -c "print \'<(letters_list', 'is_array': '', 'replace': '<!(python -c "print \'<(letters_list)', 'type': '<!', 'command_string': None} +VARIABLES:input.py:724:ExpandVariables Matches: {'content': 'letters_list', 'is_array': '', 'replace': '<(letters_list)', 'type': '<', 'command_string': None} +VARIABLES:input.py:964:ExpandVariables Found output 'python -c "print \'ABCD\'"', recursing. +VARIABLES:input.py:838:ExpandVariables Executing command 'python -c "print 'ABCD'"' in directory 'None' +VARIABLES:input.py:964:ExpandVariables Found output 'ABCD', recursing. +VARIABLES:input.py:724:ExpandVariables Matches: {'content': 'letters_list', 'is_array': '', 'replace': '<(letters_list)', 'type': '<', 'command_string': None} +VARIABLES:input.py:724:ExpandVariables Matches: {'content': 'python -c "print \'<!(python -c "<(pi', 'is_array': '', 'replace': '<!(python -c "print \'<!(python -c "<(pi)', 'type': '<!', 'command_string': None} +VARIABLES:input.py:724:ExpandVariables Matches: {'content': 'python -c "<(pi', 'is_array': '', 'replace': '<!(python -c "<(pi)', 'type': '<!', 'command_string': None} +VARIABLES:input.py:724:ExpandVariables Matches: {'content': 'pi', 'is_array': '', 'replace': '<(pi)', 'type': '<', 'command_string': None} +VARIABLES:input.py:964:ExpandVariables Found output 'python -c "import math; print math.pi"', recursing. +VARIABLES:input.py:889:ExpandVariables Had cache value for command 'python -c "import math; print math.pi"' in directory 'None' +VARIABLES:input.py:964:ExpandVariables Found output 'python -c "print \'3.14159265359 ABCD\'"', recursing. +VARIABLES:input.py:889:ExpandVariables Had cache value for command 'python -c "print '3.14159265359 ABCD'"' in directory 'None' +VARIABLES:input.py:964:ExpandVariables Found output '3.14159265359 ABCD', recursing. +VARIABLES:input.py:724:ExpandVariables Matches: {'content': 'check_str_int', 'is_array': '', 'replace': '<(check_str_int)', 'type': '<', 'command_string': None} +VARIABLES:input.py:964:ExpandVariables Found output '6', recursing. +VARIABLES:input.py:724:ExpandVariables Matches: {'content': 'check_int', 'is_array': '', 'replace': '<(check_int)', 'type': '<', 'command_string': None} +VARIABLES:input.py:964:ExpandVariables Found output '5blah', recursing. +VARIABLES:input.py:724:ExpandVariables Matches: {'content': '<!(python -c "print \'letters_list\'"', 'is_array': '', 'replace': '<(<!(python -c "print \'letters_list\'")', 'type': '<', 'command_string': None} +VARIABLES:input.py:724:ExpandVariables Matches: {'content': 'python -c "print \'letters_list\'"', 'is_array': '', 'replace': '<!(python -c "print \'letters_list\'")', 'type': '<!', 'command_string': None} +VARIABLES:input.py:889:ExpandVariables Had cache value for command 'python -c "print 'letters_list'"' in directory 'None' +VARIABLES:input.py:964:ExpandVariables Found output 'letters_list', recursing. +VARIABLES:input.py:964:ExpandVariables Found output 'ABCD', recursing. +VARIABLES:input.py:724:ExpandVariables Matches: {'content': 'python -c "print \'<(letters_list', 'is_array': '', 'replace': '<!(python -c "print \'<(letters_list)', 'type': '<!', 'command_string': None} +VARIABLES:input.py:724:ExpandVariables Matches: {'content': 'letters_list', 'is_array': '', 'replace': '<(letters_list)', 'type': '<', 'command_string': None} +VARIABLES:input.py:964:ExpandVariables Found output 'python -c "print \'ABCD\'"', recursing. +VARIABLES:input.py:889:ExpandVariables Had cache value for command 'python -c "print 'ABCD'"' in directory 'None' +VARIABLES:input.py:964:ExpandVariables Found output 'ABCD', recursing. +VARIABLES:input.py:724:ExpandVariables Matches: {'content': 'not_int_4', 'is_array': '', 'replace': '<(not_int_4)', 'type': '<', 'command_string': None} +VARIABLES:input.py:964:ExpandVariables Found output '13.0', recursing. +VARIABLES:input.py:724:ExpandVariables Matches: {'content': 'not_int_3', 'is_array': '', 'replace': '<(not_int_3)', 'type': '<', 'command_string': None} +VARIABLES:input.py:964:ExpandVariables Found output '012', recursing. +VARIABLES:input.py:724:ExpandVariables Matches: {'content': 'negative_int', 'is_array': '', 'replace': '<(negative_int)', 'type': '<', 'command_string': None} +VARIABLES:input.py:964:ExpandVariables Found output '-15', recursing. +VARIABLES:input.py:724:ExpandVariables Matches: {'content': 'not_int_5', 'is_array': '', 'replace': '<(not_int_5)', 'type': '<', 'command_string': None} +VARIABLES:input.py:964:ExpandVariables Found output '+14', recursing. +VARIABLES:input.py:724:ExpandVariables Matches: {'content': 'check_list_int', 'is_array': '', 'replace': '<(check_list_int)', 'type': '<', 'command_string': None} +VARIABLES:input.py:964:ExpandVariables Found output '7 8 9', recursing. +VARIABLES:input.py:724:ExpandVariables Matches: {'content': 'not_int_2', 'is_array': '', 'replace': '<(not_int_2)', 'type': '<', 'command_string': None} +VARIABLES:input.py:964:ExpandVariables Found output '11 ', recursing. +VARIABLES:input.py:724:ExpandVariables Matches: {'content': 'not_int_1', 'is_array': '', 'replace': '<(not_int_1)', 'type': '<', 'command_string': None} +VARIABLES:input.py:964:ExpandVariables Found output ' 10', recursing. +VARIABLES:input.py:724:ExpandVariables Matches: {'content': 'zero_int', 'is_array': '', 'replace': '<(zero_int)', 'type': '<', 'command_string': None} +VARIABLES:input.py:964:ExpandVariables Found output '0', recursing. +VARIABLES:input.py:724:ExpandVariables Matches: {'content': 'check_list_int', 'is_array': '', 'replace': '<@(check_list_int)', 'type': '<@', 'command_string': None} +VARIABLES:input.py:964:ExpandVariables Found output [7, 8, 9], recursing. +VARIABLES:input.py:724:ExpandVariables Matches: {'content': 'var6', 'is_array': '', 'replace': '<(var6)', 'type': '<', 'command_string': None} +VARIABLES:input.py:724:ExpandVariables Matches: {'content': 'echo <(var5', 'is_array': '', 'replace': '<!(echo <(var5)', 'type': '<!', 'command_string': None} +VARIABLES:input.py:724:ExpandVariables Matches: {'content': 'var5', 'is_array': '', 'replace': '<(var5)', 'type': '<', 'command_string': None} +VARIABLES:input.py:964:ExpandVariables Found output 'echo letters_list', recursing. +VARIABLES:input.py:838:ExpandVariables Executing command 'echo letters_list' in directory 'None' +VARIABLES:input.py:964:ExpandVariables Found output 'letters_list', recursing. +VARIABLES:input.py:724:ExpandVariables Matches: {'content': '_inputs', 'is_array': '', 'replace': '<(_inputs)', 'type': '<', 'command_string': None} +VARIABLES:input.py:724:ExpandVariables Matches: {'content': 'var2', 'is_array': '', 'replace': '<(var2)', 'type': '<', 'command_string': None} +VARIABLES:input.py:964:ExpandVariables Found output '3.14159265359 ABCD', recursing. +VARIABLES:input.py:964:ExpandVariables Found output '"3.14159265359 ABCD"', recursing. +VARIABLES:input.py:724:ExpandVariables Matches: {'content': '_outputs', 'is_array': '', 'replace': '<(_outputs)', 'type': '<', 'command_string': None} +VARIABLES:input.py:724:ExpandVariables Matches: {'content': 'var4', 'is_array': '', 'replace': '<(var4)', 'type': '<', 'command_string': None} +VARIABLES:input.py:964:ExpandVariables Found output 'ABCD', recursing. +VARIABLES:input.py:724:ExpandVariables Matches: {'content': 'var7', 'is_array': '', 'replace': '<(var7)', 'type': '<', 'command_string': None} +VARIABLES:input.py:964:ExpandVariables Found output 'letters_list', recursing. +VARIABLES:input.py:964:ExpandVariables Found output 'ABCD letters_list', recursing. +VARIABLES:input.py:724:ExpandVariables Matches: {'content': 'var6', 'is_array': '', 'replace': '<(var6)', 'type': '<', 'command_string': None} +VARIABLES:input.py:724:ExpandVariables Matches: {'content': 'echo <(var5', 'is_array': '', 'replace': '<!(echo <(var5)', 'type': '<!', 'command_string': None} +VARIABLES:input.py:724:ExpandVariables Matches: {'content': 'var5', 'is_array': '', 'replace': '<(var5)', 'type': '<', 'command_string': None} +VARIABLES:input.py:964:ExpandVariables Found output 'echo letters_list', recursing. +VARIABLES:input.py:889:ExpandVariables Had cache value for command 'echo letters_list' in directory 'None' +VARIABLES:input.py:964:ExpandVariables Found output 'letters_list', recursing. +VARIABLES:input.py:724:ExpandVariables Matches: {'content': '_inputs', 'is_array': '', 'replace': '<(_inputs)', 'type': '<', 'command_string': None} +VARIABLES:input.py:724:ExpandVariables Matches: {'content': 'var2', 'is_array': '', 'replace': '<(var2)', 'type': '<', 'command_string': None} +VARIABLES:input.py:964:ExpandVariables Found output '3.14159265359 ABCD', recursing. +VARIABLES:input.py:964:ExpandVariables Found output '"3.14159265359 ABCD"', recursing. +VARIABLES:input.py:724:ExpandVariables Matches: {'content': '_outputs', 'is_array': '', 'replace': '<(_outputs)', 'type': '<', 'command_string': None} +VARIABLES:input.py:724:ExpandVariables Matches: {'content': 'var4', 'is_array': '', 'replace': '<(var4)', 'type': '<', 'command_string': None} +VARIABLES:input.py:964:ExpandVariables Found output 'ABCD', recursing. +VARIABLES:input.py:724:ExpandVariables Matches: {'content': 'var7', 'is_array': '', 'replace': '<(var7)', 'type': '<', 'command_string': None} +VARIABLES:input.py:964:ExpandVariables Found output 'letters_list', recursing. +VARIABLES:input.py:964:ExpandVariables Found output 'ABCD letters_list', recursing. +VARIABLES:input.py:724:ExpandVariables Matches: {'content': 'var6', 'is_array': '', 'replace': '<(var6)', 'type': '<', 'command_string': None} +VARIABLES:input.py:724:ExpandVariables Matches: {'content': 'echo <(var5', 'is_array': '', 'replace': '<!(echo <(var5)', 'type': '<!', 'command_string': None} +VARIABLES:input.py:724:ExpandVariables Matches: {'content': 'var5', 'is_array': '', 'replace': '<(var5)', 'type': '<', 'command_string': None} +VARIABLES:input.py:964:ExpandVariables Found output 'echo letters_list', recursing. +VARIABLES:input.py:889:ExpandVariables Had cache value for command 'echo letters_list' in directory 'None' +VARIABLES:input.py:964:ExpandVariables Found output 'letters_list', recursing. +VARIABLES:input.py:724:ExpandVariables Matches: {'content': '_inputs', 'is_array': '', 'replace': '<(_inputs)', 'type': '<', 'command_string': None} +VARIABLES:input.py:724:ExpandVariables Matches: {'content': 'var2prime', 'is_array': '', 'replace': '<(var2prime)', 'type': '<', 'command_string': None} +VARIABLES:input.py:964:ExpandVariables Found output '3.14159265359 ABCD', recursing. +VARIABLES:input.py:964:ExpandVariables Found output '"3.14159265359 ABCD"', recursing. +VARIABLES:input.py:724:ExpandVariables Matches: {'content': '_outputs', 'is_array': '', 'replace': '<(_outputs)', 'type': '<', 'command_string': None} +VARIABLES:input.py:724:ExpandVariables Matches: {'content': 'var4prime', 'is_array': '', 'replace': '<(var4prime)', 'type': '<', 'command_string': None} +VARIABLES:input.py:964:ExpandVariables Found output 'ABCD', recursing. +VARIABLES:input.py:724:ExpandVariables Matches: {'content': 'var7', 'is_array': '', 'replace': '<(var7)', 'type': '<', 'command_string': None} +VARIABLES:input.py:964:ExpandVariables Found output 'letters_list', recursing. +VARIABLES:input.py:964:ExpandVariables Found output 'ABCD letters_list', recursing. diff --git a/deps/gyp/test/variables/commands/commands-repeated.gypd.golden b/deps/gyp/test/variables/commands/commands-repeated.gypd.golden new file mode 100644 index 0000000000..b29db5edee --- /dev/null +++ b/deps/gyp/test/variables/commands/commands-repeated.gypd.golden @@ -0,0 +1,77 @@ +{'_DEPTH': '.', + 'included_files': ['commands-repeated.gyp', 'commands.gypi'], + 'targets': [{'actions': [{'action': ['echo', + '"3.14159265359 ABCD"', + 'ABCD letters_list'], + 'action_name': 'test_action', + 'inputs': ['3.14159265359 ABCD'], + 'outputs': ['ABCD', 'letters_list'], + 'variables': {'var7': 'letters_list'}}, + {'action': ['echo', + '"3.14159265359 ABCD"', + 'ABCD letters_list'], + 'action_name': 'test_action_prime', + 'inputs': ['3.14159265359 ABCD'], + 'outputs': ['ABCD', 'letters_list'], + 'variables': {'var7': 'letters_list'}}, + {'action': ['echo', + '"3.14159265359 ABCD"', + 'ABCD letters_list'], + 'action_name': 'test_action_prime_prime', + 'inputs': ['3.14159265359 ABCD'], + 'outputs': ['ABCD', 'letters_list'], + 'variables': {'var7': 'letters_list'}}], + 'configurations': {'Default': {}}, + 'default_configuration': 'Default', + 'target_name': 'foo', + 'toolset': 'target', + 'type': 'none', + 'variables': {'var1': '3.14159265359', + 'var10': '7 8 9', + 'var11': ['7', '8', '9'], + 'var12': ' 10', + 'var13': '11 ', + 'var14': '012', + 'var15': '13.0', + 'var16': '+14', + 'var17': '-15', + 'var18': '0', + 'var1prime': '3.14159265359', + 'var2': '3.14159265359 ABCD', + 'var2prime': '3.14159265359 ABCD', + 'var3': 'ABCD', + 'var3prime': 'ABCD', + 'var4': 'ABCD', + 'var4prime': 'ABCD', + 'var5': 'letters_', + 'var6': 'list', + 'var7': '5', + 'var8': '5blah', + 'var9': '6'}}, + {'configurations': {'Default': {}}, + 'default_configuration': 'Default', + 'target_name': 'dummy', + 'toolset': 'target', + 'type': 'none'}], + 'variables': {'check_included': 'XYZ', + 'check_int': '5', + 'check_list_int': ['7', '8', '9'], + 'check_lists': ['XYZ', 'ABCDEFGHIJK'], + 'check_str_int': '6', + 'default_empty_files%': '', + 'default_empty_str%': '', + 'default_int%': '0', + 'default_int_files%': '0', + 'default_str%': 'my_str', + 'included_variable': 'XYZ', + 'letters_list': 'ABCD', + 'negative_int': '-15', + 'not_int_1': ' 10', + 'not_int_2': '11 ', + 'not_int_3': '012', + 'not_int_4': '13.0', + 'not_int_5': '+14', + 'other_letters': 'ABCDEFG', + 'pi': 'import math; print math.pi', + 'third_letters': 'ABCDEFGHIJK', + 'zero_int': '0'}} diff --git a/deps/gyp/test/variables/commands/commands.gyp b/deps/gyp/test/variables/commands/commands.gyp new file mode 100644 index 0000000000..78376edd99 --- /dev/null +++ b/deps/gyp/test/variables/commands/commands.gyp @@ -0,0 +1,91 @@ +# Copyright (c) 2009 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. + +# This is a simple test file to make sure that variable substitution +# happens correctly. Run "run_tests.py" using python to generate the +# output from this gyp file. + +{ + 'variables': { + 'pi': 'import math; print math.pi', + 'third_letters': "<(other_letters)HIJK", + 'letters_list': 'ABCD', + 'other_letters': '<(letters_list)EFG', + 'check_included': '<(included_variable)', + 'check_lists': [ + '<(included_variable)', + '<(third_letters)', + ], + 'check_int': 5, + 'check_str_int': '6', + 'check_list_int': [ + 7, + '8', + 9, + ], + 'not_int_1': ' 10', + 'not_int_2': '11 ', + 'not_int_3': '012', + 'not_int_4': '13.0', + 'not_int_5': '+14', + 'negative_int': '-15', + 'zero_int': '0', + }, + 'includes': [ + 'commands.gypi', + ], + 'targets': [ + { + 'target_name': 'foo', + 'type': 'none', + 'variables': { + 'var1': '<!(["python", "-c", "<(pi)"])', + 'var2': '<!(python -c "print \'<!(python -c "<(pi)") <(letters_list)\'")', + 'var3': '<!(python -c "print \'<(letters_list)\'")', + 'var4': '<(<!(python -c "print \'letters_list\'"))', + 'var5': 'letters_', + 'var6': 'list', + 'var7': '<(check_int)', + 'var8': '<(check_int)blah', + 'var9': '<(check_str_int)', + 'var10': '<(check_list_int)', + 'var11': ['<@(check_list_int)'], + 'var12': '<(not_int_1)', + 'var13': '<(not_int_2)', + 'var14': '<(not_int_3)', + 'var15': '<(not_int_4)', + 'var16': '<(not_int_5)', + 'var17': '<(negative_int)', + 'var18': '<(zero_int)', + 'var19': ['<!@(python test.py)'], + 'var20': '<!(python test.py)', + 'var21': '<(default_str)', + 'var22': '<(default_empty_str)', + 'var23': '<(default_int)', + 'var24': '<(default_empty_files)', + 'var25': '<(default_int_files)', + }, + 'actions': [ + { + 'action_name': 'test_action', + 'variables': { + 'var7': '<!(echo <(var5)<(var6))', + }, + 'inputs' : [ + '<(var2)', + ], + 'outputs': [ + '<(var4)', + '<(var7)', + ], + 'action': [ + 'echo', + '<(_inputs)', + '<(_outputs)', + ], + }, + ], + }, + ], +} diff --git a/deps/gyp/test/variables/commands/commands.gyp.ignore-env.stdout b/deps/gyp/test/variables/commands/commands.gyp.ignore-env.stdout new file mode 100644 index 0000000000..a345920a12 --- /dev/null +++ b/deps/gyp/test/variables/commands/commands.gyp.ignore-env.stdout @@ -0,0 +1,96 @@ +VARIABLES:input.py:724:ExpandVariables Matches: {'content': 'other_letters', 'is_array': '', 'replace': '<(other_letters)', 'type': '<', 'command_string': None} +VARIABLES:input.py:964:ExpandVariables Found output '<(letters_list)EFGHIJK', recursing. +VARIABLES:input.py:724:ExpandVariables Matches: {'content': 'letters_list', 'is_array': '', 'replace': '<(letters_list)', 'type': '<', 'command_string': None} +VARIABLES:input.py:964:ExpandVariables Found output 'ABCDEFGHIJK', recursing. +VARIABLES:input.py:724:ExpandVariables Matches: {'content': 'letters_list', 'is_array': '', 'replace': '<(letters_list)', 'type': '<', 'command_string': None} +VARIABLES:input.py:964:ExpandVariables Found output 'ABCDEFG', recursing. +VARIABLES:input.py:724:ExpandVariables Matches: {'content': 'included_variable', 'is_array': '', 'replace': '<(included_variable)', 'type': '<', 'command_string': None} +VARIABLES:input.py:964:ExpandVariables Found output 'XYZ', recursing. +VARIABLES:input.py:724:ExpandVariables Matches: {'content': 'included_variable', 'is_array': '', 'replace': '<(included_variable)', 'type': '<', 'command_string': None} +VARIABLES:input.py:964:ExpandVariables Found output 'XYZ', recursing. +VARIABLES:input.py:724:ExpandVariables Matches: {'content': 'third_letters', 'is_array': '', 'replace': '<(third_letters)', 'type': '<', 'command_string': None} +VARIABLES:input.py:964:ExpandVariables Found output '<(other_letters)HIJK', recursing. +VARIABLES:input.py:724:ExpandVariables Matches: {'content': 'other_letters', 'is_array': '', 'replace': '<(other_letters)', 'type': '<', 'command_string': None} +VARIABLES:input.py:964:ExpandVariables Found output '<(letters_list)EFGHIJK', recursing. +VARIABLES:input.py:724:ExpandVariables Matches: {'content': 'letters_list', 'is_array': '', 'replace': '<(letters_list)', 'type': '<', 'command_string': None} +VARIABLES:input.py:964:ExpandVariables Found output 'ABCDEFGHIJK', recursing. +VARIABLES:input.py:724:ExpandVariables Matches: {'content': 'default_empty_files', 'is_array': '', 'replace': '<(default_empty_files)', 'type': '<', 'command_string': None} +VARIABLES:input.py:964:ExpandVariables Found output '', recursing. +VARIABLES:input.py:724:ExpandVariables Matches: {'content': 'default_int_files', 'is_array': '', 'replace': '<(default_int_files)', 'type': '<', 'command_string': None} +VARIABLES:input.py:964:ExpandVariables Found output '0', recursing. +VARIABLES:input.py:724:ExpandVariables Matches: {'content': 'python test.py', 'is_array': '', 'replace': '<!(python test.py)', 'type': '<!', 'command_string': None} +VARIABLES:input.py:838:ExpandVariables Executing command 'python test.py' in directory 'None' +VARIABLES:input.py:964:ExpandVariables Found output 'sample\\path\\foo.cpp', recursing. +VARIABLES:input.py:724:ExpandVariables Matches: {'content': 'default_str', 'is_array': '', 'replace': '<(default_str)', 'type': '<', 'command_string': None} +VARIABLES:input.py:964:ExpandVariables Found output 'my_str', recursing. +VARIABLES:input.py:724:ExpandVariables Matches: {'content': 'default_empty_str', 'is_array': '', 'replace': '<(default_empty_str)', 'type': '<', 'command_string': None} +VARIABLES:input.py:964:ExpandVariables Found output '', recursing. +VARIABLES:input.py:724:ExpandVariables Matches: {'content': 'default_int', 'is_array': '', 'replace': '<(default_int)', 'type': '<', 'command_string': None} +VARIABLES:input.py:964:ExpandVariables Found output '0', recursing. +VARIABLES:input.py:724:ExpandVariables Matches: {'content': '<!(python -c "print \'letters_list\'"', 'is_array': '', 'replace': '<(<!(python -c "print \'letters_list\'")', 'type': '<', 'command_string': None} +VARIABLES:input.py:724:ExpandVariables Matches: {'content': 'python -c "print \'letters_list\'"', 'is_array': '', 'replace': '<!(python -c "print \'letters_list\'")', 'type': '<!', 'command_string': None} +VARIABLES:input.py:838:ExpandVariables Executing command 'python -c "print 'letters_list'"' in directory 'None' +VARIABLES:input.py:964:ExpandVariables Found output 'letters_list', recursing. +VARIABLES:input.py:964:ExpandVariables Found output 'ABCD', recursing. +VARIABLES:input.py:724:ExpandVariables Matches: {'content': 'check_int', 'is_array': '', 'replace': '<(check_int)', 'type': '<', 'command_string': None} +VARIABLES:input.py:964:ExpandVariables Found output '5', recursing. +VARIABLES:input.py:724:ExpandVariables Matches: {'content': '"python", "-c", "<(pi', 'is_array': '[', 'replace': '<!(["python", "-c", "<(pi)', 'type': '<!', 'command_string': None} +VARIABLES:input.py:724:ExpandVariables Matches: {'content': 'pi', 'is_array': '', 'replace': '<(pi)', 'type': '<', 'command_string': None} +VARIABLES:input.py:964:ExpandVariables Found output '["python", "-c", "import math; print math.pi"]', recursing. +VARIABLES:input.py:838:ExpandVariables Executing command '['python', '-c', 'import math; print math.pi']' in directory 'None' +VARIABLES:input.py:964:ExpandVariables Found output '3.14159265359', recursing. +VARIABLES:input.py:724:ExpandVariables Matches: {'content': 'python -c "print \'<(letters_list', 'is_array': '', 'replace': '<!(python -c "print \'<(letters_list)', 'type': '<!', 'command_string': None} +VARIABLES:input.py:724:ExpandVariables Matches: {'content': 'letters_list', 'is_array': '', 'replace': '<(letters_list)', 'type': '<', 'command_string': None} +VARIABLES:input.py:964:ExpandVariables Found output 'python -c "print \'ABCD\'"', recursing. +VARIABLES:input.py:838:ExpandVariables Executing command 'python -c "print 'ABCD'"' in directory 'None' +VARIABLES:input.py:964:ExpandVariables Found output 'ABCD', recursing. +VARIABLES:input.py:724:ExpandVariables Matches: {'content': 'letters_list', 'is_array': '', 'replace': '<(letters_list)', 'type': '<', 'command_string': None} +VARIABLES:input.py:724:ExpandVariables Matches: {'content': 'python -c "print \'<!(python -c "<(pi', 'is_array': '', 'replace': '<!(python -c "print \'<!(python -c "<(pi)', 'type': '<!', 'command_string': None} +VARIABLES:input.py:724:ExpandVariables Matches: {'content': 'python -c "<(pi', 'is_array': '', 'replace': '<!(python -c "<(pi)', 'type': '<!', 'command_string': None} +VARIABLES:input.py:724:ExpandVariables Matches: {'content': 'pi', 'is_array': '', 'replace': '<(pi)', 'type': '<', 'command_string': None} +VARIABLES:input.py:964:ExpandVariables Found output 'python -c "import math; print math.pi"', recursing. +VARIABLES:input.py:838:ExpandVariables Executing command 'python -c "import math; print math.pi"' in directory 'None' +VARIABLES:input.py:964:ExpandVariables Found output 'python -c "print \'3.14159265359 ABCD\'"', recursing. +VARIABLES:input.py:838:ExpandVariables Executing command 'python -c "print '3.14159265359 ABCD'"' in directory 'None' +VARIABLES:input.py:964:ExpandVariables Found output '3.14159265359 ABCD', recursing. +VARIABLES:input.py:724:ExpandVariables Matches: {'content': 'check_str_int', 'is_array': '', 'replace': '<(check_str_int)', 'type': '<', 'command_string': None} +VARIABLES:input.py:964:ExpandVariables Found output '6', recursing. +VARIABLES:input.py:724:ExpandVariables Matches: {'content': 'check_int', 'is_array': '', 'replace': '<(check_int)', 'type': '<', 'command_string': None} +VARIABLES:input.py:964:ExpandVariables Found output '5blah', recursing. +VARIABLES:input.py:724:ExpandVariables Matches: {'content': 'not_int_4', 'is_array': '', 'replace': '<(not_int_4)', 'type': '<', 'command_string': None} +VARIABLES:input.py:964:ExpandVariables Found output '13.0', recursing. +VARIABLES:input.py:724:ExpandVariables Matches: {'content': 'not_int_3', 'is_array': '', 'replace': '<(not_int_3)', 'type': '<', 'command_string': None} +VARIABLES:input.py:964:ExpandVariables Found output '012', recursing. +VARIABLES:input.py:724:ExpandVariables Matches: {'content': 'negative_int', 'is_array': '', 'replace': '<(negative_int)', 'type': '<', 'command_string': None} +VARIABLES:input.py:964:ExpandVariables Found output '-15', recursing. +VARIABLES:input.py:724:ExpandVariables Matches: {'content': 'not_int_5', 'is_array': '', 'replace': '<(not_int_5)', 'type': '<', 'command_string': None} +VARIABLES:input.py:964:ExpandVariables Found output '+14', recursing. +VARIABLES:input.py:724:ExpandVariables Matches: {'content': 'check_list_int', 'is_array': '', 'replace': '<(check_list_int)', 'type': '<', 'command_string': None} +VARIABLES:input.py:964:ExpandVariables Found output '7 8 9', recursing. +VARIABLES:input.py:724:ExpandVariables Matches: {'content': 'not_int_2', 'is_array': '', 'replace': '<(not_int_2)', 'type': '<', 'command_string': None} +VARIABLES:input.py:964:ExpandVariables Found output '11 ', recursing. +VARIABLES:input.py:724:ExpandVariables Matches: {'content': 'not_int_1', 'is_array': '', 'replace': '<(not_int_1)', 'type': '<', 'command_string': None} +VARIABLES:input.py:964:ExpandVariables Found output ' 10', recursing. +VARIABLES:input.py:724:ExpandVariables Matches: {'content': 'zero_int', 'is_array': '', 'replace': '<(zero_int)', 'type': '<', 'command_string': None} +VARIABLES:input.py:964:ExpandVariables Found output '0', recursing. +VARIABLES:input.py:724:ExpandVariables Matches: {'content': 'check_list_int', 'is_array': '', 'replace': '<@(check_list_int)', 'type': '<@', 'command_string': None} +VARIABLES:input.py:964:ExpandVariables Found output [7, 8, 9], recursing. +VARIABLES:input.py:724:ExpandVariables Matches: {'content': 'python test.py', 'is_array': '', 'replace': '<!@(python test.py)', 'type': '<!@', 'command_string': None} +VARIABLES:input.py:889:ExpandVariables Had cache value for command 'python test.py' in directory 'None' +VARIABLES:input.py:964:ExpandVariables Found output ['samplepathfoo.cpp'], recursing. +VARIABLES:input.py:724:ExpandVariables Matches: {'content': 'var6', 'is_array': '', 'replace': '<(var6)', 'type': '<', 'command_string': None} +VARIABLES:input.py:724:ExpandVariables Matches: {'content': 'echo <(var5', 'is_array': '', 'replace': '<!(echo <(var5)', 'type': '<!', 'command_string': None} +VARIABLES:input.py:724:ExpandVariables Matches: {'content': 'var5', 'is_array': '', 'replace': '<(var5)', 'type': '<', 'command_string': None} +VARIABLES:input.py:964:ExpandVariables Found output 'echo letters_list', recursing. +VARIABLES:input.py:838:ExpandVariables Executing command 'echo letters_list' in directory 'None' +VARIABLES:input.py:964:ExpandVariables Found output 'letters_list', recursing. +VARIABLES:input.py:724:ExpandVariables Matches: {'content': '_inputs', 'is_array': '', 'replace': '<(_inputs)', 'type': '<', 'command_string': None} +VARIABLES:input.py:724:ExpandVariables Matches: {'content': 'var2', 'is_array': '', 'replace': '<(var2)', 'type': '<', 'command_string': None} +VARIABLES:input.py:964:ExpandVariables Found output '3.14159265359 ABCD', recursing. +VARIABLES:input.py:964:ExpandVariables Found output '"3.14159265359 ABCD"', recursing. +VARIABLES:input.py:724:ExpandVariables Matches: {'content': '_outputs', 'is_array': '', 'replace': '<(_outputs)', 'type': '<', 'command_string': None} +VARIABLES:input.py:724:ExpandVariables Matches: {'content': 'var4', 'is_array': '', 'replace': '<(var4)', 'type': '<', 'command_string': None} +VARIABLES:input.py:964:ExpandVariables Found output 'ABCD', recursing. +VARIABLES:input.py:724:ExpandVariables Matches: {'content': 'var7', 'is_array': '', 'replace': '<(var7)', 'type': '<', 'command_string': None} +VARIABLES:input.py:964:ExpandVariables Found output 'letters_list', recursing. +VARIABLES:input.py:964:ExpandVariables Found output 'ABCD letters_list', recursing. diff --git a/deps/gyp/test/variables/commands/commands.gyp.stdout b/deps/gyp/test/variables/commands/commands.gyp.stdout new file mode 100644 index 0000000000..a345920a12 --- /dev/null +++ b/deps/gyp/test/variables/commands/commands.gyp.stdout @@ -0,0 +1,96 @@ +VARIABLES:input.py:724:ExpandVariables Matches: {'content': 'other_letters', 'is_array': '', 'replace': '<(other_letters)', 'type': '<', 'command_string': None} +VARIABLES:input.py:964:ExpandVariables Found output '<(letters_list)EFGHIJK', recursing. +VARIABLES:input.py:724:ExpandVariables Matches: {'content': 'letters_list', 'is_array': '', 'replace': '<(letters_list)', 'type': '<', 'command_string': None} +VARIABLES:input.py:964:ExpandVariables Found output 'ABCDEFGHIJK', recursing. +VARIABLES:input.py:724:ExpandVariables Matches: {'content': 'letters_list', 'is_array': '', 'replace': '<(letters_list)', 'type': '<', 'command_string': None} +VARIABLES:input.py:964:ExpandVariables Found output 'ABCDEFG', recursing. +VARIABLES:input.py:724:ExpandVariables Matches: {'content': 'included_variable', 'is_array': '', 'replace': '<(included_variable)', 'type': '<', 'command_string': None} +VARIABLES:input.py:964:ExpandVariables Found output 'XYZ', recursing. +VARIABLES:input.py:724:ExpandVariables Matches: {'content': 'included_variable', 'is_array': '', 'replace': '<(included_variable)', 'type': '<', 'command_string': None} +VARIABLES:input.py:964:ExpandVariables Found output 'XYZ', recursing. +VARIABLES:input.py:724:ExpandVariables Matches: {'content': 'third_letters', 'is_array': '', 'replace': '<(third_letters)', 'type': '<', 'command_string': None} +VARIABLES:input.py:964:ExpandVariables Found output '<(other_letters)HIJK', recursing. +VARIABLES:input.py:724:ExpandVariables Matches: {'content': 'other_letters', 'is_array': '', 'replace': '<(other_letters)', 'type': '<', 'command_string': None} +VARIABLES:input.py:964:ExpandVariables Found output '<(letters_list)EFGHIJK', recursing. +VARIABLES:input.py:724:ExpandVariables Matches: {'content': 'letters_list', 'is_array': '', 'replace': '<(letters_list)', 'type': '<', 'command_string': None} +VARIABLES:input.py:964:ExpandVariables Found output 'ABCDEFGHIJK', recursing. +VARIABLES:input.py:724:ExpandVariables Matches: {'content': 'default_empty_files', 'is_array': '', 'replace': '<(default_empty_files)', 'type': '<', 'command_string': None} +VARIABLES:input.py:964:ExpandVariables Found output '', recursing. +VARIABLES:input.py:724:ExpandVariables Matches: {'content': 'default_int_files', 'is_array': '', 'replace': '<(default_int_files)', 'type': '<', 'command_string': None} +VARIABLES:input.py:964:ExpandVariables Found output '0', recursing. +VARIABLES:input.py:724:ExpandVariables Matches: {'content': 'python test.py', 'is_array': '', 'replace': '<!(python test.py)', 'type': '<!', 'command_string': None} +VARIABLES:input.py:838:ExpandVariables Executing command 'python test.py' in directory 'None' +VARIABLES:input.py:964:ExpandVariables Found output 'sample\\path\\foo.cpp', recursing. +VARIABLES:input.py:724:ExpandVariables Matches: {'content': 'default_str', 'is_array': '', 'replace': '<(default_str)', 'type': '<', 'command_string': None} +VARIABLES:input.py:964:ExpandVariables Found output 'my_str', recursing. +VARIABLES:input.py:724:ExpandVariables Matches: {'content': 'default_empty_str', 'is_array': '', 'replace': '<(default_empty_str)', 'type': '<', 'command_string': None} +VARIABLES:input.py:964:ExpandVariables Found output '', recursing. +VARIABLES:input.py:724:ExpandVariables Matches: {'content': 'default_int', 'is_array': '', 'replace': '<(default_int)', 'type': '<', 'command_string': None} +VARIABLES:input.py:964:ExpandVariables Found output '0', recursing. +VARIABLES:input.py:724:ExpandVariables Matches: {'content': '<!(python -c "print \'letters_list\'"', 'is_array': '', 'replace': '<(<!(python -c "print \'letters_list\'")', 'type': '<', 'command_string': None} +VARIABLES:input.py:724:ExpandVariables Matches: {'content': 'python -c "print \'letters_list\'"', 'is_array': '', 'replace': '<!(python -c "print \'letters_list\'")', 'type': '<!', 'command_string': None} +VARIABLES:input.py:838:ExpandVariables Executing command 'python -c "print 'letters_list'"' in directory 'None' +VARIABLES:input.py:964:ExpandVariables Found output 'letters_list', recursing. +VARIABLES:input.py:964:ExpandVariables Found output 'ABCD', recursing. +VARIABLES:input.py:724:ExpandVariables Matches: {'content': 'check_int', 'is_array': '', 'replace': '<(check_int)', 'type': '<', 'command_string': None} +VARIABLES:input.py:964:ExpandVariables Found output '5', recursing. +VARIABLES:input.py:724:ExpandVariables Matches: {'content': '"python", "-c", "<(pi', 'is_array': '[', 'replace': '<!(["python", "-c", "<(pi)', 'type': '<!', 'command_string': None} +VARIABLES:input.py:724:ExpandVariables Matches: {'content': 'pi', 'is_array': '', 'replace': '<(pi)', 'type': '<', 'command_string': None} +VARIABLES:input.py:964:ExpandVariables Found output '["python", "-c", "import math; print math.pi"]', recursing. +VARIABLES:input.py:838:ExpandVariables Executing command '['python', '-c', 'import math; print math.pi']' in directory 'None' +VARIABLES:input.py:964:ExpandVariables Found output '3.14159265359', recursing. +VARIABLES:input.py:724:ExpandVariables Matches: {'content': 'python -c "print \'<(letters_list', 'is_array': '', 'replace': '<!(python -c "print \'<(letters_list)', 'type': '<!', 'command_string': None} +VARIABLES:input.py:724:ExpandVariables Matches: {'content': 'letters_list', 'is_array': '', 'replace': '<(letters_list)', 'type': '<', 'command_string': None} +VARIABLES:input.py:964:ExpandVariables Found output 'python -c "print \'ABCD\'"', recursing. +VARIABLES:input.py:838:ExpandVariables Executing command 'python -c "print 'ABCD'"' in directory 'None' +VARIABLES:input.py:964:ExpandVariables Found output 'ABCD', recursing. +VARIABLES:input.py:724:ExpandVariables Matches: {'content': 'letters_list', 'is_array': '', 'replace': '<(letters_list)', 'type': '<', 'command_string': None} +VARIABLES:input.py:724:ExpandVariables Matches: {'content': 'python -c "print \'<!(python -c "<(pi', 'is_array': '', 'replace': '<!(python -c "print \'<!(python -c "<(pi)', 'type': '<!', 'command_string': None} +VARIABLES:input.py:724:ExpandVariables Matches: {'content': 'python -c "<(pi', 'is_array': '', 'replace': '<!(python -c "<(pi)', 'type': '<!', 'command_string': None} +VARIABLES:input.py:724:ExpandVariables Matches: {'content': 'pi', 'is_array': '', 'replace': '<(pi)', 'type': '<', 'command_string': None} +VARIABLES:input.py:964:ExpandVariables Found output 'python -c "import math; print math.pi"', recursing. +VARIABLES:input.py:838:ExpandVariables Executing command 'python -c "import math; print math.pi"' in directory 'None' +VARIABLES:input.py:964:ExpandVariables Found output 'python -c "print \'3.14159265359 ABCD\'"', recursing. +VARIABLES:input.py:838:ExpandVariables Executing command 'python -c "print '3.14159265359 ABCD'"' in directory 'None' +VARIABLES:input.py:964:ExpandVariables Found output '3.14159265359 ABCD', recursing. +VARIABLES:input.py:724:ExpandVariables Matches: {'content': 'check_str_int', 'is_array': '', 'replace': '<(check_str_int)', 'type': '<', 'command_string': None} +VARIABLES:input.py:964:ExpandVariables Found output '6', recursing. +VARIABLES:input.py:724:ExpandVariables Matches: {'content': 'check_int', 'is_array': '', 'replace': '<(check_int)', 'type': '<', 'command_string': None} +VARIABLES:input.py:964:ExpandVariables Found output '5blah', recursing. +VARIABLES:input.py:724:ExpandVariables Matches: {'content': 'not_int_4', 'is_array': '', 'replace': '<(not_int_4)', 'type': '<', 'command_string': None} +VARIABLES:input.py:964:ExpandVariables Found output '13.0', recursing. +VARIABLES:input.py:724:ExpandVariables Matches: {'content': 'not_int_3', 'is_array': '', 'replace': '<(not_int_3)', 'type': '<', 'command_string': None} +VARIABLES:input.py:964:ExpandVariables Found output '012', recursing. +VARIABLES:input.py:724:ExpandVariables Matches: {'content': 'negative_int', 'is_array': '', 'replace': '<(negative_int)', 'type': '<', 'command_string': None} +VARIABLES:input.py:964:ExpandVariables Found output '-15', recursing. +VARIABLES:input.py:724:ExpandVariables Matches: {'content': 'not_int_5', 'is_array': '', 'replace': '<(not_int_5)', 'type': '<', 'command_string': None} +VARIABLES:input.py:964:ExpandVariables Found output '+14', recursing. +VARIABLES:input.py:724:ExpandVariables Matches: {'content': 'check_list_int', 'is_array': '', 'replace': '<(check_list_int)', 'type': '<', 'command_string': None} +VARIABLES:input.py:964:ExpandVariables Found output '7 8 9', recursing. +VARIABLES:input.py:724:ExpandVariables Matches: {'content': 'not_int_2', 'is_array': '', 'replace': '<(not_int_2)', 'type': '<', 'command_string': None} +VARIABLES:input.py:964:ExpandVariables Found output '11 ', recursing. +VARIABLES:input.py:724:ExpandVariables Matches: {'content': 'not_int_1', 'is_array': '', 'replace': '<(not_int_1)', 'type': '<', 'command_string': None} +VARIABLES:input.py:964:ExpandVariables Found output ' 10', recursing. +VARIABLES:input.py:724:ExpandVariables Matches: {'content': 'zero_int', 'is_array': '', 'replace': '<(zero_int)', 'type': '<', 'command_string': None} +VARIABLES:input.py:964:ExpandVariables Found output '0', recursing. +VARIABLES:input.py:724:ExpandVariables Matches: {'content': 'check_list_int', 'is_array': '', 'replace': '<@(check_list_int)', 'type': '<@', 'command_string': None} +VARIABLES:input.py:964:ExpandVariables Found output [7, 8, 9], recursing. +VARIABLES:input.py:724:ExpandVariables Matches: {'content': 'python test.py', 'is_array': '', 'replace': '<!@(python test.py)', 'type': '<!@', 'command_string': None} +VARIABLES:input.py:889:ExpandVariables Had cache value for command 'python test.py' in directory 'None' +VARIABLES:input.py:964:ExpandVariables Found output ['samplepathfoo.cpp'], recursing. +VARIABLES:input.py:724:ExpandVariables Matches: {'content': 'var6', 'is_array': '', 'replace': '<(var6)', 'type': '<', 'command_string': None} +VARIABLES:input.py:724:ExpandVariables Matches: {'content': 'echo <(var5', 'is_array': '', 'replace': '<!(echo <(var5)', 'type': '<!', 'command_string': None} +VARIABLES:input.py:724:ExpandVariables Matches: {'content': 'var5', 'is_array': '', 'replace': '<(var5)', 'type': '<', 'command_string': None} +VARIABLES:input.py:964:ExpandVariables Found output 'echo letters_list', recursing. +VARIABLES:input.py:838:ExpandVariables Executing command 'echo letters_list' in directory 'None' +VARIABLES:input.py:964:ExpandVariables Found output 'letters_list', recursing. +VARIABLES:input.py:724:ExpandVariables Matches: {'content': '_inputs', 'is_array': '', 'replace': '<(_inputs)', 'type': '<', 'command_string': None} +VARIABLES:input.py:724:ExpandVariables Matches: {'content': 'var2', 'is_array': '', 'replace': '<(var2)', 'type': '<', 'command_string': None} +VARIABLES:input.py:964:ExpandVariables Found output '3.14159265359 ABCD', recursing. +VARIABLES:input.py:964:ExpandVariables Found output '"3.14159265359 ABCD"', recursing. +VARIABLES:input.py:724:ExpandVariables Matches: {'content': '_outputs', 'is_array': '', 'replace': '<(_outputs)', 'type': '<', 'command_string': None} +VARIABLES:input.py:724:ExpandVariables Matches: {'content': 'var4', 'is_array': '', 'replace': '<(var4)', 'type': '<', 'command_string': None} +VARIABLES:input.py:964:ExpandVariables Found output 'ABCD', recursing. +VARIABLES:input.py:724:ExpandVariables Matches: {'content': 'var7', 'is_array': '', 'replace': '<(var7)', 'type': '<', 'command_string': None} +VARIABLES:input.py:964:ExpandVariables Found output 'letters_list', recursing. +VARIABLES:input.py:964:ExpandVariables Found output 'ABCD letters_list', recursing. diff --git a/deps/gyp/test/variables/commands/commands.gypd.golden b/deps/gyp/test/variables/commands/commands.gypd.golden new file mode 100644 index 0000000000..9e5cf89451 --- /dev/null +++ b/deps/gyp/test/variables/commands/commands.gypd.golden @@ -0,0 +1,66 @@ +{'_DEPTH': '.', + 'included_files': ['commands.gyp', 'commands.gypi'], + 'targets': [{'actions': [{'action': ['echo', + '"3.14159265359 ABCD"', + 'ABCD letters_list'], + 'action_name': 'test_action', + 'inputs': ['3.14159265359 ABCD'], + 'outputs': ['ABCD', 'letters_list'], + 'variables': {'var7': 'letters_list'}}], + 'configurations': {'Default': {}}, + 'default_configuration': 'Default', + 'target_name': 'foo', + 'toolset': 'target', + 'type': 'none', + 'variables': {'var1': '3.14159265359', + 'var10': '7 8 9', + 'var11': ['7', '8', '9'], + 'var12': ' 10', + 'var13': '11 ', + 'var14': '012', + 'var15': '13.0', + 'var16': '+14', + 'var17': '-15', + 'var18': '0', + 'var19': ['samplepathfoo.cpp'], + 'var2': '3.14159265359 ABCD', + 'var20': 'sample\\path\\foo.cpp', + 'var21': 'my_str', + 'var22': '', + 'var23': '0', + 'var24': '', + 'var25': '0', + 'var3': 'ABCD', + 'var4': 'ABCD', + 'var5': 'letters_', + 'var6': 'list', + 'var7': '5', + 'var8': '5blah', + 'var9': '6'}}, + {'configurations': {'Default': {}}, + 'default_configuration': 'Default', + 'target_name': 'dummy', + 'toolset': 'target', + 'type': 'none'}], + 'variables': {'check_included': 'XYZ', + 'check_int': '5', + 'check_list_int': ['7', '8', '9'], + 'check_lists': ['XYZ', 'ABCDEFGHIJK'], + 'check_str_int': '6', + 'default_empty_files%': '', + 'default_empty_str%': '', + 'default_int%': '0', + 'default_int_files%': '0', + 'default_str%': 'my_str', + 'included_variable': 'XYZ', + 'letters_list': 'ABCD', + 'negative_int': '-15', + 'not_int_1': ' 10', + 'not_int_2': '11 ', + 'not_int_3': '012', + 'not_int_4': '13.0', + 'not_int_5': '+14', + 'other_letters': 'ABCDEFG', + 'pi': 'import math; print math.pi', + 'third_letters': 'ABCDEFGHIJK', + 'zero_int': '0'}} diff --git a/deps/gyp/test/variables/commands/commands.gypi b/deps/gyp/test/variables/commands/commands.gypi new file mode 100644 index 0000000000..839cb30b7e --- /dev/null +++ b/deps/gyp/test/variables/commands/commands.gypi @@ -0,0 +1,23 @@ +# Copyright (c) 2009 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. + +# This file is included from commands.gyp to test evaluation order of includes. +{ + 'variables': { + 'included_variable': 'XYZ', + + 'default_str%': 'my_str', + 'default_empty_str%': '', + 'default_int%': 0, + + 'default_empty_files%': '', + 'default_int_files%': 0, + }, + 'targets': [ + { + 'target_name': 'dummy', + 'type': 'none', + }, + ], +} diff --git a/deps/gyp/test/variables/commands/gyptest-commands-ignore-env.py b/deps/gyp/test/variables/commands/gyptest-commands-ignore-env.py new file mode 100755 index 0000000000..1cf3308dc4 --- /dev/null +++ b/deps/gyp/test/variables/commands/gyptest-commands-ignore-env.py @@ -0,0 +1,46 @@ +#!/usr/bin/env python + +# 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. + +""" +Test that environment variables are ignored when --ignore-environment is +specified. +""" + +import os + +import TestGyp + +test = TestGyp.TestGyp(format='gypd') + +os.environ['GYP_DEFINES'] = 'FOO=BAR' +os.environ['GYP_GENERATORS'] = 'foo' +os.environ['GYP_GENERATOR_FLAGS'] = 'genflag=foo' +os.environ['GYP_GENERATOR_OUTPUT'] = 'somedir' + +expect = test.read('commands.gyp.ignore-env.stdout').replace('\r\n', '\n') + +test.run_gyp('commands.gyp', + '--debug', 'variables', + '--ignore-environment', + stdout=expect, ignore_line_numbers=True) + +# Verify the commands.gypd against the checked-in expected contents. +# +# Normally, we should canonicalize line endings in the expected +# contents file setting the Subversion svn:eol-style to native, +# but that would still fail if multiple systems are sharing a single +# workspace on a network-mounted file system. Consequently, we +# massage the Windows line endings ('\r\n') in the output to the +# checked-in UNIX endings ('\n'). + +contents = test.read('commands.gypd').replace('\r', '') +expect = test.read('commands.gypd.golden').replace('\r', '') +if not test.match(contents, expect): + print "Unexpected contents of `commands.gypd'" + test.diff(expect, contents, 'commands.gypd ') + test.fail_test() + +test.pass_test() diff --git a/deps/gyp/test/variables/commands/gyptest-commands-repeated-multidir.py b/deps/gyp/test/variables/commands/gyptest-commands-repeated-multidir.py new file mode 100755 index 0000000000..21e0487565 --- /dev/null +++ b/deps/gyp/test/variables/commands/gyptest-commands-repeated-multidir.py @@ -0,0 +1,23 @@ +#!/usr/bin/env python + +# Copyright 2014 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. + +""" +Test variable expansion of '<!()' syntax commands where they are evaluated +more than once from different directories. +""" + +import TestGyp + +test = TestGyp.TestGyp() + +# This tests GYP's cache of commands, ensuring that the directory a command is +# run from is part of its cache key. Parallelism may lead to multiple cache +# lookups failing, resulting in the command being run multiple times by +# chance, not by GYP's logic. Turn off parallelism to ensure that the logic is +# being tested. +test.run_gyp('repeated_multidir/main.gyp', '--no-parallel') + +test.pass_test() diff --git a/deps/gyp/test/variables/commands/gyptest-commands-repeated.py b/deps/gyp/test/variables/commands/gyptest-commands-repeated.py new file mode 100755 index 0000000000..b95fe2d75e --- /dev/null +++ b/deps/gyp/test/variables/commands/gyptest-commands-repeated.py @@ -0,0 +1,38 @@ +#!/usr/bin/env python + +# 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. + +""" +Test variable expansion of '<!()' syntax commands where they are evaluated +more then once.. +""" + +import TestGyp + +test = TestGyp.TestGyp(format='gypd') + +expect = test.read('commands-repeated.gyp.stdout').replace('\r\n', '\n') + +test.run_gyp('commands-repeated.gyp', + '--debug', 'variables', + stdout=expect, ignore_line_numbers=True) + +# Verify the commands-repeated.gypd against the checked-in expected contents. +# +# Normally, we should canonicalize line endings in the expected +# contents file setting the Subversion svn:eol-style to native, +# but that would still fail if multiple systems are sharing a single +# workspace on a network-mounted file system. Consequently, we +# massage the Windows line endings ('\r\n') in the output to the +# checked-in UNIX endings ('\n'). + +contents = test.read('commands-repeated.gypd').replace('\r\n', '\n') +expect = test.read('commands-repeated.gypd.golden').replace('\r\n', '\n') +if not test.match(contents, expect): + print "Unexpected contents of `commands-repeated.gypd'" + test.diff(expect, contents, 'commands-repeated.gypd ') + test.fail_test() + +test.pass_test() diff --git a/deps/gyp/test/variables/commands/gyptest-commands.py b/deps/gyp/test/variables/commands/gyptest-commands.py new file mode 100755 index 0000000000..ef1af8c525 --- /dev/null +++ b/deps/gyp/test/variables/commands/gyptest-commands.py @@ -0,0 +1,39 @@ +#!/usr/bin/env python + +# 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. + +""" +Test variable expansion of '<!()' syntax commands. +""" + +import os + +import TestGyp + +test = TestGyp.TestGyp(format='gypd') + +expect = test.read('commands.gyp.stdout').replace('\r', '') + +test.run_gyp('commands.gyp', + '--debug', 'variables', + stdout=expect, ignore_line_numbers=True) + +# Verify the commands.gypd against the checked-in expected contents. +# +# Normally, we should canonicalize line endings in the expected +# contents file setting the Subversion svn:eol-style to native, +# but that would still fail if multiple systems are sharing a single +# workspace on a network-mounted file system. Consequently, we +# massage the Windows line endings ('\r\n') in the output to the +# checked-in UNIX endings ('\n'). + +contents = test.read('commands.gypd').replace('\r', '') +expect = test.read('commands.gypd.golden').replace('\r', '') +if not test.match(contents, expect): + print "Unexpected contents of `commands.gypd'" + test.diff(expect, contents, 'commands.gypd ') + test.fail_test() + +test.pass_test() diff --git a/deps/gyp/test/variables/commands/repeated_multidir/dir_1/test_1.gyp b/deps/gyp/test/variables/commands/repeated_multidir/dir_1/test_1.gyp new file mode 100644 index 0000000000..328fc306cd --- /dev/null +++ b/deps/gyp/test/variables/commands/repeated_multidir/dir_1/test_1.gyp @@ -0,0 +1,13 @@ +# Copyright 2014 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. + +{ + 'variables': { + 'expected_value': 'dir_1', + 'target_name': 'target_1', + }, + 'includes': [ + '../repeated_command_common.gypi', + ], +} diff --git a/deps/gyp/test/variables/commands/repeated_multidir/dir_2/test_2.gyp b/deps/gyp/test/variables/commands/repeated_multidir/dir_2/test_2.gyp new file mode 100644 index 0000000000..18e0c62c93 --- /dev/null +++ b/deps/gyp/test/variables/commands/repeated_multidir/dir_2/test_2.gyp @@ -0,0 +1,13 @@ +# Copyright 2014 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. + +{ + 'variables': { + 'expected_value': 'dir_2', + 'target_name': 'target_2', + }, + 'includes': [ + '../repeated_command_common.gypi', + ], +} diff --git a/deps/gyp/test/variables/commands/repeated_multidir/main.gyp b/deps/gyp/test/variables/commands/repeated_multidir/main.gyp new file mode 100644 index 0000000000..5beeeb7244 --- /dev/null +++ b/deps/gyp/test/variables/commands/repeated_multidir/main.gyp @@ -0,0 +1,16 @@ +# Copyright 2014 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. + +{ + 'targets': [ + { + 'target_name': 'main', + 'type': 'none', + 'dependencies': [ + 'dir_1/test_1.gyp:target_1', + 'dir_2/test_2.gyp:target_2', + ], + }, + ], +} diff --git a/deps/gyp/test/variables/commands/repeated_multidir/print_cwd_basename.py b/deps/gyp/test/variables/commands/repeated_multidir/print_cwd_basename.py new file mode 100755 index 0000000000..ace9ed6b80 --- /dev/null +++ b/deps/gyp/test/variables/commands/repeated_multidir/print_cwd_basename.py @@ -0,0 +1,10 @@ +#!/usr/bin/env python + +# Copyright 2014 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 os +import os.path + +print os.path.basename(os.getcwd()) diff --git a/deps/gyp/test/variables/commands/repeated_multidir/repeated_command_common.gypi b/deps/gyp/test/variables/commands/repeated_multidir/repeated_command_common.gypi new file mode 100644 index 0000000000..74366771aa --- /dev/null +++ b/deps/gyp/test/variables/commands/repeated_multidir/repeated_command_common.gypi @@ -0,0 +1,25 @@ +# Copyright 2014 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. + +{ + 'variables': { + # This command will be run from the directories of the .gyp files that + # include this .gypi, the subdirectories dir_1 and dir_2, so use a + # relative path from those directories to the script. + 'observed_value': '<!(python ../print_cwd_basename.py)', + }, + 'targets': [ + { + 'target_name': '<(target_name)', + 'type': 'none', + 'conditions': [ + ['observed_value != expected_value', { + # Attempt to expand an undefined variable. This triggers a GYP + # error. + 'assertion': '<(observed_value_must_equal_expected_value)', + }], + ], + }, + ], +} diff --git a/deps/gyp/test/variables/commands/test.py b/deps/gyp/test/variables/commands/test.py new file mode 100644 index 0000000000..4d9ca6d1ab --- /dev/null +++ b/deps/gyp/test/variables/commands/test.py @@ -0,0 +1 @@ +print "sample\\path\\foo.cpp" diff --git a/deps/gyp/test/variables/commands/update_golden b/deps/gyp/test/variables/commands/update_golden new file mode 100755 index 0000000000..4fcf1eb961 --- /dev/null +++ b/deps/gyp/test/variables/commands/update_golden @@ -0,0 +1,11 @@ +#!/bin/bash + +# Copyright (c) 2009 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. + +python ../../../gyp --debug variables --format gypd --depth . commands.gyp > commands.gyp.stdout +python ../../../gyp --ignore-environment --debug variables --format gypd --depth . commands.gyp > commands.gyp.ignore-env.stdout +cp -f commands.gypd commands.gypd.golden +python ../../../gyp --debug variables --format gypd --depth . commands-repeated.gyp > commands-repeated.gyp.stdout +cp -f commands-repeated.gypd commands-repeated.gypd.golden diff --git a/deps/gyp/test/variables/empty/empty.gyp b/deps/gyp/test/variables/empty/empty.gyp new file mode 100644 index 0000000000..207be06fe7 --- /dev/null +++ b/deps/gyp/test/variables/empty/empty.gyp @@ -0,0 +1,13 @@ +# Copyright (c) 2015 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. + +{ + 'includes': ['empty.gypi'], + 'targets': [ + { + 'target_name': 'empty', + 'type': 'none', + }, + ], +} diff --git a/deps/gyp/test/variables/empty/empty.gypi b/deps/gyp/test/variables/empty/empty.gypi new file mode 100644 index 0000000000..e95031fca5 --- /dev/null +++ b/deps/gyp/test/variables/empty/empty.gypi @@ -0,0 +1,9 @@ +# Copyright (c) 2015 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. + +{ + 'variables': { + '': '', + }, +} diff --git a/deps/gyp/test/variables/empty/gyptest-empty.py b/deps/gyp/test/variables/empty/gyptest-empty.py new file mode 100755 index 0000000000..4cbe166fdc --- /dev/null +++ b/deps/gyp/test/variables/empty/gyptest-empty.py @@ -0,0 +1,19 @@ +#!/usr/bin/env python + +# Copyright (c) 2015 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. + +""" +Test that empty variable names don't cause infinite loops. +""" + +import os + +import TestGyp + +test = TestGyp.TestGyp() + +test.run_gyp('empty.gyp') + +test.pass_test() diff --git a/deps/gyp/test/variables/filelist/filelist.gyp.stdout b/deps/gyp/test/variables/filelist/filelist.gyp.stdout new file mode 100644 index 0000000000..595a19c684 --- /dev/null +++ b/deps/gyp/test/variables/filelist/filelist.gyp.stdout @@ -0,0 +1,26 @@ +VARIABLES:input.py:562:ExpandVariables Matches: {'content': 'names.txt <@(names', 'is_array': '', 'replace': '<|(names.txt <@(names)', 'type': '<|', 'command_string': None} +VARIABLES:input.py:562:ExpandVariables Matches: {'content': 'names', 'is_array': '', 'replace': '<@(names)', 'type': '<@', 'command_string': None} +VARIABLES:input.py:797:ExpandVariables Found output 'names.txt John Jacob Jingleheimer Schmidt', recursing. +VARIABLES:input.py:797:ExpandVariables Found output 'names.txt', recursing. +VARIABLES:input.py:562:ExpandVariables Matches: {'content': 'names_listfile', 'is_array': '', 'replace': '<(names_listfile)', 'type': '<', 'command_string': None} +VARIABLES:input.py:797:ExpandVariables Found output 'names.txt', recursing. +VARIABLES:input.py:562:ExpandVariables Matches: {'content': 'names_listfile', 'is_array': '', 'replace': '<(names_listfile)', 'type': '<', 'command_string': None} +VARIABLES:input.py:797:ExpandVariables Found output 'names.txt', recursing. +VARIABLES:input.py:562:ExpandVariables Matches: {'content': 'cat <(names_listfile', 'is_array': '', 'replace': '<!@(cat <(names_listfile)', 'type': '<!@', 'command_string': None} +VARIABLES:input.py:562:ExpandVariables Matches: {'content': 'names_listfile', 'is_array': '', 'replace': '<(names_listfile)', 'type': '<', 'command_string': None} +VARIABLES:input.py:797:ExpandVariables Found output 'cat names.txt', recursing. +VARIABLES:input.py:676:ExpandVariables Executing command 'cat names.txt' in directory 'src' +VARIABLES:input.py:797:ExpandVariables Found output ['John', 'Jacob', 'Jingleheimer', 'Schmidt'], recursing. +VARIABLES:input.py:562:ExpandVariables Matches: {'content': 'sources.txt <@(_sources', 'is_array': '', 'replace': '<|(sources.txt <@(_sources)', 'type': '<|', 'command_string': None} +VARIABLES:input.py:562:ExpandVariables Matches: {'content': '_sources', 'is_array': '', 'replace': '<@(_sources)', 'type': '<@', 'command_string': None} +VARIABLES:input.py:797:ExpandVariables Found output 'sources.txt John Jacob Jingleheimer Schmidt', recursing. +VARIABLES:input.py:797:ExpandVariables Found output 'sources.txt', recursing. +VARIABLES:input.py:562:ExpandVariables Matches: {'content': 'sources_listfile', 'is_array': '', 'replace': '<(sources_listfile)', 'type': '<', 'command_string': None} +VARIABLES:input.py:797:ExpandVariables Found output 'sources.txt', recursing. +VARIABLES:input.py:562:ExpandVariables Matches: {'content': 'sources_listfile', 'is_array': '', 'replace': '<(sources_listfile)', 'type': '<', 'command_string': None} +VARIABLES:input.py:797:ExpandVariables Found output 'sources.txt', recursing. +VARIABLES:input.py:562:ExpandVariables Matches: {'content': 'cat <(sources_listfile', 'is_array': '', 'replace': '<!@(cat <(sources_listfile)', 'type': '<!@', 'command_string': None} +VARIABLES:input.py:562:ExpandVariables Matches: {'content': 'sources_listfile', 'is_array': '', 'replace': '<(sources_listfile)', 'type': '<', 'command_string': None} +VARIABLES:input.py:797:ExpandVariables Found output 'cat sources.txt', recursing. +VARIABLES:input.py:676:ExpandVariables Executing command 'cat sources.txt' in directory 'src' +VARIABLES:input.py:797:ExpandVariables Found output ['John', 'Jacob', 'Jingleheimer', 'Schmidt'], recursing. diff --git a/deps/gyp/test/variables/filelist/filelist.gypd.golden b/deps/gyp/test/variables/filelist/filelist.gypd.golden new file mode 100644 index 0000000000..09d9116047 --- /dev/null +++ b/deps/gyp/test/variables/filelist/filelist.gypd.golden @@ -0,0 +1,43 @@ +{'_DEPTH': '.', + 'included_files': ['filelist.gyp'], + 'targets': [{'actions': [{'action': ['python', 'dummy.py', 'names.txt'], + 'action_name': 'test_action', + 'inputs': ['names.txt', + 'John', + 'Jacob', + 'Jingleheimer', + 'Schmidt'], + 'outputs': ['dummy_foo']}], + 'configurations': {'Default': {}}, + 'default_configuration': 'Default', + 'target_name': 'foo', + 'toolset': 'target', + 'type': 'none', + 'variables': {'names_listfile': 'names.txt'}}, + {'actions': [{'action': ['python', 'dummy.py', 'sources.txt'], + 'action_name': 'test_action', + 'inputs': ['sources.txt', + 'John', + 'Jacob', + 'Jingleheimer', + 'Schmidt'], + 'outputs': ['dummy_foo']}], + 'configurations': {'Default': {}}, + 'default_configuration': 'Default', + 'sources': ['John', 'Jacob', 'Jingleheimer', 'Schmidt'], + 'sources_excluded': ['Astor', 'Jerome', 'Schultz'], + 'target_name': 'bar', + 'toolset': 'target', + 'type': 'none', + 'variables': {'sources_listfile': 'sources.txt'}}], + 'variables': {'names': ['John', + 'Jacob', + 'Astor', + 'Jingleheimer', + 'Jerome', + 'Schmidt', + 'Schultz'], + 'names!': ['Astor'], + 'names/': [['exclude', 'Sch.*'], + ['include', '.*dt'], + ['exclude', 'Jer.*']]}} diff --git a/deps/gyp/test/variables/filelist/gyptest-filelist-golden.py b/deps/gyp/test/variables/filelist/gyptest-filelist-golden.py new file mode 100644 index 0000000000..55eaf9db46 --- /dev/null +++ b/deps/gyp/test/variables/filelist/gyptest-filelist-golden.py @@ -0,0 +1,51 @@ +#!/usr/bin/env python + +# 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. + +""" +Test variable expansion of '<|(list.txt ...)' syntax commands. +""" + +import os +import sys + +import TestGyp + +test = TestGyp.TestGyp(format='gypd') + +expect = test.read('filelist.gyp.stdout') +if sys.platform == 'win32': + expect = expect.replace('/', r'\\').replace('\r\n', '\n') + +test.run_gyp('src/filelist.gyp', + '--debug', 'variables', + stdout=expect, ignore_line_numbers=True) + +# Verify the filelist.gypd against the checked-in expected contents. +# +# Normally, we should canonicalize line endings in the expected +# contents file setting the Subversion svn:eol-style to native, +# but that would still fail if multiple systems are sharing a single +# workspace on a network-mounted file system. Consequently, we +# massage the Windows line endings ('\r\n') in the output to the +# checked-in UNIX endings ('\n'). + +contents = test.read('src/filelist.gypd').replace( + '\r', '').replace('\\\\', '/') +expect = test.read('filelist.gypd.golden').replace('\r', '') +if not test.match(contents, expect): + print "Unexpected contents of `src/filelist.gypd'" + test.diff(expect, contents, 'src/filelist.gypd ') + test.fail_test() + +contents = test.read('src/names.txt') +expect = 'John\nJacob\nJingleheimer\nSchmidt\n' +if not test.match(contents, expect): + print "Unexpected contents of `src/names.txt'" + test.diff(expect, contents, 'src/names.txt ') + test.fail_test() + +test.pass_test() + diff --git a/deps/gyp/test/variables/filelist/gyptest-filelist.py b/deps/gyp/test/variables/filelist/gyptest-filelist.py new file mode 100755 index 0000000000..84a6cba5f4 --- /dev/null +++ b/deps/gyp/test/variables/filelist/gyptest-filelist.py @@ -0,0 +1,29 @@ +#!/usr/bin/env python + +# 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. + +""" +Test variable expansion of '<|(list.txt ...)' syntax commands. +""" + +import os +import sys + +import TestGyp + +test = TestGyp.TestGyp() + +CHDIR = 'src' +test.run_gyp('filelist2.gyp', chdir=CHDIR) + +test.build('filelist2.gyp', 'foo', chdir=CHDIR) +contents = test.read('src/dummy_foo').replace('\r', '') +expect = 'John\nJacob\nJingleheimer\nSchmidt\n' +if not test.match(contents, expect): + print "Unexpected contents of `src/dummy_foo'" + test.diff(expect, contents, 'src/dummy_foo') + test.fail_test() + +test.pass_test() diff --git a/deps/gyp/test/variables/filelist/src/dummy.py b/deps/gyp/test/variables/filelist/src/dummy.py new file mode 100644 index 0000000000..e41fc9f8e4 --- /dev/null +++ b/deps/gyp/test/variables/filelist/src/dummy.py @@ -0,0 +1,5 @@ +#!/usr/bin/env python + +import sys + +open(sys.argv[1], 'w').write(open(sys.argv[2]).read()) diff --git a/deps/gyp/test/variables/filelist/src/filelist.gyp b/deps/gyp/test/variables/filelist/src/filelist.gyp new file mode 100644 index 0000000000..df48eb3e4a --- /dev/null +++ b/deps/gyp/test/variables/filelist/src/filelist.gyp @@ -0,0 +1,93 @@ +# Copyright (c) 2009 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. + +# This is a test to make sure that <|(foo.txt a b c) generates +# a pre-calculated file list at gyp time and returns foo.txt. +# This feature is useful to work around limits in the number of arguments that +# can be passed to rule/action. + +{ + 'variables': { + 'names': [ + 'John', + 'Jacob', + 'Astor', + 'Jingleheimer', + 'Jerome', + 'Schmidt', + 'Schultz', + ], + 'names!': [ + 'Astor', + ], + 'names/': [ + ['exclude', 'Sch.*'], + ['include', '.*dt'], + ['exclude', 'Jer.*'], + ], + }, + 'targets': [ + { + 'target_name': 'foo', + 'type': 'none', + 'variables': { + 'names_listfile': '<|(names.txt <@(names))', + }, + 'actions': [ + { + 'action_name': 'test_action', + 'inputs' : [ + '<(names_listfile)', + '<!@(cat <(names_listfile))', + ], + 'outputs': [ + 'dummy_foo', + ], + 'action': [ + 'python', 'dummy.py', '<(names_listfile)', + ], + }, + ], + }, + { + 'target_name': 'bar', + 'type': 'none', + 'sources': [ + 'John', + 'Jacob', + 'Astor', + 'Jingleheimer', + 'Jerome', + 'Schmidt', + 'Schultz', + ], + 'sources!': [ + 'Astor', + ], + 'sources/': [ + ['exclude', 'Sch.*'], + ['include', '.*dt'], + ['exclude', 'Jer.*'], + ], + 'variables': { + 'sources_listfile': '<|(sources.txt <@(_sources))', + }, + 'actions': [ + { + 'action_name': 'test_action', + 'inputs' : [ + '<(sources_listfile)', + '<!@(cat <(sources_listfile))', + ], + 'outputs': [ + 'dummy_foo', + ], + 'action': [ + 'python', 'dummy.py', '<(sources_listfile)', + ], + }, + ], + }, + ], +} diff --git a/deps/gyp/test/variables/filelist/src/filelist2.gyp b/deps/gyp/test/variables/filelist/src/filelist2.gyp new file mode 100644 index 0000000000..ec215dbb76 --- /dev/null +++ b/deps/gyp/test/variables/filelist/src/filelist2.gyp @@ -0,0 +1,40 @@ +# Copyright (c) 2013 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. + +# This is a test to make sure that <|(foo.txt a b c) generates +# a pre-calculated file list at gyp time and returns foo.txt. +# This feature is useful to work around limits in the number of arguments that +# can be passed to rule/action. + +{ + 'variables': { + 'names': [ + 'John', + 'Jacob', + 'Jingleheimer', + 'Schmidt', + ], + }, + 'targets': [ + { + 'target_name': 'foo', + 'type': 'none', + 'variables': { + 'names_listfile': '<|(names.txt <@(names))', + }, + 'actions': [ + { + 'action_name': 'test_action', + 'msvs_cygwin_shell': 0, + 'inputs' : [ '<(names_listfile)' ], + 'outputs': [ 'dummy_foo' ], + 'action': [ + 'python', 'dummy.py', '<@(_outputs)', '<(names_listfile)', + ], + }, + ], + }, + ], +} + diff --git a/deps/gyp/test/variables/filelist/update_golden b/deps/gyp/test/variables/filelist/update_golden new file mode 100755 index 0000000000..b4d489a342 --- /dev/null +++ b/deps/gyp/test/variables/filelist/update_golden @@ -0,0 +1,8 @@ +#!/bin/bash + +# Copyright (c) 2009 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. + +python ../../../gyp --debug variables --debug general --format gypd --depth . src/filelist.gyp > filelist.gyp.stdout +cp -f src/filelist.gypd filelist.gypd.golden diff --git a/deps/gyp/test/variables/latelate/gyptest-latelate.py b/deps/gyp/test/variables/latelate/gyptest-latelate.py new file mode 100755 index 0000000000..2d77dfec5e --- /dev/null +++ b/deps/gyp/test/variables/latelate/gyptest-latelate.py @@ -0,0 +1,25 @@ +#!/usr/bin/env python + +# 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. + +""" +Verifies that ^(latelate) style variables work. +""" + +import TestGyp + +test = TestGyp.TestGyp() + +test.run_gyp('latelate.gyp', chdir='src') + +test.relocate('src', 'relocate/src') + +test.build('latelate.gyp', test.ALL, chdir='relocate/src') + +test.run_built_executable( + 'program', chdir='relocate/src', stdout='program.cc\n') + + +test.pass_test() diff --git a/deps/gyp/test/variables/latelate/src/latelate.gyp b/deps/gyp/test/variables/latelate/src/latelate.gyp new file mode 100644 index 0000000000..312f3765b6 --- /dev/null +++ b/deps/gyp/test/variables/latelate/src/latelate.gyp @@ -0,0 +1,34 @@ +# Copyright (c) 2009 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. + +{ + 'target_defaults': { + 'target_conditions': [ + ['has_lame==1', { + 'sources/': [ + ['exclude', 'lame'], + ], + }], + ], + }, + 'targets': [ + { + 'target_name': 'program', + 'type': 'executable', + 'variables': { + 'has_lame': 1, + }, + 'include_dirs': [ + '<(SHARED_INTERMEDIATE_DIR)', + ], + 'defines': [ + 'FOO="^(_sources)"', + ], + 'sources': [ + 'program.cc', + 'this_is_lame.cc', + ], + }, + ], +} diff --git a/deps/gyp/test/variables/latelate/src/program.cc b/deps/gyp/test/variables/latelate/src/program.cc new file mode 100644 index 0000000000..97c98ae5b9 --- /dev/null +++ b/deps/gyp/test/variables/latelate/src/program.cc @@ -0,0 +1,13 @@ +/* + * 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. + */ + +#include <stdio.h> + + +int main(void) { + printf(FOO "\n"); + return 0; +} diff --git a/deps/gyp/test/variables/variable-in-path/C1/hello.cc b/deps/gyp/test/variables/variable-in-path/C1/hello.cc new file mode 100644 index 0000000000..1711567ef5 --- /dev/null +++ b/deps/gyp/test/variables/variable-in-path/C1/hello.cc @@ -0,0 +1,7 @@ +// 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. + +int main() { + return 0; +} diff --git a/deps/gyp/test/variables/variable-in-path/gyptest-variable-in-path.py b/deps/gyp/test/variables/variable-in-path/gyptest-variable-in-path.py new file mode 100644 index 0000000000..b73a279da7 --- /dev/null +++ b/deps/gyp/test/variables/variable-in-path/gyptest-variable-in-path.py @@ -0,0 +1,23 @@ +#!/usr/bin/env python + +# 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. + +""" +Make sure <(CONFIGURATION_NAME) variable is correctly expanded. +""" + +import TestGyp + +import sys + +test = TestGyp.TestGyp() +test.set_configuration('C1') + +test.run_gyp('variable-in-path.gyp') +test.build('variable-in-path.gyp', 'hello1') +test.build('variable-in-path.gyp', 'hello2') + + +test.pass_test() diff --git a/deps/gyp/test/variables/variable-in-path/variable-in-path.gyp b/deps/gyp/test/variables/variable-in-path/variable-in-path.gyp new file mode 100644 index 0000000000..908d21eb66 --- /dev/null +++ b/deps/gyp/test/variables/variable-in-path/variable-in-path.gyp @@ -0,0 +1,31 @@ +# Copyright (c) 2010 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. + +{ + 'targets': [ + { + 'target_name': 'hello1', + 'type': 'executable', + 'sources': [ + '<(CONFIGURATION_NAME)/hello.cc', + ], + }, + { + 'target_name': 'hello2', + 'type': 'executable', + 'sources': [ + './<(CONFIGURATION_NAME)/hello.cc', + ], + }, + ], + 'target_defaults': { + 'default_configuration': 'C1', + 'configurations': { + 'C1': { + }, + 'C2': { + }, + }, + }, +} diff --git a/deps/gyp/test/win/asm-files/asm-files.gyp b/deps/gyp/test/win/asm-files/asm-files.gyp new file mode 100644 index 0000000000..b1f132ceea --- /dev/null +++ b/deps/gyp/test/win/asm-files/asm-files.gyp @@ -0,0 +1,17 @@ +# 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. + +{ + 'targets': [ + { + 'target_name': 'sources_with_asm', + 'type': 'executable', + 'sources': [ + 'hello.cc', + 'b.s', + 'c.S', + ], + }, + ] +} diff --git a/deps/gyp/test/win/asm-files/b.s b/deps/gyp/test/win/asm-files/b.s new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/deps/gyp/test/win/asm-files/b.s diff --git a/deps/gyp/test/win/asm-files/c.S b/deps/gyp/test/win/asm-files/c.S new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/deps/gyp/test/win/asm-files/c.S diff --git a/deps/gyp/test/win/asm-files/hello.cc b/deps/gyp/test/win/asm-files/hello.cc new file mode 100644 index 0000000000..1711567ef5 --- /dev/null +++ b/deps/gyp/test/win/asm-files/hello.cc @@ -0,0 +1,7 @@ +// 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. + +int main() { + return 0; +} diff --git a/deps/gyp/test/win/batch-file-action/batch-file-action.gyp b/deps/gyp/test/win/batch-file-action/batch-file-action.gyp new file mode 100644 index 0000000000..e4db9af9d3 --- /dev/null +++ b/deps/gyp/test/win/batch-file-action/batch-file-action.gyp @@ -0,0 +1,21 @@ +# 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. + +{ + 'targets': [ + { + 'target_name': 'test_batch', + 'type': 'none', + 'actions': [ + { + 'action_name': 'copy_to_output', + 'inputs': ['infile'], + 'outputs': ['outfile'], + 'action': ['somecmd.bat', 'infile', 'outfile'], + 'msvs_cygwin_shell': 0, + } + ], + }, + ] +} diff --git a/deps/gyp/test/win/batch-file-action/infile b/deps/gyp/test/win/batch-file-action/infile new file mode 100644 index 0000000000..3f9177e45e --- /dev/null +++ b/deps/gyp/test/win/batch-file-action/infile @@ -0,0 +1 @@ +input diff --git a/deps/gyp/test/win/batch-file-action/somecmd.bat b/deps/gyp/test/win/batch-file-action/somecmd.bat new file mode 100644 index 0000000000..d487753743 --- /dev/null +++ b/deps/gyp/test/win/batch-file-action/somecmd.bat @@ -0,0 +1,5 @@ +@echo off
+:: The redirs to nul are important. %2 can end up being an unterminated "'d
+:: string, so the remainder of the command line becomes the target file name,
+:: which in turn fails because it's a filename containing >, nul, etc.
+copy /y %1 %2 >nul 2>nul
diff --git a/deps/gyp/test/win/command-quote/a.S b/deps/gyp/test/win/command-quote/a.S new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/deps/gyp/test/win/command-quote/a.S diff --git a/deps/gyp/test/win/command-quote/bat with spaces.bat b/deps/gyp/test/win/command-quote/bat with spaces.bat new file mode 100644 index 0000000000..dc3508f9a9 --- /dev/null +++ b/deps/gyp/test/win/command-quote/bat with spaces.bat @@ -0,0 +1,7 @@ +@echo off + +:: 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. + +copy %1 %2 diff --git a/deps/gyp/test/win/command-quote/command-quote.gyp b/deps/gyp/test/win/command-quote/command-quote.gyp new file mode 100644 index 0000000000..faf724674f --- /dev/null +++ b/deps/gyp/test/win/command-quote/command-quote.gyp @@ -0,0 +1,79 @@ +# 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. + +{ + 'target_defaults': { + 'msvs_cygwin_dirs': ['../../../../../<(DEPTH)/third_party/cygwin'], + }, + 'targets': [ + { + 'target_name': 'test_batch', + 'type': 'none', + 'rules': [ + { + 'rule_name': 'build_with_batch', + 'msvs_cygwin_shell': 0, + 'extension': 'S', + 'outputs': ['output.obj'], + 'action': ['call go.bat', '<(RULE_INPUT_PATH)', 'output.obj'], + },], + 'sources': ['a.S'], + }, + { + 'target_name': 'test_call_separate', + 'type': 'none', + 'rules': [ + { + 'rule_name': 'build_with_batch2', + 'msvs_cygwin_shell': 0, + 'extension': 'S', + 'outputs': ['output2.obj'], + 'action': ['call', 'go.bat', '<(RULE_INPUT_PATH)', 'output2.obj'], + },], + 'sources': ['a.S'], + }, + { + 'target_name': 'test_with_spaces', + 'type': 'none', + 'rules': [ + { + 'rule_name': 'build_with_batch3', + 'msvs_cygwin_shell': 0, + 'extension': 'S', + 'outputs': ['output3.obj'], + 'action': ['bat with spaces.bat', '<(RULE_INPUT_PATH)', 'output3.obj'], + },], + 'sources': ['a.S'], + }, + { + 'target_name': 'test_with_double_quotes', + 'type': 'none', + 'rules': [ + { + 'rule_name': 'build_with_batch3', + 'msvs_cygwin_shell': 1, + 'extension': 'S', + 'outputs': ['output4.obj'], + 'arguments': ['-v'], + 'action': ['python', '-c', 'import shutil; ' + 'shutil.copy("<(RULE_INPUT_PATH)", "output4.obj")'], + },], + 'sources': ['a.S'], + }, + { + 'target_name': 'test_with_single_quotes', + 'type': 'none', + 'rules': [ + { + 'rule_name': 'build_with_batch3', + 'msvs_cygwin_shell': 1, + 'extension': 'S', + 'outputs': ['output5.obj'], + 'action': ['python', '-c', "import shutil; " + "shutil.copy('<(RULE_INPUT_PATH)', 'output5.obj')"], + },], + 'sources': ['a.S'], + }, + ] +} diff --git a/deps/gyp/test/win/command-quote/go.bat b/deps/gyp/test/win/command-quote/go.bat new file mode 100644 index 0000000000..dc3508f9a9 --- /dev/null +++ b/deps/gyp/test/win/command-quote/go.bat @@ -0,0 +1,7 @@ +@echo off + +:: 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. + +copy %1 %2 diff --git a/deps/gyp/test/win/command-quote/subdir/and/another/in-subdir.gyp b/deps/gyp/test/win/command-quote/subdir/and/another/in-subdir.gyp new file mode 100644 index 0000000000..3dff4c40b9 --- /dev/null +++ b/deps/gyp/test/win/command-quote/subdir/and/another/in-subdir.gyp @@ -0,0 +1,27 @@ +# 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. + +{ + 'targets': [ + { + 'target_name': 'test_batch_depth', + 'type': 'none', + 'variables': { + # Taken from native_client/build/common.gypi. Seems unintentional (a + # string in a 1 element list)? But since it works on other generators, + # I guess it should work here too. + 'filepath': [ 'call <(DEPTH)/../../../go.bat' ], + }, + 'rules': [ + { + 'rule_name': 'build_with_batch4', + 'msvs_cygwin_shell': 0, + 'extension': 'S', + 'outputs': ['output4.obj'], + 'action': ['<@(filepath)', '<(RULE_INPUT_PATH)', 'output4.obj'], + },], + 'sources': ['<(DEPTH)\\..\\..\\..\\a.S'], + }, + ] +} diff --git a/deps/gyp/test/win/compiler-flags/additional-include-dirs.cc b/deps/gyp/test/win/compiler-flags/additional-include-dirs.cc new file mode 100644 index 0000000000..f1e11dd12d --- /dev/null +++ b/deps/gyp/test/win/compiler-flags/additional-include-dirs.cc @@ -0,0 +1,10 @@ +// 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. + +// No path qualification to test compiler include dir specification. +#include "header.h" + +int main() { + return 0; +} diff --git a/deps/gyp/test/win/compiler-flags/additional-include-dirs.gyp b/deps/gyp/test/win/compiler-flags/additional-include-dirs.gyp new file mode 100644 index 0000000000..42c7e849f6 --- /dev/null +++ b/deps/gyp/test/win/compiler-flags/additional-include-dirs.gyp @@ -0,0 +1,20 @@ +# 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. + +{ + 'targets': [ + { + 'target_name': 'test_incs', + 'type': 'executable', + 'msvs_settings': { + 'VCCLCompilerTool': { + 'AdditionalIncludeDirectories': [ + 'subdir', + ], + } + }, + 'sources': ['additional-include-dirs.cc'], + }, + ] +} diff --git a/deps/gyp/test/win/compiler-flags/additional-options.cc b/deps/gyp/test/win/compiler-flags/additional-options.cc new file mode 100644 index 0000000000..c79572bafa --- /dev/null +++ b/deps/gyp/test/win/compiler-flags/additional-options.cc @@ -0,0 +1,10 @@ +// 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. + +int main() { + // Generate a warning that will appear at level 4, but not level 1 + // (truncation and unused local). + char c = 123456; + return 0; +} diff --git a/deps/gyp/test/win/compiler-flags/additional-options.gyp b/deps/gyp/test/win/compiler-flags/additional-options.gyp new file mode 100644 index 0000000000..6a365a2062 --- /dev/null +++ b/deps/gyp/test/win/compiler-flags/additional-options.gyp @@ -0,0 +1,31 @@ +# 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. + +{ + 'targets': [ + { + 'target_name': 'test_additional_none', + 'type': 'executable', + 'msvs_settings': { + 'VCCLCompilerTool': { + 'WarningLevel': '4', + 'WarnAsError': 'true', + } + }, + 'sources': ['additional-options.cc'], + }, + { + 'target_name': 'test_additional_one', + 'type': 'executable', + 'msvs_settings': { + 'VCCLCompilerTool': { + 'WarningLevel': '4', + 'WarnAsError': 'true', + 'AdditionalOptions': [ '/W1' ], + } + }, + 'sources': ['additional-options.cc'], + }, + ] +} diff --git a/deps/gyp/test/win/compiler-flags/analysis.gyp b/deps/gyp/test/win/compiler-flags/analysis.gyp new file mode 100644 index 0000000000..97e942258f --- /dev/null +++ b/deps/gyp/test/win/compiler-flags/analysis.gyp @@ -0,0 +1,40 @@ +# 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. + +{ + 'targets': [ + { + 'target_name': 'test_analysis_on', + 'type': 'executable', + 'msvs_settings': { + 'VCCLCompilerTool': { + 'EnablePREfast': 'true', + 'WarnAsError': 'true', + }, + }, + 'sources': ['uninit.cc'], + }, + { + 'target_name': 'test_analysis_off', + 'type': 'executable', + 'msvs_settings': { + 'VCCLCompilerTool': { + 'EnablePREfast': 'false', + 'WarnAsError': 'true', + }, + }, + 'sources': ['uninit.cc'], + }, + { + 'target_name': 'test_analysis_unspec', + 'type': 'executable', + 'sources': ['uninit.cc'], + 'msvs_settings': { + 'VCCLCompilerTool': { + 'WarnAsError': 'true', + }, + }, + }, + ] +} diff --git a/deps/gyp/test/win/compiler-flags/buffer-security-check.gyp b/deps/gyp/test/win/compiler-flags/buffer-security-check.gyp new file mode 100644 index 0000000000..cc5a12b953 --- /dev/null +++ b/deps/gyp/test/win/compiler-flags/buffer-security-check.gyp @@ -0,0 +1,51 @@ +# 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. + +{ + 'targets': [ + # Turn debug information on so that we can see the name of the buffer + # security check cookie in the disassembly. + { + 'target_name': 'test_bsc_unset', + 'type': 'executable', + 'msvs_settings': { + 'VCCLCompilerTool': { + 'DebugInformationFormat': '3', + }, + 'VCLinkerTool': { + 'GenerateDebugInformation': 'true', + }, + }, + 'sources': ['buffer-security.cc'], + }, + { + 'target_name': 'test_bsc_off', + 'type': 'executable', + 'msvs_settings': { + 'VCCLCompilerTool': { + 'BufferSecurityCheck': 'false', + 'DebugInformationFormat': '3', + }, + 'VCLinkerTool': { + 'GenerateDebugInformation': 'true', + }, + }, + 'sources': ['buffer-security.cc'], + }, + { + 'target_name': 'test_bsc_on', + 'type': 'executable', + 'msvs_settings': { + 'VCCLCompilerTool': { + 'BufferSecurityCheck': 'true', + 'DebugInformationFormat': '3', + }, + 'VCLinkerTool': { + 'GenerateDebugInformation': 'true', + }, + }, + 'sources': ['buffer-security.cc'], + }, + ] +} diff --git a/deps/gyp/test/win/compiler-flags/buffer-security.cc b/deps/gyp/test/win/compiler-flags/buffer-security.cc new file mode 100644 index 0000000000..e8a48a2a67 --- /dev/null +++ b/deps/gyp/test/win/compiler-flags/buffer-security.cc @@ -0,0 +1,12 @@ +// 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. + +#include <malloc.h> +#include <string.h> + +int main() { + char* stuff = reinterpret_cast<char*>(_alloca(256)); + strcpy(stuff, "blah"); + return 0; +} diff --git a/deps/gyp/test/win/compiler-flags/calling-convention-cdecl.def b/deps/gyp/test/win/compiler-flags/calling-convention-cdecl.def new file mode 100644 index 0000000000..dc1dba055a --- /dev/null +++ b/deps/gyp/test/win/compiler-flags/calling-convention-cdecl.def @@ -0,0 +1,6 @@ +; Copyright (c) 2014 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. + +EXPORTS + foo diff --git a/deps/gyp/test/win/compiler-flags/calling-convention-fastcall.def b/deps/gyp/test/win/compiler-flags/calling-convention-fastcall.def new file mode 100644 index 0000000000..2c61afe208 --- /dev/null +++ b/deps/gyp/test/win/compiler-flags/calling-convention-fastcall.def @@ -0,0 +1,6 @@ +; Copyright (c) 2014 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. + +EXPORTS + @foo@0 diff --git a/deps/gyp/test/win/compiler-flags/calling-convention-stdcall.def b/deps/gyp/test/win/compiler-flags/calling-convention-stdcall.def new file mode 100644 index 0000000000..6c7e05e9ea --- /dev/null +++ b/deps/gyp/test/win/compiler-flags/calling-convention-stdcall.def @@ -0,0 +1,6 @@ +; Copyright (c) 2014 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. + +EXPORTS + _foo@0 diff --git a/deps/gyp/test/win/compiler-flags/calling-convention-vectorcall.def b/deps/gyp/test/win/compiler-flags/calling-convention-vectorcall.def new file mode 100644 index 0000000000..4ef119c3e3 --- /dev/null +++ b/deps/gyp/test/win/compiler-flags/calling-convention-vectorcall.def @@ -0,0 +1,6 @@ +; Copyright (c) 2014 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. + +EXPORTS + foo@@0 diff --git a/deps/gyp/test/win/compiler-flags/calling-convention.cc b/deps/gyp/test/win/compiler-flags/calling-convention.cc new file mode 100644 index 0000000000..0d78a0cc05 --- /dev/null +++ b/deps/gyp/test/win/compiler-flags/calling-convention.cc @@ -0,0 +1,6 @@ +// Copyright (c) 2014 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. + +extern "C" void foo() { +} diff --git a/deps/gyp/test/win/compiler-flags/calling-convention.gyp b/deps/gyp/test/win/compiler-flags/calling-convention.gyp new file mode 100644 index 0000000000..5069c552bc --- /dev/null +++ b/deps/gyp/test/win/compiler-flags/calling-convention.gyp @@ -0,0 +1,66 @@ +# Copyright (c) 2014 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. + +{ + 'targets': [ + { + 'target_name': 'test_cdecl', + 'type': 'loadable_module', + 'msvs_settings': { + 'VCCLCompilerTool': { + 'CallingConvention': 0, + }, + }, + 'sources': [ + 'calling-convention.cc', + 'calling-convention-cdecl.def', + ], + }, + { + 'target_name': 'test_fastcall', + 'type': 'loadable_module', + 'msvs_settings': { + 'VCCLCompilerTool': { + 'CallingConvention': 1, + }, + }, + 'sources': [ + 'calling-convention.cc', + 'calling-convention-fastcall.def', + ], + }, + { + 'target_name': 'test_stdcall', + 'type': 'loadable_module', + 'msvs_settings': { + 'VCCLCompilerTool': { + 'CallingConvention': 2, + }, + }, + 'sources': [ + 'calling-convention.cc', + 'calling-convention-stdcall.def', + ], + }, + ], + 'conditions': [ + ['MSVS_VERSION[0:4]>="2013"', { + 'targets': [ + { + 'target_name': 'test_vectorcall', + 'type': 'loadable_module', + 'msvs_settings': { + 'VCCLCompilerTool': { + 'CallingConvention': 3, + }, + }, + 'sources': [ + 'calling-convention.cc', + 'calling-convention-vectorcall.def', + ], + }, + ], + }], + ], +} diff --git a/deps/gyp/test/win/compiler-flags/character-set-mbcs.cc b/deps/gyp/test/win/compiler-flags/character-set-mbcs.cc new file mode 100644 index 0000000000..3286304730 --- /dev/null +++ b/deps/gyp/test/win/compiler-flags/character-set-mbcs.cc @@ -0,0 +1,11 @@ +// 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. + +#ifndef _MBCS +#error +#endif + +int main() { + return 0; +} diff --git a/deps/gyp/test/win/compiler-flags/character-set-unicode.cc b/deps/gyp/test/win/compiler-flags/character-set-unicode.cc new file mode 100644 index 0000000000..32e69724a5 --- /dev/null +++ b/deps/gyp/test/win/compiler-flags/character-set-unicode.cc @@ -0,0 +1,15 @@ +// 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. + +#ifndef _UNICODE +#error +#endif + +#ifndef UNICODE +#error +#endif + +int main() { + return 0; +} diff --git a/deps/gyp/test/win/compiler-flags/character-set.gyp b/deps/gyp/test/win/compiler-flags/character-set.gyp new file mode 100644 index 0000000000..3dc45557d9 --- /dev/null +++ b/deps/gyp/test/win/compiler-flags/character-set.gyp @@ -0,0 +1,35 @@ +# 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. + +{ + 'targets': [ + { + 'target_name': 'test_cs_notset', + 'product_name': 'test_cs_notset', + 'type': 'executable', + 'msvs_configuration_attributes': { + 'CharacterSet': '0' + }, + 'sources': ['hello.cc'], + }, + { + 'target_name': 'test_cs_unicode', + 'product_name': 'test_cs_unicode', + 'type': 'executable', + 'msvs_configuration_attributes': { + 'CharacterSet': '1' + }, + 'sources': ['character-set-unicode.cc'], + }, + { + 'target_name': 'test_cs_mbcs', + 'product_name': 'test_cs_mbcs', + 'type': 'executable', + 'msvs_configuration_attributes': { + 'CharacterSet': '2' + }, + 'sources': ['character-set-mbcs.cc'], + }, + ] +} diff --git a/deps/gyp/test/win/compiler-flags/compile-as-managed.cc b/deps/gyp/test/win/compiler-flags/compile-as-managed.cc new file mode 100644 index 0000000000..a29c71ee1d --- /dev/null +++ b/deps/gyp/test/win/compiler-flags/compile-as-managed.cc @@ -0,0 +1,9 @@ +// Copyright (c) 2015 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. + +#include <vcclr.h> + +int main() { + return 0; +} diff --git a/deps/gyp/test/win/compiler-flags/compile-as-managed.gyp b/deps/gyp/test/win/compiler-flags/compile-as-managed.gyp new file mode 100644 index 0000000000..3bacbbc135 --- /dev/null +++ b/deps/gyp/test/win/compiler-flags/compile-as-managed.gyp @@ -0,0 +1,29 @@ +# Copyright (c) 2015 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. + +{ + 'targets': [ + { + 'target_name': 'test-compile-as-managed', + 'type': 'executable', + 'msvs_settings': { + 'VCCLCompilerTool': { + 'CompileAsManaged': 'true', + 'ExceptionHandling': '0' # /clr is incompatible with /EHs + } + }, + 'sources': ['compile-as-managed.cc'], + }, + { + 'target_name': 'test-compile-as-unmanaged', + 'type': 'executable', + 'msvs_settings': { + 'VCCLCompilerTool': { + 'CompileAsManaged': 'false', + } + }, + 'sources': ['compile-as-managed.cc'], + }, + ] +} diff --git a/deps/gyp/test/win/compiler-flags/debug-format.gyp b/deps/gyp/test/win/compiler-flags/debug-format.gyp new file mode 100644 index 0000000000..daaed23ff1 --- /dev/null +++ b/deps/gyp/test/win/compiler-flags/debug-format.gyp @@ -0,0 +1,48 @@ +# 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. + +{ + 'targets': [ + { + 'target_name': 'test-debug-format-off', + 'type': 'executable', + 'msvs_settings': { + 'VCCLCompilerTool': { + 'DebugInformationFormat': '0' + } + }, + 'sources': ['hello.cc'], + }, + { + 'target_name': 'test-debug-format-oldstyle', + 'type': 'executable', + 'msvs_settings': { + 'VCCLCompilerTool': { + 'DebugInformationFormat': '1' + } + }, + 'sources': ['hello.cc'], + }, + { + 'target_name': 'test-debug-format-pdb', + 'type': 'executable', + 'msvs_settings': { + 'VCCLCompilerTool': { + 'DebugInformationFormat': '3' + } + }, + 'sources': ['hello.cc'], + }, + { + 'target_name': 'test-debug-format-editcontinue', + 'type': 'executable', + 'msvs_settings': { + 'VCCLCompilerTool': { + 'DebugInformationFormat': '4' + } + }, + 'sources': ['hello.cc'], + }, + ] +} diff --git a/deps/gyp/test/win/compiler-flags/default-char-is-unsigned.cc b/deps/gyp/test/win/compiler-flags/default-char-is-unsigned.cc new file mode 100644 index 0000000000..beeca2aa15 --- /dev/null +++ b/deps/gyp/test/win/compiler-flags/default-char-is-unsigned.cc @@ -0,0 +1,15 @@ +// 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. + +template <bool> +struct CompileAssert { +}; + +#define COMPILE_ASSERT(expr, msg) \ + typedef CompileAssert<(bool(expr))> msg[bool(expr) ? 1 : -1] + +int main() { + COMPILE_ASSERT(char(-1) > 0, default_char_is_unsigned); + return 0; +} diff --git a/deps/gyp/test/win/compiler-flags/default-char-is-unsigned.gyp b/deps/gyp/test/win/compiler-flags/default-char-is-unsigned.gyp new file mode 100644 index 0000000000..941e5810dd --- /dev/null +++ b/deps/gyp/test/win/compiler-flags/default-char-is-unsigned.gyp @@ -0,0 +1,20 @@ +# Copyright (c) 2010 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. + +{ + 'targets': [ + { + 'target_name': 'test_default_char_is_unsigned', + 'type': 'executable', + 'msvs_settings': { + 'VCCLCompilerTool': { + 'DefaultCharIsUnsigned': 'true', + }, + }, + 'sources': [ + 'default-char-is-unsigned.cc', + ], + }, + ], +} diff --git a/deps/gyp/test/win/compiler-flags/disable-specific-warnings.cc b/deps/gyp/test/win/compiler-flags/disable-specific-warnings.cc new file mode 100644 index 0000000000..d312f5f481 --- /dev/null +++ b/deps/gyp/test/win/compiler-flags/disable-specific-warnings.cc @@ -0,0 +1,9 @@ +// Copyright (c) 2013 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. + +int main() { + // Causes level 1 warning (C4700) + int i; + return i; +} diff --git a/deps/gyp/test/win/compiler-flags/disable-specific-warnings.gyp b/deps/gyp/test/win/compiler-flags/disable-specific-warnings.gyp new file mode 100644 index 0000000000..d81d694c62 --- /dev/null +++ b/deps/gyp/test/win/compiler-flags/disable-specific-warnings.gyp @@ -0,0 +1,29 @@ +# Copyright (c) 2013 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. + +{ + 'targets': [ + { + 'target_name': 'test_disable_specific_warnings_set', + 'type': 'executable', + 'msvs_settings': { + 'VCCLCompilerTool': { + 'WarnAsError': 'true', + 'DisableSpecificWarnings': ['4700'] + } + }, + 'sources': ['disable-specific-warnings.cc'] + }, + { + 'target_name': 'test_disable_specific_warnings_unset', + 'type': 'executable', + 'msvs_settings': { + 'VCCLCompilerTool': { + 'WarnAsError': 'true' + } + }, + 'sources': ['disable-specific-warnings.cc'] + }, + ] +} diff --git a/deps/gyp/test/win/compiler-flags/enable-enhanced-instruction-set.cc b/deps/gyp/test/win/compiler-flags/enable-enhanced-instruction-set.cc new file mode 100644 index 0000000000..432ef54eda --- /dev/null +++ b/deps/gyp/test/win/compiler-flags/enable-enhanced-instruction-set.cc @@ -0,0 +1,28 @@ +// Copyright (c) 2014 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. + +#include <stdio.h> + +static const char* GetArchOption() { +#if _M_IX86_FP == 0 + return "IA32"; +#elif _M_IX86_FP == 1 + return "SSE"; +#elif _M_IX86_FP == 2 +# if defined(__AVX2__) + return "AVX2"; +# elif defined(__AVX__) + return "AVX"; +# else + return "SSE2"; +# endif +#else + return "UNSUPPORTED OPTION"; +#endif +} + +int main() { + printf("/arch:%s\n", GetArchOption()); + return 0; +} diff --git a/deps/gyp/test/win/compiler-flags/enable-enhanced-instruction-set.gyp b/deps/gyp/test/win/compiler-flags/enable-enhanced-instruction-set.gyp new file mode 100644 index 0000000000..9c49edc7ff --- /dev/null +++ b/deps/gyp/test/win/compiler-flags/enable-enhanced-instruction-set.gyp @@ -0,0 +1,68 @@ +# Copyright (c) 2014 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. + +{ + 'targets': [ + { + 'target_name': 'sse_extensions', + 'type': 'executable', + 'msvs_settings': { + 'VCCLCompilerTool': { + 'EnableEnhancedInstructionSet': '1', # StreamingSIMDExtensions + } + }, + 'sources': ['enable-enhanced-instruction-set.cc'], + }, + { + 'target_name': 'sse2_extensions', + 'type': 'executable', + 'msvs_settings': { + 'VCCLCompilerTool': { + 'EnableEnhancedInstructionSet': '2', # StreamingSIMDExtensions2 + } + }, + 'sources': ['enable-enhanced-instruction-set.cc'], + }, + ], + 'conditions': [ + ['MSVS_VERSION[0:4]>"2010"', { + 'targets': [ + { + 'target_name': 'avx_extensions', + 'type': 'executable', + 'msvs_settings': { + 'VCCLCompilerTool': { + 'EnableEnhancedInstructionSet': '3', # AdvancedVectorExtensions + } + }, + 'sources': ['enable-enhanced-instruction-set.cc'], + }, + { + 'target_name': 'no_extensions', + 'type': 'executable', + 'msvs_settings': { + 'VCCLCompilerTool': { + 'EnableEnhancedInstructionSet': '4', # NoExtensions + } + }, + 'sources': ['enable-enhanced-instruction-set.cc'], + }, + ], + }], + ['MSVS_VERSION[0:4]>="2013"', { + 'targets': [ + { + 'target_name': 'avx2_extensions', + 'type': 'executable', + 'msvs_settings': { + 'VCCLCompilerTool': { + 'EnableEnhancedInstructionSet': '5', # AdvancedVectorExtensions2 + } + }, + 'sources': ['enable-enhanced-instruction-set.cc'], + }, + ], + }], + ], +} diff --git a/deps/gyp/test/win/compiler-flags/exception-handling-on.cc b/deps/gyp/test/win/compiler-flags/exception-handling-on.cc new file mode 100644 index 0000000000..5d9a3af77d --- /dev/null +++ b/deps/gyp/test/win/compiler-flags/exception-handling-on.cc @@ -0,0 +1,24 @@ +// 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. + +#include <excpt.h> +#include <stdlib.h> + +void fail() { + try { + int i = 0, j = 1; + j /= i; + } catch(...) { + exit(1); + } +} + +int main() { + __try { + fail(); + } __except(EXCEPTION_EXECUTE_HANDLER) { + return 2; + } + return 3; +} diff --git a/deps/gyp/test/win/compiler-flags/exception-handling.gyp b/deps/gyp/test/win/compiler-flags/exception-handling.gyp new file mode 100644 index 0000000000..c266768dda --- /dev/null +++ b/deps/gyp/test/win/compiler-flags/exception-handling.gyp @@ -0,0 +1,46 @@ +# 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. + +{ + 'targets': [ + # Optimization disabled so that the exception-causing code is not removed + # (divide by zero was getting optimized away in VS2010). + { + 'target_name': 'test_eh_off', + 'type': 'executable', + 'msvs_settings': { + 'VCCLCompilerTool': { + 'ExceptionHandling': '0', + 'WarnAsError': 'true', + 'Optimization': '0', + } + }, + 'sources': ['exception-handling-on.cc'], + }, + { + 'target_name': 'test_eh_s', + 'type': 'executable', + 'msvs_settings': { + 'VCCLCompilerTool': { + 'ExceptionHandling': '1', + 'WarnAsError': 'true', + 'Optimization': '0', + } + }, + 'sources': ['exception-handling-on.cc'], + }, + { + 'target_name': 'test_eh_a', + 'type': 'executable', + 'msvs_settings': { + 'VCCLCompilerTool': { + 'ExceptionHandling': '2', + 'WarnAsError': 'true', + 'Optimization': '0', + } + }, + 'sources': ['exception-handling-on.cc'], + }, + ] +} diff --git a/deps/gyp/test/win/compiler-flags/floating-point-model-fast.cc b/deps/gyp/test/win/compiler-flags/floating-point-model-fast.cc new file mode 100644 index 0000000000..9d22152f5e --- /dev/null +++ b/deps/gyp/test/win/compiler-flags/floating-point-model-fast.cc @@ -0,0 +1,19 @@ +// Copyright (c) 2014 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. + +#ifdef _M_FP_PRECISE +#error +#endif + +#ifdef _M_FP_STRICT +#error +#endif + +#ifndef _M_FP_FAST +#error +#endif + +int main() { + return 0; +} diff --git a/deps/gyp/test/win/compiler-flags/floating-point-model-precise.cc b/deps/gyp/test/win/compiler-flags/floating-point-model-precise.cc new file mode 100644 index 0000000000..1191a74ed1 --- /dev/null +++ b/deps/gyp/test/win/compiler-flags/floating-point-model-precise.cc @@ -0,0 +1,19 @@ +// Copyright (c) 2014 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. + +#ifndef _M_FP_PRECISE +#error +#endif + +#ifdef _M_FP_STRICT +#error +#endif + +#ifdef _M_FP_FAST +#error +#endif + +int main() { + return 0; +} diff --git a/deps/gyp/test/win/compiler-flags/floating-point-model-strict.cc b/deps/gyp/test/win/compiler-flags/floating-point-model-strict.cc new file mode 100644 index 0000000000..1ffde36e0c --- /dev/null +++ b/deps/gyp/test/win/compiler-flags/floating-point-model-strict.cc @@ -0,0 +1,19 @@ +// Copyright (c) 2014 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. + +#ifdef _M_FP_PRECISE +#error +#endif + +#ifndef _M_FP_STRICT +#error +#endif + +#ifdef _M_FP_FAST +#error +#endif + +int main() { + return 0; +} diff --git a/deps/gyp/test/win/compiler-flags/floating-point-model.gyp b/deps/gyp/test/win/compiler-flags/floating-point-model.gyp new file mode 100644 index 0000000000..857b275a8f --- /dev/null +++ b/deps/gyp/test/win/compiler-flags/floating-point-model.gyp @@ -0,0 +1,43 @@ +# Copyright (c) 2014 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. + +{ + 'targets': [ + { + 'target_name': 'test-floating-point-model-default', + 'type': 'executable', + 'sources': ['floating-point-model-precise.cc'], + }, + { + 'target_name': 'test-floating-point-model-precise', + 'type': 'executable', + 'msvs_settings': { + 'VCCLCompilerTool': { + 'FloatingPointModel': '0' + } + }, + 'sources': ['floating-point-model-precise.cc'], + }, + { + 'target_name': 'test-floating-point-model-strict', + 'type': 'executable', + 'msvs_settings': { + 'VCCLCompilerTool': { + 'FloatingPointModel': '1' + } + }, + 'sources': ['floating-point-model-strict.cc'], + }, + { + 'target_name': 'test-floating-point-model-fast', + 'type': 'executable', + 'msvs_settings': { + 'VCCLCompilerTool': { + 'FloatingPointModel': '2' + } + }, + 'sources': ['floating-point-model-fast.cc'], + }, + ] +} diff --git a/deps/gyp/test/win/compiler-flags/force-include-files-with-precompiled.cc b/deps/gyp/test/win/compiler-flags/force-include-files-with-precompiled.cc new file mode 100644 index 0000000000..85cb0f32a6 --- /dev/null +++ b/deps/gyp/test/win/compiler-flags/force-include-files-with-precompiled.cc @@ -0,0 +1,10 @@ +// 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. + +#include <stdio.h> + +int main() { + std::string s; + return 0; +} diff --git a/deps/gyp/test/win/compiler-flags/force-include-files.cc b/deps/gyp/test/win/compiler-flags/force-include-files.cc new file mode 100644 index 0000000000..4a93de55d4 --- /dev/null +++ b/deps/gyp/test/win/compiler-flags/force-include-files.cc @@ -0,0 +1,8 @@ +// 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. + +int main() { + std::list<std::vector<std::string> > l; + return 0; +} diff --git a/deps/gyp/test/win/compiler-flags/force-include-files.gyp b/deps/gyp/test/win/compiler-flags/force-include-files.gyp new file mode 100644 index 0000000000..2031546cc5 --- /dev/null +++ b/deps/gyp/test/win/compiler-flags/force-include-files.gyp @@ -0,0 +1,36 @@ +# Copyright (c) 2010 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. + +{ + 'targets': [ + { + 'target_name': 'test_force_include_files', + 'type': 'executable', + 'msvs_settings': { + 'VCCLCompilerTool': { + 'ForcedIncludeFiles': ['string', 'vector', 'list'], + }, + }, + 'sources': [ + 'force-include-files.cc', + ], + }, + { + 'target_name': 'test_force_include_with_precompiled', + 'type': 'executable', + 'msvs_settings': { + 'VCCLCompilerTool': { + 'ForcedIncludeFiles': ['string'], + }, + }, + 'msvs_precompiled_header': 'stdio.h', + 'msvs_precompiled_source': 'precomp.cc', + 'msvs_disabled_warnings': [ 4530, ], + 'sources': [ + 'force-include-files-with-precompiled.cc', + 'precomp.cc', + ], + }, + ], +} diff --git a/deps/gyp/test/win/compiler-flags/function-level-linking.cc b/deps/gyp/test/win/compiler-flags/function-level-linking.cc new file mode 100644 index 0000000000..4952272817 --- /dev/null +++ b/deps/gyp/test/win/compiler-flags/function-level-linking.cc @@ -0,0 +1,11 @@ +// 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. + +int comdat_function() { + return 1; +} + +int main() { + return 0; +} diff --git a/deps/gyp/test/win/compiler-flags/function-level-linking.gyp b/deps/gyp/test/win/compiler-flags/function-level-linking.gyp new file mode 100644 index 0000000000..5858586a24 --- /dev/null +++ b/deps/gyp/test/win/compiler-flags/function-level-linking.gyp @@ -0,0 +1,28 @@ +# 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. + +{ + 'targets': [ + { + 'target_name': 'test_fll_off', + 'type': 'executable', + 'msvs_settings': { + 'VCCLCompilerTool': { + 'EnableFunctionLevelLinking': 'false' + } + }, + 'sources': ['function-level-linking.cc'], + }, + { + 'target_name': 'test_fll_on', + 'type': 'executable', + 'msvs_settings': { + 'VCCLCompilerTool': { + 'EnableFunctionLevelLinking': 'true', + } + }, + 'sources': ['function-level-linking.cc'], + }, + ] +} diff --git a/deps/gyp/test/win/compiler-flags/hello.cc b/deps/gyp/test/win/compiler-flags/hello.cc new file mode 100644 index 0000000000..1711567ef5 --- /dev/null +++ b/deps/gyp/test/win/compiler-flags/hello.cc @@ -0,0 +1,7 @@ +// 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. + +int main() { + return 0; +} diff --git a/deps/gyp/test/win/compiler-flags/optimizations.gyp b/deps/gyp/test/win/compiler-flags/optimizations.gyp new file mode 100644 index 0000000000..e63096f0f7 --- /dev/null +++ b/deps/gyp/test/win/compiler-flags/optimizations.gyp @@ -0,0 +1,207 @@ +# 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. + +{ + 'targets': [ + { + 'target_name': 'test_opt_off', + 'type': 'executable', + 'msvs_settings': { + 'VCCLCompilerTool': { + 'Optimization': '0' + } + }, + 'sources': ['hello.cc'], + }, + { + 'target_name': 'test_opt_lev_size', + 'type': 'executable', + 'msvs_settings': { + 'VCCLCompilerTool': { + 'Optimization': '1' + } + }, + 'sources': ['hello.cc'], + }, + { + 'target_name': 'test_opt_lev_speed', + 'type': 'executable', + 'msvs_settings': { + 'VCCLCompilerTool': { + 'Optimization': '2' + } + }, + 'sources': ['hello.cc'], + }, + { + 'target_name': 'test_opt_lev_max', + 'type': 'executable', + 'msvs_settings': { + 'VCCLCompilerTool': { + 'Optimization': '3' + } + }, + 'sources': ['hello.cc'], + }, + { + 'target_name': 'test_opt_unset', + 'type': 'executable', + 'msvs_settings': { + 'VCCLCompilerTool': { + } + }, + 'sources': ['hello.cc'], + }, + { + 'target_name': 'test_opt_fpo', + 'type': 'executable', + 'msvs_settings': { + 'VCCLCompilerTool': { + 'OmitFramePointers': 'true' + } + }, + 'sources': ['hello.cc'], + }, + { + 'target_name': 'test_opt_fpo_off', + 'type': 'executable', + 'msvs_settings': { + 'VCCLCompilerTool': { + 'OmitFramePointers': 'false' + } + }, + 'sources': ['hello.cc'], + }, + { + 'target_name': 'test_opt_intrinsic', + 'type': 'executable', + 'msvs_settings': { + 'VCCLCompilerTool': { + 'EnableIntrinsicFunctions': 'true' + } + }, + 'sources': ['hello.cc'], + }, + { + 'target_name': 'test_opt_intrinsic_off', + 'type': 'executable', + 'msvs_settings': { + 'VCCLCompilerTool': { + 'EnableIntrinsicFunctions': 'false' + } + }, + 'sources': ['hello.cc'], + }, + { + 'target_name': 'test_opt_inline_off', + 'type': 'executable', + 'msvs_settings': { + 'VCCLCompilerTool': { + 'InlineFunctionExpansion': '0' + } + }, + 'sources': ['hello.cc'], + }, + { + 'target_name': 'test_opt_inline_manual', + 'type': 'executable', + 'msvs_settings': { + 'VCCLCompilerTool': { + 'InlineFunctionExpansion': '1' + } + }, + 'sources': ['hello.cc'], + }, + { + 'target_name': 'test_opt_inline_auto', + 'type': 'executable', + 'msvs_settings': { + 'VCCLCompilerTool': { + 'InlineFunctionExpansion': '2' + } + }, + 'sources': ['hello.cc'], + }, + { + 'target_name': 'test_opt_neither', + 'type': 'executable', + 'msvs_settings': { + 'VCCLCompilerTool': { + 'FavorSizeOrSpeed': '0' + } + }, + 'sources': ['hello.cc'], + }, + { + 'target_name': 'test_opt_speed', + 'type': 'executable', + 'msvs_settings': { + 'VCCLCompilerTool': { + 'FavorSizeOrSpeed': '1' + } + }, + 'sources': ['hello.cc'], + }, + { + 'target_name': 'test_opt_size', + 'type': 'executable', + 'msvs_settings': { + 'VCCLCompilerTool': { + 'FavorSizeOrSpeed': '2' + } + }, + 'sources': ['hello.cc'], + }, + { + 'target_name': 'test_opt_wpo', + 'type': 'executable', + 'msvs_settings': { + 'VCCLCompilerTool': { + 'WholeProgramOptimization': 'true' + } + }, + 'sources': ['hello.cc'], + }, + { + 'target_name': 'test_opt_sp', + 'type': 'executable', + 'msvs_settings': { + 'VCCLCompilerTool': { + 'StringPooling': 'true' + } + }, + 'sources': ['hello.cc'], + }, + { + 'target_name': 'test_opt_sp_off', + 'type': 'executable', + 'msvs_settings': { + 'VCCLCompilerTool': { + 'StringPooling': 'false' + } + }, + 'sources': ['hello.cc'], + }, + { + 'target_name': 'test_opt_fso', + 'type': 'executable', + 'msvs_settings': { + 'VCCLCompilerTool': { + 'EnableFiberSafeOptimizations': 'true' + } + }, + 'sources': ['hello.cc'], + }, + { + 'target_name': 'test_opt_fso_off', + 'type': 'executable', + 'msvs_settings': { + 'VCCLCompilerTool': { + 'EnableFiberSafeOptimizations': 'false' + } + }, + 'sources': ['hello.cc'], + }, + ] +} diff --git a/deps/gyp/test/win/compiler-flags/pdbname-override.gyp b/deps/gyp/test/win/compiler-flags/pdbname-override.gyp new file mode 100644 index 0000000000..dad20e01fd --- /dev/null +++ b/deps/gyp/test/win/compiler-flags/pdbname-override.gyp @@ -0,0 +1,26 @@ +# Copyright (c) 2013 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. + +{ + 'targets': [ + { + 'target_name': 'test_pdbname', + 'type': 'executable', + 'sources': [ + 'hello.cc', + 'pdbname.cc', + ], + 'msvs_settings': { + 'VCCLCompilerTool': { + 'DebugInformationFormat': '3', + 'ProgramDataBaseFileName': '<(PRODUCT_DIR)/compiler_generated.pdb', + }, + 'VCLinkerTool': { + 'GenerateDebugInformation': 'true', + 'ProgramDatabaseFile': '<(PRODUCT_DIR)/linker_generated.pdb', + }, + }, + }, + ] +} diff --git a/deps/gyp/test/win/compiler-flags/pdbname.cc b/deps/gyp/test/win/compiler-flags/pdbname.cc new file mode 100644 index 0000000000..0fe05d5afb --- /dev/null +++ b/deps/gyp/test/win/compiler-flags/pdbname.cc @@ -0,0 +1,7 @@ +// 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. + +int some_function() { + return 0; +} diff --git a/deps/gyp/test/win/compiler-flags/pdbname.gyp b/deps/gyp/test/win/compiler-flags/pdbname.gyp new file mode 100644 index 0000000000..8fcf754727 --- /dev/null +++ b/deps/gyp/test/win/compiler-flags/pdbname.gyp @@ -0,0 +1,24 @@ +# 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. + +{ + 'targets': [ + { + 'target_name': 'test_pdbname', + 'type': 'executable', + 'sources': [ + 'hello.cc', + 'pdbname.cc', + ], + 'msvs_settings': { + 'VCCLCompilerTool': { + 'DebugInformationFormat': '3', + }, + 'VCLinkerTool': { + 'GenerateDebugInformation': 'true', + }, + }, + }, + ] +} diff --git a/deps/gyp/test/win/compiler-flags/precomp.cc b/deps/gyp/test/win/compiler-flags/precomp.cc new file mode 100644 index 0000000000..d16bac890f --- /dev/null +++ b/deps/gyp/test/win/compiler-flags/precomp.cc @@ -0,0 +1,6 @@ +// Copyright 2013 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. + +#include <windows.h> +#include <stdio.h> diff --git a/deps/gyp/test/win/compiler-flags/rtti-on.cc b/deps/gyp/test/win/compiler-flags/rtti-on.cc new file mode 100644 index 0000000000..2d3ad03ae4 --- /dev/null +++ b/deps/gyp/test/win/compiler-flags/rtti-on.cc @@ -0,0 +1,11 @@ +// 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. + +#ifndef _CPPRTTI +#error +#endif + +int main() { + return 0; +} diff --git a/deps/gyp/test/win/compiler-flags/rtti.gyp b/deps/gyp/test/win/compiler-flags/rtti.gyp new file mode 100644 index 0000000000..704cd58f5a --- /dev/null +++ b/deps/gyp/test/win/compiler-flags/rtti.gyp @@ -0,0 +1,37 @@ +# 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. + +{ + 'targets': [ + { + 'target_name': 'test_rtti_off', + 'type': 'executable', + 'msvs_settings': { + 'VCCLCompilerTool': { + 'RuntimeTypeInfo': 'false', + 'WarnAsError': 'true' + } + }, + 'sources': ['rtti-on.cc'], + }, + { + 'target_name': 'test_rtti_on', + 'type': 'executable', + 'msvs_settings': { + 'VCCLCompilerTool': { + 'RuntimeTypeInfo': 'true', + 'WarnAsError': 'true' + } + }, + 'sources': ['rtti-on.cc'], + }, + { + 'target_name': 'test_rtti_unset', + 'type': 'executable', + 'msvs_settings': { + }, + 'sources': ['rtti-on.cc'], + }, + ] +} diff --git a/deps/gyp/test/win/compiler-flags/runtime-checks.cc b/deps/gyp/test/win/compiler-flags/runtime-checks.cc new file mode 100644 index 0000000000..fdb811da87 --- /dev/null +++ b/deps/gyp/test/win/compiler-flags/runtime-checks.cc @@ -0,0 +1,11 @@ +// 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. + +#ifndef __MSVC_RUNTIME_CHECKS +#error +#endif + +int main() { + return 0; +} diff --git a/deps/gyp/test/win/compiler-flags/runtime-checks.gyp b/deps/gyp/test/win/compiler-flags/runtime-checks.gyp new file mode 100644 index 0000000000..8ea3092057 --- /dev/null +++ b/deps/gyp/test/win/compiler-flags/runtime-checks.gyp @@ -0,0 +1,29 @@ +# 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. + +{ + 'targets': [ + { + 'target_name': 'test_brc_none', + 'type': 'executable', + 'msvs_settings': { + 'VCCLCompilerTool': { + 'Optimization': '0', + } + }, + 'sources': ['runtime-checks.cc'], + }, + { + 'target_name': 'test_brc_1', + 'type': 'executable', + 'msvs_settings': { + 'VCCLCompilerTool': { + 'Optimization': '0', + 'BasicRuntimeChecks': '3' + } + }, + 'sources': ['runtime-checks.cc'], + }, + ] +} diff --git a/deps/gyp/test/win/compiler-flags/runtime-library-md.cc b/deps/gyp/test/win/compiler-flags/runtime-library-md.cc new file mode 100644 index 0000000000..87c83021d4 --- /dev/null +++ b/deps/gyp/test/win/compiler-flags/runtime-library-md.cc @@ -0,0 +1,19 @@ +// 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. + +#ifndef _MT +#error +#endif + +#ifdef _DEBUG +#error +#endif + +#ifndef _DLL +#error +#endif + +int main() { + return 0; +} diff --git a/deps/gyp/test/win/compiler-flags/runtime-library-mdd.cc b/deps/gyp/test/win/compiler-flags/runtime-library-mdd.cc new file mode 100644 index 0000000000..9f175e493e --- /dev/null +++ b/deps/gyp/test/win/compiler-flags/runtime-library-mdd.cc @@ -0,0 +1,19 @@ +// 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. + +#ifndef _MT +#error +#endif + +#ifndef _DEBUG +#error +#endif + +#ifndef _DLL +#error +#endif + +int main() { + return 0; +} diff --git a/deps/gyp/test/win/compiler-flags/runtime-library-mt.cc b/deps/gyp/test/win/compiler-flags/runtime-library-mt.cc new file mode 100644 index 0000000000..27e62b63db --- /dev/null +++ b/deps/gyp/test/win/compiler-flags/runtime-library-mt.cc @@ -0,0 +1,19 @@ +// 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. + +#ifndef _MT +#error +#endif + +#ifdef _DEBUG +#error +#endif + +#ifdef _DLL +#error +#endif + +int main() { + return 0; +} diff --git a/deps/gyp/test/win/compiler-flags/runtime-library-mtd.cc b/deps/gyp/test/win/compiler-flags/runtime-library-mtd.cc new file mode 100644 index 0000000000..a9921db9e2 --- /dev/null +++ b/deps/gyp/test/win/compiler-flags/runtime-library-mtd.cc @@ -0,0 +1,19 @@ +// 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. + +#ifndef _MT +#error +#endif + +#ifndef _DEBUG +#error +#endif + +#ifdef _DLL +#error +#endif + +int main() { + return 0; +} diff --git a/deps/gyp/test/win/compiler-flags/runtime-library.gyp b/deps/gyp/test/win/compiler-flags/runtime-library.gyp new file mode 100644 index 0000000000..04afc391c7 --- /dev/null +++ b/deps/gyp/test/win/compiler-flags/runtime-library.gyp @@ -0,0 +1,48 @@ +# 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. + +{ + 'targets': [ + { + 'target_name': 'test_rl_md', + 'type': 'executable', + 'msvs_settings': { + 'VCCLCompilerTool': { + 'RuntimeLibrary': '2' + } + }, + 'sources': ['runtime-library-md.cc'], + }, + { + 'target_name': 'test_rl_mdd', + 'type': 'executable', + 'msvs_settings': { + 'VCCLCompilerTool': { + 'RuntimeLibrary': '3' + } + }, + 'sources': ['runtime-library-mdd.cc'], + }, + { + 'target_name': 'test_rl_mt', + 'type': 'executable', + 'msvs_settings': { + 'VCCLCompilerTool': { + 'RuntimeLibrary': '0' + } + }, + 'sources': ['runtime-library-mt.cc'], + }, + { + 'target_name': 'test_rl_mtd', + 'type': 'executable', + 'msvs_settings': { + 'VCCLCompilerTool': { + 'RuntimeLibrary': '1' + } + }, + 'sources': ['runtime-library-mtd.cc'], + }, + ] +} diff --git a/deps/gyp/test/win/compiler-flags/subdir/header.h b/deps/gyp/test/win/compiler-flags/subdir/header.h new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/deps/gyp/test/win/compiler-flags/subdir/header.h diff --git a/deps/gyp/test/win/compiler-flags/treat-wchar-t-as-built-in-type.gyp b/deps/gyp/test/win/compiler-flags/treat-wchar-t-as-built-in-type.gyp new file mode 100644 index 0000000000..456fe047d0 --- /dev/null +++ b/deps/gyp/test/win/compiler-flags/treat-wchar-t-as-built-in-type.gyp @@ -0,0 +1,33 @@ +# Copyright (c) 2010 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. + +{ + 'targets': [ + { + 'target_name': 'test_treat_wchar_t_as_built_in_type_negative', + 'type': 'executable', + 'msvs_settings': { + 'VCCLCompilerTool': { + 'TreatWChar_tAsBuiltInType': 'false', + }, + }, + 'sources': [ + 'treat-wchar-t-as-built-in-type1.cc', + ], + }, + { + 'target_name': 'test_treat_wchar_t_as_built_in_type_positive', + 'type': 'executable', + 'msvs_settings': { + 'VCCLCompilerTool': { + 'TreatWChar_tAsBuiltInType': 'true', + }, + }, + 'sources': [ + 'treat-wchar-t-as-built-in-type2.cc', + ], + }, + + ], +} diff --git a/deps/gyp/test/win/compiler-flags/treat-wchar-t-as-built-in-type1.cc b/deps/gyp/test/win/compiler-flags/treat-wchar-t-as-built-in-type1.cc new file mode 100644 index 0000000000..fc1ed0b7ea --- /dev/null +++ b/deps/gyp/test/win/compiler-flags/treat-wchar-t-as-built-in-type1.cc @@ -0,0 +1,11 @@ +// 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. + +#ifdef _NATIVE_WCHAR_T_DEFINED +#error +#endif + +int main() { + return 0; +} diff --git a/deps/gyp/test/win/compiler-flags/treat-wchar-t-as-built-in-type2.cc b/deps/gyp/test/win/compiler-flags/treat-wchar-t-as-built-in-type2.cc new file mode 100644 index 0000000000..28ab94f742 --- /dev/null +++ b/deps/gyp/test/win/compiler-flags/treat-wchar-t-as-built-in-type2.cc @@ -0,0 +1,11 @@ +// 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. + +#ifndef _NATIVE_WCHAR_T_DEFINED +#error +#endif + +int main() { + return 0; +} diff --git a/deps/gyp/test/win/compiler-flags/uninit.cc b/deps/gyp/test/win/compiler-flags/uninit.cc new file mode 100644 index 0000000000..a9d5f5d483 --- /dev/null +++ b/deps/gyp/test/win/compiler-flags/uninit.cc @@ -0,0 +1,13 @@ +// 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. + +// Should trigger C6001: using uninitialized memory <variable> for |i|. +int f(bool b) { + int i; + if (b) + i = 0; + return i; +} + +int main() {} diff --git a/deps/gyp/test/win/compiler-flags/warning-as-error.cc b/deps/gyp/test/win/compiler-flags/warning-as-error.cc new file mode 100644 index 0000000000..fd2130aca5 --- /dev/null +++ b/deps/gyp/test/win/compiler-flags/warning-as-error.cc @@ -0,0 +1,9 @@ +// 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. + +int main() { + // Cause a warning, even at /W1 + int export; + return 0; +} diff --git a/deps/gyp/test/win/compiler-flags/warning-as-error.gyp b/deps/gyp/test/win/compiler-flags/warning-as-error.gyp new file mode 100644 index 0000000000..d71f261141 --- /dev/null +++ b/deps/gyp/test/win/compiler-flags/warning-as-error.gyp @@ -0,0 +1,37 @@ +# 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. + +{ + 'targets': [ + { + 'target_name': 'test_warn_as_error_false', + 'type': 'executable', + 'msvs_settings': { + 'VCCLCompilerTool': { + 'WarnAsError': 'false' + } + }, + 'sources': ['warning-as-error.cc'] + }, + { + 'target_name': 'test_warn_as_error_true', + 'type': 'executable', + 'msvs_settings': { + 'VCCLCompilerTool': { + 'WarnAsError': 'true' + } + }, + 'sources': ['warning-as-error.cc'] + }, + { + 'target_name': 'test_warn_as_error_unset', + 'type': 'executable', + 'msvs_settings': { + 'VCCLCompilerTool': { + } + }, + 'sources': ['warning-as-error.cc'] + }, + ] +} diff --git a/deps/gyp/test/win/compiler-flags/warning-level.gyp b/deps/gyp/test/win/compiler-flags/warning-level.gyp new file mode 100644 index 0000000000..2297aa7cac --- /dev/null +++ b/deps/gyp/test/win/compiler-flags/warning-level.gyp @@ -0,0 +1,115 @@ +# 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. + +{ + 'targets': [ + # Level 1 + { + 'target_name': 'test_wl1_fail', + 'type': 'executable', + 'msvs_settings': { + 'VCCLCompilerTool': { + 'WarningLevel': '1', + 'WarnAsError': 'true', + } + }, + 'sources': ['warning-level1.cc'], + }, + { + 'target_name': 'test_wl1_pass', + 'type': 'executable', + 'msvs_settings': { + 'VCCLCompilerTool': { + 'WarningLevel': '1', + 'WarnAsError': 'true', + } + }, + 'sources': ['warning-level2.cc'], + }, + + # Level 2 + { + 'target_name': 'test_wl2_fail', + 'type': 'executable', + 'msvs_settings': { + 'VCCLCompilerTool': { + 'WarningLevel': '2', + 'WarnAsError': 'true', + } + }, + 'sources': ['warning-level2.cc'], + }, + { + 'target_name': 'test_wl2_pass', + 'type': 'executable', + 'msvs_settings': { + 'VCCLCompilerTool': { + 'WarningLevel': '2', + 'WarnAsError': 'true', + } + }, + 'sources': ['warning-level3.cc'], + }, + + # Level 3 + { + 'target_name': 'test_wl3_fail', + 'type': 'executable', + 'msvs_settings': { + 'VCCLCompilerTool': { + 'WarningLevel': '3', + 'WarnAsError': 'true', + } + }, + 'sources': ['warning-level3.cc'], + }, + { + 'target_name': 'test_wl3_pass', + 'type': 'executable', + 'msvs_settings': { + 'VCCLCompilerTool': { + 'WarningLevel': '3', + 'WarnAsError': 'true', + } + }, + 'sources': ['warning-level4.cc'], + }, + + + # Level 4 + { + 'target_name': 'test_wl4_fail', + 'type': 'executable', + 'msvs_settings': { + 'VCCLCompilerTool': { + 'WarningLevel': '4', + 'WarnAsError': 'true', + } + }, + 'sources': ['warning-level4.cc'], + }, + + # Default level + { + 'target_name': 'test_def_fail', + 'type': 'executable', + 'msvs_settings': { + 'VCCLCompilerTool': { + 'WarnAsError': 'true', + } + }, + 'sources': ['warning-level1.cc'], + }, + { + 'target_name': 'test_def_pass', + 'type': 'executable', + 'msvs_settings': { + 'VCCLCompilerTool': { + } + }, + 'sources': ['warning-level2.cc'], + }, + + ] +} diff --git a/deps/gyp/test/win/compiler-flags/warning-level1.cc b/deps/gyp/test/win/compiler-flags/warning-level1.cc new file mode 100644 index 0000000000..119578d694 --- /dev/null +++ b/deps/gyp/test/win/compiler-flags/warning-level1.cc @@ -0,0 +1,8 @@ +// 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. + +int main() { + int export; // Cause a level 1 warning (C4237). + return 0; +} diff --git a/deps/gyp/test/win/compiler-flags/warning-level2.cc b/deps/gyp/test/win/compiler-flags/warning-level2.cc new file mode 100644 index 0000000000..9a26703180 --- /dev/null +++ b/deps/gyp/test/win/compiler-flags/warning-level2.cc @@ -0,0 +1,14 @@ +// 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. + +int f(int x) { + return 0; +} + +int main() { + double x = 10.1; + // Cause a level 2 warning (C4243). + return f(x); + return 0; +} diff --git a/deps/gyp/test/win/compiler-flags/warning-level3.cc b/deps/gyp/test/win/compiler-flags/warning-level3.cc new file mode 100644 index 0000000000..e0a9f3cdd9 --- /dev/null +++ b/deps/gyp/test/win/compiler-flags/warning-level3.cc @@ -0,0 +1,11 @@ +// 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. + +// Cause a level 3 warning (C4359). +struct __declspec(align(8)) C8 { __int64 i; }; +struct __declspec(align(4)) C4 { C8 m8; }; + +int main() { + return 0; +} diff --git a/deps/gyp/test/win/compiler-flags/warning-level4.cc b/deps/gyp/test/win/compiler-flags/warning-level4.cc new file mode 100644 index 0000000000..48a4fb7018 --- /dev/null +++ b/deps/gyp/test/win/compiler-flags/warning-level4.cc @@ -0,0 +1,10 @@ +// 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. + +int main() { + const int i = -1; + // Cause a level 4 warning (C4245). + unsigned int j = i; + return 0; +} diff --git a/deps/gyp/test/win/enable-winrt/dllmain.cc b/deps/gyp/test/win/enable-winrt/dllmain.cc new file mode 100644 index 0000000000..dedd83c3f6 --- /dev/null +++ b/deps/gyp/test/win/enable-winrt/dllmain.cc @@ -0,0 +1,30 @@ +// Copyright (c) 2013 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. + +#include <windows.h> +#include <wrl.h> +#include <wrl/wrappers/corewrappers.h> +#include <windows.graphics.display.h> + +using namespace Microsoft::WRL; +using namespace Microsoft::WRL::Wrappers; +using namespace ABI::Windows::Foundation; +using namespace ABI::Windows::Graphics::Display; + +bool TryToUseSomeWinRT() { + ComPtr<IDisplayPropertiesStatics> dp; + HStringReference s(RuntimeClass_Windows_Graphics_Display_DisplayProperties); + HRESULT hr = GetActivationFactory(s.Get(), dp.GetAddressOf()); + if (SUCCEEDED(hr)) { + float dpi = 96.0f; + if (SUCCEEDED(dp->get_LogicalDpi(&dpi))) { + return true; + } + } + return false; +} + +BOOL WINAPI DllMain(HINSTANCE hinstance, DWORD reason, LPVOID reserved) { + return TRUE; +} diff --git a/deps/gyp/test/win/enable-winrt/enable-winrt.gyp b/deps/gyp/test/win/enable-winrt/enable-winrt.gyp new file mode 100644 index 0000000000..69f70189db --- /dev/null +++ b/deps/gyp/test/win/enable-winrt/enable-winrt.gyp @@ -0,0 +1,39 @@ +# Copyright (c) 2013 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. + +{ + 'targets': [ + { + 'target_name': 'enable_winrt_dll', + 'type': 'shared_library', + 'msvs_enable_winrt': 1, + 'sources': [ + 'dllmain.cc', + ], + }, + { + 'target_name': 'enable_winrt_missing_dll', + 'type': 'shared_library', + 'sources': [ + 'dllmain.cc', + ], + }, + { + 'target_name': 'enable_winrt_winphone_dll', + 'type': 'shared_library', + 'msvs_enable_winrt': 1, + 'msvs_enable_winphone': 1, + 'sources': [ + 'dllmain.cc', + ], + 'msvs_settings': { + 'VCLinkerTool': { + 'AdditionalDependencies': [ + '%(AdditionalDependencies)', + ], + }, + }, + }, + ] +} diff --git a/deps/gyp/test/win/generator-output-different-drive/gyptest-generator-output-different-drive.py b/deps/gyp/test/win/generator-output-different-drive/gyptest-generator-output-different-drive.py new file mode 100644 index 0000000000..8c8c365d5e --- /dev/null +++ b/deps/gyp/test/win/generator-output-different-drive/gyptest-generator-output-different-drive.py @@ -0,0 +1,44 @@ +#!/usr/bin/env python + +# Copyright (c) 2013 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. + +""" +Test that the generator output can be written to a different drive on Windows. +""" + +import os +import TestGyp +import string +import subprocess +import sys + + +if sys.platform == 'win32': + import win32api + + test = TestGyp.TestGyp(formats=['msvs', 'ninja']) + + def GetFirstFreeDriveLetter(): + """ Returns the first unused Windows drive letter in [A, Z] """ + all_letters = [c for c in string.uppercase] + in_use = win32api.GetLogicalDriveStrings() + free = list(set(all_letters) - set(in_use)) + return free[0] + + output_dir = os.path.join('different-drive', 'output') + if not os.path.isdir(os.path.abspath(output_dir)): + os.makedirs(os.path.abspath(output_dir)) + output_drive = GetFirstFreeDriveLetter() + subprocess.call(['subst', '%c:' % output_drive, os.path.abspath(output_dir)]) + try: + test.run_gyp('prog.gyp', '--generator-output=%s' % ( + os.path.join(output_drive, 'output'))) + test.build('prog.gyp', test.ALL, chdir=os.path.join(output_drive, 'output')) + test.built_file_must_exist('program', chdir=os.path.join(output_drive, + 'output'), + type=test.EXECUTABLE) + test.pass_test() + finally: + subprocess.call(['subst', '%c:' % output_drive, '/D']) diff --git a/deps/gyp/test/win/generator-output-different-drive/prog.c b/deps/gyp/test/win/generator-output-different-drive/prog.c new file mode 100644 index 0000000000..7937f5d07a --- /dev/null +++ b/deps/gyp/test/win/generator-output-different-drive/prog.c @@ -0,0 +1,10 @@ +// Copyright 2013 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include <stdio.h> + +int main(void) { + printf("Hello from prog.c\n"); + return 0; +} diff --git a/deps/gyp/test/win/generator-output-different-drive/prog.gyp b/deps/gyp/test/win/generator-output-different-drive/prog.gyp new file mode 100644 index 0000000000..92f53e5da5 --- /dev/null +++ b/deps/gyp/test/win/generator-output-different-drive/prog.gyp @@ -0,0 +1,15 @@ +# Copyright 2013 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +{ + 'targets': [ + { + 'target_name': 'program', + 'type': 'executable', + 'sources': [ + 'prog.c', + ], + }, + ], +} diff --git a/deps/gyp/test/win/gyptest-asm-files.py b/deps/gyp/test/win/gyptest-asm-files.py new file mode 100644 index 0000000000..007b52eb26 --- /dev/null +++ b/deps/gyp/test/win/gyptest-asm-files.py @@ -0,0 +1,26 @@ +#!/usr/bin/env python + +# 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. + +""" +Make sure .s files aren't passed to cl. +""" + +import TestGyp + +import sys + +if sys.platform == 'win32': + test = TestGyp.TestGyp(formats=['msvs', 'ninja']) + + CHDIR = 'asm-files' + test.run_gyp('asm-files.gyp', chdir=CHDIR) + # The compiler will error out if it's passed the .s files, so just make sure + # the build succeeds. The compiler doesn't directly support building + # assembler files on Windows, they have to be built explicitly with a + # third-party tool. + test.build('asm-files.gyp', test.ALL, chdir=CHDIR) + + test.pass_test() diff --git a/deps/gyp/test/win/gyptest-cl-additional-include-dirs.py b/deps/gyp/test/win/gyptest-cl-additional-include-dirs.py new file mode 100644 index 0000000000..1fabfa9752 --- /dev/null +++ b/deps/gyp/test/win/gyptest-cl-additional-include-dirs.py @@ -0,0 +1,22 @@ +#!/usr/bin/env python + +# 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. + +""" +Make sure additional include dirs are extracted properly. +""" + +import TestGyp + +import sys + +if sys.platform == 'win32': + test = TestGyp.TestGyp(formats=['msvs', 'ninja']) + + CHDIR = 'compiler-flags' + test.run_gyp('additional-include-dirs.gyp', chdir=CHDIR) + test.build('additional-include-dirs.gyp', test.ALL, chdir=CHDIR) + + test.pass_test() diff --git a/deps/gyp/test/win/gyptest-cl-additional-options.py b/deps/gyp/test/win/gyptest-cl-additional-options.py new file mode 100644 index 0000000000..e9aea10dc9 --- /dev/null +++ b/deps/gyp/test/win/gyptest-cl-additional-options.py @@ -0,0 +1,28 @@ +#!/usr/bin/env python + +# 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. + +""" +Make sure additional manual compiler flags are extracted properly. +""" + +import TestGyp + +import sys + +if sys.platform == 'win32': + test = TestGyp.TestGyp(formats=['msvs', 'ninja']) + + CHDIR = 'compiler-flags' + test.run_gyp('additional-options.gyp', chdir=CHDIR) + + # Warning level not overidden, must fail. + test.build('additional-options.gyp', 'test_additional_none', chdir=CHDIR, + status=1) + + # Warning level is overridden, must succeed. + test.build('additional-options.gyp', 'test_additional_one', chdir=CHDIR) + + test.pass_test() diff --git a/deps/gyp/test/win/gyptest-cl-analysis.py b/deps/gyp/test/win/gyptest-cl-analysis.py new file mode 100644 index 0000000000..7b3b9897f5 --- /dev/null +++ b/deps/gyp/test/win/gyptest-cl-analysis.py @@ -0,0 +1,30 @@ +#!/usr/bin/env python + +# 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. + +""" +Make sure PREfast (code analysis) setting is extracted properly. +""" + +import TestGyp + +import os +import sys + +if (sys.platform == 'win32' and + int(os.environ.get('GYP_MSVS_VERSION', 0)) >= 2012): + test = TestGyp.TestGyp(formats=['msvs', 'ninja']) + + CHDIR = 'compiler-flags' + test.run_gyp('analysis.gyp', chdir=CHDIR) + + # Analysis enabled, should fail. + test.build('analysis.gyp', 'test_analysis_on', chdir=CHDIR, status=1) + + # Analysis not enabled, or unspecified, should pass. + test.build('analysis.gyp', 'test_analysis_off', chdir=CHDIR) + test.build('analysis.gyp', 'test_analysis_unspec', chdir=CHDIR) + + test.pass_test() diff --git a/deps/gyp/test/win/gyptest-cl-buffer-security-check.py b/deps/gyp/test/win/gyptest-cl-buffer-security-check.py new file mode 100644 index 0000000000..e22869c3d3 --- /dev/null +++ b/deps/gyp/test/win/gyptest-cl-buffer-security-check.py @@ -0,0 +1,53 @@ +#!/usr/bin/env python + +# 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. + +""" +Make sure buffer security check setting is extracted properly. +""" + +import TestGyp + +import sys + +if sys.platform == 'win32': + test = TestGyp.TestGyp(formats=['msvs', 'ninja']) + + CHDIR = 'compiler-flags' + test.run_gyp('buffer-security-check.gyp', chdir=CHDIR) + test.build('buffer-security-check.gyp', chdir=CHDIR) + + def GetDisassemblyOfMain(exe): + # The standard library uses buffer security checks independent of our + # buffer security settings, so we extract just our code (i.e. main()) to + # check against. + full_path = test.built_file_path(exe, chdir=CHDIR) + output = test.run_dumpbin('/disasm', full_path) + result = [] + in_main = False + for line in output.splitlines(): + if line == '_main:': + in_main = True + elif in_main: + # Disassembly of next function starts. + if line.startswith('_'): + break + result.append(line) + return '\n'.join(result) + + # Buffer security checks are on by default, make sure security_cookie + # appears in the disassembly of our code. + if 'security_cookie' not in GetDisassemblyOfMain('test_bsc_unset.exe'): + test.fail_test() + + # Explicitly on. + if 'security_cookie' not in GetDisassemblyOfMain('test_bsc_on.exe'): + test.fail_test() + + # Explicitly off, shouldn't be a reference to the security cookie. + if 'security_cookie' in GetDisassemblyOfMain('test_bsc_off.exe'): + test.fail_test() + + test.pass_test() diff --git a/deps/gyp/test/win/gyptest-cl-calling-convention.py b/deps/gyp/test/win/gyptest-cl-calling-convention.py new file mode 100644 index 0000000000..b5fdc47744 --- /dev/null +++ b/deps/gyp/test/win/gyptest-cl-calling-convention.py @@ -0,0 +1,22 @@ +#!/usr/bin/env python + +# Copyright (c) 2014 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. + +""" +Make sure calling convention setting is extracted properly. +""" + +import TestGyp + +import sys + +if sys.platform == 'win32': + test = TestGyp.TestGyp(formats=['msvs', 'ninja']) + + CHDIR = 'compiler-flags' + test.run_gyp('calling-convention.gyp', chdir=CHDIR) + test.build('calling-convention.gyp', test.ALL, chdir=CHDIR) + + test.pass_test() diff --git a/deps/gyp/test/win/gyptest-cl-character-set.py b/deps/gyp/test/win/gyptest-cl-character-set.py new file mode 100644 index 0000000000..7fabb6722a --- /dev/null +++ b/deps/gyp/test/win/gyptest-cl-character-set.py @@ -0,0 +1,22 @@ +#!/usr/bin/env python + +# 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. + +""" +Make sure character set setting is extracted properly. +""" + +import TestGyp + +import sys + +if sys.platform == 'win32': + test = TestGyp.TestGyp(formats=['msvs', 'ninja']) + + CHDIR = 'compiler-flags' + test.run_gyp('character-set.gyp', chdir=CHDIR) + test.build('character-set.gyp', test.ALL, chdir=CHDIR) + + test.pass_test() diff --git a/deps/gyp/test/win/gyptest-cl-compile-as-managed.py b/deps/gyp/test/win/gyptest-cl-compile-as-managed.py new file mode 100644 index 0000000000..0d7b420485 --- /dev/null +++ b/deps/gyp/test/win/gyptest-cl-compile-as-managed.py @@ -0,0 +1,24 @@ +#!/usr/bin/env python + +# Copyright (c) 2015 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. + +""" +Make sure compile as managed (clr) settings are extracted properly. +""" + +import TestGyp + +import sys + +if sys.platform == 'win32': + test = TestGyp.TestGyp() + + CHDIR = 'compiler-flags' + test.run_gyp('compile-as-managed.gyp', chdir=CHDIR) + test.build('compile-as-managed.gyp', "test-compile-as-managed", chdir=CHDIR) + # Must fail. + test.build('compile-as-managed.gyp', "test-compile-as-unmanaged", + chdir=CHDIR, status=1) + test.pass_test() diff --git a/deps/gyp/test/win/gyptest-cl-debug-format.py b/deps/gyp/test/win/gyptest-cl-debug-format.py new file mode 100644 index 0000000000..6c68a619be --- /dev/null +++ b/deps/gyp/test/win/gyptest-cl-debug-format.py @@ -0,0 +1,43 @@ +#!/usr/bin/env python + +# 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. + +""" +Make sure debug format settings are extracted properly. +""" + +import TestGyp + +import sys + +if sys.platform == 'win32': + test = TestGyp.TestGyp(formats=['ninja']) + + CHDIR = 'compiler-flags' + test.run_gyp('debug-format.gyp', chdir=CHDIR) + + # While there's ways to via .pdb contents, the .pdb doesn't include + # which style the debug information was created from, so we resort to just + # verifying the flags are correct on the command line. + + ninja_file = test.built_file_path('obj/test-debug-format-off.ninja', + chdir=CHDIR) + test.must_not_contain(ninja_file, '/Z7') + test.must_not_contain(ninja_file, '/Zi') + test.must_not_contain(ninja_file, '/ZI') + + ninja_file = test.built_file_path('obj/test-debug-format-oldstyle.ninja', + chdir=CHDIR) + test.must_contain(ninja_file, '/Z7') + + ninja_file = test.built_file_path('obj/test-debug-format-pdb.ninja', + chdir=CHDIR) + test.must_contain(ninja_file, '/Zi') + + ninja_file = test.built_file_path('obj/test-debug-format-editcontinue.ninja', + chdir=CHDIR) + test.must_contain(ninja_file, '/ZI') + + test.pass_test() diff --git a/deps/gyp/test/win/gyptest-cl-default-char-is-unsigned.py b/deps/gyp/test/win/gyptest-cl-default-char-is-unsigned.py new file mode 100644 index 0000000000..d20f6742f5 --- /dev/null +++ b/deps/gyp/test/win/gyptest-cl-default-char-is-unsigned.py @@ -0,0 +1,22 @@ +#!/usr/bin/env python + +# 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. + +""" +Make sure DefaultCharIsUnsigned option is functional. +""" + +import TestGyp + +import sys + +if sys.platform == 'win32': + test = TestGyp.TestGyp(formats=['msvs', 'ninja']) + + CHDIR = 'compiler-flags' + test.run_gyp('default-char-is-unsigned.gyp', chdir=CHDIR) + test.build('default-char-is-unsigned.gyp', test.ALL, chdir=CHDIR) + + test.pass_test() diff --git a/deps/gyp/test/win/gyptest-cl-disable-specific-warnings.py b/deps/gyp/test/win/gyptest-cl-disable-specific-warnings.py new file mode 100644 index 0000000000..cb253aff62 --- /dev/null +++ b/deps/gyp/test/win/gyptest-cl-disable-specific-warnings.py @@ -0,0 +1,32 @@ +#!/usr/bin/env python + +# Copyright (c) 2013 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. + +""" +Make sure disable specific warnings is extracted properly. +""" + +import TestGyp + +import sys + +if sys.platform == 'win32': + test = TestGyp.TestGyp(formats=['msvs', 'ninja']) + + CHDIR = 'compiler-flags' + test.run_gyp('disable-specific-warnings.gyp', chdir=CHDIR) + + # The source file contains a warning, so if WarnAsError is true and + # DisableSpecificWarnings for the warning in question is set, then the build + # should succeed, otherwise it must fail. + + test.build('disable-specific-warnings.gyp', + 'test_disable_specific_warnings_set', + chdir=CHDIR) + test.build('disable-specific-warnings.gyp', + 'test_disable_specific_warnings_unset', + chdir=CHDIR, status=1) + + test.pass_test() diff --git a/deps/gyp/test/win/gyptest-cl-enable-enhanced-instruction-set.py b/deps/gyp/test/win/gyptest-cl-enable-enhanced-instruction-set.py new file mode 100644 index 0000000000..78a924aba3 --- /dev/null +++ b/deps/gyp/test/win/gyptest-cl-enable-enhanced-instruction-set.py @@ -0,0 +1,47 @@ +#!/usr/bin/env python + +# Copyright (c) 2014 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. + +""" +Test VCCLCompilerTool EnableEnhancedInstructionSet setting. +""" + +import TestGyp + +import os +import sys + +if sys.platform == 'win32': + print "This test is currently disabled: https://crbug.com/483696." + sys.exit(0) + + test = TestGyp.TestGyp() + + CHDIR = 'compiler-flags' + test.run_gyp('enable-enhanced-instruction-set.gyp', chdir=CHDIR) + + test.build('enable-enhanced-instruction-set.gyp', test.ALL, chdir=CHDIR) + + test.run_built_executable('sse_extensions', chdir=CHDIR, + stdout='/arch:SSE\n') + test.run_built_executable('sse2_extensions', chdir=CHDIR, + stdout='/arch:SSE2\n') + + # /arch:AVX introduced in VS2010, but MSBuild support lagged until 2012. + if os.path.exists(test.built_file_path('avx_extensions')): + test.run_built_executable('avx_extensions', chdir=CHDIR, + stdout='/arch:AVX\n') + + # /arch:IA32 introduced in VS2012. + if os.path.exists(test.built_file_path('no_extensions')): + test.run_built_executable('no_extensions', chdir=CHDIR, + stdout='/arch:IA32\n') + + # /arch:AVX2 introduced in VS2013r2. + if os.path.exists(test.built_file_path('avx2_extensions')): + test.run_built_executable('avx2_extensions', chdir=CHDIR, + stdout='/arch:AVX2\n') + + test.pass_test() diff --git a/deps/gyp/test/win/gyptest-cl-exception-handling.py b/deps/gyp/test/win/gyptest-cl-exception-handling.py new file mode 100644 index 0000000000..5738a54071 --- /dev/null +++ b/deps/gyp/test/win/gyptest-cl-exception-handling.py @@ -0,0 +1,33 @@ +#!/usr/bin/env python + +# 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. + +""" +Make sure exception handling settings are extracted properly. +""" + +import TestGyp + +import sys + +if sys.platform == 'win32': + test = TestGyp.TestGyp(formats=['msvs', 'ninja']) + + CHDIR = 'compiler-flags' + test.run_gyp('exception-handling.gyp', chdir=CHDIR) + + # Must fail. + test.build('exception-handling.gyp', 'test_eh_off', chdir=CHDIR, + status=1) + + # Must succeed. + test.build('exception-handling.gyp', 'test_eh_s', chdir=CHDIR) + test.build('exception-handling.gyp', 'test_eh_a', chdir=CHDIR) + + # Error code must be 1 if EHa, and 2 if EHsc. + test.run_built_executable('test_eh_a', chdir=CHDIR, status=1) + test.run_built_executable('test_eh_s', chdir=CHDIR, status=2) + + test.pass_test() diff --git a/deps/gyp/test/win/gyptest-cl-floating-point-model.py b/deps/gyp/test/win/gyptest-cl-floating-point-model.py new file mode 100644 index 0000000000..86ff4785a0 --- /dev/null +++ b/deps/gyp/test/win/gyptest-cl-floating-point-model.py @@ -0,0 +1,22 @@ +#!/usr/bin/env python + +# Copyright (c) 2014 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. + +""" +Make sure floating point model settings are extracted properly. +""" + +import TestGyp + +import sys + +if sys.platform == 'win32': + test = TestGyp.TestGyp() + + CHDIR = 'compiler-flags' + test.run_gyp('floating-point-model.gyp', chdir=CHDIR) + test.build('floating-point-model.gyp', test.ALL, chdir=CHDIR) + + test.pass_test() diff --git a/deps/gyp/test/win/gyptest-cl-force-include-files.py b/deps/gyp/test/win/gyptest-cl-force-include-files.py new file mode 100644 index 0000000000..b73b8bd503 --- /dev/null +++ b/deps/gyp/test/win/gyptest-cl-force-include-files.py @@ -0,0 +1,22 @@ +#!/usr/bin/env python + +# 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. + +""" +Make sure ForcedIncludeFiles option is functional. +""" + +import TestGyp + +import sys + +if sys.platform == 'win32': + test = TestGyp.TestGyp(formats=['msvs', 'ninja']) + + CHDIR = 'compiler-flags' + test.run_gyp('force-include-files.gyp', chdir=CHDIR) + test.build('force-include-files.gyp', test.ALL, chdir=CHDIR) + + test.pass_test() diff --git a/deps/gyp/test/win/gyptest-cl-function-level-linking.py b/deps/gyp/test/win/gyptest-cl-function-level-linking.py new file mode 100644 index 0000000000..17c29e235f --- /dev/null +++ b/deps/gyp/test/win/gyptest-cl-function-level-linking.py @@ -0,0 +1,52 @@ +#!/usr/bin/env python + +# 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. + +""" +Make sure function-level linking setting is extracted properly. +""" + +import TestGyp + +import sys + +if sys.platform == 'win32': + test = TestGyp.TestGyp(formats=['msvs', 'ninja']) + + CHDIR = 'compiler-flags' + test.run_gyp('function-level-linking.gyp', chdir=CHDIR) + test.build('function-level-linking.gyp', test.ALL, chdir=CHDIR) + + def CheckForSectionString(binary, search_for, should_exist): + output = test.run_dumpbin('/headers', binary) + if should_exist and search_for not in output: + print 'Did not find "%s" in %s' % (search_for, binary) + test.fail_test() + elif not should_exist and search_for in output: + print 'Found "%s" in %s (and shouldn\'t have)' % (search_for, binary) + test.fail_test() + + def Object(proj, obj): + sep = '.' if test.format == 'ninja' else '\\' + return 'obj\\%s%s%s' % (proj, sep, obj) + + look_for = '''COMDAT; sym= "int __cdecl comdat_function''' + + # When function level linking is on, the functions should be listed as + # separate comdat entries. + + CheckForSectionString( + test.built_file_path(Object('test_fll_on', 'function-level-linking.obj'), + chdir=CHDIR), + look_for, + should_exist=True) + + CheckForSectionString( + test.built_file_path(Object('test_fll_off', 'function-level-linking.obj'), + chdir=CHDIR), + look_for, + should_exist=False) + + test.pass_test() diff --git a/deps/gyp/test/win/gyptest-cl-optimizations.py b/deps/gyp/test/win/gyptest-cl-optimizations.py new file mode 100644 index 0000000000..31341f7dd7 --- /dev/null +++ b/deps/gyp/test/win/gyptest-cl-optimizations.py @@ -0,0 +1,105 @@ +#!/usr/bin/env python + +# 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. + +""" +Make sure optimization settings are extracted properly. +""" + +import TestGyp + +import sys + +if sys.platform == 'win32': + test = TestGyp.TestGyp(formats=['ninja']) + + CHDIR = 'compiler-flags' + test.run_gyp('optimizations.gyp', chdir=CHDIR) + + # It's hard to map flags to output contents in a non-fragile way (especially + # handling both 2008/2010), so just verify the correct ninja command line + # contents. + + ninja_file = test.built_file_path('obj/test_opt_off.ninja', chdir=CHDIR) + test.must_contain(ninja_file, 'cflags = /Od') + + ninja_file = test.built_file_path('obj/test_opt_lev_size.ninja', chdir=CHDIR) + test.must_contain(ninja_file, 'cflags = /O1') + + ninja_file = test.built_file_path('obj/test_opt_lev_speed.ninja', chdir=CHDIR) + test.must_contain(ninja_file, 'cflags = /O2') + + ninja_file = test.built_file_path('obj/test_opt_lev_max.ninja', chdir=CHDIR) + test.must_contain(ninja_file, 'cflags = /Ox') + + ninja_file = test.built_file_path('obj/test_opt_unset.ninja', chdir=CHDIR) + test.must_not_contain(ninja_file, '/Od') + test.must_not_contain(ninja_file, '/O1') + test.must_not_contain(ninja_file, '/Ox') + # Set by default if none specified. + test.must_contain(ninja_file, '/O2') + + ninja_file = test.built_file_path('obj/test_opt_fpo.ninja', chdir=CHDIR) + test.must_contain(ninja_file, '/Oy') + test.must_not_contain(ninja_file, '/Oy-') + + ninja_file = test.built_file_path('obj/test_opt_fpo_off.ninja', chdir=CHDIR) + test.must_contain(ninja_file, '/Oy-') + + ninja_file = test.built_file_path('obj/test_opt_intrinsic.ninja', + chdir=CHDIR) + test.must_contain(ninja_file, '/Oi') + test.must_not_contain(ninja_file, '/Oi-') + + ninja_file = test.built_file_path('obj/test_opt_intrinsic_off.ninja', + chdir=CHDIR) + test.must_contain(ninja_file, '/Oi-') + + ninja_file = test.built_file_path('obj/test_opt_inline_off.ninja', + chdir=CHDIR) + test.must_contain(ninja_file, '/Ob0') + + ninja_file = test.built_file_path('obj/test_opt_inline_manual.ninja', + chdir=CHDIR) + test.must_contain(ninja_file, '/Ob1') + + ninja_file = test.built_file_path('obj/test_opt_inline_auto.ninja', + chdir=CHDIR) + test.must_contain(ninja_file, '/Ob2') + + ninja_file = test.built_file_path('obj/test_opt_neither.ninja', + chdir=CHDIR) + test.must_not_contain(ninja_file, '/Os') + test.must_not_contain(ninja_file, '/Ot') + + ninja_file = test.built_file_path('obj/test_opt_size.ninja', + chdir=CHDIR) + test.must_contain(ninja_file, '/Os') + + ninja_file = test.built_file_path('obj/test_opt_speed.ninja', + chdir=CHDIR) + test.must_contain(ninja_file, '/Ot') + + ninja_file = test.built_file_path('obj/test_opt_wpo.ninja', + chdir=CHDIR) + test.must_contain(ninja_file, '/GL') + + ninja_file = test.built_file_path('obj/test_opt_sp.ninja', + chdir=CHDIR) + test.must_contain(ninja_file, '/GF') + + ninja_file = test.built_file_path('obj/test_opt_sp_off.ninja', + chdir=CHDIR) + test.must_not_contain(ninja_file, '/GF') + + ninja_file = test.built_file_path('obj/test_opt_fso.ninja', + chdir=CHDIR) + test.must_contain(ninja_file, '/GT') + + ninja_file = test.built_file_path('obj/test_opt_fso_off.ninja', + chdir=CHDIR) + test.must_not_contain(ninja_file, '/GT') + + test.pass_test() diff --git a/deps/gyp/test/win/gyptest-cl-pdbname-override.py b/deps/gyp/test/win/gyptest-cl-pdbname-override.py new file mode 100644 index 0000000000..da9b49af16 --- /dev/null +++ b/deps/gyp/test/win/gyptest-cl-pdbname-override.py @@ -0,0 +1,27 @@ +#!/usr/bin/env python + +# 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. + +""" +Make sure pdb is named as expected (shared between .cc files). +""" + +import TestGyp + +import sys + +if sys.platform == 'win32': + test = TestGyp.TestGyp() + + CHDIR = 'compiler-flags' + test.run_gyp('pdbname-override.gyp', chdir=CHDIR) + test.build('pdbname-override.gyp', test.ALL, chdir=CHDIR) + + # Confirm that the pdb generated by the compiler was renamed (and we also + # have the linker generated one). + test.built_file_must_exist('compiler_generated.pdb', chdir=CHDIR) + test.built_file_must_exist('linker_generated.pdb', chdir=CHDIR) + + test.pass_test() diff --git a/deps/gyp/test/win/gyptest-cl-pdbname.py b/deps/gyp/test/win/gyptest-cl-pdbname.py new file mode 100644 index 0000000000..f09ac233cd --- /dev/null +++ b/deps/gyp/test/win/gyptest-cl-pdbname.py @@ -0,0 +1,30 @@ +#!/usr/bin/env python + +# Copyright (c) 2013 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. + +""" +Make sure pdb is named as expected (shared between .cc files). +""" + +import TestGyp + +import sys + +if sys.platform == 'win32': + test = TestGyp.TestGyp(formats=['ninja']) + + CHDIR = 'compiler-flags' + test.run_gyp('pdbname.gyp', chdir=CHDIR) + test.build('pdbname.gyp', test.ALL, chdir=CHDIR) + + # Confirm that the default behaviour is to name the .pdb per-target (rather + # than per .cc file). + test.built_file_must_exist('obj/test_pdbname.cc.pdb', chdir=CHDIR) + + # Confirm that there should be a .pdb alongside the executable. + test.built_file_must_exist('test_pdbname.exe', chdir=CHDIR) + test.built_file_must_exist('test_pdbname.exe.pdb', chdir=CHDIR) + + test.pass_test() diff --git a/deps/gyp/test/win/gyptest-cl-rtti.py b/deps/gyp/test/win/gyptest-cl-rtti.py new file mode 100644 index 0000000000..d49a094379 --- /dev/null +++ b/deps/gyp/test/win/gyptest-cl-rtti.py @@ -0,0 +1,30 @@ +#!/usr/bin/env python + +# 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. + +""" +Make sure RTTI setting is extracted properly. +""" + +import TestGyp + +import sys + +if sys.platform == 'win32': + test = TestGyp.TestGyp(formats=['msvs', 'ninja']) + + CHDIR = 'compiler-flags' + test.run_gyp('rtti.gyp', chdir=CHDIR) + + # Must fail. + test.build('rtti.gyp', 'test_rtti_off', chdir=CHDIR, status=1) + + # Must succeed. + test.build('rtti.gyp', 'test_rtti_on', chdir=CHDIR) + + # Must succeed. + test.build('rtti.gyp', 'test_rtti_unset', chdir=CHDIR) + + test.pass_test() diff --git a/deps/gyp/test/win/gyptest-cl-runtime-checks.py b/deps/gyp/test/win/gyptest-cl-runtime-checks.py new file mode 100644 index 0000000000..4fd529f892 --- /dev/null +++ b/deps/gyp/test/win/gyptest-cl-runtime-checks.py @@ -0,0 +1,30 @@ +#!/usr/bin/env python + +# 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. + +""" +Make sure RTC setting is extracted properly. +""" + +import TestGyp + +import sys + +if sys.platform == 'win32': + test = TestGyp.TestGyp(formats=['msvs', 'ninja']) + + CHDIR = 'compiler-flags' + test.run_gyp('runtime-checks.gyp', chdir=CHDIR) + + # Runtime checks disabled, should fail. + test.build('runtime-checks.gyp', 'test_brc_none', chdir=CHDIR, status=1) + + # Runtime checks enabled, should pass. + test.build('runtime-checks.gyp', 'test_brc_1', chdir=CHDIR) + + # TODO(scottmg): There are other less frequently used/partial options, but + # it's not clear how to verify them, so ignore for now. + + test.pass_test() diff --git a/deps/gyp/test/win/gyptest-cl-runtime-library.py b/deps/gyp/test/win/gyptest-cl-runtime-library.py new file mode 100644 index 0000000000..53c149297b --- /dev/null +++ b/deps/gyp/test/win/gyptest-cl-runtime-library.py @@ -0,0 +1,22 @@ +#!/usr/bin/env python + +# 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. + +""" +Make sure runtime C library setting is extracted properly. +""" + +import TestGyp + +import sys + +if sys.platform == 'win32': + test = TestGyp.TestGyp(formats=['msvs', 'ninja']) + + CHDIR = 'compiler-flags' + test.run_gyp('runtime-library.gyp', chdir=CHDIR) + test.build('runtime-library.gyp', test.ALL, chdir=CHDIR) + + test.pass_test() diff --git a/deps/gyp/test/win/gyptest-cl-treat-wchar-t-as-built-in-type.py b/deps/gyp/test/win/gyptest-cl-treat-wchar-t-as-built-in-type.py new file mode 100644 index 0000000000..ca35fb55a0 --- /dev/null +++ b/deps/gyp/test/win/gyptest-cl-treat-wchar-t-as-built-in-type.py @@ -0,0 +1,22 @@ +#!/usr/bin/env python + +# 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. + +""" +Make sure TreatWChar_tAsBuiltInType option is functional. +""" + +import TestGyp + +import sys + +if sys.platform == 'win32': + test = TestGyp.TestGyp(formats=['msvs', 'ninja']) + + CHDIR = 'compiler-flags' + test.run_gyp('treat-wchar-t-as-built-in-type.gyp', chdir=CHDIR) + test.build('treat-wchar-t-as-built-in-type.gyp', test.ALL, chdir=CHDIR) + + test.pass_test() diff --git a/deps/gyp/test/win/gyptest-cl-warning-as-error.py b/deps/gyp/test/win/gyptest-cl-warning-as-error.py new file mode 100644 index 0000000000..d4ef1b362b --- /dev/null +++ b/deps/gyp/test/win/gyptest-cl-warning-as-error.py @@ -0,0 +1,30 @@ +#!/usr/bin/env python + +# 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. + +""" +Make sure warning-as-error is extracted properly. +""" + +import TestGyp + +import sys + +if sys.platform == 'win32': + test = TestGyp.TestGyp(formats=['msvs', 'ninja']) + + CHDIR = 'compiler-flags' + test.run_gyp('warning-as-error.gyp', chdir=CHDIR) + + # The source file contains a warning, so if WarnAsError is false (or + # default, which is also false), then the build should succeed, otherwise it + # must fail. + + test.build('warning-as-error.gyp', 'test_warn_as_error_false', chdir=CHDIR) + test.build('warning-as-error.gyp', 'test_warn_as_error_unset', chdir=CHDIR) + test.build('warning-as-error.gyp', 'test_warn_as_error_true', chdir=CHDIR, + status=1) + + test.pass_test() diff --git a/deps/gyp/test/win/gyptest-cl-warning-level.py b/deps/gyp/test/win/gyptest-cl-warning-level.py new file mode 100644 index 0000000000..62a5b39b6a --- /dev/null +++ b/deps/gyp/test/win/gyptest-cl-warning-level.py @@ -0,0 +1,41 @@ +#!/usr/bin/env python + +# 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. + +""" +Make sure warning level is extracted properly. +""" + +import TestGyp + +import sys + +if sys.platform == 'win32': + test = TestGyp.TestGyp(formats=['msvs', 'ninja']) + + CHDIR = 'compiler-flags' + test.run_gyp('warning-level.gyp', chdir=CHDIR) + + # A separate target for each warning level: one pass (compiling a file + # containing a warning that's above the specified level); and one fail + # (compiling a file at the specified level). No pass for 4 of course, + # because it would have to have no warnings. The default warning level is + # equivalent to level 1. + + test.build('warning-level.gyp', 'test_wl1_fail', chdir=CHDIR, status=1) + test.build('warning-level.gyp', 'test_wl1_pass', chdir=CHDIR) + + test.build('warning-level.gyp', 'test_wl2_fail', chdir=CHDIR, status=1) + test.build('warning-level.gyp', 'test_wl2_pass', chdir=CHDIR) + + test.build('warning-level.gyp', 'test_wl3_fail', chdir=CHDIR, status=1) + test.build('warning-level.gyp', 'test_wl3_pass', chdir=CHDIR) + + test.build('warning-level.gyp', 'test_wl4_fail', chdir=CHDIR, status=1) + + test.build('warning-level.gyp', 'test_def_fail', chdir=CHDIR, status=1) + test.build('warning-level.gyp', 'test_def_pass', chdir=CHDIR) + + test.pass_test() diff --git a/deps/gyp/test/win/gyptest-command-quote.py b/deps/gyp/test/win/gyptest-command-quote.py new file mode 100644 index 0000000000..bd93ac5e92 --- /dev/null +++ b/deps/gyp/test/win/gyptest-command-quote.py @@ -0,0 +1,40 @@ +#!/usr/bin/env python + +# 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. + +""" + +Make sure the program in a command can be a called batch file, or an +application in the path. Specifically, this means not quoting something like +"call x.bat", lest the shell look for a program named "call x.bat", rather +than calling "x.bat". +""" + +import TestGyp + +import sys + +if sys.platform == 'win32': + print "This test is currently disabled: https://crbug.com/483696." + sys.exit(0) + + test = TestGyp.TestGyp(formats=['msvs', 'ninja']) + CHDIR = 'command-quote' + test.run_gyp('command-quote.gyp', chdir=CHDIR) + + test.build('command-quote.gyp', 'test_batch', chdir=CHDIR) + test.build('command-quote.gyp', 'test_call_separate', chdir=CHDIR) + test.build('command-quote.gyp', 'test_with_double_quotes', chdir=CHDIR) + test.build('command-quote.gyp', 'test_with_single_quotes', chdir=CHDIR) + + # We confirm that this fails because other generators don't handle spaces in + # inputs so it's preferable to not have it work here. + test.build('command-quote.gyp', 'test_with_spaces', chdir=CHDIR, status=1) + + CHDIR = 'command-quote/subdir/and/another' + test.run_gyp('in-subdir.gyp', chdir=CHDIR) + test.build('in-subdir.gyp', 'test_batch_depth', chdir=CHDIR) + + test.pass_test() diff --git a/deps/gyp/test/win/gyptest-crosscompile-ar.py b/deps/gyp/test/win/gyptest-crosscompile-ar.py new file mode 100644 index 0000000000..dc75d96a84 --- /dev/null +++ b/deps/gyp/test/win/gyptest-crosscompile-ar.py @@ -0,0 +1,29 @@ +#!/usr/bin/env python + +# Copyright 2015 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. + +""" +Verifies that ar_host is set correctly when enabling cross-compile on windows. +""" + +import TestGyp + +import sys +import os + +if sys.platform == 'win32': + test = TestGyp.TestGyp(formats=['ninja']) + + CHDIR = 'lib-crosscompile' + oldenv = os.environ.copy() + try: + os.environ['GYP_CROSSCOMPILE'] = '1' + test.run_gyp('use_host_ar.gyp', chdir=CHDIR) + finally: + os.environ.clear() + os.environ.update(oldenv) + + test.build('use_host_ar.gyp', test.ALL, chdir=CHDIR) + test.pass_test() diff --git a/deps/gyp/test/win/gyptest-lib-ltcg.py b/deps/gyp/test/win/gyptest-lib-ltcg.py new file mode 100644 index 0000000000..d1d7bad840 --- /dev/null +++ b/deps/gyp/test/win/gyptest-lib-ltcg.py @@ -0,0 +1,22 @@ +#!/usr/bin/env python + +# 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. + +""" +Make sure LTCG setting is extracted properly. +""" + +import TestGyp + +import sys + +if sys.platform == 'win32': + test = TestGyp.TestGyp(formats=['msvs', 'ninja']) + + CHDIR = 'lib-flags' + test.run_gyp('ltcg.gyp', chdir=CHDIR) + test.build('ltcg.gyp', test.ALL, chdir=CHDIR) + test.must_not_contain_any_line(test.stdout(), ['restarting link with /LTCG']) + test.pass_test() diff --git a/deps/gyp/test/win/gyptest-link-additional-deps.py b/deps/gyp/test/win/gyptest-link-additional-deps.py new file mode 100644 index 0000000000..62c57366f9 --- /dev/null +++ b/deps/gyp/test/win/gyptest-link-additional-deps.py @@ -0,0 +1,22 @@ +#!/usr/bin/env python + +# 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. + +""" +Make sure additional library dependencies are handled. +""" + +import TestGyp + +import sys + +if sys.platform == 'win32': + test = TestGyp.TestGyp(formats=['msvs', 'ninja']) + + CHDIR = 'linker-flags' + test.run_gyp('additional-deps.gyp', chdir=CHDIR) + test.build('additional-deps.gyp', test.ALL, chdir=CHDIR) + + test.pass_test() diff --git a/deps/gyp/test/win/gyptest-link-additional-options.py b/deps/gyp/test/win/gyptest-link-additional-options.py new file mode 100644 index 0000000000..7e57ae4764 --- /dev/null +++ b/deps/gyp/test/win/gyptest-link-additional-options.py @@ -0,0 +1,22 @@ +#!/usr/bin/env python + +# 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. + +""" +Make sure additional options are handled. +""" + +import TestGyp + +import sys + +if sys.platform == 'win32': + test = TestGyp.TestGyp(formats=['msvs', 'ninja']) + + CHDIR = 'linker-flags' + test.run_gyp('additional-options.gyp', chdir=CHDIR) + test.build('additional-options.gyp', test.ALL, chdir=CHDIR) + + test.pass_test() diff --git a/deps/gyp/test/win/gyptest-link-aslr.py b/deps/gyp/test/win/gyptest-link-aslr.py new file mode 100644 index 0000000000..e765017d3b --- /dev/null +++ b/deps/gyp/test/win/gyptest-link-aslr.py @@ -0,0 +1,35 @@ +#!/usr/bin/env python + +# 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. + +""" +Make sure aslr setting is extracted properly. +""" + +import TestGyp + +import sys + +if sys.platform == 'win32': + test = TestGyp.TestGyp(formats=['msvs', 'ninja']) + + CHDIR = 'linker-flags' + test.run_gyp('aslr.gyp', chdir=CHDIR) + test.build('aslr.gyp', test.ALL, chdir=CHDIR) + + def HasDynamicBase(exe): + full_path = test.built_file_path(exe, chdir=CHDIR) + output = test.run_dumpbin('/headers', full_path) + return ' Dynamic base' in output + + # Default is to be on. + if not HasDynamicBase('test_aslr_default.exe'): + test.fail_test() + if HasDynamicBase('test_aslr_no.exe'): + test.fail_test() + if not HasDynamicBase('test_aslr_yes.exe'): + test.fail_test() + + test.pass_test() diff --git a/deps/gyp/test/win/gyptest-link-base-address.py b/deps/gyp/test/win/gyptest-link-base-address.py new file mode 100644 index 0000000000..d58527ad7e --- /dev/null +++ b/deps/gyp/test/win/gyptest-link-base-address.py @@ -0,0 +1,62 @@ +#!/usr/bin/env python + +# Copyright 2013 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. + +""" +Make sure the base address setting is extracted properly. +""" + +import TestGyp + +import re +import sys + +if sys.platform == 'win32': + test = TestGyp.TestGyp(formats=['msvs', 'ninja']) + + CHDIR = 'linker-flags' + test.run_gyp('base-address.gyp', chdir=CHDIR) + test.build('base-address.gyp', test.ALL, chdir=CHDIR) + + def GetHeaders(exe): + full_path = test.built_file_path(exe, chdir=CHDIR) + return test.run_dumpbin('/headers', full_path) + + # Extract the image base address from the headers output. + image_base_reg_ex = re.compile(r'.*\s+([0-9]+) image base.*', re.DOTALL) + + exe_headers = GetHeaders('test_base_specified_exe.exe') + exe_match = image_base_reg_ex.match(exe_headers) + + if not exe_match or not exe_match.group(1): + test.fail_test() + if exe_match.group(1) != '420000': + test.fail_test() + + dll_headers = GetHeaders('test_base_specified_dll.dll') + dll_match = image_base_reg_ex.match(dll_headers) + + if not dll_match or not dll_match.group(1): + test.fail_test() + if dll_match.group(1) != '10420000': + test.fail_test() + + default_exe_headers = GetHeaders('test_base_default_exe.exe') + default_exe_match = image_base_reg_ex.match(default_exe_headers) + + if not default_exe_match or not default_exe_match.group(1): + test.fail_test() + if default_exe_match.group(1) != '400000': + test.fail_test() + + default_dll_headers = GetHeaders('test_base_default_dll.dll') + default_dll_match = image_base_reg_ex.match(default_dll_headers) + + if not default_dll_match or not default_dll_match.group(1): + test.fail_test() + if default_dll_match.group(1) != '10000000': + test.fail_test() + + test.pass_test() diff --git a/deps/gyp/test/win/gyptest-link-debug-info.py b/deps/gyp/test/win/gyptest-link-debug-info.py new file mode 100644 index 0000000000..33e8ac48bf --- /dev/null +++ b/deps/gyp/test/win/gyptest-link-debug-info.py @@ -0,0 +1,26 @@ +#!/usr/bin/env python + +# 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. + +""" +Make sure debug info setting is extracted properly. +""" + +import TestGyp + +import sys + +if sys.platform == 'win32': + test = TestGyp.TestGyp(formats=['msvs', 'ninja']) + + CHDIR = 'linker-flags' + test.run_gyp('debug-info.gyp', chdir=CHDIR) + test.build('debug-info.gyp', test.ALL, chdir=CHDIR) + + suffix = '.exe.pdb' if test.format == 'ninja' else '.pdb' + test.built_file_must_not_exist('test_debug_off%s' % suffix, chdir=CHDIR) + test.built_file_must_exist('test_debug_on%s' % suffix, chdir=CHDIR) + + test.pass_test() diff --git a/deps/gyp/test/win/gyptest-link-default-libs.py b/deps/gyp/test/win/gyptest-link-default-libs.py new file mode 100644 index 0000000000..5edf467913 --- /dev/null +++ b/deps/gyp/test/win/gyptest-link-default-libs.py @@ -0,0 +1,22 @@ +#!/usr/bin/env python + +# 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. + +""" +Make sure we include the default libs. +""" + +import TestGyp + +import sys + +if sys.platform == 'win32': + test = TestGyp.TestGyp(formats=['msvs', 'ninja']) + + CHDIR = 'linker-flags' + test.run_gyp('no-default-libs.gyp', chdir=CHDIR) + test.build('no-default-libs.gyp', test.ALL, chdir=CHDIR, status=1) + + test.pass_test() diff --git a/deps/gyp/test/win/gyptest-link-deffile.py b/deps/gyp/test/win/gyptest-link-deffile.py new file mode 100644 index 0000000000..94df874f85 --- /dev/null +++ b/deps/gyp/test/win/gyptest-link-deffile.py @@ -0,0 +1,43 @@ +#!/usr/bin/env python + +# 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. + +""" +Make sure a .def file is handled in the link. +""" + +import TestGyp + +import sys + +if sys.platform == 'win32': + test = TestGyp.TestGyp(formats=['msvs', 'ninja']) + + CHDIR = 'linker-flags' + + # Multiple .def files doesn't make any sense, should fail at generate time. + test.run_gyp('deffile-multiple.gyp', chdir=CHDIR, stderr=None, status=1) + + test.run_gyp('deffile.gyp', chdir=CHDIR) + test.build('deffile.gyp', test.ALL, chdir=CHDIR) + + def HasExport(binary, export): + full_path = test.built_file_path(binary, chdir=CHDIR) + output = test.run_dumpbin('/exports', full_path) + return export in output + + # Make sure we only have the export when the .def file is in use. + + if HasExport('test_deffile_dll_notexported.dll', 'AnExportedFunction'): + test.fail_test() + if not HasExport('test_deffile_dll_ok.dll', 'AnExportedFunction'): + test.fail_test() + + if HasExport('test_deffile_exe_notexported.exe', 'AnExportedFunction'): + test.fail_test() + if not HasExport('test_deffile_exe_ok.exe', 'AnExportedFunction'): + test.fail_test() + + test.pass_test() diff --git a/deps/gyp/test/win/gyptest-link-defrelink.py b/deps/gyp/test/win/gyptest-link-defrelink.py new file mode 100644 index 0000000000..cec0ea1870 --- /dev/null +++ b/deps/gyp/test/win/gyptest-link-defrelink.py @@ -0,0 +1,54 @@ +#!/usr/bin/env python + +# Copyright (c) 2013 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. + +""" +Make sure a relink is performed when a .def file is touched. +""" + +import TestGyp + +import sys + +if sys.platform == 'win32': + print "This test is currently disabled: https://crbug.com/483696." + sys.exit(0) + + test = TestGyp.TestGyp(formats=['msvs', 'ninja']) + + CHDIR = 'linker-flags' + target = 'test_deffile_dll_ok' + def_contents = test.read('linker-flags/deffile.def') + + # This first build makes sure everything is up to date. + test.run_gyp('deffile.gyp', chdir=CHDIR) + test.build('deffile.gyp', target, chdir=CHDIR) + test.up_to_date('deffile.gyp', target, chdir=CHDIR) + + def HasExport(binary, export): + full_path = test.built_file_path(binary, chdir=CHDIR) + output = test.run_dumpbin('/exports', full_path) + return export in output + + # Verify that only one function is exported. + if not HasExport('test_deffile_dll_ok.dll', 'AnExportedFunction'): + test.fail_test() + if HasExport('test_deffile_dll_ok.dll', 'AnotherExportedFunction'): + test.fail_test() + + # Add AnotherExportedFunction to the def file, then rebuild. If it doesn't + # relink the DLL, then the subsequent check for AnotherExportedFunction will + # fail. + new_def_contents = def_contents + "\n AnotherExportedFunction" + test.write('linker-flags/deffile.def', new_def_contents) + test.build('deffile.gyp', target, chdir=CHDIR) + test.up_to_date('deffile.gyp', target, chdir=CHDIR) + + if not HasExport('test_deffile_dll_ok.dll', 'AnExportedFunction'): + test.fail_test() + if not HasExport('test_deffile_dll_ok.dll', 'AnotherExportedFunction'): + test.fail_test() + + test.pass_test() diff --git a/deps/gyp/test/win/gyptest-link-delay-load-dlls.py b/deps/gyp/test/win/gyptest-link-delay-load-dlls.py new file mode 100644 index 0000000000..3880247b4a --- /dev/null +++ b/deps/gyp/test/win/gyptest-link-delay-load-dlls.py @@ -0,0 +1,35 @@ +#!/usr/bin/env python + +# 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. + +""" +Make sure delay load setting is extracted properly. +""" + +import TestGyp + +import sys + +if sys.platform == 'win32': + test = TestGyp.TestGyp(formats=['msvs', 'ninja']) + + CHDIR = 'linker-flags' + test.run_gyp('delay-load-dlls.gyp', chdir=CHDIR) + test.build('delay-load-dlls.gyp', test.ALL, chdir=CHDIR) + + prefix = 'contains the following delay load imports:' + shell32_look_for = prefix + '\r\n\r\n SHELL32.dll' + + output = test.run_dumpbin( + '/all', test.built_file_path('test_dld_none.exe', chdir=CHDIR)) + if prefix in output: + test.fail_test() + + output = test.run_dumpbin( + '/all', test.built_file_path('test_dld_shell32.exe', chdir=CHDIR)) + if shell32_look_for not in output: + test.fail_test() + + test.pass_test() diff --git a/deps/gyp/test/win/gyptest-link-embed-manifest.py b/deps/gyp/test/win/gyptest-link-embed-manifest.py new file mode 100644 index 0000000000..5b9d2c25b4 --- /dev/null +++ b/deps/gyp/test/win/gyptest-link-embed-manifest.py @@ -0,0 +1,99 @@ +#!/usr/bin/env python + +# Copyright (c) 2013 Yandex LLC. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +""" +Make sure manifests are embedded in binaries properly. Handling of +AdditionalManifestFiles is tested too. +""" + +import TestGyp + +import sys + +if sys.platform == 'win32': + import pywintypes + import win32api + import winerror + + RT_MANIFEST = 24 + + class LoadLibrary(object): + """Context manager for loading and releasing binaries in Windows. + Yields the handle of the binary loaded.""" + def __init__(self, path): + self._path = path + self._handle = None + + def __enter__(self): + self._handle = win32api.LoadLibrary(self._path) + return self._handle + + def __exit__(self, type, value, traceback): + win32api.FreeLibrary(self._handle) + + + def extract_manifest(path, resource_name): + """Reads manifest from |path| and returns it as a string. + Returns None is there is no such manifest.""" + with LoadLibrary(path) as handle: + try: + return win32api.LoadResource(handle, RT_MANIFEST, resource_name) + except pywintypes.error as error: + if error.args[0] == winerror.ERROR_RESOURCE_DATA_NOT_FOUND: + return None + else: + raise + + test = TestGyp.TestGyp(formats=['msvs', 'ninja']) + CHDIR = 'linker-flags' + test.run_gyp('embed-manifest.gyp', chdir=CHDIR) + test.build('embed-manifest.gyp', test.ALL, chdir=CHDIR) + + # The following binaries must contain a manifest embedded. + test.fail_test(not extract_manifest(test.built_file_path( + 'test_manifest_exe.exe', chdir=CHDIR), 1)) + test.fail_test(not extract_manifest(test.built_file_path( + 'test_manifest_exe_inc.exe', chdir=CHDIR), 1)) + test.fail_test(not extract_manifest(test.built_file_path( + 'test_manifest_dll.dll', chdir=CHDIR), 2)) + test.fail_test(not extract_manifest(test.built_file_path( + 'test_manifest_dll_inc.dll', chdir=CHDIR), 2)) + + # Must contain the Win7 support GUID, but not the Vista one (from + # extra2.manifest). + test.fail_test( + '35138b9a-5d96-4fbd-8e2d-a2440225f93a' not in + extract_manifest(test.built_file_path('test_manifest_extra1.exe', + chdir=CHDIR), 1)) + test.fail_test( + 'e2011457-1546-43c5-a5fe-008deee3d3f0' in + extract_manifest(test.built_file_path('test_manifest_extra1.exe', + chdir=CHDIR), 1)) + # Must contain both. + test.fail_test( + '35138b9a-5d96-4fbd-8e2d-a2440225f93a' not in + extract_manifest(test.built_file_path('test_manifest_extra2.exe', + chdir=CHDIR), 1)) + test.fail_test( + 'e2011457-1546-43c5-a5fe-008deee3d3f0' not in + extract_manifest(test.built_file_path('test_manifest_extra2.exe', + chdir=CHDIR), 1)) + + # Same as extra2, but using list syntax instead. + test.fail_test( + '35138b9a-5d96-4fbd-8e2d-a2440225f93a' not in + extract_manifest(test.built_file_path('test_manifest_extra_list.exe', + chdir=CHDIR), 1)) + test.fail_test( + 'e2011457-1546-43c5-a5fe-008deee3d3f0' not in + extract_manifest(test.built_file_path('test_manifest_extra_list.exe', + chdir=CHDIR), 1)) + + # Test that incremental linking doesn't force manifest embedding. + test.fail_test(extract_manifest(test.built_file_path( + 'test_manifest_exe_inc_no_embed.exe', chdir=CHDIR), 1)) + + test.pass_test() diff --git a/deps/gyp/test/win/gyptest-link-enable-uac.py b/deps/gyp/test/win/gyptest-link-enable-uac.py new file mode 100644 index 0000000000..131e07ec1f --- /dev/null +++ b/deps/gyp/test/win/gyptest-link-enable-uac.py @@ -0,0 +1,95 @@ +#!/usr/bin/env python + +# Copyright 2013 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. + +""" +Verifies that embedding UAC information into the manifest works. +""" + +import TestGyp + +import sys +from xml.dom.minidom import parseString + +if sys.platform == 'win32': + import pywintypes + import win32api + import winerror + + RT_MANIFEST = 24 + + class LoadLibrary(object): + """Context manager for loading and releasing binaries in Windows. + Yields the handle of the binary loaded.""" + def __init__(self, path): + self._path = path + self._handle = None + + def __enter__(self): + self._handle = win32api.LoadLibrary(self._path) + return self._handle + + def __exit__(self, type, value, traceback): + win32api.FreeLibrary(self._handle) + + + def extract_manifest(path, resource_name): + """Reads manifest from |path| and returns it as a string. + Returns None is there is no such manifest.""" + with LoadLibrary(path) as handle: + try: + return win32api.LoadResource(handle, RT_MANIFEST, resource_name) + except pywintypes.error as error: + if error.args[0] == winerror.ERROR_RESOURCE_DATA_NOT_FOUND: + return None + else: + raise + + test = TestGyp.TestGyp(formats=['msvs', 'ninja']) + CHDIR = 'linker-flags' + test.run_gyp('enable-uac.gyp', chdir=CHDIR) + test.build('enable-uac.gyp', test.ALL, chdir=CHDIR) + + # The following binaries must contain a manifest embedded. + test.fail_test(not extract_manifest(test.built_file_path( + 'enable_uac.exe', chdir=CHDIR), 1)) + test.fail_test(not extract_manifest(test.built_file_path( + 'enable_uac_no.exe', chdir=CHDIR), 1)) + test.fail_test(not extract_manifest(test.built_file_path( + 'enable_uac_admin.exe', chdir=CHDIR), 1)) + + # Verify that <requestedExecutionLevel level="asInvoker" uiAccess="false" /> + # is present. + manifest = parseString(extract_manifest( + test.built_file_path('enable_uac.exe', chdir=CHDIR), 1)) + execution_level = manifest.getElementsByTagName('requestedExecutionLevel') + test.fail_test(len(execution_level) != 1) + execution_level = execution_level[0].attributes + test.fail_test(not ( + execution_level.has_key('level') and + execution_level.has_key('uiAccess') and + execution_level['level'].nodeValue == 'asInvoker' and + execution_level['uiAccess'].nodeValue == 'false')) + + # Verify that <requestedExecutionLevel> is not in the menifest. + manifest = parseString(extract_manifest( + test.built_file_path('enable_uac_no.exe', chdir=CHDIR), 1)) + execution_level = manifest.getElementsByTagName('requestedExecutionLevel') + test.fail_test(len(execution_level) != 0) + + # Verify that <requestedExecutionLevel level="requireAdministrator" + # uiAccess="true" /> is present. + manifest = parseString(extract_manifest( + test.built_file_path('enable_uac_admin.exe', chdir=CHDIR), 1)) + execution_level = manifest.getElementsByTagName('requestedExecutionLevel') + test.fail_test(len(execution_level) != 1) + execution_level = execution_level[0].attributes + test.fail_test(not ( + execution_level.has_key('level') and + execution_level.has_key('uiAccess') and + execution_level['level'].nodeValue == 'requireAdministrator' and + execution_level['uiAccess'].nodeValue == 'true')) + + test.pass_test() diff --git a/deps/gyp/test/win/gyptest-link-enable-winrt-app-revision.py b/deps/gyp/test/win/gyptest-link-enable-winrt-app-revision.py new file mode 100644 index 0000000000..e5c5a71335 --- /dev/null +++ b/deps/gyp/test/win/gyptest-link-enable-winrt-app-revision.py @@ -0,0 +1,41 @@ +#!/usr/bin/env python + +# Copyright (c) 2013 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. + +""" +Make sure msvs_application_type_revision works correctly. +""" + +import TestGyp + +import os +import sys +import struct + +CHDIR = 'winrt-app-type-revision' + +print 'This test is not currently working on the bots: https://code.google.com/p/gyp/issues/detail?id=466' +sys.exit(0) + +if (sys.platform == 'win32' and + int(os.environ.get('GYP_MSVS_VERSION', 0)) == 2013): + test = TestGyp.TestGyp(formats=['msvs']) + + test.run_gyp('winrt-app-type-revision.gyp', chdir=CHDIR) + + test.build('winrt-app-type-revision.gyp', 'enable_winrt_81_revision_dll', + chdir=CHDIR) + + # Revision is set to 8.2 which is invalid for 2013 projects so compilation + # must fail. + test.build('winrt-app-type-revision.gyp', 'enable_winrt_82_revision_dll', + chdir=CHDIR, status=1) + + # Revision is set to an invalid value for 2013 projects so compilation + # must fail. + test.build('winrt-app-type-revision.gyp', 'enable_winrt_invalid_revision_dll', + chdir=CHDIR, status=1) + + test.pass_test() diff --git a/deps/gyp/test/win/gyptest-link-enable-winrt-target-platform-version.py b/deps/gyp/test/win/gyptest-link-enable-winrt-target-platform-version.py new file mode 100644 index 0000000000..cd9244ed01 --- /dev/null +++ b/deps/gyp/test/win/gyptest-link-enable-winrt-target-platform-version.py @@ -0,0 +1,45 @@ +#!/usr/bin/env python + +# Copyright (c) 2015 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. + +""" +Make sure msvs_target_platform_version works correctly. +""" + +import TestGyp + +import os +import sys +import struct + +CHDIR = 'winrt-target-platform-version' + +print 'This test is not currently working on the bots: https://code.google.com/p/gyp/issues/detail?id=466' +sys.exit(0) + +if (sys.platform == 'win32' and + int(os.environ.get('GYP_MSVS_VERSION', 0)) == 2015): + test = TestGyp.TestGyp(formats=['msvs']) + + test.run_gyp('winrt-target-platform-version.gyp', chdir=CHDIR) + + test.build('winrt-target-platform-version.gyp', + 'enable_winrt_10_platversion_dll', chdir=CHDIR) + + # Target Platform without Minimum Target Platform version defaults to a valid + # Target Platform and compiles. + test.build('winrt-target-platform-version.gyp', + 'enable_winrt_10_platversion_nominver_dll', chdir=CHDIR) + + # Target Platform is set to 9.0 which is invalid for 2015 projects so + # compilation must fail. + test.build('winrt-target-platform-version.gyp', + 'enable_winrt_9_platversion_dll', chdir=CHDIR, status=1) + + # Missing Target Platform for 2015 projects must fail. + test.build('winrt-target-platform-version.gyp', + 'enable_winrt_missing_platversion_dll', chdir=CHDIR, status=1) + + test.pass_test() diff --git a/deps/gyp/test/win/gyptest-link-enable-winrt.py b/deps/gyp/test/win/gyptest-link-enable-winrt.py new file mode 100644 index 0000000000..283863ced7 --- /dev/null +++ b/deps/gyp/test/win/gyptest-link-enable-winrt.py @@ -0,0 +1,35 @@ +#!/usr/bin/env python + +# Copyright (c) 2013 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. + +""" +Make sure msvs_enable_winrt works correctly. +""" + +import TestGyp + +import os +import sys +import struct + +CHDIR = 'enable-winrt' + +print 'This test is not currently working on the bots: https://code.google.com/p/gyp/issues/detail?id=466' +sys.exit(0) + +if (sys.platform == 'win32' and + int(os.environ.get('GYP_MSVS_VERSION', 0)) >= 2013): + test = TestGyp.TestGyp(formats=['msvs']) + + test.run_gyp('enable-winrt.gyp', chdir=CHDIR) + + test.build('enable-winrt.gyp', 'enable_winrt_dll', chdir=CHDIR) + + test.build('enable-winrt.gyp', 'enable_winrt_missing_dll', chdir=CHDIR, + status=1) + + test.build('enable-winrt.gyp', 'enable_winrt_winphone_dll', chdir=CHDIR) + + test.pass_test() diff --git a/deps/gyp/test/win/gyptest-link-entrypointsymbol.py b/deps/gyp/test/win/gyptest-link-entrypointsymbol.py new file mode 100644 index 0000000000..e88174a085 --- /dev/null +++ b/deps/gyp/test/win/gyptest-link-entrypointsymbol.py @@ -0,0 +1,24 @@ +#!/usr/bin/env python + +# 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. + +""" +Make sure entrypointsymbol setting is extracted properly. +""" + +import TestGyp + +import sys + +if sys.platform == 'win32': + test = TestGyp.TestGyp(formats=['msvs', 'ninja']) + + CHDIR = 'linker-flags' + test.run_gyp('entrypointsymbol.gyp', chdir=CHDIR) + + test.build('entrypointsymbol.gyp', 'test_ok', chdir=CHDIR) + test.build('entrypointsymbol.gyp', 'test_fail', chdir=CHDIR, status=1) + + test.pass_test() diff --git a/deps/gyp/test/win/gyptest-link-fixed-base.py b/deps/gyp/test/win/gyptest-link-fixed-base.py new file mode 100644 index 0000000000..725a87028a --- /dev/null +++ b/deps/gyp/test/win/gyptest-link-fixed-base.py @@ -0,0 +1,40 @@ +#!/usr/bin/env python + +# 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. + +""" +Make sure fixed base setting is extracted properly. +""" + +import TestGyp + +import sys + +if sys.platform == 'win32': + test = TestGyp.TestGyp(formats=['msvs', 'ninja']) + + CHDIR = 'linker-flags' + test.run_gyp('fixed-base.gyp', chdir=CHDIR) + test.build('fixed-base.gyp', test.ALL, chdir=CHDIR) + + def GetHeaders(exe): + full_path = test.built_file_path(exe, chdir=CHDIR) + return test.run_dumpbin('/headers', full_path) + + # For exe, default is fixed, for dll, it's not fixed. + if 'Relocations stripped' not in GetHeaders('test_fixed_default_exe.exe'): + test.fail_test() + if 'Relocations stripped' in GetHeaders('test_fixed_default_dll.dll'): + test.fail_test() + + # Explicitly not fixed. + if 'Relocations stripped' in GetHeaders('test_fixed_no.exe'): + test.fail_test() + + # Explicitly fixed. + if 'Relocations stripped' not in GetHeaders('test_fixed_yes.exe'): + test.fail_test() + + test.pass_test() diff --git a/deps/gyp/test/win/gyptest-link-force-symbol-reference.py b/deps/gyp/test/win/gyptest-link-force-symbol-reference.py new file mode 100644 index 0000000000..235e94f71b --- /dev/null +++ b/deps/gyp/test/win/gyptest-link-force-symbol-reference.py @@ -0,0 +1,26 @@ +#!/usr/bin/env python + +# Copyright (c) 2013 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. + +""" +Make sure ForceSymbolReference is translated properly. +""" + +import TestGyp + +import sys + +if sys.platform == 'win32': + test = TestGyp.TestGyp(formats=['msvs', 'ninja']) + + CHDIR = 'linker-flags' + test.run_gyp('force-symbol-reference.gyp', chdir=CHDIR) + test.build('force-symbol-reference.gyp', test.ALL, chdir=CHDIR) + + output = test.run_dumpbin( + '/disasm', test.built_file_path('test_force_reference.exe', chdir=CHDIR)) + if '?x@@YAHXZ:' not in output or '?y@@YAHXZ:' not in output: + test.fail_test() + test.pass_test() diff --git a/deps/gyp/test/win/gyptest-link-generate-manifest.py b/deps/gyp/test/win/gyptest-link-generate-manifest.py new file mode 100644 index 0000000000..77c9228ee5 --- /dev/null +++ b/deps/gyp/test/win/gyptest-link-generate-manifest.py @@ -0,0 +1,127 @@ +#!/usr/bin/env python + +# 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. + +""" +Make sure we generate a manifest file when linking binaries, including +handling AdditionalManifestFiles. +""" + +import TestGyp + +import sys + +if sys.platform == 'win32': + import pywintypes + import win32api + import winerror + + RT_MANIFEST = 24 + + class LoadLibrary(object): + """Context manager for loading and releasing binaries in Windows. + Yields the handle of the binary loaded.""" + def __init__(self, path): + self._path = path + self._handle = None + + def __enter__(self): + self._handle = win32api.LoadLibrary(self._path) + return self._handle + + def __exit__(self, type, value, traceback): + win32api.FreeLibrary(self._handle) + + def extract_manifest(path, resource_name): + """Reads manifest from |path| and returns it as a string. + Returns None is there is no such manifest.""" + with LoadLibrary(path) as handle: + try: + return win32api.LoadResource(handle, RT_MANIFEST, resource_name) + except pywintypes.error as error: + if error.args[0] == winerror.ERROR_RESOURCE_DATA_NOT_FOUND: + return None + else: + raise + + test = TestGyp.TestGyp(formats=['msvs', 'ninja']) + + CHDIR = 'linker-flags' + test.run_gyp('generate-manifest.gyp', chdir=CHDIR) + test.build('generate-manifest.gyp', test.ALL, chdir=CHDIR) + + # Make sure that generation of .generated.manifest does not cause a relink. + test.run_gyp('generate-manifest.gyp', chdir=CHDIR) + test.up_to_date('generate-manifest.gyp', test.ALL, chdir=CHDIR) + + def test_manifest(filename, generate_manifest, embedded_manifest, + extra_manifest): + exe_file = test.built_file_path(filename, chdir=CHDIR) + if not generate_manifest: + test.must_not_exist(exe_file + '.manifest') + manifest = extract_manifest(exe_file, 1) + test.fail_test(manifest) + return + if embedded_manifest: + manifest = extract_manifest(exe_file, 1) + test.fail_test(not manifest) + else: + test.must_exist(exe_file + '.manifest') + manifest = test.read(exe_file + '.manifest') + test.fail_test(not manifest) + test.fail_test(extract_manifest(exe_file, 1)) + if generate_manifest: + test.must_contain_any_line(manifest, 'requestedExecutionLevel') + if extra_manifest: + test.must_contain_any_line(manifest, + '35138b9a-5d96-4fbd-8e2d-a2440225f93a') + test.must_contain_any_line(manifest, + 'e2011457-1546-43c5-a5fe-008deee3d3f0') + + test_manifest('test_generate_manifest_true.exe', + generate_manifest=True, + embedded_manifest=False, + extra_manifest=False) + test_manifest('test_generate_manifest_false.exe', + generate_manifest=False, + embedded_manifest=False, + extra_manifest=False) + test_manifest('test_generate_manifest_default.exe', + generate_manifest=True, + embedded_manifest=False, + extra_manifest=False) + test_manifest('test_generate_manifest_true_as_embedded.exe', + generate_manifest=True, + embedded_manifest=True, + extra_manifest=False) + test_manifest('test_generate_manifest_false_as_embedded.exe', + generate_manifest=False, + embedded_manifest=True, + extra_manifest=False) + test_manifest('test_generate_manifest_default_as_embedded.exe', + generate_manifest=True, + embedded_manifest=True, + extra_manifest=False) + test_manifest('test_generate_manifest_true_with_extra_manifest.exe', + generate_manifest=True, + embedded_manifest=False, + extra_manifest=True) + test_manifest('test_generate_manifest_false_with_extra_manifest.exe', + generate_manifest=False, + embedded_manifest=False, + extra_manifest=True) + test_manifest('test_generate_manifest_true_with_extra_manifest_list.exe', + generate_manifest=True, + embedded_manifest=False, + extra_manifest=True) + test_manifest('test_generate_manifest_false_with_extra_manifest_list.exe', + generate_manifest=False, + embedded_manifest=False, + extra_manifest=True) + test_manifest('test_generate_manifest_default_embed_default.exe', + generate_manifest=True, + embedded_manifest=True, + extra_manifest=False) + test.pass_test() diff --git a/deps/gyp/test/win/gyptest-link-incremental.py b/deps/gyp/test/win/gyptest-link-incremental.py new file mode 100644 index 0000000000..e7184e162c --- /dev/null +++ b/deps/gyp/test/win/gyptest-link-incremental.py @@ -0,0 +1,37 @@ +#!/usr/bin/env python + +# 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. + +""" +Make sure incremental linking setting is extracted properly. +""" + +import TestGyp + +import sys + +if sys.platform == 'win32': + test = TestGyp.TestGyp(formats=['msvs', 'ninja']) + + CHDIR = 'linker-flags' + test.run_gyp('incremental.gyp', chdir=CHDIR) + test.build('incremental.gyp', test.ALL, chdir=CHDIR) + + def HasILTTables(exe): + full_path = test.built_file_path(exe, chdir=CHDIR) + output = test.run_dumpbin('/disasm', full_path) + return '@ILT+' in output + + # Default or unset is to be on. + if not HasILTTables('test_incremental_unset.exe'): + test.fail_test() + if not HasILTTables('test_incremental_default.exe'): + test.fail_test() + if HasILTTables('test_incremental_no.exe'): + test.fail_test() + if not HasILTTables('test_incremental_yes.exe'): + test.fail_test() + + test.pass_test() diff --git a/deps/gyp/test/win/gyptest-link-large-address-aware.py b/deps/gyp/test/win/gyptest-link-large-address-aware.py new file mode 100644 index 0000000000..ea433f2099 --- /dev/null +++ b/deps/gyp/test/win/gyptest-link-large-address-aware.py @@ -0,0 +1,35 @@ +#!/usr/bin/env python + +# 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. + +""" +Make sure largeaddressaware setting is extracted properly. +""" + +import TestGyp + +import sys + +if sys.platform == 'win32': + test = TestGyp.TestGyp(formats=['msvs', 'ninja']) + + CHDIR = 'linker-flags' + test.run_gyp('large-address-aware.gyp', chdir=CHDIR) + test.build('large-address-aware.gyp', test.ALL, chdir=CHDIR) + + def GetHeaders(exe): + return test.run_dumpbin('/headers', test.built_file_path(exe, chdir=CHDIR)) + + MARKER = 'Application can handle large (>2GB) addresses' + + # Explicitly off. + if MARKER in GetHeaders('test_large_address_aware_no.exe'): + test.fail_test() + + # Explicitly on. + if MARKER not in GetHeaders('test_large_address_aware_yes.exe'): + test.fail_test() + + test.pass_test() diff --git a/deps/gyp/test/win/gyptest-link-large-pdb.py b/deps/gyp/test/win/gyptest-link-large-pdb.py new file mode 100644 index 0000000000..4604745d14 --- /dev/null +++ b/deps/gyp/test/win/gyptest-link-large-pdb.py @@ -0,0 +1,74 @@ +#!/usr/bin/env python + +# Copyright (c) 2013 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. + +""" +Make sure msvs_large_pdb works correctly. +""" + +import TestGyp + +import struct +import sys + +if sys.platform == 'win32': + print "This test is currently disabled: https://crbug.com/483696." + sys.exit(0) + + +CHDIR = 'large-pdb' + + +def CheckImageAndPdb(test, image_basename, expected_page_size, + pdb_basename=None): + if not pdb_basename: + pdb_basename = image_basename + '.pdb' + test.built_file_must_exist(image_basename, chdir=CHDIR) + test.built_file_must_exist(pdb_basename, chdir=CHDIR) + + # We expect the PDB to have the given page size. For full details of the + # header look here: https://code.google.com/p/pdbparser/wiki/MSF_Format + # We read the little-endian 4-byte unsigned integer at position 32 of the + # file. + pdb_path = test.built_file_path(pdb_basename, chdir=CHDIR) + pdb_file = open(pdb_path, 'rb') + pdb_file.seek(32, 0) + page_size = struct.unpack('<I', pdb_file.read(4))[0] + if page_size != expected_page_size: + print "Expected page size of %d, got %d for PDB file `%s'." % ( + expected_page_size, page_size, pdb_path) + + +if sys.platform == 'win32': + test = TestGyp.TestGyp(formats=['msvs', 'ninja']) + + test.run_gyp('large-pdb.gyp', chdir=CHDIR) + + test.build('large-pdb.gyp', 'large_pdb_exe', chdir=CHDIR) + CheckImageAndPdb(test, 'large_pdb_exe.exe', 4096) + + test.build('large-pdb.gyp', 'small_pdb_exe', chdir=CHDIR) + CheckImageAndPdb(test, 'small_pdb_exe.exe', 1024) + + test.build('large-pdb.gyp', 'large_pdb_dll', chdir=CHDIR) + CheckImageAndPdb(test, 'large_pdb_dll.dll', 4096) + + test.build('large-pdb.gyp', 'small_pdb_dll', chdir=CHDIR) + CheckImageAndPdb(test, 'small_pdb_dll.dll', 1024) + + test.build('large-pdb.gyp', 'large_pdb_implicit_exe', chdir=CHDIR) + CheckImageAndPdb(test, 'large_pdb_implicit_exe.exe', 4096) + + # This target has a different PDB name because it uses an + # 'msvs_large_pdb_path' variable. + test.build('large-pdb.gyp', 'large_pdb_variable_exe', chdir=CHDIR) + CheckImageAndPdb(test, 'large_pdb_variable_exe.exe', 4096, + pdb_basename='foo.pdb') + + # This target has a different output name because it uses 'product_name'. + test.build('large-pdb.gyp', 'large_pdb_product_exe', chdir=CHDIR) + CheckImageAndPdb(test, 'bar.exe', 4096) + + test.pass_test() diff --git a/deps/gyp/test/win/gyptest-link-library-adjust.py b/deps/gyp/test/win/gyptest-link-library-adjust.py new file mode 100644 index 0000000000..71d1c09360 --- /dev/null +++ b/deps/gyp/test/win/gyptest-link-library-adjust.py @@ -0,0 +1,21 @@ +#!/usr/bin/env python + +# 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. + +""" +Make sure link_settings containing -lblah.lib is remapped to just blah.lib. +""" + +import TestGyp + +import sys + +if sys.platform == 'win32': + test = TestGyp.TestGyp(formats=['ninja']) + + CHDIR = 'linker-flags' + test.run_gyp('library-adjust.gyp', chdir=CHDIR) + test.build('library-adjust.gyp', test.ALL, chdir=CHDIR) + test.pass_test() diff --git a/deps/gyp/test/win/gyptest-link-library-directories.py b/deps/gyp/test/win/gyptest-link-library-directories.py new file mode 100644 index 0000000000..8308e14fcb --- /dev/null +++ b/deps/gyp/test/win/gyptest-link-library-directories.py @@ -0,0 +1,35 @@ +#!/usr/bin/env python + +# 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. + +""" +Make sure libpath is extracted properly. +""" + +import TestGyp + +import sys + +if sys.platform == 'win32': + test = TestGyp.TestGyp(formats=['msvs', 'ninja']) + + CHDIR = 'linker-flags' + + # Build subdirectory library. + test.run_gyp('subdir/library.gyp', chdir=CHDIR) + test.build('subdir/library.gyp', test.ALL, chdir=CHDIR) + + # And then try to link the main project against the library using only + # LIBPATH to find it. + test.run_gyp('library-directories.gyp', chdir=CHDIR) + + # Without additional paths specified, should fail. + test.build('library-directories.gyp', 'test_libdirs_none', chdir=CHDIR, + status=1) + + # With the additional library directory, should pass. + test.build('library-directories.gyp', 'test_libdirs_with', chdir=CHDIR) + + test.pass_test() diff --git a/deps/gyp/test/win/gyptest-link-ltcg.py b/deps/gyp/test/win/gyptest-link-ltcg.py new file mode 100644 index 0000000000..5271e099d7 --- /dev/null +++ b/deps/gyp/test/win/gyptest-link-ltcg.py @@ -0,0 +1,44 @@ +#!/usr/bin/env python + +# Copyright (c) 2013 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. + +""" +Make sure LTCG is working properly. +""" + +import TestGyp + +import sys + +if sys.platform == 'win32': + test = TestGyp.TestGyp(formats=['msvs', 'ninja']) + + CHDIR = 'linker-flags' + test.run_gyp('ltcg.gyp', chdir=CHDIR) + + # Here we expect LTCG is able to inline functions beyond compile unit. + # Note: This marker is embedded in 'inline_test_main.cc' + INLINE_MARKER = '==== inlined ====' + + # link.exe generates following lines when LTCG is enabled. + # Note: Future link.exe may or may not generate them. Update as needed. + LTCG_LINKER_MESSAGES = ['Generating code', 'Finished generating code'] + + # test 'LinkTimeCodeGenerationOptionDefault' + test.build('ltcg.gyp', 'test_ltcg_off', chdir=CHDIR) + test.run_built_executable('test_ltcg_off', chdir=CHDIR) + test.must_not_contain_any_line(test.stdout(), [INLINE_MARKER]) + + # test 'LinkTimeCodeGenerationOptionUse' + test.build('ltcg.gyp', 'test_ltcg_on', chdir=CHDIR) + if test.format == 'ninja': + # Make sure ninja win_tool.py filters out noisy lines. + test.must_not_contain_any_line(test.stdout(), LTCG_LINKER_MESSAGES) + elif test.format == 'msvs': + test.must_contain_any_line(test.stdout(), LTCG_LINKER_MESSAGES) + test.run_built_executable('test_ltcg_on', chdir=CHDIR) + test.must_contain_any_line(test.stdout(), [INLINE_MARKER]) + + test.pass_test() diff --git a/deps/gyp/test/win/gyptest-link-mapfile.py b/deps/gyp/test/win/gyptest-link-mapfile.py new file mode 100644 index 0000000000..00c1dea9e9 --- /dev/null +++ b/deps/gyp/test/win/gyptest-link-mapfile.py @@ -0,0 +1,44 @@ +#!/usr/bin/env python + +# Copyright (c) 2013 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. + +""" +Make sure mapfile settings are extracted properly. +""" + +import TestGyp + +import sys + +if sys.platform == 'win32': + test = TestGyp.TestGyp(formats=['msvs', 'ninja']) + + CHDIR = 'linker-flags' + test.run_gyp('mapfile.gyp', chdir=CHDIR) + test.build('mapfile.gyp', test.ALL, chdir=CHDIR) + + map_file = test.built_file_path('test_mapfile_unset.map', chdir=CHDIR) + test.must_not_exist(map_file) + + map_file = test.built_file_path('test_mapfile_generate.map', chdir=CHDIR) + test.must_exist(map_file) + test.must_contain(map_file, '?AnExportedFunction@@YAXXZ') + test.must_not_contain(map_file, 'void __cdecl AnExportedFunction(void)') + + map_file = test.built_file_path('test_mapfile_generate_exports.map', + chdir=CHDIR) + test.must_exist(map_file) + test.must_contain(map_file, 'void __cdecl AnExportedFunction(void)') + + map_file = test.built_file_path('test_mapfile_generate_filename.map', + chdir=CHDIR) + test.must_not_exist(map_file) + + map_file = test.built_file_path('custom_file_name.map', chdir=CHDIR) + test.must_exist(map_file) + test.must_contain(map_file, '?AnExportedFunction@@YAXXZ') + test.must_not_contain(map_file, 'void __cdecl AnExportedFunction(void)') + + test.pass_test() diff --git a/deps/gyp/test/win/gyptest-link-nodefaultlib.py b/deps/gyp/test/win/gyptest-link-nodefaultlib.py new file mode 100644 index 0000000000..f00760b882 --- /dev/null +++ b/deps/gyp/test/win/gyptest-link-nodefaultlib.py @@ -0,0 +1,24 @@ +#!/usr/bin/env python + +# 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. + +""" +Make sure nodefaultlib setting is extracted properly. +""" + +import TestGyp + +import sys + +if sys.platform == 'win32': + test = TestGyp.TestGyp(formats=['msvs', 'ninja']) + + CHDIR = 'linker-flags' + test.run_gyp('nodefaultlib.gyp', chdir=CHDIR) + + test.build('nodefaultlib.gyp', 'test_ok', chdir=CHDIR) + test.build('nodefaultlib.gyp', 'test_fail', chdir=CHDIR, status=1) + + test.pass_test() diff --git a/deps/gyp/test/win/gyptest-link-noimportlib.py b/deps/gyp/test/win/gyptest-link-noimportlib.py new file mode 100644 index 0000000000..d12e0ad3ed --- /dev/null +++ b/deps/gyp/test/win/gyptest-link-noimportlib.py @@ -0,0 +1,30 @@ +#!/usr/bin/env python + +# Copyright (c) 2015 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. + +""" +Make sure that the (custom) NoImportLibrary flag is handled correctly. +""" + +import TestGyp + +import os +import sys + +if sys.platform == 'win32': + test = TestGyp.TestGyp(formats=['ninja']) + + CHDIR = 'importlib' + test.run_gyp('noimplib.gyp', chdir=CHDIR) + test.build('noimplib.gyp', test.ALL, chdir=CHDIR) + + # The target has an entry point, but no exports. Ordinarily, ninja expects + # all DLLs to export some symbols (with the exception of /NOENTRY resource- + # only DLLs). When the NoImportLibrary flag is set, this is suppressed. If + # this is not working correctly, the expected .lib will never be generated + # but will be expected, so the build will not be up to date. + test.up_to_date('noimplib.gyp', test.ALL, chdir=CHDIR) + + test.pass_test() diff --git a/deps/gyp/test/win/gyptest-link-nxcompat.py b/deps/gyp/test/win/gyptest-link-nxcompat.py new file mode 100644 index 0000000000..660074397c --- /dev/null +++ b/deps/gyp/test/win/gyptest-link-nxcompat.py @@ -0,0 +1,37 @@ +#!/usr/bin/env python + +# 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. + +""" +Make sure nxcompat setting is extracted properly. +""" + +import TestGyp + +import sys + +if sys.platform == 'win32': + test = TestGyp.TestGyp(formats=['msvs', 'ninja']) + + CHDIR = 'linker-flags' + test.run_gyp('nxcompat.gyp', chdir=CHDIR) + test.build('nxcompat.gyp', test.ALL, chdir=CHDIR) + + def GetHeaders(exe): + return test.run_dumpbin('/headers', test.built_file_path(exe, chdir=CHDIR)) + + # NXCOMPAT is on by default. + if 'NX compatible' not in GetHeaders('test_nxcompat_default.exe'): + test.fail_test() + + # Explicitly off, should not be marked NX compatiable. + if 'NX compatible' in GetHeaders('test_nxcompat_no.exe'): + test.fail_test() + + # Explicitly on. + if 'NX compatible' not in GetHeaders('test_nxcompat_yes.exe'): + test.fail_test() + + test.pass_test() diff --git a/deps/gyp/test/win/gyptest-link-opt-icf.py b/deps/gyp/test/win/gyptest-link-opt-icf.py new file mode 100644 index 0000000000..3c48ef6eb9 --- /dev/null +++ b/deps/gyp/test/win/gyptest-link-opt-icf.py @@ -0,0 +1,41 @@ +#!/usr/bin/env python + +# 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. + +""" +Make sure comdat folding optimization setting is extracted properly. +""" + +import TestGyp + +import sys + +if sys.platform == 'win32': + test = TestGyp.TestGyp(formats=['msvs', 'ninja']) + + CHDIR = 'linker-flags' + test.run_gyp('opt-icf.gyp', chdir=CHDIR) + test.build('opt-icf.gyp', chdir=CHDIR) + + # We're specifying /DEBUG so the default is to not merge identical + # functions, so all of the similar_functions should be preserved. + output = test.run_dumpbin( + '/disasm', test.built_file_path('test_opticf_default.exe', chdir=CHDIR)) + if output.count('similar_function') != 6: # 3 definitions, 3 calls. + test.fail_test() + + # Explicitly off, all functions preserved seperately. + output = test.run_dumpbin( + '/disasm', test.built_file_path('test_opticf_no.exe', chdir=CHDIR)) + if output.count('similar_function') != 6: # 3 definitions, 3 calls. + test.fail_test() + + # Explicitly on, all but one removed. + output = test.run_dumpbin( + '/disasm', test.built_file_path('test_opticf_yes.exe', chdir=CHDIR)) + if output.count('similar_function') != 4: # 1 definition, 3 calls. + test.fail_test() + + test.pass_test() diff --git a/deps/gyp/test/win/gyptest-link-opt-ref.py b/deps/gyp/test/win/gyptest-link-opt-ref.py new file mode 100644 index 0000000000..586b7afcd4 --- /dev/null +++ b/deps/gyp/test/win/gyptest-link-opt-ref.py @@ -0,0 +1,40 @@ +#!/usr/bin/env python + +# 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. + +""" +Make sure reference optimization setting is extracted properly. +""" + +import TestGyp + +import sys + +if sys.platform == 'win32': + test = TestGyp.TestGyp(formats=['msvs', 'ninja']) + + CHDIR = 'linker-flags' + test.run_gyp('opt-ref.gyp', chdir=CHDIR) + test.build('opt-ref.gyp', chdir=CHDIR) + + # We're specifying /DEBUG so the default is to not remove unused functions. + output = test.run_dumpbin( + '/disasm', test.built_file_path('test_optref_default.exe', chdir=CHDIR)) + if 'unused_function' not in output: + test.fail_test() + + # Explicitly off, unused_function preserved. + output = test.run_dumpbin( + '/disasm', test.built_file_path('test_optref_no.exe', chdir=CHDIR)) + if 'unused_function' not in output: + test.fail_test() + + # Explicitly on, should be removed. + output = test.run_dumpbin( + '/disasm', test.built_file_path('test_optref_yes.exe', chdir=CHDIR)) + if 'unused_function' in output: + test.fail_test() + + test.pass_test() diff --git a/deps/gyp/test/win/gyptest-link-ordering.py b/deps/gyp/test/win/gyptest-link-ordering.py new file mode 100644 index 0000000000..a2527fa3b4 --- /dev/null +++ b/deps/gyp/test/win/gyptest-link-ordering.py @@ -0,0 +1,101 @@ +#!/usr/bin/env python + +# Copyright (c) 2013 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. + +""" +Make sure the link order of object files is the same between msvs and ninja. +""" + +import TestGyp + +import sys + +if sys.platform == 'win32': + test = TestGyp.TestGyp(formats=['msvs', 'ninja']) + + CHDIR = 'linker-flags' + test.run_gyp('link-ordering.gyp', chdir=CHDIR) + test.build('link-ordering.gyp', test.ALL, chdir=CHDIR) + + def GetDisasm(exe): + full_path = test.built_file_path(exe, chdir=CHDIR) + # Get disassembly and drop int3 padding between functions. + return '\n'.join( + x for x in test.run_dumpbin('/disasm', full_path).splitlines() + if 'CC' not in x) + + # This is the full dump that we expect. The source files in the .gyp match + # this order which is what determines the ordering in the binary. + + expected_disasm_basic = ''' +_mainCRTStartup: + 00401000: B8 05 00 00 00 mov eax,5 + 00401005: C3 ret +?z@@YAHXZ: + 00401010: B8 03 00 00 00 mov eax,3 + 00401015: C3 ret +?x@@YAHXZ: + 00401020: B8 01 00 00 00 mov eax,1 + 00401025: C3 ret +?y@@YAHXZ: + 00401030: B8 02 00 00 00 mov eax,2 + 00401035: C3 ret +_main: + 00401040: 33 C0 xor eax,eax + 00401042: C3 ret +''' + + if expected_disasm_basic not in GetDisasm('test_ordering_exe.exe'): + print GetDisasm('test_ordering_exe.exe') + test.fail_test() + + # Similar to above. The VS generator handles subdirectories differently. + + expected_disasm_subdirs = ''' +_mainCRTStartup: + 00401000: B8 05 00 00 00 mov eax,5 + 00401005: C3 ret +_main: + 00401010: 33 C0 xor eax,eax + 00401012: C3 ret +?y@@YAHXZ: + 00401020: B8 02 00 00 00 mov eax,2 + 00401025: C3 ret +?z@@YAHXZ: + 00401030: B8 03 00 00 00 mov eax,3 + 00401035: C3 ret +''' + + if expected_disasm_subdirs not in GetDisasm('test_ordering_subdirs.exe'): + print GetDisasm('test_ordering_subdirs.exe') + test.fail_test() + + # Similar, but with directories mixed into folders (crt and main at the same + # level, but with a subdir in the middle). + + expected_disasm_subdirs_mixed = ''' +_mainCRTStartup: + 00401000: B8 05 00 00 00 mov eax,5 + 00401005: C3 ret +?x@@YAHXZ: + 00401010: B8 01 00 00 00 mov eax,1 + 00401015: C3 ret +_main: + 00401020: 33 C0 xor eax,eax + 00401022: C3 ret +?z@@YAHXZ: + 00401030: B8 03 00 00 00 mov eax,3 + 00401035: C3 ret +?y@@YAHXZ: + 00401040: B8 02 00 00 00 mov eax,2 + 00401045: C3 ret +''' + + if (expected_disasm_subdirs_mixed not in + GetDisasm('test_ordering_subdirs_mixed.exe')): + print GetDisasm('test_ordering_subdirs_mixed.exe') + test.fail_test() + + test.pass_test() diff --git a/deps/gyp/test/win/gyptest-link-outputfile.py b/deps/gyp/test/win/gyptest-link-outputfile.py new file mode 100644 index 0000000000..b98cdff0f0 --- /dev/null +++ b/deps/gyp/test/win/gyptest-link-outputfile.py @@ -0,0 +1,28 @@ +#!/usr/bin/env python + +# 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. + +""" +Make sure linker OutputFile setting is extracted properly. +""" + +import TestGyp + +import sys + +if sys.platform == 'win32': + test = TestGyp.TestGyp(formats=['msvs', 'ninja']) + + CHDIR = 'linker-flags' + test.run_gyp('outputfile.gyp', chdir=CHDIR) + test.build('outputfile.gyp', test.ALL, chdir=CHDIR) + + test.built_file_must_exist('blorp.exe', chdir=CHDIR) + test.built_file_must_exist('blorp.dll', chdir=CHDIR) + test.built_file_must_exist('subdir/blorp.exe', chdir=CHDIR) + test.built_file_must_exist('blorp.lib', chdir=CHDIR) + test.built_file_must_exist('subdir/blorp.lib', chdir=CHDIR) + + test.pass_test() diff --git a/deps/gyp/test/win/gyptest-link-pdb-no-output.py b/deps/gyp/test/win/gyptest-link-pdb-no-output.py new file mode 100644 index 0000000000..6da0aeae98 --- /dev/null +++ b/deps/gyp/test/win/gyptest-link-pdb-no-output.py @@ -0,0 +1,25 @@ +#!/usr/bin/env python + +# Copyright (c) 2014 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. + +""" +Ensure that when debug information is not output, a pdb is not expected. +""" + +import TestGyp + +import os +import sys + +if sys.platform == 'win32': + test = TestGyp.TestGyp() + CHDIR = 'linker-flags' + test.run_gyp('pdb-output.gyp', chdir=CHDIR) + test.build('pdb-output.gyp', 'test_pdb_output_disabled', chdir=CHDIR) + # Make sure that the build doesn't expect a PDB to be generated when there + # will be none. + test.up_to_date('pdb-output.gyp', 'test_pdb_output_disabled', chdir=CHDIR) + + test.pass_test() diff --git a/deps/gyp/test/win/gyptest-link-pdb-output.py b/deps/gyp/test/win/gyptest-link-pdb-output.py new file mode 100644 index 0000000000..27245f7ec8 --- /dev/null +++ b/deps/gyp/test/win/gyptest-link-pdb-output.py @@ -0,0 +1,33 @@ +#!/usr/bin/env python + +# Copyright (c) 2014 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. + +""" +Ensure that ninja includes the .pdb as an output file from linking. +""" + +import TestGyp + +import os +import sys + +if sys.platform == 'win32': + test = TestGyp.TestGyp(formats=['ninja']) + CHDIR = 'linker-flags' + test.run_gyp('pdb-output.gyp', chdir=CHDIR) + # Note, building the pdbs rather than ALL or gyp target. + test.build('pdb-output.gyp', 'output_exe.pdb', chdir=CHDIR) + test.build('pdb-output.gyp', 'output_dll.pdb', chdir=CHDIR) + + def FindFile(pdb): + full_path = test.built_file_path(pdb, chdir=CHDIR) + return os.path.isfile(full_path) + + if not FindFile('output_exe.pdb'): + test.fail_test() + if not FindFile('output_dll.pdb'): + test.fail_test() + + test.pass_test() diff --git a/deps/gyp/test/win/gyptest-link-pdb.py b/deps/gyp/test/win/gyptest-link-pdb.py new file mode 100644 index 0000000000..26d744d0b7 --- /dev/null +++ b/deps/gyp/test/win/gyptest-link-pdb.py @@ -0,0 +1,35 @@ +#!/usr/bin/env python + +# 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. + +""" +Verifies that the 'ProgramDatabaseFile' attribute in VCLinker is extracted +properly. +""" + +import TestGyp + +import os +import sys + + +if sys.platform == 'win32': + test = TestGyp.TestGyp(formats=['msvs', 'ninja']) + CHDIR = 'linker-flags' + test.run_gyp('program-database.gyp', chdir=CHDIR) + test.build('program-database.gyp', test.ALL, chdir=CHDIR) + + def FindFile(pdb): + full_path = test.built_file_path(pdb, chdir=CHDIR) + return os.path.isfile(full_path) + + # Verify the specified PDB is created when ProgramDatabaseFile + # is provided. + if not FindFile('name_outdir.pdb'): + test.fail_test() + if not FindFile('name_proddir.pdb'): + test.fail_test() + + test.pass_test() diff --git a/deps/gyp/test/win/gyptest-link-pgo.py b/deps/gyp/test/win/gyptest-link-pgo.py new file mode 100644 index 0000000000..d742047ac3 --- /dev/null +++ b/deps/gyp/test/win/gyptest-link-pgo.py @@ -0,0 +1,75 @@ +#!/usr/bin/env python + +# Copyright (c) 2013 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. + +""" +Make sure PGO is working properly. +""" + +import TestGyp + +import os +import sys + +if sys.platform == 'win32': + test = TestGyp.TestGyp(formats=['msvs', 'ninja']) + + CHDIR = 'linker-flags' + test.run_gyp('pgo.gyp', chdir=CHDIR) + + def IsPGOAvailable(): + """Returns true if the Visual Studio available here supports PGO.""" + test.build('pgo.gyp', 'gen_linker_option', chdir=CHDIR) + tmpfile = test.read(test.built_file_path('linker_options.txt', chdir=CHDIR)) + return any(line.find('PGOPTIMIZE') for line in tmpfile) + + # Test generated build files look fine. + if test.format == 'ninja': + ninja = test.built_file_path('obj/test_pgo_instrument.ninja', chdir=CHDIR) + test.must_contain(ninja, '/LTCG:PGINSTRUMENT') + test.must_contain(ninja, 'test_pgo.pgd') + ninja = test.built_file_path('obj/test_pgo_optimize.ninja', chdir=CHDIR) + test.must_contain(ninja, '/LTCG:PGOPTIMIZE') + test.must_contain(ninja, 'test_pgo.pgd') + ninja = test.built_file_path('obj/test_pgo_update.ninja', chdir=CHDIR) + test.must_contain(ninja, '/LTCG:PGUPDATE') + test.must_contain(ninja, 'test_pgo.pgd') + elif test.format == 'msvs': + LTCG_FORMAT = '<LinkTimeCodeGeneration>%s</LinkTimeCodeGeneration>' + vcproj = test.workpath('linker-flags/test_pgo_instrument.vcxproj') + test.must_contain(vcproj, LTCG_FORMAT % 'PGInstrument') + test.must_contain(vcproj, 'test_pgo.pgd') + vcproj = test.workpath('linker-flags/test_pgo_optimize.vcxproj') + test.must_contain(vcproj, LTCG_FORMAT % 'PGOptimization') + test.must_contain(vcproj, 'test_pgo.pgd') + vcproj = test.workpath('linker-flags/test_pgo_update.vcxproj') + test.must_contain(vcproj, LTCG_FORMAT % 'PGUpdate') + test.must_contain(vcproj, 'test_pgo.pgd') + + # When PGO is available, try building binaries with PGO. + if IsPGOAvailable(): + pgd_path = test.built_file_path('test_pgo.pgd', chdir=CHDIR) + + # Test if 'PGInstrument' generates PGD (Profile-Guided Database) file. + if os.path.exists(pgd_path): + test.unlink(pgd_path) + test.must_not_exist(pgd_path) + test.build('pgo.gyp', 'test_pgo_instrument', chdir=CHDIR) + test.must_exist(pgd_path) + + # Test if 'PGOptimize' works well + test.build('pgo.gyp', 'test_pgo_optimize', chdir=CHDIR) + test.must_contain_any_line(test.stdout(), ['profiled functions']) + + # Test if 'PGUpdate' works well + test.build('pgo.gyp', 'test_pgo_update', chdir=CHDIR) + # With 'PGUpdate', linker should not complain that sources are changed after + # the previous training run. + test.touch(test.workpath('linker-flags/inline_test_main.cc')) + test.unlink(test.built_file_path('test_pgo_update.exe', chdir=CHDIR)) + test.build('pgo.gyp', 'test_pgo_update', chdir=CHDIR) + test.must_contain_any_line(test.stdout(), ['profiled functions']) + + test.pass_test() diff --git a/deps/gyp/test/win/gyptest-link-profile.py b/deps/gyp/test/win/gyptest-link-profile.py new file mode 100644 index 0000000000..4dbc9ae4ce --- /dev/null +++ b/deps/gyp/test/win/gyptest-link-profile.py @@ -0,0 +1,37 @@ +#!/usr/bin/env python + +# 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. + +""" +Verifies that the 'Profile' attribute in VCLinker is extracted properly. +""" + +import TestGyp + +import os +import sys + + +if sys.platform == 'win32': + test = TestGyp.TestGyp(formats=['msvs', 'ninja']) + CHDIR = 'linker-flags' + test.run_gyp('profile.gyp', chdir=CHDIR) + test.build('profile.gyp', test.ALL, chdir=CHDIR) + + def GetSummary(exe): + full_path = test.built_file_path(exe, chdir=CHDIR) + return test.run_dumpbin(full_path) + + # '.idata' section will be missing when /PROFILE is enabled. + if '.idata' in GetSummary('test_profile_true.exe'): + test.fail_test() + + if not '.idata' in GetSummary('test_profile_false.exe'): + test.fail_test() + + if not '.idata' in GetSummary('test_profile_default.exe'): + test.fail_test() + + test.pass_test() diff --git a/deps/gyp/test/win/gyptest-link-restat-importlib.py b/deps/gyp/test/win/gyptest-link-restat-importlib.py new file mode 100644 index 0000000000..76b5c3cdb9 --- /dev/null +++ b/deps/gyp/test/win/gyptest-link-restat-importlib.py @@ -0,0 +1,45 @@ +#!/usr/bin/env python + +# 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. + +""" +Make sure we don't cause unnecessary builds due to import libs appearing +to be out of date. +""" + +import TestGyp + +import os +import sys +import time + +if sys.platform == 'win32': + test = TestGyp.TestGyp(formats=['msvs', 'ninja']) + + if not os.environ.get('ProgramFiles(x86)'): + # TODO(scottmg) + print 'Skipping test on x86, http://crbug.com/365833' + test.pass_test() + + CHDIR = 'importlib' + test.run_gyp('importlib.gyp', chdir=CHDIR) + test.build('importlib.gyp', test.ALL, chdir=CHDIR) + + # Delay briefly so that there's time for this touch not to have the + # timestamp as the previous run. + test.sleep() + + # Touch the .cc file; the .dll will rebuild, but the import libs timestamp + # won't be updated. + test.touch('importlib/has-exports.cc') + test.build('importlib.gyp', 'test_importlib', chdir=CHDIR) + + # This is the important part. The .dll above will relink and have an updated + # timestamp, however the import .libs timestamp won't be updated. So, we + # have to handle restating inputs in ninja so the final binary doesn't + # continually relink (due to thinking the .lib isn't up to date). + test.up_to_date('importlib.gyp', test.ALL, chdir=CHDIR) + + test.pass_test() diff --git a/deps/gyp/test/win/gyptest-link-safeseh.py b/deps/gyp/test/win/gyptest-link-safeseh.py new file mode 100644 index 0000000000..31a25673f4 --- /dev/null +++ b/deps/gyp/test/win/gyptest-link-safeseh.py @@ -0,0 +1,46 @@ +#!/usr/bin/env python + +# Copyright (c) 2014 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. + +""" +Make sure safeseh setting is extracted properly. +""" + +import TestGyp + +import sys + +if sys.platform == 'win32': + test = TestGyp.TestGyp() + + CHDIR = 'linker-flags' + test.run_gyp('safeseh.gyp', chdir=CHDIR) + test.build('safeseh.gyp', test.ALL, chdir=CHDIR) + + def HasSafeExceptionHandlers(exe): + full_path = test.built_file_path(exe, chdir=CHDIR) + output = test.run_dumpbin('/LOADCONFIG', full_path) + return ' Safe Exception Handler Table' in output + + # From MSDN: http://msdn.microsoft.com/en-us/library/9a89h429.aspx + # If /SAFESEH is not specified, the linker will produce an image with a + # table of safe exceptions handlers if all modules are compatible with + # the safe exception handling feature. If any modules were not + # compatible with safe exception handling feature, the resulting image + # will not contain a table of safe exception handlers. + # However, the msvs IDE passes /SAFESEH to the linker by default, if + # ImageHasSafeExceptionHandlers is not set to false in the vcxproj file. + # We emulate this behavior in msvs_emulation.py, so 'test_safeseh_default' + # and 'test_safeseh_yes' are built identically. + if not HasSafeExceptionHandlers('test_safeseh_default.exe'): + test.fail_test() + if HasSafeExceptionHandlers('test_safeseh_no.exe'): + test.fail_test() + if not HasSafeExceptionHandlers('test_safeseh_yes.exe'): + test.fail_test() + if HasSafeExceptionHandlers('test_safeseh_x64.exe'): + test.fail_test() + + test.pass_test() diff --git a/deps/gyp/test/win/gyptest-link-shard.py b/deps/gyp/test/win/gyptest-link-shard.py new file mode 100644 index 0000000000..9af93284a7 --- /dev/null +++ b/deps/gyp/test/win/gyptest-link-shard.py @@ -0,0 +1,30 @@ +#!/usr/bin/env python + +# Copyright (c) 2013 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. + +""" +Make sure msvs_shard works correctly. +""" + +import TestGyp + +import sys + +if sys.platform == 'win32': + test = TestGyp.TestGyp(formats=['msvs', 'ninja']) + + CHDIR = 'shard' + test.run_gyp('shard.gyp', chdir=CHDIR) + test.build('shard.gyp', test.ALL, chdir=CHDIR) + + test.built_file_must_exist('shard_0.lib', chdir=CHDIR) + test.built_file_must_exist('shard_1.lib', chdir=CHDIR) + test.built_file_must_exist('shard_2.lib', chdir=CHDIR) + test.built_file_must_exist('shard_3.lib', chdir=CHDIR) + + test.run_gyp('shard_ref.gyp', chdir=CHDIR) + test.build('shard_ref.gyp', test.ALL, chdir=CHDIR) + + test.pass_test() diff --git a/deps/gyp/test/win/gyptest-link-stacksize.py b/deps/gyp/test/win/gyptest-link-stacksize.py new file mode 100644 index 0000000000..2e952d2c73 --- /dev/null +++ b/deps/gyp/test/win/gyptest-link-stacksize.py @@ -0,0 +1,62 @@ +#!/usr/bin/env python + +# Copyright (c) 2015 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. + +""" +Make sure StackReserveSize and StackCommitSize settings are extracted properly. +""" + +import TestGyp + +import sys + +if sys.platform == 'win32': + test = TestGyp.TestGyp(formats=['msvs', 'ninja']) + + CHDIR = 'linker-flags' + test.run_gyp('stacksize.gyp', chdir=CHDIR) + test.build('stacksize.gyp', test.ALL, chdir=CHDIR) + + def GetHeaders(exe): + return test.run_dumpbin('/headers', test.built_file_path(exe, chdir=CHDIR)) + + # Verify default sizes as reported by dumpbin: + # 100000h = 1MB + # 1000h = 4KB + default_headers = GetHeaders('test_default.exe') + if '100000 size of stack reserve' not in default_headers: + test.fail_test() + if '1000 size of stack commit' not in default_headers: + test.fail_test() + + # Verify that reserved size is changed, but commit size is unchanged: + # 200000h = 2MB + # 1000h = 4KB + set_reserved_size_headers = GetHeaders('test_set_reserved_size.exe') + if '200000 size of stack reserve' not in set_reserved_size_headers: + test.fail_test() + if '1000 size of stack commit' not in set_reserved_size_headers: + test.fail_test() + + # Verify that setting the commit size, without the reserve size, has no + # effect: + # 100000h = 1MB + # 1000h = 4KB + set_commit_size_headers = GetHeaders('test_set_commit_size.exe') + if '100000 size of stack reserve' not in set_commit_size_headers: + test.fail_test() + if '1000 size of stack commit' not in set_commit_size_headers: + test.fail_test() + + # Verify that setting both works: + # 200000h = 2MB + # 2000h = 8KB + set_both_headers = GetHeaders('test_set_both.exe') + if '200000 size of stack reserve' not in set_both_headers: + test.fail_test() + if '2000 size of stack commit' not in set_both_headers: + test.fail_test() + + test.pass_test() diff --git a/deps/gyp/test/win/gyptest-link-subsystem.py b/deps/gyp/test/win/gyptest-link-subsystem.py new file mode 100644 index 0000000000..a94ba36856 --- /dev/null +++ b/deps/gyp/test/win/gyptest-link-subsystem.py @@ -0,0 +1,38 @@ +#!/usr/bin/env python + +# 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. + +""" +Make sure subsystem setting is extracted properly. +""" + +import TestGyp + +import sys + +if sys.platform == 'win32': + test = TestGyp.TestGyp(formats=['msvs', 'ninja']) + + CHDIR = 'linker-flags' + test.run_gyp('subsystem.gyp', chdir=CHDIR) + + test.build('subsystem.gyp', 'test_console_ok', chdir=CHDIR) + test.build('subsystem.gyp', 'test_console_fail', chdir=CHDIR, status=1) + test.build('subsystem.gyp', 'test_windows_ok', chdir=CHDIR) + test.build('subsystem.gyp', 'test_windows_fail', chdir=CHDIR, status=1) + + test.build('subsystem.gyp', 'test_console_xp', chdir=CHDIR) + test.build('subsystem.gyp', 'test_windows_xp', chdir=CHDIR) + # Make sure we are targeting XP. + def GetHeaders(exe): + return test.run_dumpbin('/headers', test.built_file_path(exe, chdir=CHDIR)) + if '5.01 subsystem version' not in GetHeaders('test_console_xp.exe'): + test.fail_test() + if '5.01 subsystem version' not in GetHeaders('test_windows_xp.exe'): + test.fail_test() + + # TODO(scottmg): There are other subsystems (WinCE, etc.) that we don't use. + + test.pass_test() diff --git a/deps/gyp/test/win/gyptest-link-target-machine.py b/deps/gyp/test/win/gyptest-link-target-machine.py new file mode 100644 index 0000000000..5a15f3f4dc --- /dev/null +++ b/deps/gyp/test/win/gyptest-link-target-machine.py @@ -0,0 +1,28 @@ +#!/usr/bin/env python + +# Copyright (c) 2013 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. + +""" +Make sure TargetMachine setting is extracted properly. +""" + +import TestGyp + +import sys + +if sys.platform == 'win32': + test = TestGyp.TestGyp(formats=['msvs', 'ninja']) + + CHDIR = 'linker-flags' + test.run_gyp('target-machine.gyp', chdir=CHDIR) + # The .cc file is compiled as x86 (the default), so the link/libs that are + # x64 need to fail. + test.build('target-machine.gyp', 'test_target_link_x86', chdir=CHDIR) + test.build( + 'target-machine.gyp', 'test_target_link_x64', chdir=CHDIR, status=1) + test.build('target-machine.gyp', 'test_target_lib_x86', chdir=CHDIR) + test.build('target-machine.gyp', 'test_target_lib_x64', chdir=CHDIR, status=1) + + test.pass_test() diff --git a/deps/gyp/test/win/gyptest-link-tsaware.py b/deps/gyp/test/win/gyptest-link-tsaware.py new file mode 100644 index 0000000000..d34b3c24a5 --- /dev/null +++ b/deps/gyp/test/win/gyptest-link-tsaware.py @@ -0,0 +1,33 @@ +#!/usr/bin/env python + +# 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. + +""" +Make sure tsaware setting is extracted properly. +""" + +import TestGyp + +import sys + +if sys.platform == 'win32': + test = TestGyp.TestGyp(formats=['msvs', 'ninja']) + + CHDIR = 'linker-flags' + test.run_gyp('tsaware.gyp', chdir=CHDIR) + test.build('tsaware.gyp', test.ALL, chdir=CHDIR) + + def GetHeaders(exe): + return test.run_dumpbin('/headers', test.built_file_path(exe, chdir=CHDIR)) + + # Explicitly off, should not be marked NX compatiable. + if 'Terminal Server Aware' in GetHeaders('test_tsaware_no.exe'): + test.fail_test() + + # Explicitly on. + if 'Terminal Server Aware' not in GetHeaders('test_tsaware_yes.exe'): + test.fail_test() + + test.pass_test() diff --git a/deps/gyp/test/win/gyptest-link-uldi-depending-on-module.py b/deps/gyp/test/win/gyptest-link-uldi-depending-on-module.py new file mode 100644 index 0000000000..75c9503dc4 --- /dev/null +++ b/deps/gyp/test/win/gyptest-link-uldi-depending-on-module.py @@ -0,0 +1,24 @@ +#!/usr/bin/env python + +# Copyright (c) 2015 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. + +""" +Make sure that when ULDI is on, we link cause downstream modules to get built +when we depend on the component objs. +""" + +import TestGyp + +import sys + +if sys.platform == 'win32': + test = TestGyp.TestGyp(formats=['msvs', 'ninja']) + + CHDIR = 'uldi' + test.run_gyp('uldi-depending-on-module.gyp', chdir=CHDIR) + test.build('uldi-depending-on-module.gyp', 'an_exe', chdir=CHDIR) + test.built_file_must_exist('a_module.dll', chdir=CHDIR) + + test.pass_test() diff --git a/deps/gyp/test/win/gyptest-link-uldi.py b/deps/gyp/test/win/gyptest-link-uldi.py new file mode 100644 index 0000000000..62c5892c50 --- /dev/null +++ b/deps/gyp/test/win/gyptest-link-uldi.py @@ -0,0 +1,28 @@ +#!/usr/bin/env python + +# 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. + +""" +Make sure that when ULDI is on, we link .objs that make up .libs rather than +the .libs themselves. +""" + +import TestGyp + +import sys + +if sys.platform == 'win32': + test = TestGyp.TestGyp(formats=['msvs', 'ninja']) + + CHDIR = 'uldi' + test.run_gyp('uldi.gyp', chdir=CHDIR) + # When linking with ULDI, the duplicated function from the lib will be an + # error. + test.build('uldi.gyp', 'final_uldi', chdir=CHDIR, status=1) + # And when in libs, the duplicated function will be silently dropped, so the + # build succeeds. + test.build('uldi.gyp', 'final_no_uldi', chdir=CHDIR) + + test.pass_test() diff --git a/deps/gyp/test/win/gyptest-link-unsupported-manifest.py b/deps/gyp/test/win/gyptest-link-unsupported-manifest.py new file mode 100644 index 0000000000..8f7e12bc8c --- /dev/null +++ b/deps/gyp/test/win/gyptest-link-unsupported-manifest.py @@ -0,0 +1,27 @@ +#!/usr/bin/env python + +# Copyright (c) 2013 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. + +""" +Make sure we error out if #pragma comments are used to modify manifests. +""" + +import TestGyp + +import sys + +if sys.platform == 'win32': + # This assertion only applies to the ninja build. + test = TestGyp.TestGyp(formats=['ninja']) + + CHDIR = 'linker-flags' + test.run_gyp('unsupported-manifest.gyp', chdir=CHDIR) + + # Just needs to fail to build. + test.build('unsupported-manifest.gyp', + 'test_unsupported', chdir=CHDIR, status=1) + test.must_not_exist(test.built_file_path('test_unsupported.exe', chdir=CHDIR)) + + test.pass_test() diff --git a/deps/gyp/test/win/gyptest-link-update-manifest.py b/deps/gyp/test/win/gyptest-link-update-manifest.py new file mode 100644 index 0000000000..4f8b2b9112 --- /dev/null +++ b/deps/gyp/test/win/gyptest-link-update-manifest.py @@ -0,0 +1,103 @@ +#!/usr/bin/env python + +# Copyright (c) 2013 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. + +""" +Make sure binary is relinked when manifest settings are changed. +""" + +import TestGyp + +import os +import sys + +if sys.platform == 'win32': + import pywintypes + import win32api + import winerror + + RT_MANIFEST = 24 + + class LoadLibrary(object): + """Context manager for loading and releasing binaries in Windows. + Yields the handle of the binary loaded.""" + def __init__(self, path): + self._path = path + self._handle = None + + def __enter__(self): + self._handle = win32api.LoadLibrary(self._path) + return self._handle + + def __exit__(self, type, value, traceback): + win32api.FreeLibrary(self._handle) + + def extract_manifest(path, resource_name): + """Reads manifest from |path| and returns it as a string. + Returns None is there is no such manifest.""" + with LoadLibrary(path) as handle: + try: + return win32api.LoadResource(handle, RT_MANIFEST, resource_name) + except pywintypes.error as error: + if error.args[0] == winerror.ERROR_RESOURCE_DATA_NOT_FOUND: + return None + else: + raise + + test = TestGyp.TestGyp(formats=['msvs', 'ninja']) + + CHDIR = 'linker-flags' + + gyp_template = ''' +{ + 'targets': [ + { + 'target_name': 'test_update_manifest', + 'type': 'executable', + 'sources': ['hello.cc'], + 'msvs_settings': { + 'VCLinkerTool': { + 'EnableUAC': 'true', + 'UACExecutionLevel': '%(uac_execution_level)d', + }, + 'VCManifestTool': { + 'EmbedManifest': 'true', + 'AdditionalManifestFiles': '%(additional_manifest_files)s', + }, + }, + }, + ], +} +''' + + gypfile = 'update-manifest.gyp' + + def WriteAndUpdate(uac_execution_level, additional_manifest_files, do_build): + with open(os.path.join(CHDIR, gypfile), 'wb') as f: + f.write(gyp_template % { + 'uac_execution_level': uac_execution_level, + 'additional_manifest_files': additional_manifest_files, + }) + test.run_gyp(gypfile, chdir=CHDIR) + if do_build: + test.build(gypfile, chdir=CHDIR) + exe_file = test.built_file_path('test_update_manifest.exe', chdir=CHDIR) + return extract_manifest(exe_file, 1) + + manifest = WriteAndUpdate(0, '', True) + test.fail_test('asInvoker' not in manifest) + test.fail_test('35138b9a-5d96-4fbd-8e2d-a2440225f93a' in manifest) + + # Make sure that updating .gyp and regenerating doesn't cause a rebuild. + WriteAndUpdate(0, '', False) + test.up_to_date(gypfile, test.ALL, chdir=CHDIR) + + # But make sure that changing a manifest property does cause a relink. + manifest = WriteAndUpdate(2, '', True) + test.fail_test('requireAdministrator' not in manifest) + + # Adding a manifest causes a rebuild. + manifest = WriteAndUpdate(2, 'extra.manifest', True) + test.fail_test('35138b9a-5d96-4fbd-8e2d-a2440225f93a' not in manifest) diff --git a/deps/gyp/test/win/gyptest-link-warnings-as-errors.py b/deps/gyp/test/win/gyptest-link-warnings-as-errors.py new file mode 100644 index 0000000000..d6a64736fb --- /dev/null +++ b/deps/gyp/test/win/gyptest-link-warnings-as-errors.py @@ -0,0 +1,24 @@ +#!/usr/bin/env python + +# Copyright (c) 2013 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. + +""" +Make sure linker warnings-as-errors setting is extracted properly. +""" + +import TestGyp + +import sys + +if sys.platform == 'win32': + test = TestGyp.TestGyp(formats=['msvs', 'ninja']) + + CHDIR = 'linker-flags' + test.run_gyp('warn-as-error.gyp', chdir=CHDIR) + + test.build('warn-as-error.gyp', 'test_on', chdir=CHDIR, status=1) + test.build('warn-as-error.gyp', 'test_off', chdir=CHDIR) + test.build('warn-as-error.gyp', 'test_default', chdir=CHDIR) + test.pass_test() diff --git a/deps/gyp/test/win/gyptest-long-command-line.py b/deps/gyp/test/win/gyptest-long-command-line.py new file mode 100644 index 0000000000..8f8b7a3bbd --- /dev/null +++ b/deps/gyp/test/win/gyptest-long-command-line.py @@ -0,0 +1,23 @@ +#!/usr/bin/env python + +# 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. + +""" +Make sure long command lines work. +""" + +import TestGyp + +import subprocess +import sys + +if sys.platform == 'win32': + test = TestGyp.TestGyp(formats=['ninja', 'msvs']) + + CHDIR = 'long-command-line' + test.run_gyp('long-command-line.gyp', chdir=CHDIR) + test.build('long-command-line.gyp', test.ALL, chdir=CHDIR) + + test.pass_test() diff --git a/deps/gyp/test/win/gyptest-macro-projectname.py b/deps/gyp/test/win/gyptest-macro-projectname.py new file mode 100644 index 0000000000..e411cc04a4 --- /dev/null +++ b/deps/gyp/test/win/gyptest-macro-projectname.py @@ -0,0 +1,24 @@ +#!/usr/bin/env python + +# 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. + +""" +Make sure macro expansion of $(ProjectName) is handled. +""" + +import TestGyp + +import sys + +if sys.platform == 'win32': + test = TestGyp.TestGyp(formats=['msvs', 'ninja']) + + CHDIR = 'vs-macros' + test.run_gyp('projectname.gyp', chdir=CHDIR) + test.build('projectname.gyp', test.ALL, chdir=CHDIR) + test.built_file_must_exist('test_expansions_plus_something.exe', chdir=CHDIR) + test.built_file_must_exist( + 'test_with_product_name_plus_something.exe', chdir=CHDIR) + test.pass_test() diff --git a/deps/gyp/test/win/gyptest-macro-targetext.py b/deps/gyp/test/win/gyptest-macro-targetext.py new file mode 100644 index 0000000000..450710d631 --- /dev/null +++ b/deps/gyp/test/win/gyptest-macro-targetext.py @@ -0,0 +1,26 @@ +#!/usr/bin/env python + +# Copyright (c) 2014 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. + +""" +Make sure macro expansion of $(TargetExt) is handled. +""" + +import TestGyp + +import sys + +if sys.platform == 'win32': + test = TestGyp.TestGyp(formats=['msvs', 'ninja']) + + CHDIR = 'vs-macros' + test.run_gyp('targetext.gyp', chdir=CHDIR) + test.build('targetext.gyp', test.ALL, chdir=CHDIR) + test.built_file_must_exist('executable.exe', chdir=CHDIR) + test.built_file_must_exist('loadable_module.dll', chdir=CHDIR) + test.built_file_must_exist('shared_library.dll', chdir=CHDIR) + test.built_file_must_exist('static_library.lib', chdir=CHDIR) + test.built_file_must_exist('product_extension.library', chdir=CHDIR) + test.pass_test() diff --git a/deps/gyp/test/win/gyptest-macro-targetfilename.py b/deps/gyp/test/win/gyptest-macro-targetfilename.py new file mode 100644 index 0000000000..be4b637e9c --- /dev/null +++ b/deps/gyp/test/win/gyptest-macro-targetfilename.py @@ -0,0 +1,35 @@ +#!/usr/bin/env python + +# Copyright (c) 2014 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. + +""" +Make sure macro expansion of $(TargetFileName) is handled. +""" + +import TestGyp + +import os +import sys + +if sys.platform == 'win32': + print "This test is currently disabled: https://crbug.com/483696." + sys.exit(0) + + test = TestGyp.TestGyp(formats=['msvs', 'ninja']) + if not (test.format == 'msvs' and + int(os.environ.get('GYP_MSVS_VERSION', 0)) == 2013): + CHDIR = 'vs-macros' + test.run_gyp('targetfilename.gyp', chdir=CHDIR) + test.build('targetfilename.gyp', test.ALL, chdir=CHDIR) + test.built_file_must_exist('test_targetfilename_executable.exe', chdir=CHDIR) + test.built_file_must_exist('test_targetfilename_loadable_module.dll', + chdir=CHDIR) + test.built_file_must_exist('test_targetfilename_shared_library.dll', + chdir=CHDIR) + test.built_file_must_exist('test_targetfilename_static_library.lib', + chdir=CHDIR) + test.built_file_must_exist('test_targetfilename_product_extension.foo', + chdir=CHDIR) + test.pass_test() diff --git a/deps/gyp/test/win/gyptest-macro-targetname.py b/deps/gyp/test/win/gyptest-macro-targetname.py new file mode 100644 index 0000000000..b1118019a3 --- /dev/null +++ b/deps/gyp/test/win/gyptest-macro-targetname.py @@ -0,0 +1,29 @@ +#!/usr/bin/env python + +# Copyright (c) 2013 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. + +""" +Make sure macro expansion of $(TargetName) and $(TargetDir) are handled. +""" + +import TestGyp + +import sys + +if sys.platform == 'win32': + test = TestGyp.TestGyp(formats=['msvs', 'ninja']) + + CHDIR = 'vs-macros' + test.run_gyp('targetname.gyp', chdir=CHDIR) + test.build('targetname.gyp', test.ALL, chdir=CHDIR) + test.built_file_must_exist('test_targetname_plus_something1.exe', + chdir=CHDIR) + test.built_file_must_exist( + 'prod_prefixtest_targetname_with_prefix_plus_something2.exe', + chdir=CHDIR) + test.built_file_must_exist('prod_name_plus_something3.exe', chdir=CHDIR) + test.built_file_must_exist('prod_prefixprod_name_plus_something4.exe', + chdir=CHDIR) + test.pass_test() diff --git a/deps/gyp/test/win/gyptest-macro-targetpath.py b/deps/gyp/test/win/gyptest-macro-targetpath.py new file mode 100644 index 0000000000..fe7eac1834 --- /dev/null +++ b/deps/gyp/test/win/gyptest-macro-targetpath.py @@ -0,0 +1,30 @@ +#!/usr/bin/env python + +# Copyright (c) 2014 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. + +""" +Make sure macro expansion of $(TargetPath) is handled. +""" + +import TestGyp + +import sys + +if sys.platform == 'win32': + test = TestGyp.TestGyp(formats=['msvs', 'ninja']) + + CHDIR = 'vs-macros' + test.run_gyp('targetpath.gyp', chdir=CHDIR) + test.build('targetpath.gyp', test.ALL, chdir=CHDIR) + test.built_file_must_exist('test_targetpath_executable.exe', chdir=CHDIR) + test.built_file_must_exist('test_targetpath_loadable_module.dll', + chdir=CHDIR) + test.built_file_must_exist('test_targetpath_shared_library.dll', + chdir=CHDIR) + test.built_file_must_exist('test_targetpath_static_library.lib', + chdir=CHDIR) + test.built_file_must_exist('test_targetpath_product_extension.foo', + chdir=CHDIR) + test.pass_test() diff --git a/deps/gyp/test/win/gyptest-macro-vcinstalldir.py b/deps/gyp/test/win/gyptest-macro-vcinstalldir.py new file mode 100644 index 0000000000..37396e161a --- /dev/null +++ b/deps/gyp/test/win/gyptest-macro-vcinstalldir.py @@ -0,0 +1,24 @@ +#!/usr/bin/env python + +# 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. + +""" +Make sure macro expansion of $(VCInstallDir) is handled, and specifically +always / terminated for compatibility. +""" + +import TestGyp + +import sys + +if sys.platform == 'win32': + test = TestGyp.TestGyp(formats=['msvs', 'ninja']) + + CHDIR = 'vs-macros' + test.run_gyp('vcinstalldir.gyp', chdir=CHDIR) + # This fails on VS because the trailing slash escapes the trailing quote. + test.build('vcinstalldir.gyp', 'test_slash_trailing', chdir=CHDIR, status=1) + test.build('vcinstalldir.gyp', 'test_slash_dir', chdir=CHDIR) + test.pass_test() diff --git a/deps/gyp/test/win/gyptest-macros-containing-gyp.py b/deps/gyp/test/win/gyptest-macros-containing-gyp.py new file mode 100644 index 0000000000..f6eaf63dbb --- /dev/null +++ b/deps/gyp/test/win/gyptest-macros-containing-gyp.py @@ -0,0 +1,21 @@ +#!/usr/bin/env python + +# 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. + +""" +Handle VS macro expansion containing gyp variables. +""" + +import TestGyp + +import sys + +if sys.platform == 'win32': + test = TestGyp.TestGyp(formats=['msvs', 'ninja']) + + CHDIR = 'vs-macros' + test.run_gyp('containing-gyp.gyp', chdir=CHDIR) + test.build('containing-gyp.gyp', test.ALL, chdir=CHDIR) + test.pass_test() diff --git a/deps/gyp/test/win/gyptest-macros-in-inputs-and-outputs.py b/deps/gyp/test/win/gyptest-macros-in-inputs-and-outputs.py new file mode 100644 index 0000000000..3d6fa74e43 --- /dev/null +++ b/deps/gyp/test/win/gyptest-macros-in-inputs-and-outputs.py @@ -0,0 +1,27 @@ +#!/usr/bin/env python + +# 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. + +""" +Handle macro expansion in inputs and outputs of rules. +""" + +import TestGyp + +import sys + +if sys.platform == 'win32': + test = TestGyp.TestGyp(formats=['msvs', 'ninja']) + + CHDIR = 'vs-macros' + test.run_gyp('input-output-macros.gyp', chdir=CHDIR) + + test.build('input-output-macros.gyp', 'test_expansions', chdir=CHDIR) + + test.built_file_must_exist('stuff.blah.something', + content='Random data file.\nModified.', + chdir=CHDIR) + + test.pass_test() diff --git a/deps/gyp/test/win/gyptest-midl-excluded.py b/deps/gyp/test/win/gyptest-midl-excluded.py new file mode 100644 index 0000000000..70059ab64b --- /dev/null +++ b/deps/gyp/test/win/gyptest-midl-excluded.py @@ -0,0 +1,22 @@ +#!/usr/bin/env python + +# Copyright (c) 2014 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. + +""" +Test that .idl files in actions and non-native rules are excluded. +""" + +import TestGyp + +import sys + +if sys.platform == 'win32': + test = TestGyp.TestGyp(formats=['msvs', 'ninja']) + + CHDIR = 'idl-excluded' + test.run_gyp('idl-excluded.gyp', chdir=CHDIR) + test.build('idl-excluded.gyp', test.ALL, chdir=CHDIR) + + test.pass_test() diff --git a/deps/gyp/test/win/gyptest-midl-includedirs.py b/deps/gyp/test/win/gyptest-midl-includedirs.py new file mode 100644 index 0000000000..05f6370409 --- /dev/null +++ b/deps/gyp/test/win/gyptest-midl-includedirs.py @@ -0,0 +1,21 @@ +#!/usr/bin/env python + +# Copyright (c) 2014 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. + +""" +Verify that 'midl_include_dirs' is handled. +""" + +import TestGyp + +import sys + +if sys.platform == 'win32': + test = TestGyp.TestGyp(formats=['msvs', 'ninja']) + + CHDIR = 'idl-includedirs' + test.run_gyp('idl-includedirs.gyp', chdir=CHDIR) + test.build('idl-includedirs.gyp', test.ALL, chdir=CHDIR) + test.pass_test() diff --git a/deps/gyp/test/win/gyptest-midl-rules.py b/deps/gyp/test/win/gyptest-midl-rules.py new file mode 100644 index 0000000000..591a507320 --- /dev/null +++ b/deps/gyp/test/win/gyptest-midl-rules.py @@ -0,0 +1,28 @@ +#!/usr/bin/env python + +# 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. + +""" +Handle default .idl build rules. +""" + +import TestGyp + +import sys + +if sys.platform == 'win32': + test = TestGyp.TestGyp(formats=['msvs', 'ninja']) + + CHDIR = 'idl-rules' + test.run_gyp('basic-idl.gyp', chdir=CHDIR) + for platform in ['Win32', 'x64']: + test.set_configuration('Debug|%s' % platform) + test.build('basic-idl.gyp', test.ALL, chdir=CHDIR) + + # Make sure ninja win_tool.py filters out noisy lines. + if test.format == 'ninja' and 'Processing' in test.stdout(): + test.fail_test() + + test.pass_test() diff --git a/deps/gyp/test/win/gyptest-ml-safeseh.py b/deps/gyp/test/win/gyptest-ml-safeseh.py new file mode 100644 index 0000000000..ec702b9df2 --- /dev/null +++ b/deps/gyp/test/win/gyptest-ml-safeseh.py @@ -0,0 +1,22 @@ +#!/usr/bin/env python + +# Copyright (c) 2014 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. + +""" +Make sure the /safeseh option can be passed to ml. +""" + +import TestGyp + +import sys + +if sys.platform == 'win32': + test = TestGyp.TestGyp(formats=['ninja']) + + CHDIR = 'ml-safeseh' + test.run_gyp('ml-safeseh.gyp', chdir=CHDIR) + test.build('ml-safeseh.gyp', test.ALL, chdir=CHDIR) + + test.pass_test() diff --git a/deps/gyp/test/win/gyptest-quoting-commands.py b/deps/gyp/test/win/gyptest-quoting-commands.py new file mode 100644 index 0000000000..b40f99f088 --- /dev/null +++ b/deps/gyp/test/win/gyptest-quoting-commands.py @@ -0,0 +1,25 @@ +#!/usr/bin/env python + +# 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. + +""" +Make sure batch files run as actions. Regression test for previously missing +trailing quote on command line. cmd typically will implicitly insert a missing +quote, but if the command ends in a quote, it will not insert another, so the +command can sometimes become unterminated. +""" + +import TestGyp + +import sys + +if sys.platform == 'win32': + test = TestGyp.TestGyp(formats=['msvs', 'ninja']) + + CHDIR = 'batch-file-action' + test.run_gyp('batch-file-action.gyp', chdir=CHDIR) + test.build('batch-file-action.gyp', test.ALL, chdir=CHDIR) + + test.pass_test() diff --git a/deps/gyp/test/win/gyptest-rc-build.py b/deps/gyp/test/win/gyptest-rc-build.py new file mode 100644 index 0000000000..a6e4d360f6 --- /dev/null +++ b/deps/gyp/test/win/gyptest-rc-build.py @@ -0,0 +1,27 @@ +#!/usr/bin/env python + +# 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. + +""" +Make sure we build and include .rc files. +""" + +import TestGyp + +import sys + +if sys.platform == 'win32': + print "This test is currently disabled: https://crbug.com/483696." + sys.exit(0) + + test = TestGyp.TestGyp(formats=['msvs', 'ninja']) + + CHDIR = 'rc-build' + test.run_gyp('hello.gyp', chdir=CHDIR) + test.build('hello.gyp', test.ALL, chdir=CHDIR) + test.up_to_date('hello.gyp', 'resource_only_dll', chdir=CHDIR) + test.run_built_executable('with_resources', chdir=CHDIR, status=4) + + test.pass_test() diff --git a/deps/gyp/test/win/gyptest-system-include.py b/deps/gyp/test/win/gyptest-system-include.py new file mode 100644 index 0000000000..9a47d98538 --- /dev/null +++ b/deps/gyp/test/win/gyptest-system-include.py @@ -0,0 +1,21 @@ +#!/usr/bin/env python + +# Copyright (c) 2014 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. + +""" +Checks that msvs_system_include_dirs works. +""" + +import TestGyp + +import sys + +if sys.platform == 'win32': + test = TestGyp.TestGyp(formats=['msvs', 'ninja']) + + CHDIR = 'system-include' + test.run_gyp('test.gyp', chdir=CHDIR) + test.build('test.gyp', test.ALL, chdir=CHDIR) + test.pass_test() diff --git a/deps/gyp/test/win/idl-excluded/bad.idl b/deps/gyp/test/win/idl-excluded/bad.idl new file mode 100644 index 0000000000..38554e9635 --- /dev/null +++ b/deps/gyp/test/win/idl-excluded/bad.idl @@ -0,0 +1,6 @@ +// Copyright (c) 2014 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +This is a dummy .idl file that will trigger an error if it is not excluded from +the build. diff --git a/deps/gyp/test/win/idl-excluded/copy-file.py b/deps/gyp/test/win/idl-excluded/copy-file.py new file mode 100644 index 0000000000..5a5feae1f2 --- /dev/null +++ b/deps/gyp/test/win/idl-excluded/copy-file.py @@ -0,0 +1,11 @@ +#!/usr/bin/env python + +# Copyright (c) 2009 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 sys + +contents = open(sys.argv[1], 'r').read() +open(sys.argv[2], 'wb').write(contents) + +sys.exit(0) diff --git a/deps/gyp/test/win/idl-excluded/idl-excluded.gyp b/deps/gyp/test/win/idl-excluded/idl-excluded.gyp new file mode 100644 index 0000000000..972b7dedac --- /dev/null +++ b/deps/gyp/test/win/idl-excluded/idl-excluded.gyp @@ -0,0 +1,58 @@ +# Copyright (c) 2014 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +{ + 'targets': [ + { + 'target_name': 'exclude_with_action', + 'type': 'none', + 'msvs_cygwin_shell': 0, + 'actions': [{ + 'action_name': 'copy_action', + 'inputs': [ + 'copy-file.py', + 'bad.idl', + ], + 'outputs': [ + '<(INTERMEDIATE_DIR)/bad.idl', + ], + 'action': [ + 'python', '<@(_inputs)', '<@(_outputs)', + ], + }], + }, + { + 'target_name': 'exclude_with_rule', + 'type': 'none', + 'msvs_cygwin_shell': 0, + 'sources': [ + 'bad.idl', + ], + 'rules': [{ + 'rule_name': 'copy_rule', + 'extension': 'idl', + 'inputs': [ + 'copy-file.py', + ], + 'outputs': [ + '<(INTERMEDIATE_DIR)/<(RULE_INPUT_ROOT).idl', + ], + 'action': [ + 'python', '<@(_inputs)', '<(RULE_INPUT_PATH)', '<@(_outputs)', + ], + }], + }, + { + 'target_name': 'program', + 'type': 'executable', + 'sources': [ + 'program.cc', + ], + 'dependencies': [ + 'exclude_with_action', + 'exclude_with_rule', + ], + }, + ], +} diff --git a/deps/gyp/test/win/idl-excluded/program.cc b/deps/gyp/test/win/idl-excluded/program.cc new file mode 100644 index 0000000000..9dc3c94f34 --- /dev/null +++ b/deps/gyp/test/win/idl-excluded/program.cc @@ -0,0 +1,7 @@ +// Copyright (c) 2014 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. + +int main() { + return 0; +} diff --git a/deps/gyp/test/win/idl-includedirs/hello.cc b/deps/gyp/test/win/idl-includedirs/hello.cc new file mode 100644 index 0000000000..9dc3c94f34 --- /dev/null +++ b/deps/gyp/test/win/idl-includedirs/hello.cc @@ -0,0 +1,7 @@ +// Copyright (c) 2014 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. + +int main() { + return 0; +} diff --git a/deps/gyp/test/win/idl-includedirs/idl-includedirs.gyp b/deps/gyp/test/win/idl-includedirs/idl-includedirs.gyp new file mode 100644 index 0000000000..fcec063a98 --- /dev/null +++ b/deps/gyp/test/win/idl-includedirs/idl-includedirs.gyp @@ -0,0 +1,26 @@ +# Copyright (c) 2014 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +{ + 'targets': [ + { + 'target_name': 'test_midl_include_dirs', + 'type': 'executable', + 'sources': [ + 'hello.cc', + 'subdir/foo.idl', + 'subdir/bar.idl', + ], + 'midl_include_dirs': [ + 'subdir', + ], + 'msvs_settings': { + 'VCMIDLTool': { + 'OutputDirectory': '<(INTERMEDIATE_DIR)', + 'DLLDataFileName': '$(InputName)_dlldata.h', + }, + }, + }, + ], +} diff --git a/deps/gyp/test/win/idl-includedirs/subdir/bar.idl b/deps/gyp/test/win/idl-includedirs/subdir/bar.idl new file mode 100644 index 0000000000..d4e6cbb3eb --- /dev/null +++ b/deps/gyp/test/win/idl-includedirs/subdir/bar.idl @@ -0,0 +1,13 @@ +// Copyright (c) 2014 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import "oaidl.idl"; + +[ + object, + uuid(A03D1421-B1EC-11D0-8C3A-00C04FC31D3F), +] +interface Bar : IUnknown { + HRESULT BarFunction(); +}; diff --git a/deps/gyp/test/win/idl-includedirs/subdir/foo.idl b/deps/gyp/test/win/idl-includedirs/subdir/foo.idl new file mode 100644 index 0000000000..c8c65b9be6 --- /dev/null +++ b/deps/gyp/test/win/idl-includedirs/subdir/foo.idl @@ -0,0 +1,14 @@ +// Copyright (c) 2014 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import "oaidl.idl"; +import "bar.idl"; + +[ + object, + uuid(9C1100DD-51D4-4827-AE9F-3B8FAC4AED72), +] +interface Foo : IUnknown { + HRESULT FooFunction(Bar* bar); +}; diff --git a/deps/gyp/test/win/idl-rules/Window.idl b/deps/gyp/test/win/idl-rules/Window.idl new file mode 100644 index 0000000000..d8ea01bee3 --- /dev/null +++ b/deps/gyp/test/win/idl-rules/Window.idl @@ -0,0 +1,9 @@ +// Copyright (c) 2014 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. + +[ + WillBeGarbageCollected, +] interface Window { + void alert(); +}; diff --git a/deps/gyp/test/win/idl-rules/basic-idl.gyp b/deps/gyp/test/win/idl-rules/basic-idl.gyp new file mode 100644 index 0000000000..b74622adea --- /dev/null +++ b/deps/gyp/test/win/idl-rules/basic-idl.gyp @@ -0,0 +1,67 @@ +# Copyright (c) 2012 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +{ + 'variables': { + 'midl_out_dir': '<(SHARED_INTERMEDIATE_DIR)', + }, + 'target_defaults': { + 'configurations': { + 'Debug': { + 'msvs_configuration_platform': 'Win32', + }, + 'Debug_x64': { + 'inherit_from': ['Debug'], + 'msvs_configuration_platform': 'x64', + }, + }, + }, + 'targets': [ + { + 'target_name': 'idl_test', + 'type': 'executable', + 'sources': [ + 'history_indexer.idl', + '<(midl_out_dir)/history_indexer.h', + '<(midl_out_dir)/history_indexer_i.c', + 'history_indexer_user.cc', + ], + 'libraries': ['ole32.lib'], + 'include_dirs': [ + '<(midl_out_dir)', + ], + 'msvs_settings': { + 'VCMIDLTool': { + 'OutputDirectory': '<(midl_out_dir)', + 'HeaderFileName': '<(RULE_INPUT_ROOT).h', + }, + }, + }, + { + 'target_name': 'idl_explicit_action', + 'type': 'none', + 'sources': [ + 'Window.idl', + ], + 'actions': [{ + 'action_name': 'blink_idl', + 'explicit_idl_action': 1, + 'msvs_cygwin_shell': 0, + 'inputs': [ + 'Window.idl', + 'idl_compiler.py', + ], + 'outputs': [ + 'Window.cpp', + 'Window.h', + ], + 'action': [ + 'python', + 'idl_compiler.py', + 'Window.idl', + ], + }], + }, + ], +} diff --git a/deps/gyp/test/win/idl-rules/history_indexer.idl b/deps/gyp/test/win/idl-rules/history_indexer.idl new file mode 100644 index 0000000000..e866ce6d90 --- /dev/null +++ b/deps/gyp/test/win/idl-rules/history_indexer.idl @@ -0,0 +1,17 @@ +// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import "oaidl.idl";
+import "ocidl.idl";
+
+[
+ object,
+ uuid(9C1100DD-51D4-4827-AE9F-3B8FAC4AED72),
+ oleautomation,
+ nonextensible,
+ pointer_default(unique)
+]
+interface IChromeHistoryIndexer : IUnknown {
+ HRESULT SomeFunction([in] VARIANT begin_time, [in] VARIANT end_time);
+};
diff --git a/deps/gyp/test/win/idl-rules/history_indexer_user.cc b/deps/gyp/test/win/idl-rules/history_indexer_user.cc new file mode 100644 index 0000000000..071a9ffef5 --- /dev/null +++ b/deps/gyp/test/win/idl-rules/history_indexer_user.cc @@ -0,0 +1,15 @@ +// 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. + +#include "history_indexer.h" + +// Use the thing in the IDL. +int main() { + IChromeHistoryIndexer** indexer = 0; + IID fake_iid; + CoCreateInstance(fake_iid, NULL, CLSCTX_INPROC, + __uuidof(IChromeHistoryIndexer), + reinterpret_cast<void**>(indexer)); + return 0; +} diff --git a/deps/gyp/test/win/idl-rules/idl_compiler.py b/deps/gyp/test/win/idl-rules/idl_compiler.py new file mode 100644 index 0000000000..a12b274d67 --- /dev/null +++ b/deps/gyp/test/win/idl-rules/idl_compiler.py @@ -0,0 +1,17 @@ +#!/usr/bin/env python + +# Copyright (c) 2014 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. + +# mock, just outputs empty .h/.cpp files + +import os +import sys + +if len(sys.argv) == 2: + basename, ext = os.path.splitext(sys.argv[1]) + with open('%s.h' % basename, 'w') as f: + f.write('// %s.h\n' % basename) + with open('%s.cpp' % basename, 'w') as f: + f.write('// %s.cpp\n' % basename) diff --git a/deps/gyp/test/win/importlib/dll_no_exports.cc b/deps/gyp/test/win/importlib/dll_no_exports.cc new file mode 100644 index 0000000000..96dd7970b7 --- /dev/null +++ b/deps/gyp/test/win/importlib/dll_no_exports.cc @@ -0,0 +1,9 @@ +// Copyright (c) 2015 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. + +#include <windows.h> + +BOOL APIENTRY DllMain(HMODULE module, DWORD reason, LPVOID reserved) { + return TRUE; +} diff --git a/deps/gyp/test/win/importlib/has-exports.cc b/deps/gyp/test/win/importlib/has-exports.cc new file mode 100644 index 0000000000..3f62d6c60d --- /dev/null +++ b/deps/gyp/test/win/importlib/has-exports.cc @@ -0,0 +1,10 @@ +// 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. + +__declspec(dllexport) void some_function() { +} + +int main() { + return 0; +} diff --git a/deps/gyp/test/win/importlib/hello.cc b/deps/gyp/test/win/importlib/hello.cc new file mode 100644 index 0000000000..66ff68c113 --- /dev/null +++ b/deps/gyp/test/win/importlib/hello.cc @@ -0,0 +1,9 @@ +// 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. + +__declspec(dllimport) void some_function(); + +int main() { + some_function(); +} diff --git a/deps/gyp/test/win/importlib/importlib.gyp b/deps/gyp/test/win/importlib/importlib.gyp new file mode 100644 index 0000000000..ab15b1893d --- /dev/null +++ b/deps/gyp/test/win/importlib/importlib.gyp @@ -0,0 +1,30 @@ +# 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. + +{ + 'targets': [ + { + 'target_name': 'test_importlib', + 'type': 'shared_library', + 'msvs_settings': { + 'VCLinkerTool': { + 'LinkIncremental': '2', + } + }, + 'sources': ['has-exports.cc'], + }, + + { + 'target_name': 'test_linkagainst', + 'type': 'executable', + 'dependencies': ['test_importlib'], + 'msvs_settings': { + 'VCLinkerTool': { + 'LinkIncremental': '2', + } + }, + 'sources': ['hello.cc'], + }, + ] +} diff --git a/deps/gyp/test/win/importlib/noimplib.gyp b/deps/gyp/test/win/importlib/noimplib.gyp new file mode 100644 index 0000000000..0245058a99 --- /dev/null +++ b/deps/gyp/test/win/importlib/noimplib.gyp @@ -0,0 +1,16 @@ +# Copyright (c) 2015 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. + +{ + 'targets': [ + { + 'target_name': 'no_import_library', + 'type': 'loadable_module', + 'msvs_settings': { + 'NoImportLibrary': 'true', + }, + 'sources': ['dll_no_exports.cc'], + }, + ] +} diff --git a/deps/gyp/test/win/large-pdb/dllmain.cc b/deps/gyp/test/win/large-pdb/dllmain.cc new file mode 100644 index 0000000000..14875623e8 --- /dev/null +++ b/deps/gyp/test/win/large-pdb/dllmain.cc @@ -0,0 +1,9 @@ +// Copyright (c) 2013 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. + +#include <windows.h> + +BOOL WINAPI DllMain(HINSTANCE hinstance, DWORD reason, LPVOID reserved) { + return TRUE; +} diff --git a/deps/gyp/test/win/large-pdb/large-pdb.gyp b/deps/gyp/test/win/large-pdb/large-pdb.gyp new file mode 100644 index 0000000000..2a241a5623 --- /dev/null +++ b/deps/gyp/test/win/large-pdb/large-pdb.gyp @@ -0,0 +1,98 @@ +# Copyright (c) 2013 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. + +{ + 'targets': [ + { + 'target_name': 'large_pdb_exe', + 'type': 'executable', + 'msvs_large_pdb': 1, + 'sources': [ + 'main.cc', + ], + 'msvs_settings': { + 'VCLinkerTool': { + 'GenerateDebugInformation': 'true', + 'ProgramDatabaseFile': '<(PRODUCT_DIR)/large_pdb_exe.exe.pdb', + }, + }, + }, + { + 'target_name': 'small_pdb_exe', + 'type': 'executable', + 'msvs_large_pdb': 0, + 'sources': [ + 'main.cc', + ], + 'msvs_settings': { + 'VCLinkerTool': { + 'GenerateDebugInformation': 'true', + 'ProgramDatabaseFile': '<(PRODUCT_DIR)/small_pdb_exe.exe.pdb', + }, + }, + }, + { + 'target_name': 'large_pdb_dll', + 'type': 'shared_library', + 'msvs_large_pdb': 1, + 'sources': [ + 'dllmain.cc', + ], + 'msvs_settings': { + 'VCLinkerTool': { + 'GenerateDebugInformation': 'true', + 'ProgramDatabaseFile': '<(PRODUCT_DIR)/large_pdb_dll.dll.pdb', + }, + }, + }, + { + 'target_name': 'small_pdb_dll', + 'type': 'shared_library', + 'msvs_large_pdb': 0, + 'sources': [ + 'dllmain.cc', + ], + 'msvs_settings': { + 'VCLinkerTool': { + 'GenerateDebugInformation': 'true', + 'ProgramDatabaseFile': '<(PRODUCT_DIR)/small_pdb_dll.dll.pdb', + }, + }, + }, + { + 'target_name': 'large_pdb_implicit_exe', + 'type': 'executable', + 'msvs_large_pdb': 1, + 'sources': [ + 'main.cc', + ], + # No PDB file is specified. However, the msvs_large_pdb mechanism should + # default to the appropriate <(PRODUCT_DIR)/<(TARGET_NAME).exe.pdb. + }, + { + 'target_name': 'large_pdb_variable_exe', + 'type': 'executable', + 'msvs_large_pdb': 1, + 'sources': [ + 'main.cc', + ], + # No PDB file is specified. However, the msvs_large_pdb_path variable + # explicitly sets one. + 'variables': { + 'msvs_large_pdb_path': '<(PRODUCT_DIR)/foo.pdb', + }, + }, + { + 'target_name': 'large_pdb_product_exe', + 'product_name': 'bar', + 'type': 'executable', + 'msvs_large_pdb': 1, + 'sources': [ + 'main.cc', + ], + # No PDB file is specified. However, we've specified a product name so + # it should use <(PRODUCT_DIR)/bar.exe.pdb. + }, + ] +} diff --git a/deps/gyp/test/win/large-pdb/main.cc b/deps/gyp/test/win/large-pdb/main.cc new file mode 100644 index 0000000000..c3da8e9219 --- /dev/null +++ b/deps/gyp/test/win/large-pdb/main.cc @@ -0,0 +1,7 @@ +// Copyright (c) 2013 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. + +int main(void) { + return 0; +} diff --git a/deps/gyp/test/win/lib-crosscompile/answer.cc b/deps/gyp/test/win/lib-crosscompile/answer.cc new file mode 100644 index 0000000000..a6ffa16862 --- /dev/null +++ b/deps/gyp/test/win/lib-crosscompile/answer.cc @@ -0,0 +1,9 @@ +// 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. + +#include "answer.h" + +int answer() { + return 42; +} diff --git a/deps/gyp/test/win/lib-crosscompile/answer.h b/deps/gyp/test/win/lib-crosscompile/answer.h new file mode 100644 index 0000000000..82312d54b8 --- /dev/null +++ b/deps/gyp/test/win/lib-crosscompile/answer.h @@ -0,0 +1,5 @@ +// 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. + +int answer();
\ No newline at end of file diff --git a/deps/gyp/test/win/lib-crosscompile/use_host_ar.gyp b/deps/gyp/test/win/lib-crosscompile/use_host_ar.gyp new file mode 100644 index 0000000000..4747bc6445 --- /dev/null +++ b/deps/gyp/test/win/lib-crosscompile/use_host_ar.gyp @@ -0,0 +1,17 @@ +# Copyright (c) 2015 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +{ + 'targets': [ + { + 'target_name': 'lib_answer', + 'type': 'static_library', + 'toolsets': ['host'], + 'msvs_settings': { + 'msvs_cygwin_shell': 0, + }, + 'sources': ['answer.cc'], + }, + ] +} diff --git a/deps/gyp/test/win/lib-flags/answer.cc b/deps/gyp/test/win/lib-flags/answer.cc new file mode 100644 index 0000000000..a6ffa16862 --- /dev/null +++ b/deps/gyp/test/win/lib-flags/answer.cc @@ -0,0 +1,9 @@ +// 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. + +#include "answer.h" + +int answer() { + return 42; +} diff --git a/deps/gyp/test/win/lib-flags/answer.h b/deps/gyp/test/win/lib-flags/answer.h new file mode 100644 index 0000000000..82312d54b8 --- /dev/null +++ b/deps/gyp/test/win/lib-flags/answer.h @@ -0,0 +1,5 @@ +// 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. + +int answer();
\ No newline at end of file diff --git a/deps/gyp/test/win/lib-flags/ltcg.gyp b/deps/gyp/test/win/lib-flags/ltcg.gyp new file mode 100644 index 0000000000..c183107730 --- /dev/null +++ b/deps/gyp/test/win/lib-flags/ltcg.gyp @@ -0,0 +1,21 @@ +# 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. + +{ + 'targets': [ + { + 'target_name': 'lib_answer', + 'type': 'static_library', + 'msvs_settings': { + 'VCCLCompilerTool': { + 'WholeProgramOptimization': 'true', # /GL + }, + 'VCLibrarianTool': { + 'LinkTimeCodeGeneration': 'true', # /LTCG + }, + }, + 'sources': ['answer.cc'], + }, + ] +} diff --git a/deps/gyp/test/win/linker-flags/a/x.cc b/deps/gyp/test/win/linker-flags/a/x.cc new file mode 100644 index 0000000000..f5f763b095 --- /dev/null +++ b/deps/gyp/test/win/linker-flags/a/x.cc @@ -0,0 +1,7 @@ +// Copyright (c) 2013 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. + +int x() { + return 1; +} diff --git a/deps/gyp/test/win/linker-flags/a/z.cc b/deps/gyp/test/win/linker-flags/a/z.cc new file mode 100644 index 0000000000..8a43501270 --- /dev/null +++ b/deps/gyp/test/win/linker-flags/a/z.cc @@ -0,0 +1,7 @@ +// Copyright (c) 2013 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. + +int z() { + return 3; +} diff --git a/deps/gyp/test/win/linker-flags/additional-deps.cc b/deps/gyp/test/win/linker-flags/additional-deps.cc new file mode 100644 index 0000000000..7dfb589d26 --- /dev/null +++ b/deps/gyp/test/win/linker-flags/additional-deps.cc @@ -0,0 +1,10 @@ +// 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. + +#include <winsock2.h> + +int main() { + WSAStartup(0, 0); + return 0; +} diff --git a/deps/gyp/test/win/linker-flags/additional-deps.gyp b/deps/gyp/test/win/linker-flags/additional-deps.gyp new file mode 100644 index 0000000000..55afe64fb0 --- /dev/null +++ b/deps/gyp/test/win/linker-flags/additional-deps.gyp @@ -0,0 +1,30 @@ +# 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. + +{ + 'targets': [ + { + 'target_name': 'test_deps_none', + 'type': 'executable', + 'msvs_settings': { + 'VCLinkerTool': { + } + }, + 'sources': ['hello.cc'], + }, + { + 'target_name': 'test_deps_few', + 'type': 'executable', + 'msvs_settings': { + 'VCLinkerTool': { + 'AdditionalDependencies': [ + 'wininet.lib', + 'ws2_32.lib', + ] + } + }, + 'sources': ['additional-deps.cc'], + }, + ] +} diff --git a/deps/gyp/test/win/linker-flags/additional-options.gyp b/deps/gyp/test/win/linker-flags/additional-options.gyp new file mode 100644 index 0000000000..cab3994cd1 --- /dev/null +++ b/deps/gyp/test/win/linker-flags/additional-options.gyp @@ -0,0 +1,29 @@ +# 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.
+
+{
+ 'targets': [
+ {
+ 'target_name': 'test_additional_none',
+ 'type': 'executable',
+ 'msvs_settings': {
+ 'VCLinkerTool': {
+ }
+ },
+ 'sources': ['hello.cc'],
+ },
+ {
+ 'target_name': 'test_additional_few',
+ 'type': 'executable',
+ 'msvs_settings': {
+ 'VCLinkerTool': {
+ 'AdditionalOptions': [
+ '/dynamicbase:no',
+ ]
+ }
+ },
+ 'sources': ['hello.cc'],
+ },
+ ]
+}
diff --git a/deps/gyp/test/win/linker-flags/aslr.gyp b/deps/gyp/test/win/linker-flags/aslr.gyp new file mode 100644 index 0000000000..b3aefd50b7 --- /dev/null +++ b/deps/gyp/test/win/linker-flags/aslr.gyp @@ -0,0 +1,35 @@ +# 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. + +{ + 'targets': [ + { + 'target_name': 'test_aslr_default', + 'type': 'executable', + 'msvs_settings': { + }, + 'sources': ['hello.cc'], + }, + { + 'target_name': 'test_aslr_no', + 'type': 'executable', + 'msvs_settings': { + 'VCLinkerTool': { + 'RandomizedBaseAddress': '1', + }, + }, + 'sources': ['hello.cc'], + }, + { + 'target_name': 'test_aslr_yes', + 'type': 'executable', + 'msvs_settings': { + 'VCLinkerTool': { + 'RandomizedBaseAddress': '2', + } + }, + 'sources': ['hello.cc'], + }, + ] +} diff --git a/deps/gyp/test/win/linker-flags/b/y.cc b/deps/gyp/test/win/linker-flags/b/y.cc new file mode 100644 index 0000000000..bd884119fc --- /dev/null +++ b/deps/gyp/test/win/linker-flags/b/y.cc @@ -0,0 +1,7 @@ +// Copyright (c) 2013 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. + +int y() { + return 2; +} diff --git a/deps/gyp/test/win/linker-flags/base-address.gyp b/deps/gyp/test/win/linker-flags/base-address.gyp new file mode 100644 index 0000000000..873ebfea3f --- /dev/null +++ b/deps/gyp/test/win/linker-flags/base-address.gyp @@ -0,0 +1,38 @@ +# Copyright 2013 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. + +{ + 'targets': [ + { + 'target_name': 'test_base_specified_exe', + 'type': 'executable', + 'msvs_settings': { + 'VCLinkerTool': { + 'BaseAddress': '0x00420000', + }, + }, + 'sources': ['hello.cc'], + }, + { + 'target_name': 'test_base_specified_dll', + 'type': 'shared_library', + 'msvs_settings': { + 'VCLinkerTool': { + 'BaseAddress': '0x10420000', + }, + }, + 'sources': ['hello.cc'], + }, + { + 'target_name': 'test_base_default_exe', + 'type': 'executable', + 'sources': ['hello.cc'], + }, + { + 'target_name': 'test_base_default_dll', + 'type': 'shared_library', + 'sources': ['hello.cc'], + }, + ] +} diff --git a/deps/gyp/test/win/linker-flags/debug-info.gyp b/deps/gyp/test/win/linker-flags/debug-info.gyp new file mode 100644 index 0000000000..d47d0ecced --- /dev/null +++ b/deps/gyp/test/win/linker-flags/debug-info.gyp @@ -0,0 +1,28 @@ +# 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. + +{ + 'targets': [ + { + 'target_name': 'test_debug_off', + 'type': 'executable', + 'msvs_settings': { + 'VCLinkerTool': { + 'GenerateDebugInformation': 'false' + }, + }, + 'sources': ['hello.cc'], + }, + { + 'target_name': 'test_debug_on', + 'type': 'executable', + 'msvs_settings': { + 'VCLinkerTool': { + 'GenerateDebugInformation': 'true' + }, + }, + 'sources': ['hello.cc'], + }, + ] +} diff --git a/deps/gyp/test/win/linker-flags/deffile-multiple.gyp b/deps/gyp/test/win/linker-flags/deffile-multiple.gyp new file mode 100644 index 0000000000..c74a9af20a --- /dev/null +++ b/deps/gyp/test/win/linker-flags/deffile-multiple.gyp @@ -0,0 +1,17 @@ +# 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. + +{ + 'targets': [ + { + 'target_name': 'test_deffile_multiple_fail', + 'type': 'shared_library', + 'sources': [ + 'deffile.cc', + 'deffile.def', + 'deffile2.def', + ], + }, + ] +} diff --git a/deps/gyp/test/win/linker-flags/deffile.cc b/deps/gyp/test/win/linker-flags/deffile.cc new file mode 100644 index 0000000000..fa203b34c8 --- /dev/null +++ b/deps/gyp/test/win/linker-flags/deffile.cc @@ -0,0 +1,13 @@ +// 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. + +void AnExportedFunction() { +} + +void AnotherExportedFunction() { +} + +int main() { + return 0; +} diff --git a/deps/gyp/test/win/linker-flags/deffile.def b/deps/gyp/test/win/linker-flags/deffile.def new file mode 100644 index 0000000000..ba9d399bd6 --- /dev/null +++ b/deps/gyp/test/win/linker-flags/deffile.def @@ -0,0 +1,8 @@ +; 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. + +LIBRARY test_deffile_ok + +EXPORTS + AnExportedFunction diff --git a/deps/gyp/test/win/linker-flags/deffile.gyp b/deps/gyp/test/win/linker-flags/deffile.gyp new file mode 100644 index 0000000000..7b241d5e3a --- /dev/null +++ b/deps/gyp/test/win/linker-flags/deffile.gyp @@ -0,0 +1,38 @@ +# 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. + +{ + 'targets': [ + { + 'target_name': 'test_deffile_dll_ok', + 'type': 'shared_library', + 'sources': [ + 'deffile.cc', + 'deffile.def', + ], + }, + { + 'target_name': 'test_deffile_dll_notexported', + 'type': 'shared_library', + 'sources': [ + 'deffile.cc', + ], + }, + { + 'target_name': 'test_deffile_exe_ok', + 'type': 'executable', + 'sources': [ + 'deffile.cc', + 'deffile.def', + ], + }, + { + 'target_name': 'test_deffile_exe_notexported', + 'type': 'executable', + 'sources': [ + 'deffile.cc', + ], + }, + ] +} diff --git a/deps/gyp/test/win/linker-flags/delay-load-dlls.gyp b/deps/gyp/test/win/linker-flags/delay-load-dlls.gyp new file mode 100644 index 0000000000..671cbaa802 --- /dev/null +++ b/deps/gyp/test/win/linker-flags/delay-load-dlls.gyp @@ -0,0 +1,35 @@ +# 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. + +{ + 'targets': [ + { + 'target_name': 'test_dld_none', + 'type': 'executable', + 'msvs_settings': { + 'VCLinkerTool': { + } + }, + 'sources': ['delay-load.cc'], + 'libraries': [ + 'delayimp.lib', + 'shell32.lib', + ], + }, + { + 'target_name': 'test_dld_shell32', + 'type': 'executable', + 'msvs_settings': { + 'VCLinkerTool': { + 'DelayLoadDLLs': ['shell32.dll'] + } + }, + 'sources': ['delay-load.cc'], + 'libraries': [ + 'delayimp.lib', + 'shell32.lib', + ], + }, + ] +} diff --git a/deps/gyp/test/win/linker-flags/delay-load.cc b/deps/gyp/test/win/linker-flags/delay-load.cc new file mode 100644 index 0000000000..2be34aa876 --- /dev/null +++ b/deps/gyp/test/win/linker-flags/delay-load.cc @@ -0,0 +1,10 @@ +// 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. + +#include <shlobj.h> + +int main() { + SHCreateDirectory(0, 0); + return 0; +} diff --git a/deps/gyp/test/win/linker-flags/embed-manifest.gyp b/deps/gyp/test/win/linker-flags/embed-manifest.gyp new file mode 100644 index 0000000000..fefb2f56d8 --- /dev/null +++ b/deps/gyp/test/win/linker-flags/embed-manifest.gyp @@ -0,0 +1,109 @@ +# Copyright (c) 2013 Yandex LLC. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +{ + 'targets': [ + { + 'target_name': 'test_manifest_exe', + 'type': 'executable', + 'sources': ['hello.cc'], + 'msvs_settings': { + 'VCLinkerTool': { + 'LinkIncremental': '1', + }, + 'VCManifestTool': { + 'EmbedManifest': 'true', + } + }, + }, + { + 'target_name': 'test_manifest_dll', + 'type': 'loadable_module', + 'sources': ['hello.cc'], + 'msvs_settings': { + 'VCLinkerTool': { + 'LinkIncremental': '1', + }, + 'VCManifestTool': { + 'EmbedManifest': 'true', + } + }, + }, + { + 'target_name': 'test_manifest_extra1', + 'type': 'executable', + 'sources': ['hello.cc'], + 'msvs_settings': { + 'VCManifestTool': { + 'EmbedManifest': 'true', + 'AdditionalManifestFiles': 'extra.manifest', + } + }, + }, + { + 'target_name': 'test_manifest_extra2', + 'type': 'executable', + 'sources': ['hello.cc'], + 'msvs_settings': { + 'VCManifestTool': { + 'EmbedManifest': 'true', + 'AdditionalManifestFiles': 'extra.manifest;extra2.manifest', + } + }, + }, + { + 'target_name': 'test_manifest_extra_list', + 'type': 'executable', + 'sources': ['hello.cc'], + 'msvs_settings': { + 'VCManifestTool': { + 'EmbedManifest': 'true', + 'AdditionalManifestFiles': [ + 'extra.manifest', + 'extra2.manifest' + ], + } + }, + }, + { + 'target_name': 'test_manifest_dll_inc', + 'type': 'loadable_module', + 'sources': ['hello.cc'], + 'msvs_settings': { + 'VCLinkerTool': { + 'LinkIncremental': '2', + }, + 'VCManifestTool': { + 'EmbedManifest': 'true', + } + }, + }, + { + 'target_name': 'test_manifest_exe_inc', + 'type': 'executable', + 'sources': ['hello.cc'], + 'msvs_settings': { + 'VCLinkerTool': { + 'LinkIncremental': '2', + }, + 'VCManifestTool': { + 'EmbedManifest': 'true', + } + }, + }, + { + 'target_name': 'test_manifest_exe_inc_no_embed', + 'type': 'executable', + 'sources': ['hello.cc'], + 'msvs_settings': { + 'VCLinkerTool': { + 'LinkIncremental': '2', + }, + 'VCManifestTool': { + 'EmbedManifest': 'false', + } + }, + }, + ] +} diff --git a/deps/gyp/test/win/linker-flags/enable-uac.gyp b/deps/gyp/test/win/linker-flags/enable-uac.gyp new file mode 100644 index 0000000000..4e58c86ec8 --- /dev/null +++ b/deps/gyp/test/win/linker-flags/enable-uac.gyp @@ -0,0 +1,45 @@ +# Copyright 2013 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. + +{ + 'targets': [ + { + 'target_name': 'enable_uac', + 'type': 'executable', + 'sources': ['hello.cc'], + 'msvs_settings': { + 'VCManifestTool': { + 'EmbedManifest': 'true', + } + }, + }, + { + 'target_name': 'enable_uac_no', + 'type': 'executable', + 'sources': ['hello.cc'], + 'msvs_settings': { + 'VCLinkerTool': { + 'EnableUAC': 'false', + }, + 'VCManifestTool': { + 'EmbedManifest': 'true', + } + }, + }, + { + 'target_name': 'enable_uac_admin', + 'type': 'executable', + 'sources': ['hello.cc'], + 'msvs_settings': { + 'VCLinkerTool': { + 'UACExecutionLevel': 2, + 'UACUIAccess': 'true', + }, + 'VCManifestTool': { + 'EmbedManifest': 'true', + } + }, + }, + ] +} diff --git a/deps/gyp/test/win/linker-flags/entrypointsymbol.cc b/deps/gyp/test/win/linker-flags/entrypointsymbol.cc new file mode 100644 index 0000000000..b567bc87b3 --- /dev/null +++ b/deps/gyp/test/win/linker-flags/entrypointsymbol.cc @@ -0,0 +1,13 @@ +// 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. + +// The entry point specified by link.exe /ENTRY option. +extern "C" void MainEntryPoint() { +} + +// Still needed because the linker checks for existence of one of main, wmain, +// WinMain, or wMain to offer informative diagnositics. +int main() { + return 0; +} diff --git a/deps/gyp/test/win/linker-flags/entrypointsymbol.gyp b/deps/gyp/test/win/linker-flags/entrypointsymbol.gyp new file mode 100644 index 0000000000..7f2c14252d --- /dev/null +++ b/deps/gyp/test/win/linker-flags/entrypointsymbol.gyp @@ -0,0 +1,28 @@ +# 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. + +{ + 'targets': [ + { + 'target_name': 'test_ok', + 'type': 'executable', + 'msvs_settings': { + 'VCLinkerTool': { + 'EntryPointSymbol': 'MainEntryPoint', + } + }, + 'sources': ['entrypointsymbol.cc'], + }, + { + 'target_name': 'test_fail', + 'type': 'executable', + 'msvs_settings': { + 'VCLinkerTool': { + 'EntryPointSymbol': 'MainEntryPoint', + } + }, + 'sources': ['hello.cc'], + }, + ] +} diff --git a/deps/gyp/test/win/linker-flags/extra.manifest b/deps/gyp/test/win/linker-flags/extra.manifest new file mode 100644 index 0000000000..2e436dc251 --- /dev/null +++ b/deps/gyp/test/win/linker-flags/extra.manifest @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
+
+ <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
+ <application>
+ <!--This Id value indicates the application supports Windows 7 functionality-->
+ <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
+ </application>
+ </compatibility>
+
+</assembly>
diff --git a/deps/gyp/test/win/linker-flags/extra2.manifest b/deps/gyp/test/win/linker-flags/extra2.manifest new file mode 100644 index 0000000000..bfb570ca59 --- /dev/null +++ b/deps/gyp/test/win/linker-flags/extra2.manifest @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
+
+ <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
+ <application>
+ <!--This Id value indicates the application supports Windows Vista functionality -->
+ <supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/>
+ </application>
+ </compatibility>
+
+</assembly>
diff --git a/deps/gyp/test/win/linker-flags/fixed-base.gyp b/deps/gyp/test/win/linker-flags/fixed-base.gyp new file mode 100644 index 0000000000..cc2982eb27 --- /dev/null +++ b/deps/gyp/test/win/linker-flags/fixed-base.gyp @@ -0,0 +1,52 @@ +# 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. + +{ + 'targets': [ + # Disable DYNAMICBASE for these tests because it implies/doesn't imply + # FIXED in certain cases so it complicates the test for FIXED. + { + 'target_name': 'test_fixed_default_exe', + 'type': 'executable', + 'msvs_settings': { + 'VCLinkerTool': { + 'RandomizedBaseAddress': '1', + }, + }, + 'sources': ['hello.cc'], + }, + { + 'target_name': 'test_fixed_default_dll', + 'type': 'shared_library', + 'msvs_settings': { + 'VCLinkerTool': { + 'RandomizedBaseAddress': '1', + }, + }, + 'sources': ['hello.cc'], + }, + { + 'target_name': 'test_fixed_no', + 'type': 'executable', + 'msvs_settings': { + 'VCLinkerTool': { + 'FixedBaseAddress': '1', + 'RandomizedBaseAddress': '1', + } + }, + 'sources': ['hello.cc'], + }, + { + 'target_name': 'test_fixed_yes', + 'type': 'executable', + 'msvs_settings': { + 'VCLinkerTool': { + 'FixedBaseAddress': '2', + 'RandomizedBaseAddress': '1', + }, + }, + 'sources': ['hello.cc'], + }, + ] +} diff --git a/deps/gyp/test/win/linker-flags/force-symbol-reference.gyp b/deps/gyp/test/win/linker-flags/force-symbol-reference.gyp new file mode 100644 index 0000000000..d6d02a6848 --- /dev/null +++ b/deps/gyp/test/win/linker-flags/force-symbol-reference.gyp @@ -0,0 +1,39 @@ +# Copyright (c) 2013 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.
+
+{
+ 'targets': [
+ {
+ 'target_name': 'test_force_reference_lib',
+ 'type': 'static_library',
+ 'sources': ['x.cc', 'y.cc'],
+ },
+ {
+ 'target_name': 'test_force_reference',
+ 'type': 'executable',
+ # Turn on debug info to get symbols in disasm for the test code, and
+ # turn on opt:ref to drop unused symbols to make sure we wouldn't
+ # otherwise have the symbols.
+ 'msvs_settings': {
+ 'VCCLCompilerTool': {
+ 'DebugInformationFormat': '3',
+ },
+ 'VCLinkerTool': {
+ 'GenerateDebugInformation': 'true',
+ 'AdditionalOptions': [
+ '/OPT:REF',
+ ],
+ 'ForceSymbolReferences': [
+ '?x@@YAHXZ',
+ '?y@@YAHXZ',
+ ],
+ },
+ },
+ 'sources': ['hello.cc'],
+ 'dependencies': [
+ 'test_force_reference_lib',
+ ],
+ },
+ ]
+}
diff --git a/deps/gyp/test/win/linker-flags/generate-manifest.gyp b/deps/gyp/test/win/linker-flags/generate-manifest.gyp new file mode 100644 index 0000000000..34a68d1a48 --- /dev/null +++ b/deps/gyp/test/win/linker-flags/generate-manifest.gyp @@ -0,0 +1,166 @@ +# 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. + +{ + 'targets': [ + { + 'target_name': 'test_generate_manifest_true', + 'type': 'executable', + 'sources': ['hello.cc'], + 'msvs_settings': { + 'VCLinkerTool': { + 'EnableUAC': 'true', + 'GenerateManifest': 'true', + }, + 'VCManifestTool': { + 'EmbedManifest': 'false', + }, + }, + }, + { + 'target_name': 'test_generate_manifest_false', + 'type': 'executable', + 'sources': ['hello.cc'], + 'msvs_settings': { + 'VCLinkerTool': { + 'EnableUAC': 'true', + 'GenerateManifest': 'false', + }, + 'VCManifestTool': { + 'EmbedManifest': 'false', + }, + }, + }, + { + 'target_name': 'test_generate_manifest_default', + 'type': 'executable', + 'sources': ['hello.cc'], + 'msvs_settings': { + 'VCLinkerTool': { + 'EnableUAC': 'true', + }, + 'VCManifestTool': { + 'EmbedManifest': 'false', + }, + }, + }, + { + 'target_name': 'test_generate_manifest_true_as_embedded', + 'type': 'executable', + 'sources': ['hello.cc'], + 'msvs_settings': { + 'VCLinkerTool': { + 'EnableUAC': 'true', + 'GenerateManifest': 'true', + }, + 'VCManifestTool': { + 'EmbedManifest': 'true', + }, + }, + }, + { + 'target_name': 'test_generate_manifest_false_as_embedded', + 'type': 'executable', + 'sources': ['hello.cc'], + 'msvs_settings': { + 'VCLinkerTool': { + 'EnableUAC': 'true', + 'GenerateManifest': 'false', + }, + 'VCManifestTool': { + 'EmbedManifest': 'true', + }, + }, + }, + { + 'target_name': 'test_generate_manifest_default_as_embedded', + 'type': 'executable', + 'sources': ['hello.cc'], + 'msvs_settings': { + 'VCLinkerTool': { + 'EnableUAC': 'true', + }, + 'VCManifestTool': { + 'EmbedManifest': 'true', + }, + }, + }, + { + 'target_name': 'test_generate_manifest_true_with_extra_manifest', + 'type': 'executable', + 'sources': ['hello.cc'], + 'msvs_settings': { + 'VCLinkerTool': { + 'EnableUAC': 'true', + 'GenerateManifest': 'true', + }, + 'VCManifestTool': { + 'EmbedManifest': 'false', + 'AdditionalManifestFiles': 'extra.manifest;extra2.manifest', + }, + }, + }, + { + 'target_name': 'test_generate_manifest_false_with_extra_manifest', + 'type': 'executable', + 'sources': ['hello.cc'], + 'msvs_settings': { + 'VCLinkerTool': { + 'EnableUAC': 'true', + 'GenerateManifest': 'false', + }, + 'VCManifestTool': { + 'EmbedManifest': 'false', + 'AdditionalManifestFiles': 'extra.manifest;extra2.manifest', + }, + }, + }, + { + 'target_name': 'test_generate_manifest_true_with_extra_manifest_list', + 'type': 'executable', + 'sources': ['hello.cc'], + 'msvs_settings': { + 'VCLinkerTool': { + 'EnableUAC': 'true', + 'GenerateManifest': 'true', + }, + 'VCManifestTool': { + 'EmbedManifest': 'false', + 'AdditionalManifestFiles': [ + 'extra.manifest', + 'extra2.manifest', + ], + }, + }, + }, + { + 'target_name': 'test_generate_manifest_false_with_extra_manifest_list', + 'type': 'executable', + 'sources': ['hello.cc'], + 'msvs_settings': { + 'VCLinkerTool': { + 'EnableUAC': 'true', + 'GenerateManifest': 'false', + }, + 'VCManifestTool': { + 'EmbedManifest': 'false', + 'AdditionalManifestFiles': [ + 'extra.manifest', + 'extra2.manifest', + ], + }, + }, + }, + { + 'target_name': 'test_generate_manifest_default_embed_default', + 'type': 'executable', + 'sources': ['hello.cc'], + 'msvs_settings': { + 'VCLinkerTool': { + 'EnableUAC': 'true', + }, + }, + }, + ] +} diff --git a/deps/gyp/test/win/linker-flags/hello.cc b/deps/gyp/test/win/linker-flags/hello.cc new file mode 100644 index 0000000000..1711567ef5 --- /dev/null +++ b/deps/gyp/test/win/linker-flags/hello.cc @@ -0,0 +1,7 @@ +// 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. + +int main() { + return 0; +} diff --git a/deps/gyp/test/win/linker-flags/incremental.gyp b/deps/gyp/test/win/linker-flags/incremental.gyp new file mode 100644 index 0000000000..59f3103253 --- /dev/null +++ b/deps/gyp/test/win/linker-flags/incremental.gyp @@ -0,0 +1,65 @@ +# 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. + +{ + 'targets': [ + # Turn on debug information so the incremental linking tables have a + # visible symbolic name in the disassembly. + { + 'target_name': 'test_incremental_unset', + 'type': 'executable', + 'msvs_settings': { + 'VCCLCompilerTool': { + 'DebugInformationFormat': '3', + }, + 'VCLinkerTool': { + 'GenerateDebugInformation': 'true', + }, + }, + 'sources': ['hello.cc'], + }, + { + 'target_name': 'test_incremental_default', + 'type': 'executable', + 'msvs_settings': { + 'VCCLCompilerTool': { + 'DebugInformationFormat': '3', + }, + 'VCLinkerTool': { + 'GenerateDebugInformation': 'true', + 'LinkIncremental': '0', + }, + }, + 'sources': ['hello.cc'], + }, + { + 'target_name': 'test_incremental_no', + 'type': 'executable', + 'msvs_settings': { + 'VCCLCompilerTool': { + 'DebugInformationFormat': '3', + }, + 'VCLinkerTool': { + 'GenerateDebugInformation': 'true', + 'LinkIncremental': '1', + }, + }, + 'sources': ['hello.cc'], + }, + { + 'target_name': 'test_incremental_yes', + 'type': 'executable', + 'msvs_settings': { + 'VCCLCompilerTool': { + 'DebugInformationFormat': '3', + }, + 'VCLinkerTool': { + 'GenerateDebugInformation': 'true', + 'LinkIncremental': '2', + } + }, + 'sources': ['hello.cc'], + }, + ] +} diff --git a/deps/gyp/test/win/linker-flags/inline_test.cc b/deps/gyp/test/win/linker-flags/inline_test.cc new file mode 100644 index 0000000000..a9f177e476 --- /dev/null +++ b/deps/gyp/test/win/linker-flags/inline_test.cc @@ -0,0 +1,12 @@ +// Copyright (c) 2013 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. + +#include "inline_test.h" + +#include <intrin.h> +#pragma intrinsic(_ReturnAddress) + +bool IsFunctionInlined(void* caller_return_address) { + return _ReturnAddress() == caller_return_address; +} diff --git a/deps/gyp/test/win/linker-flags/inline_test.h b/deps/gyp/test/win/linker-flags/inline_test.h new file mode 100644 index 0000000000..117913c4f5 --- /dev/null +++ b/deps/gyp/test/win/linker-flags/inline_test.h @@ -0,0 +1,5 @@ +// Copyright (c) 2013 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. + +bool IsFunctionInlined(void* current_return_address); diff --git a/deps/gyp/test/win/linker-flags/inline_test_main.cc b/deps/gyp/test/win/linker-flags/inline_test_main.cc new file mode 100644 index 0000000000..23cafe8f94 --- /dev/null +++ b/deps/gyp/test/win/linker-flags/inline_test_main.cc @@ -0,0 +1,15 @@ +// Copyright (c) 2013 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. + +#include "inline_test.h" + +#include <intrin.h> +#include <stdio.h> + +#pragma intrinsic(_ReturnAddress) + +int main() { + if (IsFunctionInlined(_ReturnAddress())) + puts("==== inlined ====\n"); +} diff --git a/deps/gyp/test/win/linker-flags/large-address-aware.gyp b/deps/gyp/test/win/linker-flags/large-address-aware.gyp new file mode 100644 index 0000000000..fa56d3789c --- /dev/null +++ b/deps/gyp/test/win/linker-flags/large-address-aware.gyp @@ -0,0 +1,28 @@ +# 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. + +{ + 'targets': [ + { + 'target_name': 'test_large_address_aware_no', + 'type': 'executable', + 'msvs_settings': { + 'VCLinkerTool': { + 'LargeAddressAware': '1', + } + }, + 'sources': ['hello.cc'], + }, + { + 'target_name': 'test_large_address_aware_yes', + 'type': 'executable', + 'msvs_settings': { + 'VCLinkerTool': { + 'LargeAddressAware': '2', + }, + }, + 'sources': ['hello.cc'], + }, + ] +} diff --git a/deps/gyp/test/win/linker-flags/library-adjust.cc b/deps/gyp/test/win/linker-flags/library-adjust.cc new file mode 100644 index 0000000000..7dfb589d26 --- /dev/null +++ b/deps/gyp/test/win/linker-flags/library-adjust.cc @@ -0,0 +1,10 @@ +// 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. + +#include <winsock2.h> + +int main() { + WSAStartup(0, 0); + return 0; +} diff --git a/deps/gyp/test/win/linker-flags/library-adjust.gyp b/deps/gyp/test/win/linker-flags/library-adjust.gyp new file mode 100644 index 0000000000..10e9996f5c --- /dev/null +++ b/deps/gyp/test/win/linker-flags/library-adjust.gyp @@ -0,0 +1,16 @@ +# 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. + +{ + 'targets': [ + { + 'target_name': 'test_adjust', + 'type': 'executable', + 'libraries': [ + '-lws2_32.lib' + ], + 'sources': ['library-adjust.cc'], + }, + ] +} diff --git a/deps/gyp/test/win/linker-flags/library-directories-define.cc b/deps/gyp/test/win/linker-flags/library-directories-define.cc new file mode 100644 index 0000000000..211ef062c1 --- /dev/null +++ b/deps/gyp/test/win/linker-flags/library-directories-define.cc @@ -0,0 +1,7 @@ +// 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. + +int library_function() { + return 0; +} diff --git a/deps/gyp/test/win/linker-flags/library-directories-reference.cc b/deps/gyp/test/win/linker-flags/library-directories-reference.cc new file mode 100644 index 0000000000..335097839a --- /dev/null +++ b/deps/gyp/test/win/linker-flags/library-directories-reference.cc @@ -0,0 +1,10 @@ +// 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. + +extern int library_function(); + +int main() { + library_function(); + return 0; +} diff --git a/deps/gyp/test/win/linker-flags/library-directories.gyp b/deps/gyp/test/win/linker-flags/library-directories.gyp new file mode 100644 index 0000000000..25395d6c87 --- /dev/null +++ b/deps/gyp/test/win/linker-flags/library-directories.gyp @@ -0,0 +1,42 @@ +# 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. + +{ + 'targets': [ + { + 'target_name': 'test_libdirs_none', + 'type': 'executable', + 'msvs_settings': { + 'VCLinkerTool': { + 'AdditionalDependencies': [ + 'test_lib.lib', + ], + }, + }, + 'sources': ['library-directories-reference.cc'], + }, + { + 'target_name': 'test_libdirs_with', + 'type': 'executable', + 'msvs_settings': { + 'VCLinkerTool': { + # NOTE: Don't use this for general dependencies between gyp + # libraries (use 'dependencies' instead). This is done here only for + # testing. + # + # This setting should only be used to depend on third party prebuilt + # libraries that are stored as binaries at a known location. + 'AdditionalLibraryDirectories': [ + '<(DEPTH)/out/Default/obj/subdir', # ninja style + '<(DEPTH)/subdir/Default/lib', # msvs style + ], + 'AdditionalDependencies': [ + 'test_lib.lib', + ], + }, + }, + 'sources': ['library-directories-reference.cc'], + }, + ] +} diff --git a/deps/gyp/test/win/linker-flags/link-ordering.gyp b/deps/gyp/test/win/linker-flags/link-ordering.gyp new file mode 100644 index 0000000000..66f44309d1 --- /dev/null +++ b/deps/gyp/test/win/linker-flags/link-ordering.gyp @@ -0,0 +1,95 @@ +# Copyright (c) 2013 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. + +{ + 'targets': [ + { + 'target_name': 'test_ordering_exe', + 'type': 'executable', + # These are so the names of the functions appear in the disassembly. + 'msvs_settings': { + 'VCCLCompilerTool': { + 'DebugInformationFormat': '3', + 'Optimization': '2', + }, + 'VCLinkerTool': { + 'GenerateDebugInformation': 'true', + 'LinkIncremental': '1', + 'GenerateManifest': 'false', + # Minimize the disassembly to just our code. + 'AdditionalOptions': [ + '/NODEFAULTLIB', + ], + }, + }, + 'sources': [ + # Explicitly sorted the same way as the disassembly in the test .py. + 'main-crt.c', + 'z.cc', + 'x.cc', + 'y.cc', + 'hello.cc', + ], + }, + + { + 'target_name': 'test_ordering_subdirs', + 'type': 'executable', + # These are so the names of the functions appear in the disassembly. + 'msvs_settings': { + 'VCCLCompilerTool': { + 'DebugInformationFormat': '3', + 'Optimization': '2', + }, + 'VCLinkerTool': { + 'GenerateDebugInformation': 'true', + 'LinkIncremental': '1', + 'GenerateManifest': 'false', + # Minimize the disassembly to just our code. + 'AdditionalOptions': [ + '/NODEFAULTLIB', + ], + }, + }, + 'sources': [ + # Explicitly sorted the same way as the disassembly in the test .py. + 'main-crt.c', + 'hello.cc', + 'b/y.cc', + 'a/z.cc', + ], + }, + + + { + 'target_name': 'test_ordering_subdirs_mixed', + 'type': 'executable', + # These are so the names of the functions appear in the disassembly. + 'msvs_settings': { + 'VCCLCompilerTool': { + 'DebugInformationFormat': '3', + 'Optimization': '2', + }, + 'VCLinkerTool': { + 'GenerateDebugInformation': 'true', + 'LinkIncremental': '1', + 'GenerateManifest': 'false', + # Minimize the disassembly to just our code. + 'AdditionalOptions': [ + '/NODEFAULTLIB', + ], + }, + }, + 'sources': [ + # Explicitly sorted the same way as the disassembly in the test .py. + 'main-crt.c', + 'a/x.cc', + 'hello.cc', + 'a/z.cc', + 'y.cc', + ], + }, + + ] +} diff --git a/deps/gyp/test/win/linker-flags/link-warning.cc b/deps/gyp/test/win/linker-flags/link-warning.cc new file mode 100644 index 0000000000..4b34277ba3 --- /dev/null +++ b/deps/gyp/test/win/linker-flags/link-warning.cc @@ -0,0 +1,10 @@ +// Copyright (c) 2013 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. + +// This will cause LNK4254. +#pragma comment(linker, "/merge:.data=.text") + +int main() { + return 0; +} diff --git a/deps/gyp/test/win/linker-flags/ltcg.gyp b/deps/gyp/test/win/linker-flags/ltcg.gyp new file mode 100644 index 0000000000..ddb0d9b4e2 --- /dev/null +++ b/deps/gyp/test/win/linker-flags/ltcg.gyp @@ -0,0 +1,42 @@ +# Copyright (c) 2013 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. + +{ + 'targets': [ + { + 'target_name': 'test_ltcg_off', + 'type': 'executable', + 'msvs_settings': { + 'VCCLCompilerTool': { + 'WholeProgramOptimization': 'false', + }, + 'VCLinkerTool': { + 'LinkTimeCodeGeneration': '0', + }, + }, + 'sources': [ + 'inline_test.h', + 'inline_test.cc', + 'inline_test_main.cc', + ], + }, + { + 'target_name': 'test_ltcg_on', + 'type': 'executable', + 'msvs_settings': { + 'VCCLCompilerTool': { + 'WholeProgramOptimization': 'true', # /GL + }, + 'VCLinkerTool': { + 'LinkTimeCodeGeneration': '1', # /LTCG + }, + }, + 'sources': [ + 'inline_test.h', + 'inline_test.cc', + 'inline_test_main.cc', + ], + }, + ] +} diff --git a/deps/gyp/test/win/linker-flags/main-crt.c b/deps/gyp/test/win/linker-flags/main-crt.c new file mode 100644 index 0000000000..bdc80c54fd --- /dev/null +++ b/deps/gyp/test/win/linker-flags/main-crt.c @@ -0,0 +1,8 @@ +// Copyright (c) 2013 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. + +// Stub so we can link with /NODEFAULTLIB when checking disasm. +int mainCRTStartup() { + return 5; +} diff --git a/deps/gyp/test/win/linker-flags/manifest-in-comment.cc b/deps/gyp/test/win/linker-flags/manifest-in-comment.cc new file mode 100644 index 0000000000..ae54ae5462 --- /dev/null +++ b/deps/gyp/test/win/linker-flags/manifest-in-comment.cc @@ -0,0 +1,13 @@ +// Copyright 2013 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. + +#pragma comment(linker, \ + "\"/manifestdependency:type='Win32' " \ + "name='Test.Research.SampleAssembly' version='6.0.0.0' " \ + "processorArchitecture='X86' " \ + "publicKeyToken='0000000000000000' language='*'\"") + +int main() { + return 0; +} diff --git a/deps/gyp/test/win/linker-flags/mapfile.cc b/deps/gyp/test/win/linker-flags/mapfile.cc new file mode 100644 index 0000000000..cebccb264a --- /dev/null +++ b/deps/gyp/test/win/linker-flags/mapfile.cc @@ -0,0 +1,12 @@ +// Copyright (c) 2013 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. + +__declspec(dllexport) +void AnExportedFunction() { + // We need an exported function to verify that /MAPINFO:EXPORTS works. +} + +int main() { + return 0; +} diff --git a/deps/gyp/test/win/linker-flags/mapfile.gyp b/deps/gyp/test/win/linker-flags/mapfile.gyp new file mode 100644 index 0000000000..14206fe28d --- /dev/null +++ b/deps/gyp/test/win/linker-flags/mapfile.gyp @@ -0,0 +1,45 @@ +# Copyright (c) 2013 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. + +{ + 'targets': [ + { + 'target_name': 'test_mapfile_unset', + 'type': 'executable', + 'sources': ['mapfile.cc'], + }, + { + 'target_name': 'test_mapfile_generate', + 'type': 'executable', + 'msvs_settings': { + 'VCLinkerTool': { + 'GenerateMapFile': 'true', + }, + }, + 'sources': ['mapfile.cc'], + }, + { + 'target_name': 'test_mapfile_generate_exports', + 'type': 'executable', + 'msvs_settings': { + 'VCLinkerTool': { + 'GenerateMapFile': 'true', + 'MapExports': 'true', + }, + }, + 'sources': ['mapfile.cc'], + }, + { + 'target_name': 'test_mapfile_generate_filename', + 'type': 'executable', + 'msvs_settings': { + 'VCLinkerTool': { + 'GenerateMapFile': 'true', + 'MapFileName': '<(PRODUCT_DIR)/custom_file_name.map', + }, + }, + 'sources': ['mapfile.cc'], + }, + ] +} diff --git a/deps/gyp/test/win/linker-flags/no-default-libs.cc b/deps/gyp/test/win/linker-flags/no-default-libs.cc new file mode 100644 index 0000000000..e306846987 --- /dev/null +++ b/deps/gyp/test/win/linker-flags/no-default-libs.cc @@ -0,0 +1,18 @@ +// 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. + +// Reference something in kernel32.dll. This will fail to link, verifying that +// GYP provides no default import library configuration. +// Note that we don't include Windows.h, as that will result in generating +// linker directives in the object file through #pragma comment(lib, ...). +typedef short BOOL; + +extern "C" __declspec(dllimport) +BOOL CopyFileW(const wchar_t*, const wchar_t*, BOOL); + + +int main() { + CopyFileW(0, 0, 0); // kernel32 + return 0; +} diff --git a/deps/gyp/test/win/linker-flags/no-default-libs.gyp b/deps/gyp/test/win/linker-flags/no-default-libs.gyp new file mode 100644 index 0000000000..77838ce8c4 --- /dev/null +++ b/deps/gyp/test/win/linker-flags/no-default-libs.gyp @@ -0,0 +1,13 @@ +# 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. + +{ + 'targets': [ + { + 'target_name': 'test_default', + 'type': 'executable', + 'sources': ['no-default-libs.cc'], + }, + ] +} diff --git a/deps/gyp/test/win/linker-flags/nodefaultlib.cc b/deps/gyp/test/win/linker-flags/nodefaultlib.cc new file mode 100644 index 0000000000..24b6eca438 --- /dev/null +++ b/deps/gyp/test/win/linker-flags/nodefaultlib.cc @@ -0,0 +1,13 @@ +// 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. + +// Include entry point function that's excluded by removing C runtime libraries. +extern "C" void mainCRTStartup() { +} + +// Still needed because the linker checks for existence of one of main, wmain, +// WinMain, or wMain to offer informative diagnositics. +int main() { + return 0; +} diff --git a/deps/gyp/test/win/linker-flags/nodefaultlib.gyp b/deps/gyp/test/win/linker-flags/nodefaultlib.gyp new file mode 100644 index 0000000000..4fb452a18b --- /dev/null +++ b/deps/gyp/test/win/linker-flags/nodefaultlib.gyp @@ -0,0 +1,30 @@ +# 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. + +{ + 'targets': [ + { + 'target_name': 'test_ok', + 'type': 'executable', + 'msvs_settings': { + 'VCLinkerTool': { + 'IgnoreDefaultLibraryNames': + ['libcmtd.lib', 'libcmt.lib', 'msvcrt.lib', 'msvcrtd.lib'], + } + }, + 'sources': ['nodefaultlib.cc'], + }, + { + 'target_name': 'test_fail', + 'type': 'executable', + 'msvs_settings': { + 'VCLinkerTool': { + 'IgnoreDefaultLibraryNames': + ['libcmtd.lib', 'libcmt.lib', 'msvcrt.lib', 'msvcrtd.lib'], + } + }, + 'sources': ['hello.cc'], + }, + ] +} diff --git a/deps/gyp/test/win/linker-flags/nxcompat.gyp b/deps/gyp/test/win/linker-flags/nxcompat.gyp new file mode 100644 index 0000000000..fa4118cbd7 --- /dev/null +++ b/deps/gyp/test/win/linker-flags/nxcompat.gyp @@ -0,0 +1,35 @@ +# 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. + +{ + 'targets': [ + { + 'target_name': 'test_nxcompat_default', + 'type': 'executable', + 'msvs_settings': { + }, + 'sources': ['hello.cc'], + }, + { + 'target_name': 'test_nxcompat_no', + 'type': 'executable', + 'msvs_settings': { + 'VCLinkerTool': { + 'DataExecutionPrevention': '1', + } + }, + 'sources': ['hello.cc'], + }, + { + 'target_name': 'test_nxcompat_yes', + 'type': 'executable', + 'msvs_settings': { + 'VCLinkerTool': { + 'DataExecutionPrevention': '2', + }, + }, + 'sources': ['hello.cc'], + }, + ] +} diff --git a/deps/gyp/test/win/linker-flags/opt-icf.cc b/deps/gyp/test/win/linker-flags/opt-icf.cc new file mode 100644 index 0000000000..1f12156b7f --- /dev/null +++ b/deps/gyp/test/win/linker-flags/opt-icf.cc @@ -0,0 +1,29 @@ +// 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. + +void similar_function0(char* x) { + while (*x) { + ++x; + } +} + +void similar_function1(char* p) { + while (*p) { + ++p; + } +} + +void similar_function2(char* q) { + while (*q) { + ++q; + } +} + +int main() { + char* x = "hello"; + similar_function0(x); + similar_function1(x); + similar_function2(x); + return 0; +} diff --git a/deps/gyp/test/win/linker-flags/opt-icf.gyp b/deps/gyp/test/win/linker-flags/opt-icf.gyp new file mode 100644 index 0000000000..effe8021c3 --- /dev/null +++ b/deps/gyp/test/win/linker-flags/opt-icf.gyp @@ -0,0 +1,63 @@ +# 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. + +{ + 'targets': [ + # Have to turn on function level linking here to get the function packaged + # as a COMDAT so that it's eligible for merging. Also turn on debug + # information so that the symbol names for the code appear in the dump. + # Finally, specify non-incremental linking so that there's not a bunch of + # extra "similar_function"s in the output (the ILT jump table). + { + 'target_name': 'test_opticf_default', + 'type': 'executable', + 'msvs_settings': { + 'VCCLCompilerTool': { + 'EnableFunctionLevelLinking': 'true', + 'DebugInformationFormat': '3', + 'Optimization': '0', + }, + 'VCLinkerTool': { + 'GenerateDebugInformation': 'true', + 'LinkIncremental': '1', + }, + }, + 'sources': ['opt-icf.cc'], + }, + { + 'target_name': 'test_opticf_no', + 'type': 'executable', + 'msvs_settings': { + 'VCCLCompilerTool': { + 'EnableFunctionLevelLinking': 'true', + 'DebugInformationFormat': '3', + 'Optimization': '0', + }, + 'VCLinkerTool': { + 'GenerateDebugInformation': 'true', + 'EnableCOMDATFolding': '1', + 'LinkIncremental': '1', + }, + }, + 'sources': ['opt-icf.cc'], + }, + { + 'target_name': 'test_opticf_yes', + 'type': 'executable', + 'msvs_settings': { + 'VCCLCompilerTool': { + 'EnableFunctionLevelLinking': 'true', + 'DebugInformationFormat': '3', + 'Optimization': '0', + }, + 'VCLinkerTool': { + 'GenerateDebugInformation': 'true', + 'EnableCOMDATFolding': '2', + 'LinkIncremental': '1', + }, + }, + 'sources': ['opt-icf.cc'], + }, + ] +} diff --git a/deps/gyp/test/win/linker-flags/opt-ref.cc b/deps/gyp/test/win/linker-flags/opt-ref.cc new file mode 100644 index 0000000000..afaa328a5d --- /dev/null +++ b/deps/gyp/test/win/linker-flags/opt-ref.cc @@ -0,0 +1,11 @@ +// 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. + +int unused_function() { + return 0; +} + +int main() { + return 0; +} diff --git a/deps/gyp/test/win/linker-flags/opt-ref.gyp b/deps/gyp/test/win/linker-flags/opt-ref.gyp new file mode 100644 index 0000000000..69d0281a08 --- /dev/null +++ b/deps/gyp/test/win/linker-flags/opt-ref.gyp @@ -0,0 +1,56 @@ +# 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. + +{ + 'targets': [ + # Have to turn on function level linking here to get the function packaged + # as a COMDAT so that it's eligible for optimizing away. Also turn on + # debug information so that the symbol names for the code appear in the + # dump (so we can verify if they are included in the final exe). + { + 'target_name': 'test_optref_default', + 'type': 'executable', + 'msvs_settings': { + 'VCCLCompilerTool': { + 'EnableFunctionLevelLinking': 'true', + 'DebugInformationFormat': '3', + }, + 'VCLinkerTool': { + 'GenerateDebugInformation': 'true', + }, + }, + 'sources': ['opt-ref.cc'], + }, + { + 'target_name': 'test_optref_no', + 'type': 'executable', + 'msvs_settings': { + 'VCCLCompilerTool': { + 'EnableFunctionLevelLinking': 'true', + 'DebugInformationFormat': '3', + }, + 'VCLinkerTool': { + 'GenerateDebugInformation': 'true', + 'OptimizeReferences': '1', + }, + }, + 'sources': ['opt-ref.cc'], + }, + { + 'target_name': 'test_optref_yes', + 'type': 'executable', + 'msvs_settings': { + 'VCCLCompilerTool': { + 'EnableFunctionLevelLinking': 'true', + 'DebugInformationFormat': '3', + }, + 'VCLinkerTool': { + 'GenerateDebugInformation': 'true', + 'OptimizeReferences': '2', + }, + }, + 'sources': ['opt-ref.cc'], + }, + ] +} diff --git a/deps/gyp/test/win/linker-flags/outputfile.gyp b/deps/gyp/test/win/linker-flags/outputfile.gyp new file mode 100644 index 0000000000..1022ec2e20 --- /dev/null +++ b/deps/gyp/test/win/linker-flags/outputfile.gyp @@ -0,0 +1,58 @@ +# 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. + +{ + 'targets': [ + { + 'target_name': 'test_output_exe', + 'type': 'executable', + 'msvs_settings': { + 'VCLinkerTool': { + 'OutputFile': '$(OutDir)\\blorp.exe' + }, + }, + 'sources': ['hello.cc'], + }, + { + 'target_name': 'test_output_exe2', + 'type': 'executable', + 'msvs_settings': { + 'VCLinkerTool': { + 'OutputFile': '$(OutDir)\\subdir\\blorp.exe' + }, + }, + 'sources': ['hello.cc'], + }, + { + 'target_name': 'test_output_dll', + 'type': 'shared_library', + 'msvs_settings': { + 'VCLinkerTool': { + 'OutputFile': '$(OutDir)\\blorp.dll' + }, + }, + 'sources': ['hello.cc'], + }, + { + 'target_name': 'test_output_lib', + 'type': 'static_library', + 'msvs_settings': { + 'VCLibrarianTool': { + 'OutputFile': '$(OutDir)\\blorp.lib' + }, + }, + 'sources': ['hello.cc'], + }, + { + 'target_name': 'test_output_lib2', + 'type': 'static_library', + 'msvs_settings': { + 'VCLibrarianTool': { + 'OutputFile': '$(OutDir)\\subdir\\blorp.lib' + }, + }, + 'sources': ['hello.cc'], + }, + ] +} diff --git a/deps/gyp/test/win/linker-flags/pdb-output.gyp b/deps/gyp/test/win/linker-flags/pdb-output.gyp new file mode 100644 index 0000000000..1a03c67cc0 --- /dev/null +++ b/deps/gyp/test/win/linker-flags/pdb-output.gyp @@ -0,0 +1,49 @@ +# Copyright (c) 2014 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. + +{ + 'targets': [ + { + 'target_name': 'test_pdb_output_exe', + 'type': 'executable', + 'sources': ['hello.cc'], + 'msvs_settings': { + 'VCCLCompilerTool': { + 'DebugInformationFormat': '3' + }, + 'VCLinkerTool': { + 'GenerateDebugInformation': 'true', + 'ProgramDatabaseFile': 'output_exe.pdb', + }, + }, + }, + { + 'target_name': 'test_pdb_output_dll', + 'type': 'shared_library', + 'sources': ['hello.cc'], + 'msvs_settings': { + 'VCCLCompilerTool': { + 'DebugInformationFormat': '3' + }, + 'VCLinkerTool': { + 'GenerateDebugInformation': 'true', + 'ProgramDatabaseFile': 'output_dll.pdb', + }, + }, + }, + { + 'target_name': 'test_pdb_output_disabled', + 'type': 'executable', + 'sources': ['hello.cc'], + 'msvs_settings': { + 'VCCLCompilerTool': { + 'DebugInformationFormat': '0' + }, + 'VCLinkerTool': { + 'GenerateDebugInformation': 'false', + }, + }, + }, + ] +} diff --git a/deps/gyp/test/win/linker-flags/pgo.gyp b/deps/gyp/test/win/linker-flags/pgo.gyp new file mode 100644 index 0000000000..da32639973 --- /dev/null +++ b/deps/gyp/test/win/linker-flags/pgo.gyp @@ -0,0 +1,143 @@ +# Copyright (c) 2013 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. + +{ + 'variables': { + 'pgd_basename': 'test_pgo', + }, + 'targets': [ + # In the PGO (Profile-Guided Optimization) build flow, we need to build the + # target binary multiple times. To implement this flow with gyp, here we + # define multiple 'executable' targets, each of which represents one build + # particular build/profile stage. On tricky part to do this is that these + # 'executable' targets should share the code itself so that profile data + # can be reused among these 'executable' files. In other words, the only + # differences among below 'executable' targets are: + # 1) PGO (Profile-Guided Optimization) database, and + # 2) linker options. + # The following static library contains all the logic including entry point. + # Basically we don't need to rebuild this target once we enter profiling + # phase of PGO. + { + 'target_name': 'test_pgo_main', + 'type': 'static_library', + 'msvs_settings': { + 'VCCLCompilerTool': { + 'WholeProgramOptimization': 'true', # /GL + }, + 'VCLibrarianTool': { + 'LinkTimeCodeGeneration': 'true', + }, + }, + 'link_settings': { + 'msvs_settings': { + 'VCLinkerTool': { + 'ProfileGuidedDatabase': '$(OutDir)\\<(pgd_basename).pgd', + 'TargetMachine': '1', # x86 - 32 + 'SubSystem': '1', # /SUBSYSTEM:CONSOLE
+ # Tell ninja generator not to pass /ManifestFile:<filename> option + # to the linker, because it causes LNK1268 error in PGO biuld. + 'GenerateManifest': 'false', + # We need to specify 'libcmt.lib' here so that the linker can pick + # up a valid entry point. + 'AdditionalDependencies': [ + 'libcmt.lib', + ], + }, + }, + }, + 'sources': [ + 'inline_test.h', + 'inline_test.cc', + 'inline_test_main.cc', + ], + }, + { + 'target_name': 'test_pgo_instrument', + 'type': 'executable', + 'msvs_settings': { + 'VCLinkerTool': { + 'LinkTimeCodeGeneration': '2', + }, + }, + 'dependencies': [ + 'test_pgo_main', + ], + }, + { + 'target_name': 'gen_profile_guided_database', + 'type': 'none', + 'msvs_cygwin_shell': 0, + 'actions': [ + { + 'action_name': 'action_main', + 'inputs': [], + 'outputs': [ + '$(OutDir)\\<(pgd_basename).pgd', + ], + 'action': [ + 'python', 'update_pgd.py', + '--vcbindir', '$(VCInstallDir)bin', + '--exe', '$(OutDir)\\test_pgo_instrument.exe', + '--pgd', '$(OutDir)\\<(pgd_basename).pgd', + ], + }, + ], + 'dependencies': [ + 'test_pgo_instrument', + ], + }, + { + 'target_name': 'test_pgo_optimize', + 'type': 'executable', + 'msvs_settings': { + 'VCLinkerTool': { + 'LinkTimeCodeGeneration': '3', + }, + }, + 'sources': [ + '$(OutDir)\\<(pgd_basename).pgd', + ], + 'dependencies': [ + 'test_pgo_main', + 'gen_profile_guided_database', + ], + }, + { + 'target_name': 'test_pgo_update', + 'type': 'executable', + 'msvs_settings': { + 'VCLinkerTool': { + 'LinkTimeCodeGeneration': '4', + }, + }, + 'sources': [ + '$(OutDir)\\<(pgd_basename).pgd', + ], + 'dependencies': [ + 'test_pgo_main', + ], + }, + # A helper target to dump link.exe's command line options. We can use the + # output to determine if PGO (Profile-Guided Optimization) is available on + # the test environment. + { + 'target_name': 'gen_linker_option', + 'type': 'none', + 'msvs_cygwin_shell': 0, + 'actions': [ + { + 'action_name': 'action_main', + 'inputs': [], + 'outputs': [ + '$(OutDir)\\linker_options.txt', + ], + 'action': [ + 'cmd.exe', '/c link.exe > $(OutDir)\\linker_options.txt & exit 0', + ], + }, + ], + }, + ] +} diff --git a/deps/gyp/test/win/linker-flags/profile.gyp b/deps/gyp/test/win/linker-flags/profile.gyp new file mode 100644 index 0000000000..d60a700fbb --- /dev/null +++ b/deps/gyp/test/win/linker-flags/profile.gyp @@ -0,0 +1,50 @@ +# 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. + +{ + 'targets': [ + # Verify that 'Profile' option correctly makes it to LINK steup in Ninja + { + 'target_name': 'test_profile_true', + 'type': 'executable', + 'sources': ['hello.cc'], + 'msvs_settings': { + 'VCCLCompilerTool': { + 'DebugInformationFormat': '3' + }, + 'VCLinkerTool': { + 'Profile': 'true', + 'GenerateDebugInformation': 'true', + }, + }, + }, + { + 'target_name': 'test_profile_false', + 'type': 'executable', + 'sources': ['hello.cc'], + 'msvs_settings': { + 'VCCLCompilerTool': { + 'DebugInformationFormat': '3' + }, + 'VCLinkerTool': { + 'Profile': 'false', + 'GenerateDebugInformation': 'true', + }, + }, + }, + { + 'target_name': 'test_profile_default', + 'type': 'executable', + 'sources': ['hello.cc'], + 'msvs_settings': { + 'VCCLCompilerTool': { + 'DebugInformationFormat': '3' + }, + 'VCLinkerTool': { + 'GenerateDebugInformation': 'true', + }, + }, + }, + ] +} diff --git a/deps/gyp/test/win/linker-flags/program-database.gyp b/deps/gyp/test/win/linker-flags/program-database.gyp new file mode 100644 index 0000000000..6e60ac0dc9 --- /dev/null +++ b/deps/gyp/test/win/linker-flags/program-database.gyp @@ -0,0 +1,40 @@ +# 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. + +{ + 'targets': [ + # Verify that 'ProgramDatabaseFile' option correctly makes it to LINK + # step in Ninja. + { + # Verify that VC macros and windows paths work correctly. + 'target_name': 'test_pdb_outdir', + 'type': 'executable', + 'sources': ['hello.cc'], + 'msvs_settings': { + 'VCCLCompilerTool': { + 'DebugInformationFormat': '3' + }, + 'VCLinkerTool': { + 'GenerateDebugInformation': 'true', + 'ProgramDatabaseFile': '$(OutDir)\\name_outdir.pdb', + }, + }, + }, + { + # Verify that GYP macros and POSIX paths work correctly. + 'target_name': 'test_pdb_proddir', + 'type': 'executable', + 'sources': ['hello.cc'], + 'msvs_settings': { + 'VCCLCompilerTool': { + 'DebugInformationFormat': '3' + }, + 'VCLinkerTool': { + 'GenerateDebugInformation': 'true', + 'ProgramDatabaseFile': '<(PRODUCT_DIR)/name_proddir.pdb', + }, + }, + }, + ] +} diff --git a/deps/gyp/test/win/linker-flags/safeseh.gyp b/deps/gyp/test/win/linker-flags/safeseh.gyp new file mode 100644 index 0000000000..d4a62074b8 --- /dev/null +++ b/deps/gyp/test/win/linker-flags/safeseh.gyp @@ -0,0 +1,79 @@ +# Copyright (c) 2014 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. + +{ + 'target_defaults': { + 'configurations': { + 'Default': { + 'msvs_configuration_platform': 'Win32', + }, + 'Default_x64': { + 'inherit_from': ['Default'], + 'msvs_configuration_platform': 'x64', + }, + }, + }, + 'targets': [ + { + 'target_name': 'test_safeseh_default', + 'type': 'executable', + 'msvs_settings': { + # By default, msvs passes /SAFESEH for Link, but not for MASM. In + # order for test_safeseh_default to link successfully, we need to + # explicitly specify /SAFESEH for MASM. + 'MASM': { + 'UseSafeExceptionHandlers': 'true', + }, + }, + 'sources': [ + 'safeseh_hello.cc', + 'safeseh_zero.asm', + ], + }, + { + 'target_name': 'test_safeseh_no', + 'type': 'executable', + 'msvs_settings': { + 'VCLinkerTool': { + 'ImageHasSafeExceptionHandlers': 'false', + }, + }, + 'sources': [ + 'safeseh_hello.cc', + 'safeseh_zero.asm', + ], + }, + { + 'target_name': 'test_safeseh_yes', + 'type': 'executable', + 'msvs_settings': { + 'VCLinkerTool': { + 'ImageHasSafeExceptionHandlers': 'true', + }, + 'MASM': { + 'UseSafeExceptionHandlers': 'true', + }, + }, + 'sources': [ + 'safeseh_hello.cc', + 'safeseh_zero.asm', + ], + }, + { + # x64 targets cannot have ImageHasSafeExceptionHandlers or + # UseSafeExceptionHandlers set. + 'target_name': 'test_safeseh_x64', + 'type': 'executable', + 'configurations': { + 'Default': { + 'msvs_target_platform': 'x64', + }, + }, + 'sources': [ + 'safeseh_hello.cc', + 'safeseh_zero64.asm', + ], + }, + ] +} diff --git a/deps/gyp/test/win/linker-flags/safeseh_hello.cc b/deps/gyp/test/win/linker-flags/safeseh_hello.cc new file mode 100644 index 0000000000..6141300d2c --- /dev/null +++ b/deps/gyp/test/win/linker-flags/safeseh_hello.cc @@ -0,0 +1,11 @@ +// Copyright (c) 2014 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. + +extern "C" { +int zero(void); +} + +int main() { + return zero(); +} diff --git a/deps/gyp/test/win/linker-flags/safeseh_zero.asm b/deps/gyp/test/win/linker-flags/safeseh_zero.asm new file mode 100644 index 0000000000..62da0df4f3 --- /dev/null +++ b/deps/gyp/test/win/linker-flags/safeseh_zero.asm @@ -0,0 +1,10 @@ +.MODEL FLAT, C +.CODE + +PUBLIC zero +zero PROC + xor eax, eax + ret 0 +zero ENDP + +END diff --git a/deps/gyp/test/win/linker-flags/safeseh_zero64.asm b/deps/gyp/test/win/linker-flags/safeseh_zero64.asm new file mode 100644 index 0000000000..a4740c0dfb --- /dev/null +++ b/deps/gyp/test/win/linker-flags/safeseh_zero64.asm @@ -0,0 +1,9 @@ +.CODE + +PUBLIC zero +zero PROC + xor eax, eax + ret 0 +zero ENDP + +END diff --git a/deps/gyp/test/win/linker-flags/stacksize.gyp b/deps/gyp/test/win/linker-flags/stacksize.gyp new file mode 100644 index 0000000000..bba44ca4a7 --- /dev/null +++ b/deps/gyp/test/win/linker-flags/stacksize.gyp @@ -0,0 +1,44 @@ +# Copyright (c) 2015 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. + +{ + 'targets': [ + { + 'target_name': 'test_default', + 'type': 'executable', + 'sources': ['hello.cc'], + }, + { + 'target_name': 'test_set_reserved_size', + 'type': 'executable', + 'sources': ['hello.cc'], + 'msvs_settings': { + 'VCLinkerTool': { + 'StackReserveSize': 2097152, # 2MB + } + }, + }, + { + 'target_name': 'test_set_commit_size', + 'type': 'executable', + 'sources': ['hello.cc'], + 'msvs_settings': { + 'VCLinkerTool': { + 'StackCommitSize': 8192, # 8KB + } + }, + }, + { + 'target_name': 'test_set_both', + 'type': 'executable', + 'sources': ['hello.cc'], + 'msvs_settings': { + 'VCLinkerTool': { + 'StackReserveSize': 2097152, # 2MB + 'StackCommitSize': 8192, # 8KB + } + }, + }, + ] +} diff --git a/deps/gyp/test/win/linker-flags/subdir/library.gyp b/deps/gyp/test/win/linker-flags/subdir/library.gyp new file mode 100644 index 0000000000..519577f0d7 --- /dev/null +++ b/deps/gyp/test/win/linker-flags/subdir/library.gyp @@ -0,0 +1,13 @@ +# 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.
+
+{
+ 'targets': [
+ {
+ 'target_name': 'test_lib',
+ 'type': 'static_library',
+ 'sources': ['../library-directories-define.cc'],
+ },
+ ]
+}
diff --git a/deps/gyp/test/win/linker-flags/subsystem-windows.cc b/deps/gyp/test/win/linker-flags/subsystem-windows.cc new file mode 100644 index 0000000000..ac99da808e --- /dev/null +++ b/deps/gyp/test/win/linker-flags/subsystem-windows.cc @@ -0,0 +1,9 @@ +// 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. + +#include <windows.h> + +int CALLBACK WinMain(HINSTANCE, HINSTANCE, LPSTR, int) { + return 0; +} diff --git a/deps/gyp/test/win/linker-flags/subsystem.gyp b/deps/gyp/test/win/linker-flags/subsystem.gyp new file mode 100644 index 0000000000..63f072a206 --- /dev/null +++ b/deps/gyp/test/win/linker-flags/subsystem.gyp @@ -0,0 +1,70 @@ +# 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. + +{ + 'targets': [ + { + 'target_name': 'test_console_ok', + 'type': 'executable', + 'msvs_settings': { + 'VCLinkerTool': { + 'SubSystem': '1' + } + }, + 'sources': ['hello.cc'], + }, + { + 'target_name': 'test_console_fail', + 'type': 'executable', + 'msvs_settings': { + 'VCLinkerTool': { + 'SubSystem': '1' + } + }, + 'sources': ['subsystem-windows.cc'], + }, + { + 'target_name': 'test_windows_ok', + 'type': 'executable', + 'msvs_settings': { + 'VCLinkerTool': { + 'SubSystem': '2' + } + }, + 'sources': ['subsystem-windows.cc'], + }, + { + 'target_name': 'test_windows_fail', + 'type': 'executable', + 'msvs_settings': { + 'VCLinkerTool': { + 'SubSystem': '2' + } + }, + 'sources': ['hello.cc'], + }, + { + 'target_name': 'test_console_xp', + 'type': 'executable', + 'msvs_settings': { + 'VCLinkerTool': { + 'SubSystem': '1', + 'MinimumRequiredVersion': '5.01', # XP. + } + }, + 'sources': ['hello.cc'], + }, + { + 'target_name': 'test_windows_xp', + 'type': 'executable', + 'msvs_settings': { + 'VCLinkerTool': { + 'SubSystem': '2', + 'MinimumRequiredVersion': '5.01', # XP. + } + }, + 'sources': ['subsystem-windows.cc'], + }, + ] +} diff --git a/deps/gyp/test/win/linker-flags/target-machine.gyp b/deps/gyp/test/win/linker-flags/target-machine.gyp new file mode 100644 index 0000000000..30271926c9 --- /dev/null +++ b/deps/gyp/test/win/linker-flags/target-machine.gyp @@ -0,0 +1,48 @@ +# Copyright (c) 2013 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. + +{ + 'targets': [ + { + 'target_name': 'test_target_link_x86', + 'type': 'executable', + 'msvs_settings': { + 'VCLinkerTool': { + 'TargetMachine': '1', + } + }, + 'sources': ['hello.cc'], + }, + { + 'target_name': 'test_target_link_x64', + 'type': 'executable', + 'msvs_settings': { + 'VCLinkerTool': { + 'TargetMachine': '17', + }, + }, + 'sources': ['hello.cc'], + }, + { + 'target_name': 'test_target_lib_x86', + 'type': 'static_library', + 'msvs_settings': { + 'VCLibrarianTool': { + 'TargetMachine': '1', + } + }, + 'sources': ['hello.cc'], + }, + { + 'target_name': 'test_target_lib_x64', + 'type': 'static_library', + 'msvs_settings': { + 'VCLibrarianTool': { + 'TargetMachine': '17', + }, + }, + 'sources': ['hello.cc'], + }, + ] +} diff --git a/deps/gyp/test/win/linker-flags/tsaware.gyp b/deps/gyp/test/win/linker-flags/tsaware.gyp new file mode 100644 index 0000000000..7ffc7426bb --- /dev/null +++ b/deps/gyp/test/win/linker-flags/tsaware.gyp @@ -0,0 +1,28 @@ +# 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. + +{ + 'targets': [ + { + 'target_name': 'test_tsaware_no', + 'type': 'executable', + 'msvs_settings': { + 'VCLinkerTool': { + 'TerminalServerAware': '1', + } + }, + 'sources': ['hello.cc'], + }, + { + 'target_name': 'test_tsaware_yes', + 'type': 'executable', + 'msvs_settings': { + 'VCLinkerTool': { + 'TerminalServerAware': '2', + }, + }, + 'sources': ['hello.cc'], + }, + ] +} diff --git a/deps/gyp/test/win/linker-flags/unsupported-manifest.gyp b/deps/gyp/test/win/linker-flags/unsupported-manifest.gyp new file mode 100644 index 0000000000..5549e7cb9b --- /dev/null +++ b/deps/gyp/test/win/linker-flags/unsupported-manifest.gyp @@ -0,0 +1,13 @@ +# Copyright (c) 2013 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. + +{ + 'targets': [ + { + 'target_name': 'test_unsupported', + 'type': 'executable', + 'sources': ['manifest-in-comment.cc'], + }, + ], +} diff --git a/deps/gyp/test/win/linker-flags/update_pgd.py b/deps/gyp/test/win/linker-flags/update_pgd.py new file mode 100644 index 0000000000..176e9e5472 --- /dev/null +++ b/deps/gyp/test/win/linker-flags/update_pgd.py @@ -0,0 +1,35 @@ +#!/usr/bin/env python + +# Copyright (c) 2013 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. + +from optparse import OptionParser +import glob +import os +import subprocess + +parser = OptionParser() +parser.add_option('--exe', dest='exe') +parser.add_option('--vcbindir', dest='vcbindir') +parser.add_option('--pgd', dest='pgd') +(options, args) = parser.parse_args() + +# Instrumented binaries fail to run unless the Visual C++'s bin dir is included +# in the PATH environment variable. +os.environ['PATH'] = os.environ['PATH'] + os.pathsep + options.vcbindir + +# Run Instrumented binary. The profile will be recorded into *.pgc file. +subprocess.call([options.exe]) + +# Merge *.pgc files into a *.pgd (Profile-Guided Database) file. +subprocess.call(['pgomgr', '/merge', options.pgd]) + +# *.pgc files are no longer necessary. Clear all of them. +pgd_file = os.path.abspath(options.pgd) +pgd_dir = os.path.dirname(pgd_file) +(pgd_basename, _) = os.path.splitext(os.path.basename(pgd_file)) +pgc_filepattern = os.path.join(pgd_dir, '%s!*.pgc' % pgd_basename) +pgc_files= glob.glob(pgc_filepattern) +for pgc_file in pgc_files: + os.unlink(pgc_file) diff --git a/deps/gyp/test/win/linker-flags/warn-as-error.gyp b/deps/gyp/test/win/linker-flags/warn-as-error.gyp new file mode 100644 index 0000000000..83c67e9df1 --- /dev/null +++ b/deps/gyp/test/win/linker-flags/warn-as-error.gyp @@ -0,0 +1,33 @@ +# Copyright (c) 2013 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.
+
+{
+ 'targets': [
+ {
+ 'target_name': 'test_on',
+ 'type': 'executable',
+ 'msvs_settings': {
+ 'VCLinkerTool': {
+ 'TreatLinkerWarningAsErrors': 'true',
+ }
+ },
+ 'sources': ['link-warning.cc'],
+ },
+ {
+ 'target_name': 'test_off',
+ 'type': 'executable',
+ 'msvs_settings': {
+ 'VCLinkerTool': {
+ 'TreatLinkerWarningAsErrors': 'false',
+ }
+ },
+ 'sources': ['link-warning.cc'],
+ },
+ {
+ 'target_name': 'test_default',
+ 'type': 'executable',
+ 'sources': ['link-warning.cc'],
+ },
+ ]
+}
diff --git a/deps/gyp/test/win/linker-flags/x.cc b/deps/gyp/test/win/linker-flags/x.cc new file mode 100644 index 0000000000..f5f763b095 --- /dev/null +++ b/deps/gyp/test/win/linker-flags/x.cc @@ -0,0 +1,7 @@ +// Copyright (c) 2013 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. + +int x() { + return 1; +} diff --git a/deps/gyp/test/win/linker-flags/y.cc b/deps/gyp/test/win/linker-flags/y.cc new file mode 100644 index 0000000000..bd884119fc --- /dev/null +++ b/deps/gyp/test/win/linker-flags/y.cc @@ -0,0 +1,7 @@ +// Copyright (c) 2013 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. + +int y() { + return 2; +} diff --git a/deps/gyp/test/win/linker-flags/z.cc b/deps/gyp/test/win/linker-flags/z.cc new file mode 100644 index 0000000000..8a43501270 --- /dev/null +++ b/deps/gyp/test/win/linker-flags/z.cc @@ -0,0 +1,7 @@ +// Copyright (c) 2013 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. + +int z() { + return 3; +} diff --git a/deps/gyp/test/win/long-command-line/function.cc b/deps/gyp/test/win/long-command-line/function.cc new file mode 100644 index 0000000000..af44b2cabd --- /dev/null +++ b/deps/gyp/test/win/long-command-line/function.cc @@ -0,0 +1,7 @@ +// 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. + +int func() { + return 0; +} diff --git a/deps/gyp/test/win/long-command-line/hello.cc b/deps/gyp/test/win/long-command-line/hello.cc new file mode 100644 index 0000000000..1711567ef5 --- /dev/null +++ b/deps/gyp/test/win/long-command-line/hello.cc @@ -0,0 +1,7 @@ +// 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. + +int main() { + return 0; +} diff --git a/deps/gyp/test/win/long-command-line/long-command-line.gyp b/deps/gyp/test/win/long-command-line/long-command-line.gyp new file mode 100644 index 0000000000..964c94fa94 --- /dev/null +++ b/deps/gyp/test/win/long-command-line/long-command-line.gyp @@ -0,0 +1,54 @@ +# 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. + +{ + 'targets': [ + { + 'target_name': 'longexe', + 'type': 'executable', + 'msvs_settings': { + # Use this as a simple way to get a long command. + 'VCCLCompilerTool': { + 'AdditionalOptions': '/nologo ' * 8000, + }, + 'VCLinkerTool': { + 'AdditionalOptions': '/nologo ' * 8000, + }, + }, + 'sources': [ + 'hello.cc', + ], + }, + { + 'target_name': 'longlib', + 'type': 'static_library', + 'msvs_settings': { + 'VCCLCompilerTool': { + 'AdditionalOptions': '/nologo ' * 8000, + }, + 'VCLibrarianTool': { + 'AdditionalOptions': '/nologo ' * 8000, + }, + }, + 'sources': [ + 'function.cc', + ], + }, + { + 'target_name': 'longdll', + 'type': 'shared_library', + 'msvs_settings': { + 'VCCLCompilerTool': { + 'AdditionalOptions': '/nologo ' * 8000, + }, + 'VCLinkerTool': { + 'AdditionalOptions': '/nologo ' * 8000, + }, + }, + 'sources': [ + 'hello.cc', + ], + }, + ] +} diff --git a/deps/gyp/test/win/ml-safeseh/a.asm b/deps/gyp/test/win/ml-safeseh/a.asm new file mode 100644 index 0000000000..62da0df4f3 --- /dev/null +++ b/deps/gyp/test/win/ml-safeseh/a.asm @@ -0,0 +1,10 @@ +.MODEL FLAT, C +.CODE + +PUBLIC zero +zero PROC + xor eax, eax + ret 0 +zero ENDP + +END diff --git a/deps/gyp/test/win/ml-safeseh/hello.cc b/deps/gyp/test/win/ml-safeseh/hello.cc new file mode 100644 index 0000000000..6141300d2c --- /dev/null +++ b/deps/gyp/test/win/ml-safeseh/hello.cc @@ -0,0 +1,11 @@ +// Copyright (c) 2014 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. + +extern "C" { +int zero(void); +} + +int main() { + return zero(); +} diff --git a/deps/gyp/test/win/ml-safeseh/ml-safeseh.gyp b/deps/gyp/test/win/ml-safeseh/ml-safeseh.gyp new file mode 100644 index 0000000000..bf8618f865 --- /dev/null +++ b/deps/gyp/test/win/ml-safeseh/ml-safeseh.gyp @@ -0,0 +1,24 @@ +# Copyright (c) 2014 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. + +{ + 'targets': [ + { + 'target_name': 'ml_safeseh', + 'type': 'executable', + 'sources': [ + 'hello.cc', + 'a.asm', + ], + 'msvs_settings': { + 'VCLinkerTool': { + 'ImageHasSafeExceptionHandlers': 'true', + }, + 'MASM': { + 'UseSafeExceptionHandlers': 'true', + }, + }, + }, + ] +} diff --git a/deps/gyp/test/win/precompiled/gyptest-all.py b/deps/gyp/test/win/precompiled/gyptest-all.py new file mode 100644 index 0000000000..9fb5e62edf --- /dev/null +++ b/deps/gyp/test/win/precompiled/gyptest-all.py @@ -0,0 +1,21 @@ +#!/usr/bin/env python + +# Copyright (c) 2011 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. + +""" +Verifies that precompiled headers can be specified. +""" + +import TestGyp + +import sys + +if sys.platform == 'win32': + test = TestGyp.TestGyp(formats=['msvs', 'ninja'], workdir='workarea_all') + test.run_gyp('hello.gyp') + test.build('hello.gyp', 'hello') + test.run_built_executable('hello', stdout="Hello, world!\nHello, two!\n") + test.up_to_date('hello.gyp', test.ALL) + test.pass_test() diff --git a/deps/gyp/test/win/precompiled/hello.c b/deps/gyp/test/win/precompiled/hello.c new file mode 100644 index 0000000000..ffb47bf822 --- /dev/null +++ b/deps/gyp/test/win/precompiled/hello.c @@ -0,0 +1,14 @@ +/* Copyright (c) 2011 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. */ + +// Note the abscence of a stdio.h include. This will be inserted because of the +// precompiled header. + +extern int hello2(); + +int main(void) { + printf("Hello, world!\n"); + hello2(); + return 0; +} diff --git a/deps/gyp/test/win/precompiled/hello.gyp b/deps/gyp/test/win/precompiled/hello.gyp new file mode 100644 index 0000000000..5f82c53593 --- /dev/null +++ b/deps/gyp/test/win/precompiled/hello.gyp @@ -0,0 +1,28 @@ +# 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. + +{ + 'targets': [ + { + 'target_name': 'hello', + 'type': 'executable', + 'sources': [ + 'hello.c', + 'hello2.c', + 'precomp.c', + ], + 'msvs_precompiled_header': 'stdio.h', + 'msvs_precompiled_source': 'precomp.c', + + # Required so that the printf actually causes a build failure + # if the pch isn't included. + 'msvs_settings': { + 'VCCLCompilerTool': { + 'WarningLevel': '3', + 'WarnAsError': 'true', + }, + }, + }, + ], +} diff --git a/deps/gyp/test/win/precompiled/hello2.c b/deps/gyp/test/win/precompiled/hello2.c new file mode 100644 index 0000000000..d6d53111fb --- /dev/null +++ b/deps/gyp/test/win/precompiled/hello2.c @@ -0,0 +1,13 @@ +/* Copyright (c) 2011 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. */ + +// Unlike hello.c, this file specifies the headers. + +#include <windows.h> +#include <stdio.h> + +int hello2() { + printf("Hello, two!\n"); + return 0; +} diff --git a/deps/gyp/test/win/precompiled/precomp.c b/deps/gyp/test/win/precompiled/precomp.c new file mode 100644 index 0000000000..517c61a36b --- /dev/null +++ b/deps/gyp/test/win/precompiled/precomp.c @@ -0,0 +1,8 @@ +/* Copyright (c) 2011 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. */ + +// The precompiled header does not have to be the first one in the file. + +#include <windows.h> +#include <stdio.h> diff --git a/deps/gyp/test/win/rc-build/Resource.h b/deps/gyp/test/win/rc-build/Resource.h new file mode 100644 index 0000000000..137acf39b5 --- /dev/null +++ b/deps/gyp/test/win/rc-build/Resource.h @@ -0,0 +1,26 @@ +//{{NO_DEPENDENCIES}}
+// Microsoft Visual C++ generated include file.
+// Used by hello.rc
+//
+
+#define IDS_APP_TITLE 103
+
+#define IDR_MAINFRAME 128
+#define IDI_HELLO 107
+#define IDI_SMALL 108
+#define IDC_HELLO 109
+#ifndef IDC_STATIC
+#define IDC_STATIC -1
+#endif
+// Next default values for new objects
+//
+#ifdef APSTUDIO_INVOKED
+#ifndef APSTUDIO_READONLY_SYMBOLS
+
+#define _APS_NO_MFC 130
+#define _APS_NEXT_RESOURCE_VALUE 129
+#define _APS_NEXT_COMMAND_VALUE 32771
+#define _APS_NEXT_CONTROL_VALUE 1000
+#define _APS_NEXT_SYMED_VALUE 110
+#endif
+#endif
diff --git a/deps/gyp/test/win/rc-build/hello.cpp b/deps/gyp/test/win/rc-build/hello.cpp new file mode 100644 index 0000000000..f552ca1591 --- /dev/null +++ b/deps/gyp/test/win/rc-build/hello.cpp @@ -0,0 +1,30 @@ +// 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.
+
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+#include <tchar.h>
+
+#include "resource.h"
+
+#define MAX_LOADSTRING 100
+
+TCHAR szTitle[MAX_LOADSTRING];
+TCHAR szWindowClass[MAX_LOADSTRING];
+
+int APIENTRY _tWinMain(
+ HINSTANCE hInstance,
+ HINSTANCE hPrevInstance,
+ LPTSTR lpCmdLine,
+ int nCmdShow) {
+ // Make sure we can load some resources.
+ int count = 0;
+ LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
+ if (szTitle[0] != 0) ++count;
+ LoadString(hInstance, IDC_HELLO, szWindowClass, MAX_LOADSTRING);
+ if (szWindowClass[0] != 0) ++count;
+ if (LoadIcon(hInstance, MAKEINTRESOURCE(IDI_SMALL)) != NULL) ++count;
+ if (LoadIcon(hInstance, MAKEINTRESOURCE(IDI_HELLO)) != NULL) ++count;
+ return count;
+}
diff --git a/deps/gyp/test/win/rc-build/hello.gyp b/deps/gyp/test/win/rc-build/hello.gyp new file mode 100644 index 0000000000..3a66357dd4 --- /dev/null +++ b/deps/gyp/test/win/rc-build/hello.gyp @@ -0,0 +1,92 @@ +# 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. + +{ + 'targets': [ + { + 'target_name': 'with_resources', + 'type': 'executable', + 'msvs_settings': { + 'VCCLCompilerTool': { + 'DebugInformationFormat': '3', + }, + 'VCLinkerTool': { + 'GenerateDebugInformation': 'true', + }, + 'VCResourceCompilerTool': { + 'Culture' : '1033', + }, + }, + 'sources': [ + 'hello.cpp', + 'hello.rc', + ], + 'libraries': [ + 'kernel32.lib', + 'user32.lib', + ], + }, + { + 'target_name': 'with_resources_subdir', + 'type': 'executable', + 'msvs_settings': { + 'VCCLCompilerTool': { + 'DebugInformationFormat': '3', + }, + 'VCLinkerTool': { + 'GenerateDebugInformation': 'true', + }, + 'VCResourceCompilerTool': { + 'Culture' : '1033', + }, + }, + 'sources': [ + 'hello.cpp', + 'subdir/hello2.rc', + ], + 'libraries': [ + 'kernel32.lib', + 'user32.lib', + ], + }, + { + 'target_name': 'with_include_subdir', + 'type': 'executable', + 'msvs_settings': { + 'VCCLCompilerTool': { + 'DebugInformationFormat': '3', + }, + 'VCLinkerTool': { + 'GenerateDebugInformation': 'true', + }, + 'VCResourceCompilerTool': { + 'Culture' : '1033', + }, + }, + 'resource_include_dirs': [ + '$(ProjectDir)\\subdir', + ], + 'sources': [ + 'hello.cpp', + 'hello3.rc', + ], + 'libraries': [ + 'kernel32.lib', + 'user32.lib', + ], + }, + { + 'target_name': 'resource_only_dll', + 'type': 'shared_library', + 'msvs_settings': { + 'VCLinkerTool': { + 'ResourceOnlyDLL': 'true', + }, + }, + 'sources': [ + 'hello.rc', + ], + }, + ], +} diff --git a/deps/gyp/test/win/rc-build/hello.h b/deps/gyp/test/win/rc-build/hello.h new file mode 100644 index 0000000000..e60f2eb7ed --- /dev/null +++ b/deps/gyp/test/win/rc-build/hello.h @@ -0,0 +1,3 @@ +#pragma once
+
+#include "resource.h"
diff --git a/deps/gyp/test/win/rc-build/hello.ico b/deps/gyp/test/win/rc-build/hello.ico Binary files differnew file mode 100644 index 0000000000..d551aa3aaf --- /dev/null +++ b/deps/gyp/test/win/rc-build/hello.ico diff --git a/deps/gyp/test/win/rc-build/hello.rc b/deps/gyp/test/win/rc-build/hello.rc new file mode 100644 index 0000000000..c9a7af6a07 --- /dev/null +++ b/deps/gyp/test/win/rc-build/hello.rc @@ -0,0 +1,86 @@ +//Microsoft Visual C++ generated resource script.
+//
+#include "resource.h"
+
+#define APSTUDIO_READONLY_SYMBOLS
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 2 resource.
+//
+#ifndef APSTUDIO_INVOKED
+#include "targetver.h"
+#endif
+#define APSTUDIO_HIDDEN_SYMBOLS
+#include "windows.h"
+#undef APSTUDIO_HIDDEN_SYMBOLS
+/////////////////////////////////////////////////////////////////////////////
+#undef APSTUDIO_READONLY_SYMBOLS
+
+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
+LANGUAGE 9, 1
+#pragma code_page(932)
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Icon
+//
+
+// Icon with lowest ID value placed first to ensure application icon
+// remains consistent on all systems.
+
+IDI_HELLO ICON "hello.ico"
+IDI_SMALL ICON "small.ico"
+
+#ifdef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// TEXTINCLUDE
+//
+1 TEXTINCLUDE
+BEGIN
+ "resource.h\0"
+END
+
+2 TEXTINCLUDE
+BEGIN
+ "#ifndef APSTUDIO_INVOKED\r\n"
+ "#include ""targetver.h""\r\n"
+ "#endif\r\n"
+ "#define APSTUDIO_HIDDEN_SYMBOLS\r\n"
+ "#include ""windows.h""\r\n"
+ "#undef APSTUDIO_HIDDEN_SYMBOLS\r\n"
+ "\0"
+END
+
+3 TEXTINCLUDE
+BEGIN
+ "\r\n"
+ "\0"
+END
+
+#endif // APSTUDIO_INVOKED
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// String Table
+//
+
+STRINGTABLE
+BEGIN
+ IDC_HELLO "HELLO"
+ IDS_APP_TITLE "hello"
+END
+
+#endif
+/////////////////////////////////////////////////////////////////////////////
+
+
+
+#ifndef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 3 resource.
+//
+
+/////////////////////////////////////////////////////////////////////////////
+#endif // not APSTUDIO_INVOKED
diff --git a/deps/gyp/test/win/rc-build/hello3.rc b/deps/gyp/test/win/rc-build/hello3.rc new file mode 100644 index 0000000000..c74dede576 --- /dev/null +++ b/deps/gyp/test/win/rc-build/hello3.rc @@ -0,0 +1,87 @@ +//Microsoft Visual C++ generated resource script.
+//
+#include "include.h"
+#include "resource.h"
+
+#define APSTUDIO_READONLY_SYMBOLS
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 2 resource.
+//
+#ifndef APSTUDIO_INVOKED
+#include "targetver.h"
+#endif
+#define APSTUDIO_HIDDEN_SYMBOLS
+#include "windows.h"
+#undef APSTUDIO_HIDDEN_SYMBOLS
+/////////////////////////////////////////////////////////////////////////////
+#undef APSTUDIO_READONLY_SYMBOLS
+
+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
+LANGUAGE 9, 1
+#pragma code_page(932)
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Icon
+//
+
+// Icon with lowest ID value placed first to ensure application icon
+// remains consistent on all systems.
+
+IDI_HELLO ICON "hello.ico"
+IDI_SMALL ICON "small.ico"
+
+#ifdef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// TEXTINCLUDE
+//
+1 TEXTINCLUDE
+BEGIN
+ "resource.h\0"
+END
+
+2 TEXTINCLUDE
+BEGIN
+ "#ifndef APSTUDIO_INVOKED\r\n"
+ "#include ""targetver.h""\r\n"
+ "#endif\r\n"
+ "#define APSTUDIO_HIDDEN_SYMBOLS\r\n"
+ "#include ""windows.h""\r\n"
+ "#undef APSTUDIO_HIDDEN_SYMBOLS\r\n"
+ "\0"
+END
+
+3 TEXTINCLUDE
+BEGIN
+ "\r\n"
+ "\0"
+END
+
+#endif // APSTUDIO_INVOKED
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// String Table
+//
+
+STRINGTABLE
+BEGIN
+ IDC_HELLO "HELLO"
+ IDS_APP_TITLE "hello"
+END
+
+#endif
+/////////////////////////////////////////////////////////////////////////////
+
+
+
+#ifndef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 3 resource.
+//
+
+/////////////////////////////////////////////////////////////////////////////
+#endif // not APSTUDIO_INVOKED
diff --git a/deps/gyp/test/win/rc-build/small.ico b/deps/gyp/test/win/rc-build/small.ico Binary files differnew file mode 100644 index 0000000000..d551aa3aaf --- /dev/null +++ b/deps/gyp/test/win/rc-build/small.ico diff --git a/deps/gyp/test/win/rc-build/subdir/hello2.rc b/deps/gyp/test/win/rc-build/subdir/hello2.rc new file mode 100644 index 0000000000..4c8eab109e --- /dev/null +++ b/deps/gyp/test/win/rc-build/subdir/hello2.rc @@ -0,0 +1,87 @@ +//Microsoft Visual C++ generated resource script.
+//
+#include "subdir/include.h"
+#include "resource.h"
+
+#define APSTUDIO_READONLY_SYMBOLS
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 2 resource.
+//
+#ifndef APSTUDIO_INVOKED
+#include "targetver.h"
+#endif
+#define APSTUDIO_HIDDEN_SYMBOLS
+#include "windows.h"
+#undef APSTUDIO_HIDDEN_SYMBOLS
+/////////////////////////////////////////////////////////////////////////////
+#undef APSTUDIO_READONLY_SYMBOLS
+
+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
+LANGUAGE 9, 1
+#pragma code_page(932)
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Icon
+//
+
+// Icon with lowest ID value placed first to ensure application icon
+// remains consistent on all systems.
+
+IDI_HELLO ICON "hello.ico"
+IDI_SMALL ICON "small.ico"
+
+#ifdef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// TEXTINCLUDE
+//
+1 TEXTINCLUDE
+BEGIN
+ "resource.h\0"
+END
+
+2 TEXTINCLUDE
+BEGIN
+ "#ifndef APSTUDIO_INVOKED\r\n"
+ "#include ""targetver.h""\r\n"
+ "#endif\r\n"
+ "#define APSTUDIO_HIDDEN_SYMBOLS\r\n"
+ "#include ""windows.h""\r\n"
+ "#undef APSTUDIO_HIDDEN_SYMBOLS\r\n"
+ "\0"
+END
+
+3 TEXTINCLUDE
+BEGIN
+ "\r\n"
+ "\0"
+END
+
+#endif // APSTUDIO_INVOKED
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// String Table
+//
+
+STRINGTABLE
+BEGIN
+ IDC_HELLO "HELLO"
+ IDS_APP_TITLE "hello"
+END
+
+#endif
+/////////////////////////////////////////////////////////////////////////////
+
+
+
+#ifndef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 3 resource.
+//
+
+/////////////////////////////////////////////////////////////////////////////
+#endif // not APSTUDIO_INVOKED
diff --git a/deps/gyp/test/win/rc-build/subdir/include.h b/deps/gyp/test/win/rc-build/subdir/include.h new file mode 100644 index 0000000000..f15c48b422 --- /dev/null +++ b/deps/gyp/test/win/rc-build/subdir/include.h @@ -0,0 +1 @@ +// Just exists to make sure it can be included.
diff --git a/deps/gyp/test/win/rc-build/targetver.h b/deps/gyp/test/win/rc-build/targetver.h new file mode 100644 index 0000000000..f583181dfd --- /dev/null +++ b/deps/gyp/test/win/rc-build/targetver.h @@ -0,0 +1,24 @@ +#pragma once
+
+// The following macros define the minimum required platform. The minimum required platform
+// is the earliest version of Windows, Internet Explorer etc. that has the necessary features to run
+// your application. The macros work by enabling all features available on platform versions up to and
+// including the version specified.
+
+// Modify the following defines if you have to target a platform prior to the ones specified below.
+// Refer to MSDN for the latest info on corresponding values for different platforms.
+#ifndef WINVER // Specifies that the minimum required platform is Windows Vista.
+#define WINVER 0x0600 // Change this to the appropriate value to target other versions of Windows.
+#endif
+
+#ifndef _WIN32_WINNT // Specifies that the minimum required platform is Windows Vista.
+#define _WIN32_WINNT 0x0600 // Change this to the appropriate value to target other versions of Windows.
+#endif
+
+#ifndef _WIN32_WINDOWS // Specifies that the minimum required platform is Windows 98.
+#define _WIN32_WINDOWS 0x0410 // Change this to the appropriate value to target Windows Me or later.
+#endif
+
+#ifndef _WIN32_IE // Specifies that the minimum required platform is Internet Explorer 7.0.
+#define _WIN32_IE 0x0700 // Change this to the appropriate value to target other versions of IE.
+#endif
diff --git a/deps/gyp/test/win/shard/hello.cc b/deps/gyp/test/win/shard/hello.cc new file mode 100644 index 0000000000..a9dce62453 --- /dev/null +++ b/deps/gyp/test/win/shard/hello.cc @@ -0,0 +1,7 @@ +// Copyright 2014 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. + +int main() { + return 0; +} diff --git a/deps/gyp/test/win/shard/hello1.cc b/deps/gyp/test/win/shard/hello1.cc new file mode 100644 index 0000000000..0eccf2861d --- /dev/null +++ b/deps/gyp/test/win/shard/hello1.cc @@ -0,0 +1,7 @@ +// Copyright (c) 2013 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. + +int f1() { + return 0; +} diff --git a/deps/gyp/test/win/shard/hello2.cc b/deps/gyp/test/win/shard/hello2.cc new file mode 100644 index 0000000000..23fcb546cb --- /dev/null +++ b/deps/gyp/test/win/shard/hello2.cc @@ -0,0 +1,7 @@ +// Copyright (c) 2013 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. + +int f2() { + return 0; +} diff --git a/deps/gyp/test/win/shard/hello3.cc b/deps/gyp/test/win/shard/hello3.cc new file mode 100644 index 0000000000..a72e2efb5a --- /dev/null +++ b/deps/gyp/test/win/shard/hello3.cc @@ -0,0 +1,7 @@ +// Copyright (c) 2013 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. + +int f3() { + return 0; +} diff --git a/deps/gyp/test/win/shard/hello4.cc b/deps/gyp/test/win/shard/hello4.cc new file mode 100644 index 0000000000..a94df19499 --- /dev/null +++ b/deps/gyp/test/win/shard/hello4.cc @@ -0,0 +1,7 @@ +// Copyright (c) 2013 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. + +int f4() { + return 0; +} diff --git a/deps/gyp/test/win/shard/shard.gyp b/deps/gyp/test/win/shard/shard.gyp new file mode 100644 index 0000000000..eac45fcff7 --- /dev/null +++ b/deps/gyp/test/win/shard/shard.gyp @@ -0,0 +1,31 @@ +# Copyright (c) 2013 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. + +{ + 'targets': [ + { + 'target_name': 'shard', + 'type': 'static_library', + 'msvs_shard': 4, + 'sources': [ + 'hello1.cc', + 'hello2.cc', + 'hello3.cc', + 'hello4.cc', + ], + 'product_dir': '<(PRODUCT_DIR)', + }, + { + 'target_name': 'refs_to_shard', + 'type': 'executable', + 'dependencies': [ + # Make sure references are correctly updated. + 'shard', + ], + 'sources': [ + 'hello.cc', + ], + }, + ] +} diff --git a/deps/gyp/test/win/shard/shard_ref.gyp b/deps/gyp/test/win/shard/shard_ref.gyp new file mode 100644 index 0000000000..3ec8d76f99 --- /dev/null +++ b/deps/gyp/test/win/shard/shard_ref.gyp @@ -0,0 +1,41 @@ +# Copyright 2014 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. + +{ + 'targets': [ + { + 'target_name': 'refs_to_shard_external_lib', + 'type': 'static_library', + 'dependencies': [ + # Make sure references in other files are updated correctly. + 'shard.gyp:shard', + ], + 'sources': [ + 'hello.cc', + ], + }, + { + 'target_name': 'refs_to_shard_external_exe', + 'type': 'executable', + 'dependencies': [ + # Make sure references in other files are updated correctly. + 'shard.gyp:shard', + ], + 'sources': [ + 'hello.cc', + ], + }, + { + 'target_name': 'refs_to_shard_external_dll', + 'type': 'shared_library', + 'dependencies': [ + # Make sure references in other files are updated correctly. + 'shard.gyp:shard', + ], + 'sources': [ + 'hello.cc', + ], + }, + ] +} diff --git a/deps/gyp/test/win/system-include/bar/header.h b/deps/gyp/test/win/system-include/bar/header.h new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/deps/gyp/test/win/system-include/bar/header.h diff --git a/deps/gyp/test/win/system-include/common/commonheader.h b/deps/gyp/test/win/system-include/common/commonheader.h new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/deps/gyp/test/win/system-include/common/commonheader.h diff --git a/deps/gyp/test/win/system-include/foo/header.h b/deps/gyp/test/win/system-include/foo/header.h new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/deps/gyp/test/win/system-include/foo/header.h diff --git a/deps/gyp/test/win/system-include/main.cc b/deps/gyp/test/win/system-include/main.cc new file mode 100644 index 0000000000..b04ea8a530 --- /dev/null +++ b/deps/gyp/test/win/system-include/main.cc @@ -0,0 +1,4 @@ +#include <commonheader.h> +#include <header.h> + +int main() {} diff --git a/deps/gyp/test/win/system-include/test.gyp b/deps/gyp/test/win/system-include/test.gyp new file mode 100644 index 0000000000..07f2636543 --- /dev/null +++ b/deps/gyp/test/win/system-include/test.gyp @@ -0,0 +1,26 @@ +{ + 'target_defaults': { + 'msvs_settings': { + 'VCCLCompilerTool': { + 'WarningLevel': '4', + 'WarnAsError': 'true', + }, + }, + 'msvs_system_include_dirs': [ + '$(ProjectName)', # Different for each target + 'common', # Same for all targets + ], + }, + 'targets': [ + { + 'target_name': 'foo', + 'type': 'executable', + 'sources': [ 'main.cc', ], + }, + { + 'target_name': 'bar', + 'type': 'executable', + 'sources': [ 'main.cc', ], + }, + ], +} diff --git a/deps/gyp/test/win/uldi/a.cc b/deps/gyp/test/win/uldi/a.cc new file mode 100644 index 0000000000..0fe05d5afb --- /dev/null +++ b/deps/gyp/test/win/uldi/a.cc @@ -0,0 +1,7 @@ +// 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. + +int some_function() { + return 0; +} diff --git a/deps/gyp/test/win/uldi/b.cc b/deps/gyp/test/win/uldi/b.cc new file mode 100644 index 0000000000..0fe05d5afb --- /dev/null +++ b/deps/gyp/test/win/uldi/b.cc @@ -0,0 +1,7 @@ +// 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. + +int some_function() { + return 0; +} diff --git a/deps/gyp/test/win/uldi/dll.cc b/deps/gyp/test/win/uldi/dll.cc new file mode 100644 index 0000000000..93a6c19003 --- /dev/null +++ b/deps/gyp/test/win/uldi/dll.cc @@ -0,0 +1,6 @@ +// Copyright (c) 2015 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. + +__declspec(dllexport) void SomeFunction() { +} diff --git a/deps/gyp/test/win/uldi/exe.cc b/deps/gyp/test/win/uldi/exe.cc new file mode 100644 index 0000000000..b3039ace96 --- /dev/null +++ b/deps/gyp/test/win/uldi/exe.cc @@ -0,0 +1,7 @@ +// Copyright (c) 2015 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. + +int main() { + return 0; +} diff --git a/deps/gyp/test/win/uldi/main.cc b/deps/gyp/test/win/uldi/main.cc new file mode 100644 index 0000000000..81b46d863a --- /dev/null +++ b/deps/gyp/test/win/uldi/main.cc @@ -0,0 +1,10 @@ +// 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. + +extern int some_function(); + +int main() { + some_function(); + return 0; +} diff --git a/deps/gyp/test/win/uldi/uldi-depending-on-module.gyp b/deps/gyp/test/win/uldi/uldi-depending-on-module.gyp new file mode 100644 index 0000000000..3e34de8418 --- /dev/null +++ b/deps/gyp/test/win/uldi/uldi-depending-on-module.gyp @@ -0,0 +1,42 @@ +# Copyright (c) 2015 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. + +{ + 'targets': [ + { + 'target_name': 'an_exe', + 'type': 'executable', + 'sources': ['exe.cc'], + 'dependencies': [ + 'a_dll', + ], + }, + { + 'target_name': 'a_dll', + 'type': 'shared_library', + 'sources': ['dll.cc'], + 'dependencies': [ + 'a_lib', + ], + 'msvs_settings': { + 'VCLinkerTool': { + 'UseLibraryDependencyInputs': 'true' + }, + }, + }, + { + 'target_name': 'a_lib', + 'type': 'static_library', + 'dependencies': [ + 'a_module', + ], + 'sources': ['a.cc'], + }, + { + 'target_name': 'a_module', + 'type': 'loadable_module', + 'sources': ['a.cc'], + }, + ] +} diff --git a/deps/gyp/test/win/uldi/uldi.gyp b/deps/gyp/test/win/uldi/uldi.gyp new file mode 100644 index 0000000000..c32f5e0956 --- /dev/null +++ b/deps/gyp/test/win/uldi/uldi.gyp @@ -0,0 +1,45 @@ +# 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. + +{ + 'targets': [ + { + 'target_name': 'lib1', + 'type': 'static_library', + 'sources': ['a.cc'], + }, + { + 'target_name': 'final_uldi', + 'type': 'executable', + 'dependencies': [ + 'lib1', + 'lib2', + ], + 'msvs_settings': { + 'VCLinkerTool': { + 'UseLibraryDependencyInputs': 'true' + }, + }, + 'sources': ['main.cc'], + }, + { + 'target_name': 'final_no_uldi', + 'type': 'executable', + 'dependencies': [ + 'lib1', + 'lib2', + ], + 'sources': ['main.cc'], + }, + { + 'target_name': 'lib2', + 'type': 'static_library', + # b.cc has the same named function as a.cc, but don't use the same name + # so that the .obj will have a different name. If the obj file has the + # same name, the linker will discard the obj file, invalidating the + # test. + 'sources': ['b.cc'], + }, + ] +} diff --git a/deps/gyp/test/win/vs-macros/as.py b/deps/gyp/test/win/vs-macros/as.py new file mode 100644 index 0000000000..e0bc3ae6f3 --- /dev/null +++ b/deps/gyp/test/win/vs-macros/as.py @@ -0,0 +1,18 @@ +#!/usr/bin/env python + +# 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. + +from optparse import OptionParser + +parser = OptionParser() +parser.add_option('-a', dest='platform') +parser.add_option('-o', dest='output') +parser.add_option('-p', dest='path') +(options, args) = parser.parse_args() + +f = open(options.output, 'w') +print >>f, 'options', options +print >>f, 'args', args +f.close() diff --git a/deps/gyp/test/win/vs-macros/containing-gyp.gyp b/deps/gyp/test/win/vs-macros/containing-gyp.gyp new file mode 100644 index 0000000000..c07b639ff1 --- /dev/null +++ b/deps/gyp/test/win/vs-macros/containing-gyp.gyp @@ -0,0 +1,39 @@ +# 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. + +{ + 'targets': [ + { + 'target_name': 'test_expansions', + 'msvs_cygwin_shell': 0, + 'type': 'none', + 'rules': [ + { + 'rule_name': 'assembler (gnu-compatible)', + 'msvs_cygwin_shell': 0, + 'msvs_quote_cmd': 0, + 'extension': 'S', + 'inputs': [ + 'as.py', + ], + 'outputs': [ + '$(IntDir)/$(InputName).obj', + ], + 'action': + ['python', + 'as.py', + '-a', '$(PlatformName)', + '-o', '$(IntDir)/$(InputName).obj', + '-p', '<(DEPTH)', + '$(InputPath)'], + 'message': 'Building assembly language file $(InputPath)', + 'process_outputs_as_sources': 1, + }, + ], + 'sources': [ + 'input.S', + ], + }, + ] +} diff --git a/deps/gyp/test/win/vs-macros/do_stuff.py b/deps/gyp/test/win/vs-macros/do_stuff.py new file mode 100644 index 0000000000..4669d3139b --- /dev/null +++ b/deps/gyp/test/win/vs-macros/do_stuff.py @@ -0,0 +1,8 @@ +# 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 sys + +input = open(sys.argv[1], "r").read() +open(sys.argv[2], "w").write(input + "Modified.") diff --git a/deps/gyp/test/win/vs-macros/hello.cc b/deps/gyp/test/win/vs-macros/hello.cc new file mode 100644 index 0000000000..1711567ef5 --- /dev/null +++ b/deps/gyp/test/win/vs-macros/hello.cc @@ -0,0 +1,7 @@ +// 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. + +int main() { + return 0; +} diff --git a/deps/gyp/test/win/vs-macros/input-output-macros.gyp b/deps/gyp/test/win/vs-macros/input-output-macros.gyp new file mode 100644 index 0000000000..b4520f8cb8 --- /dev/null +++ b/deps/gyp/test/win/vs-macros/input-output-macros.gyp @@ -0,0 +1,32 @@ +# 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. + +{ + 'targets': [ + { + 'target_name': 'test_expansions', + 'msvs_cygwin_shell': 0, + 'type': 'none', + 'rules': [ + { + 'rule_name': 'generate_file', + 'extension': 'blah', + 'inputs': [ + 'do_stuff.py', + ], + 'outputs': [ + '$(OutDir)\\<(RULE_INPUT_NAME).something', + ], + 'action': ['python', + 'do_stuff.py', + '<(RULE_INPUT_PATH)', + '$(OutDir)\\<(RULE_INPUT_NAME).something',], + }, + ], + 'sources': [ + 'stuff.blah', + ], + }, + ] +} diff --git a/deps/gyp/test/win/vs-macros/input.S b/deps/gyp/test/win/vs-macros/input.S new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/deps/gyp/test/win/vs-macros/input.S diff --git a/deps/gyp/test/win/vs-macros/projectname.gyp b/deps/gyp/test/win/vs-macros/projectname.gyp new file mode 100644 index 0000000000..625a177643 --- /dev/null +++ b/deps/gyp/test/win/vs-macros/projectname.gyp @@ -0,0 +1,29 @@ +# 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. + +{ + 'targets': [ + { + 'target_name': 'test_expansions', + 'type': 'executable', + 'sources': ['hello.cc'], + 'msvs_settings': { + 'VCLinkerTool': { + 'OutputFile': '$(OutDir)\\$(ProjectName)_plus_something.exe', + }, + }, + }, + { + 'target_name': 'test_with_product_name', + 'product_name': 'prod_name', + 'type': 'executable', + 'sources': ['hello.cc'], + 'msvs_settings': { + 'VCLinkerTool': { + 'OutputFile': '$(OutDir)\\$(ProjectName)_plus_something.exe', + }, + }, + }, + ] +} diff --git a/deps/gyp/test/win/vs-macros/stuff.blah b/deps/gyp/test/win/vs-macros/stuff.blah new file mode 100644 index 0000000000..d438b4a787 --- /dev/null +++ b/deps/gyp/test/win/vs-macros/stuff.blah @@ -0,0 +1 @@ +Random data file. diff --git a/deps/gyp/test/win/vs-macros/targetext.gyp b/deps/gyp/test/win/vs-macros/targetext.gyp new file mode 100644 index 0000000000..11f580e4a6 --- /dev/null +++ b/deps/gyp/test/win/vs-macros/targetext.gyp @@ -0,0 +1,59 @@ +# Copyright (c) 2014 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. + +{ + 'targets': [ + { + 'target_name': 'test_targetext_executable', + 'type': 'executable', + 'sources': ['hello.cc'], + 'msvs_settings': { + 'VCLinkerTool': { + 'OutputFile': '$(TargetDir)\\executable$(TargetExt)', + }, + }, + }, + { + 'target_name': 'test_targetext_loadable_module', + 'type': 'loadable_module', + 'sources': ['hello.cc'], + 'msvs_settings': { + 'VCLinkerTool': { + 'OutputFile': '$(TargetDir)\\loadable_module$(TargetExt)', + }, + }, + }, + { + 'target_name': 'test_targetext_shared_library', + 'type': 'shared_library', + 'sources': ['hello.cc'], + 'msvs_settings': { + 'VCLinkerTool': { + 'OutputFile': '$(TargetDir)\\shared_library$(TargetExt)', + }, + }, + }, + { + 'target_name': 'test_targetext_static_library', + 'type': 'static_library', + 'sources': ['hello.cc'], + 'msvs_settings': { + 'VCLibrarianTool': { + 'OutputFile': '$(TargetDir)\\static_library$(TargetExt)', + }, + }, + }, + { + 'target_name': 'test_targetext_product_extension', + 'type': 'executable', + 'sources': ['hello.cc'], + 'product_extension': 'library', + 'msvs_settings': { + 'VCLinkerTool': { + 'OutputFile': '$(TargetDir)\\product_extension$(TargetExt)', + }, + }, + }, + ] +} diff --git a/deps/gyp/test/win/vs-macros/targetfilename.gyp b/deps/gyp/test/win/vs-macros/targetfilename.gyp new file mode 100644 index 0000000000..8287320278 --- /dev/null +++ b/deps/gyp/test/win/vs-macros/targetfilename.gyp @@ -0,0 +1,59 @@ +# Copyright (c) 2014 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. + +{ + 'targets': [ + { + 'target_name': 'test_targetfilename_executable', + 'type': 'executable', + 'sources': ['hello.cc'], + 'msvs_settings': { + 'VCLinkerTool': { + 'OutputFile': '$(TargetDir)\\$(TargetFileName)', + }, + }, + }, + { + 'target_name': 'test_targetfilename_loadable_module', + 'type': 'loadable_module', + 'sources': ['hello.cc'], + 'msvs_settings': { + 'VCLinkerTool': { + 'OutputFile': '$(TargetDir)\\$(TargetFileName)', + }, + }, + }, + { + 'target_name': 'test_targetfilename_shared_library', + 'type': 'loadable_module', + 'sources': ['hello.cc'], + 'msvs_settings': { + 'VCLinkerTool': { + 'OutputFile': '$(TargetDir)\\$(TargetFileName)', + }, + }, + }, + { + 'target_name': 'test_targetfilename_static_library', + 'type': 'static_library', + 'sources': ['hello.cc'], + 'msvs_settings': { + 'VCLibrarianTool': { + 'OutputFile': '$(TargetDir)\\$(TargetFileName)', + }, + }, + }, + { + 'target_name': 'test_targetfilename_product_extension', + 'type': 'executable', + 'sources': ['hello.cc'], + 'product_extension': 'foo', + 'msvs_settings': { + 'VCLinkerTool': { + 'OutputFile': '$(TargetDir)\\$(TargetFileName)', + }, + }, + }, + ] +} diff --git a/deps/gyp/test/win/vs-macros/targetname.gyp b/deps/gyp/test/win/vs-macros/targetname.gyp new file mode 100644 index 0000000000..a53d3c0aa3 --- /dev/null +++ b/deps/gyp/test/win/vs-macros/targetname.gyp @@ -0,0 +1,52 @@ +# Copyright (c) 2013 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. + +{ + 'targets': [ + { + 'target_name': 'test_targetname', + 'type': 'executable', + 'sources': ['hello.cc'], + 'msvs_settings': { + 'VCLinkerTool': { + 'OutputFile': '$(TargetDir)\\$(TargetName)_plus_something1.exe', + }, + }, + }, + { + 'target_name': 'test_targetname_with_prefix', + 'product_prefix': 'prod_prefix', + 'type': 'executable', + 'sources': ['hello.cc'], + 'msvs_settings': { + 'VCLinkerTool': { + 'OutputFile': '$(TargetDir)\\$(TargetName)_plus_something2.exe', + }, + }, + }, + { + 'target_name': 'test_targetname_with_prodname', + 'product_name': 'prod_name', + 'type': 'executable', + 'sources': ['hello.cc'], + 'msvs_settings': { + 'VCLinkerTool': { + 'OutputFile': '$(TargetDir)\\$(TargetName)_plus_something3.exe', + }, + }, + }, + { + 'target_name': 'test_targetname_with_prodname_with_prefix', + 'product_name': 'prod_name', + 'product_prefix': 'prod_prefix', + 'type': 'executable', + 'sources': ['hello.cc'], + 'msvs_settings': { + 'VCLinkerTool': { + 'OutputFile': '$(TargetDir)\\$(TargetName)_plus_something4.exe', + }, + }, + }, + ] +} diff --git a/deps/gyp/test/win/vs-macros/targetpath.gyp b/deps/gyp/test/win/vs-macros/targetpath.gyp new file mode 100644 index 0000000000..a8699ffb25 --- /dev/null +++ b/deps/gyp/test/win/vs-macros/targetpath.gyp @@ -0,0 +1,59 @@ +# Copyright (c) 2014 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. + +{ + 'targets': [ + { + 'target_name': 'test_targetpath_executable', + 'type': 'executable', + 'sources': ['hello.cc'], + 'msvs_settings': { + 'VCLinkerTool': { + 'OutputFile': '$(TargetPath)', + }, + }, + }, + { + 'target_name': 'test_targetpath_loadable_module', + 'type': 'loadable_module', + 'sources': ['hello.cc'], + 'msvs_settings': { + 'VCLinkerTool': { + 'OutputFile': '$(TargetPath)', + }, + }, + }, + { + 'target_name': 'test_targetpath_shared_library', + 'type': 'loadable_module', + 'sources': ['hello.cc'], + 'msvs_settings': { + 'VCLinkerTool': { + 'OutputFile': '$(TargetPath)', + }, + }, + }, + { + 'target_name': 'test_targetpath_static_library', + 'type': 'static_library', + 'sources': ['hello.cc'], + 'msvs_settings': { + 'VCLibrarianTool': { + 'OutputFile': '$(TargetPath)', + }, + }, + }, + { + 'target_name': 'test_targetpath_product_extension', + 'type': 'executable', + 'sources': ['hello.cc'], + 'product_extension': 'foo', + 'msvs_settings': { + 'VCLinkerTool': { + 'OutputFile': '$(TargetPath)', + }, + }, + }, + ] +} diff --git a/deps/gyp/test/win/vs-macros/test_exists.py b/deps/gyp/test/win/vs-macros/test_exists.py new file mode 100644 index 0000000000..f5c90ad6f2 --- /dev/null +++ b/deps/gyp/test/win/vs-macros/test_exists.py @@ -0,0 +1,10 @@ +# 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 os +import sys + +if not os.path.exists(sys.argv[1]): + raise +open(sys.argv[2], 'w').close() diff --git a/deps/gyp/test/win/vs-macros/vcinstalldir.gyp b/deps/gyp/test/win/vs-macros/vcinstalldir.gyp new file mode 100644 index 0000000000..3763a4eb18 --- /dev/null +++ b/deps/gyp/test/win/vs-macros/vcinstalldir.gyp @@ -0,0 +1,41 @@ +# 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. + +{ + 'targets': [ + { + 'target_name': 'test_slash_trailing', + 'type': 'none', + 'msvs_cygwin_shell': '0', + 'actions': [ + { + 'action_name': 'root', + 'inputs': [], + 'outputs': ['out1'], + 'action': ['python', 'test_exists.py', '$(VCInstallDir)', 'out1'] + }, + ], + }, + { + 'target_name': 'test_slash_dir', + 'type': 'none', + 'msvs_cygwin_shell': '0', + 'actions': [ + { + 'action_name': 'bin', + 'inputs': [], + 'outputs': ['out2'], + 'action': ['python', 'test_exists.py', '$(VCInstallDir)bin', 'out2'], + }, + { + 'action_name': 'compiler', + 'inputs': [], + 'outputs': ['out3'], + 'action': [ + 'python', 'test_exists.py', '$(VCInstallDir)bin\\cl.exe', 'out3'], + }, + ], + }, + ] +} diff --git a/deps/gyp/test/win/win-tool/copies_readonly_files.gyp b/deps/gyp/test/win/win-tool/copies_readonly_files.gyp new file mode 100644 index 0000000000..3cd7e69f1a --- /dev/null +++ b/deps/gyp/test/win/win-tool/copies_readonly_files.gyp @@ -0,0 +1,29 @@ +{ + 'targets': [ + { + 'target_name': 'foo', + 'type': 'none', + 'copies': [ + { + 'destination': '<(PRODUCT_DIR)/dest', + 'files': [ + 'read-only-file', + ], + }, + ], + }, # target: foo + + { + 'target_name': 'bar', + 'type': 'none', + 'copies': [ + { + 'destination': '<(PRODUCT_DIR)/dest', + 'files': [ + 'subdir/', + ], + }, + ], + }, # target: bar + ], +} diff --git a/deps/gyp/test/win/win-tool/gyptest-win-tool-handles-readonly-files.py b/deps/gyp/test/win/win-tool/gyptest-win-tool-handles-readonly-files.py new file mode 100644 index 0000000000..951b952775 --- /dev/null +++ b/deps/gyp/test/win/win-tool/gyptest-win-tool-handles-readonly-files.py @@ -0,0 +1,55 @@ +#!/usr/bin/env python + +# Copyright (c) 2014 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. + +""" +Make sure overwriting read-only files works as expected (via win-tool). +""" + +import TestGyp + +import filecmp +import os +import stat +import sys + +if sys.platform == 'win32': + test = TestGyp.TestGyp(formats=['ninja']) + + # First, create the source files. + os.makedirs('subdir') + read_only_files = ['read-only-file', 'subdir/A', 'subdir/B', 'subdir/C'] + for f in read_only_files: + test.write(f, 'source_contents') + test.chmod(f, stat.S_IREAD) + if os.access(f, os.W_OK): + test.fail_test() + + # Second, create the read-only destination files. Note that we are creating + # them where the ninja and win-tool will try to copy them to, in order to test + # that copies overwrite the files. + os.makedirs(test.built_file_path('dest/subdir')) + for f in read_only_files: + f = os.path.join('dest', f) + test.write(test.built_file_path(f), 'SHOULD BE OVERWRITTEN') + test.chmod(test.built_file_path(f), stat.S_IREAD) + # Ensure not writable. + if os.access(test.built_file_path(f), os.W_OK): + test.fail_test() + + test.run_gyp('copies_readonly_files.gyp') + test.build('copies_readonly_files.gyp') + + # Check the destination files were overwritten by ninja. + for f in read_only_files: + f = os.path.join('dest', f) + test.must_contain(test.built_file_path(f), 'source_contents') + + # This will fail if the files are not the same mode or contents. + for f in read_only_files: + if not filecmp.cmp(f, test.built_file_path(os.path.join('dest', f))): + test.fail_test() + + test.pass_test() diff --git a/deps/gyp/test/win/winrt-app-type-revision/dllmain.cc b/deps/gyp/test/win/winrt-app-type-revision/dllmain.cc new file mode 100644 index 0000000000..dedd83c3f6 --- /dev/null +++ b/deps/gyp/test/win/winrt-app-type-revision/dllmain.cc @@ -0,0 +1,30 @@ +// Copyright (c) 2013 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. + +#include <windows.h> +#include <wrl.h> +#include <wrl/wrappers/corewrappers.h> +#include <windows.graphics.display.h> + +using namespace Microsoft::WRL; +using namespace Microsoft::WRL::Wrappers; +using namespace ABI::Windows::Foundation; +using namespace ABI::Windows::Graphics::Display; + +bool TryToUseSomeWinRT() { + ComPtr<IDisplayPropertiesStatics> dp; + HStringReference s(RuntimeClass_Windows_Graphics_Display_DisplayProperties); + HRESULT hr = GetActivationFactory(s.Get(), dp.GetAddressOf()); + if (SUCCEEDED(hr)) { + float dpi = 96.0f; + if (SUCCEEDED(dp->get_LogicalDpi(&dpi))) { + return true; + } + } + return false; +} + +BOOL WINAPI DllMain(HINSTANCE hinstance, DWORD reason, LPVOID reserved) { + return TRUE; +} diff --git a/deps/gyp/test/win/winrt-app-type-revision/winrt-app-type-revison.gyp b/deps/gyp/test/win/winrt-app-type-revision/winrt-app-type-revison.gyp new file mode 100644 index 0000000000..5f37b5a2ab --- /dev/null +++ b/deps/gyp/test/win/winrt-app-type-revision/winrt-app-type-revison.gyp @@ -0,0 +1,43 @@ +# Copyright (c) 2013 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. + +{ + 'targets': [ + { + 'target_name': 'enable_winrt_81_revision_dll', + 'type': 'shared_library', + 'msvs_enable_winrt': 1, + 'msvs_application_type_revision': '8.1' + 'sources': [ + 'dllmain.cc', + ], + }, + { + 'target_name': 'enable_winrt_82_revision_dll', + 'type': 'shared_library', + 'msvs_enable_winrt': 1, + 'msvs_application_type_revision': '8.2' + 'sources': [ + 'dllmain.cc', + ], + }, + { + 'target_name': 'enable_winrt_invalid_revision_dll', + 'type': 'shared_library', + 'msvs_enable_winrt': 1, + 'msvs_application_type_revision': '999' + 'sources': [ + 'dllmain.cc', + ], + }, + 'msvs_settings': { + 'VCLinkerTool': { + 'AdditionalDependencies': [ + '%(AdditionalDependencies)', + ], + }, + }, + }, + ] +} diff --git a/deps/gyp/test/win/winrt-target-platform-version/dllmain.cc b/deps/gyp/test/win/winrt-target-platform-version/dllmain.cc new file mode 100644 index 0000000000..d71460c924 --- /dev/null +++ b/deps/gyp/test/win/winrt-target-platform-version/dllmain.cc @@ -0,0 +1,30 @@ +// Copyright (c) 2015 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. + +#include <windows.h> +#include <wrl.h> +#include <wrl/wrappers/corewrappers.h> +#include <windows.graphics.display.h> + +using namespace Microsoft::WRL; +using namespace Microsoft::WRL::Wrappers; +using namespace ABI::Windows::Foundation; +using namespace ABI::Windows::Graphics::Display; + +bool TryToUseSomeWinRT() { + ComPtr<IDisplayPropertiesStatics> dp; + HStringReference s(RuntimeClass_Windows_Graphics_Display_DisplayProperties); + HRESULT hr = GetActivationFactory(s.Get(), dp.GetAddressOf()); + if (SUCCEEDED(hr)) { + float dpi = 96.0f; + if (SUCCEEDED(dp->get_LogicalDpi(&dpi))) { + return true; + } + } + return false; +} + +BOOL WINAPI DllMain(HINSTANCE hinstance, DWORD reason, LPVOID reserved) { + return TRUE; +} diff --git a/deps/gyp/test/win/winrt-target-platform-version/winrt-target-platform-version.gyp b/deps/gyp/test/win/winrt-target-platform-version/winrt-target-platform-version.gyp new file mode 100644 index 0000000000..dbcfac6962 --- /dev/null +++ b/deps/gyp/test/win/winrt-target-platform-version/winrt-target-platform-version.gyp @@ -0,0 +1,49 @@ +# Copyright (c) 2015 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. + +{ + 'targets': [ + { + 'target_name': 'enable_winrt_10_platversion_dll', + 'type': 'shared_library', + 'msvs_enable_winrt': 1, + 'msvs_application_type_revision': '10.0', + 'msvs_target_platform_version':'10.0.10240.0', + 'msvs_target_platform_minversion':'10.0.10240.0' + 'sources': [ + 'dllmain.cc', + ], + }, + { + 'target_name': 'enable_winrt_10_platversion_nominver_dll', + 'type': 'shared_library', + 'msvs_enable_winrt': 1, + 'msvs_application_type_revision': '10.0', + 'msvs_target_platform_version':'10.0.10240.0', + 'sources': [ + 'dllmain.cc', + ], + }, + { + 'target_name': 'enable_winrt_9_platversion_dll', + 'type': 'shared_library', + 'msvs_enable_winrt': 1, + 'msvs_application_type_revision': '10.0', + 'msvs_target_platform_version':'9.0.0.0', + 'msvs_target_platform_minversion':'9.0.0.0' + 'sources': [ + 'dllmain.cc', + ], + }, + { + 'target_name': 'enable_winrt_missing_platversion_dll', + 'type': 'shared_library', + 'msvs_enable_winrt': 1, + 'msvs_application_type_revision': '10.0', + 'sources': [ + 'dllmain.cc', + ], + }, + ] +} diff --git a/deps/gyp/tools/README b/deps/gyp/tools/README new file mode 100644 index 0000000000..712e4efbb7 --- /dev/null +++ b/deps/gyp/tools/README @@ -0,0 +1,15 @@ +pretty_vcproj: + Usage: pretty_vcproj.py "c:\path\to\vcproj.vcproj" [key1=value1] [key2=value2] + + They key/value pair are used to resolve vsprops name. + + For example, if I want to diff the base.vcproj project: + + pretty_vcproj.py z:\dev\src-chrome\src\base\build\base.vcproj "$(SolutionDir)=z:\dev\src-chrome\src\chrome\\" "$(CHROMIUM_BUILD)=" "$(CHROME_BUILD_TYPE)=" > orignal.txt + pretty_vcproj.py z:\dev\src-chrome\src\base\base_gyp.vcproj "$(SolutionDir)=z:\dev\src-chrome\src\chrome\\" "$(CHROMIUM_BUILD)=" "$(CHROME_BUILD_TYPE)=" > gyp.txt + + And you can use your favorite diff tool to see the changes. + + Note: In the case of base.vcproj, the original vcproj is one level up the generated one. + I suggest you do a search and replace for '"..\' and replace it with '"' in original.txt + before you perform the diff.
\ No newline at end of file diff --git a/deps/gyp/tools/Xcode/README b/deps/gyp/tools/Xcode/README new file mode 100644 index 0000000000..2492a2c2f8 --- /dev/null +++ b/deps/gyp/tools/Xcode/README @@ -0,0 +1,5 @@ +Specifications contains syntax formatters for Xcode 3. These do not appear to be supported yet on Xcode 4. To use these with Xcode 3 please install both the gyp.pbfilespec and gyp.xclangspec files in + +~/Library/Application Support/Developer/Shared/Xcode/Specifications/ + +and restart Xcode.
\ No newline at end of file diff --git a/deps/gyp/tools/Xcode/Specifications/gyp.pbfilespec b/deps/gyp/tools/Xcode/Specifications/gyp.pbfilespec new file mode 100644 index 0000000000..85e2e268a5 --- /dev/null +++ b/deps/gyp/tools/Xcode/Specifications/gyp.pbfilespec @@ -0,0 +1,27 @@ +/* + gyp.pbfilespec + GYP source file spec for Xcode 3 + + There is not much documentation available regarding the format + of .pbfilespec files. As a starting point, see for instance the + outdated documentation at: + http://maxao.free.fr/xcode-plugin-interface/specifications.html + and the files in: + /Developer/Library/PrivateFrameworks/XcodeEdit.framework/Versions/A/Resources/ + + Place this file in directory: + ~/Library/Application Support/Developer/Shared/Xcode/Specifications/ +*/ + +( + { + Identifier = sourcecode.gyp; + BasedOn = sourcecode; + Name = "GYP Files"; + Extensions = ("gyp", "gypi"); + MIMETypes = ("text/gyp"); + Language = "xcode.lang.gyp"; + IsTextFile = YES; + IsSourceFile = YES; + } +) diff --git a/deps/gyp/tools/Xcode/Specifications/gyp.xclangspec b/deps/gyp/tools/Xcode/Specifications/gyp.xclangspec new file mode 100644 index 0000000000..3b3506d319 --- /dev/null +++ b/deps/gyp/tools/Xcode/Specifications/gyp.xclangspec @@ -0,0 +1,226 @@ +/* + Copyright (c) 2011 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. + + gyp.xclangspec + GYP language specification for Xcode 3 + + There is not much documentation available regarding the format + of .xclangspec files. As a starting point, see for instance the + outdated documentation at: + http://maxao.free.fr/xcode-plugin-interface/specifications.html + and the files in: + /Developer/Library/PrivateFrameworks/XcodeEdit.framework/Versions/A/Resources/ + + Place this file in directory: + ~/Library/Application Support/Developer/Shared/Xcode/Specifications/ +*/ + +( + + { + Identifier = "xcode.lang.gyp.keyword"; + Syntax = { + Words = ( + "and", + "or", + "<!", + "<", + ); + Type = "xcode.syntax.keyword"; + }; + }, + + { + Identifier = "xcode.lang.gyp.target.declarator"; + Syntax = { + Words = ( + "'target_name'", + ); + Type = "xcode.syntax.identifier.type"; + }; + }, + + { + Identifier = "xcode.lang.gyp.string.singlequote"; + Syntax = { + IncludeRules = ( + "xcode.lang.string", + "xcode.lang.gyp.keyword", + "xcode.lang.number", + ); + Start = "'"; + End = "'"; + }; + }, + + { + Identifier = "xcode.lang.gyp.comma"; + Syntax = { + Words = ( ",", ); + + }; + }, + + { + Identifier = "xcode.lang.gyp"; + Description = "GYP Coloring"; + BasedOn = "xcode.lang.simpleColoring"; + IncludeInMenu = YES; + Name = "GYP"; + Syntax = { + Tokenizer = "xcode.lang.gyp.lexer.toplevel"; + IncludeRules = ( + "xcode.lang.gyp.dictionary", + ); + Type = "xcode.syntax.plain"; + }; + }, + + // The following rule returns tokens to the other rules + { + Identifier = "xcode.lang.gyp.lexer"; + Syntax = { + IncludeRules = ( + "xcode.lang.gyp.comment", + "xcode.lang.string", + 'xcode.lang.gyp.targetname.declarator', + "xcode.lang.gyp.string.singlequote", + "xcode.lang.number", + "xcode.lang.gyp.comma", + ); + }; + }, + + { + Identifier = "xcode.lang.gyp.lexer.toplevel"; + Syntax = { + IncludeRules = ( + "xcode.lang.gyp.comment", + ); + }; + }, + + { + Identifier = "xcode.lang.gyp.assignment"; + Syntax = { + Tokenizer = "xcode.lang.gyp.lexer"; + Rules = ( + "xcode.lang.gyp.assignment.lhs", + ":", + "xcode.lang.gyp.assignment.rhs", + ); + }; + + }, + + { + Identifier = "xcode.lang.gyp.target.declaration"; + Syntax = { + Tokenizer = "xcode.lang.gyp.lexer"; + Rules = ( + "xcode.lang.gyp.target.declarator", + ":", + "xcode.lang.gyp.target.name", + ); + }; + }, + + { + Identifier = "xcode.lang.gyp.target.name"; + Syntax = { + Tokenizer = "xcode.lang.gyp.lexer"; + Rules = ( + "xcode.lang.gyp.string.singlequote", + ); + Type = "xcode.syntax.definition.function"; + }; + }, + + { + Identifier = "xcode.lang.gyp.assignment.lhs"; + Syntax = { + Tokenizer = "xcode.lang.gyp.lexer"; + Rules = ( + "xcode.lang.gyp.string.singlequote", + ); + Type = "xcode.syntax.identifier.type"; + }; + }, + + { + Identifier = "xcode.lang.gyp.assignment.rhs"; + Syntax = { + Tokenizer = "xcode.lang.gyp.lexer"; + Rules = ( + "xcode.lang.gyp.string.singlequote?", + "xcode.lang.gyp.array?", + "xcode.lang.gyp.dictionary?", + "xcode.lang.number?", + ); + }; + }, + + { + Identifier = "xcode.lang.gyp.dictionary"; + Syntax = { + Tokenizer = "xcode.lang.gyp.lexer"; + Start = "{"; + End = "}"; + Foldable = YES; + Recursive = YES; + IncludeRules = ( + "xcode.lang.gyp.target.declaration", + "xcode.lang.gyp.assignment", + ); + }; + }, + + { + Identifier = "xcode.lang.gyp.array"; + Syntax = { + Tokenizer = "xcode.lang.gyp.lexer"; + Start = "["; + End = "]"; + Foldable = YES; + Recursive = YES; + IncludeRules = ( + "xcode.lang.gyp.array", + "xcode.lang.gyp.dictionary", + "xcode.lang.gyp.string.singlequote", + ); + }; + }, + + { + Identifier = "xcode.lang.gyp.todo.mark"; + Syntax = { + StartChars = "T"; + Match = ( + "^\(TODO\(.*\):[ \t]+.*\)$", // include "TODO: " in the markers list + ); + // This is the order of captures. All of the match strings above need the same order. + CaptureTypes = ( + "xcode.syntax.mark" + ); + Type = "xcode.syntax.comment"; + }; + }, + + { + Identifier = "xcode.lang.gyp.comment"; + BasedOn = "xcode.lang.comment"; // for text macros + Syntax = { + Start = "#"; + End = "\n"; + IncludeRules = ( + "xcode.lang.url", + "xcode.lang.url.mail", + "xcode.lang.comment.mark", + "xcode.lang.gyp.todo.mark", + ); + Type = "xcode.syntax.comment"; + }; + }, +) diff --git a/deps/gyp/tools/emacs/README b/deps/gyp/tools/emacs/README new file mode 100644 index 0000000000..eeef39f41b --- /dev/null +++ b/deps/gyp/tools/emacs/README @@ -0,0 +1,12 @@ +How to install gyp-mode for emacs: + +Add the following to your ~/.emacs (replace ... with the path to your gyp +checkout). + +(setq load-path (cons ".../tools/emacs" load-path)) +(require 'gyp) + +Restart emacs (or eval-region the added lines) and you should be all set. + +Please note that ert is required for running the tests, which is included in +Emacs 24, or available separately from https://github.com/ohler/ert diff --git a/deps/gyp/tools/emacs/gyp-tests.el b/deps/gyp/tools/emacs/gyp-tests.el new file mode 100644 index 0000000000..11b8497886 --- /dev/null +++ b/deps/gyp/tools/emacs/gyp-tests.el @@ -0,0 +1,63 @@ +;;; gyp-tests.el - unit tests for gyp-mode. + +;; 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. + +;; The recommended way to run these tests is to run them from the command-line, +;; with the run-unit-tests.sh script. + +(require 'cl) +(require 'ert) +(require 'gyp) + +(defconst samples (directory-files "testdata" t ".gyp$") + "List of golden samples to check") + +(defun fontify (filename) + (with-temp-buffer + (insert-file-contents-literally filename) + (gyp-mode) + (font-lock-fontify-buffer) + (buffer-string))) + +(defun read-golden-sample (filename) + (with-temp-buffer + (insert-file-contents-literally (concat filename ".fontified")) + (read (current-buffer)))) + +(defun equivalent-face (face) + "For the purposes of face comparison, we're not interested in the + differences between certain faces. For example, the difference between + font-lock-comment-delimiter and font-lock-comment-face." + (case face + ((font-lock-comment-delimiter-face) font-lock-comment-face) + (t face))) + +(defun text-face-properties (s) + "Extract the text properties from s" + (let ((result (list t))) + (dotimes (i (length s)) + (setq result (cons (equivalent-face (get-text-property i 'face s)) + result))) + (nreverse result))) + +(ert-deftest test-golden-samples () + "Check that fontification produces the same results as the golden samples" + (dolist (sample samples) + (let ((golden (read-golden-sample sample)) + (fontified (fontify sample))) + (should (equal golden fontified)) + (should (equal (text-face-properties golden) + (text-face-properties fontified)))))) + +(defun create-golden-sample (filename) + "Create a golden sample by fontifying filename and writing out the printable + representation of the fontified buffer (with text properties) to the + FILENAME.fontified" + (with-temp-file (concat filename ".fontified") + (print (fontify filename) (current-buffer)))) + +(defun create-golden-samples () + "Recreate the golden samples" + (dolist (sample samples) (create-golden-sample sample))) diff --git a/deps/gyp/tools/emacs/gyp.el b/deps/gyp/tools/emacs/gyp.el new file mode 100644 index 0000000000..b98b155ced --- /dev/null +++ b/deps/gyp/tools/emacs/gyp.el @@ -0,0 +1,275 @@ +;;; gyp.el - font-lock-mode support for gyp files. + +;; 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. + +;; Put this somewhere in your load-path and +;; (require 'gyp) + +(require 'python) +(require 'cl) + +(when (string-match "python-mode.el" (symbol-file 'python-mode 'defun)) + (error (concat "python-mode must be loaded from python.el (bundled with " + "recent emacsen), not from the older and less maintained " + "python-mode.el"))) + +(defadvice python-indent-calculate-levels (after gyp-outdent-closing-parens + activate) + "De-indent closing parens, braces, and brackets in gyp-mode." + (when (and (eq major-mode 'gyp-mode) + (string-match "^ *[])}][],)}]* *$" + (buffer-substring-no-properties + (line-beginning-position) (line-end-position)))) + (setf (first python-indent-levels) + (- (first python-indent-levels) python-continuation-offset)))) + +(defadvice python-indent-guess-indent-offset (around + gyp-indent-guess-indent-offset + activate) + "Guess correct indent offset in gyp-mode." + (or (and (not (eq major-mode 'gyp-mode)) + ad-do-it) + (save-excursion + (save-restriction + (widen) + (goto-char (point-min)) + ;; Find first line ending with an opening brace that is not a comment. + (or (and (re-search-forward "\\(^[[{]$\\|^.*[^#].*[[{]$\\)") + (forward-line) + (/= (current-indentation) 0) + (set (make-local-variable 'python-indent-offset) + (current-indentation)) + (set (make-local-variable 'python-continuation-offset) + (current-indentation))) + (message "Can't guess gyp indent offset, using default: %s" + python-continuation-offset)))))) + +(define-derived-mode gyp-mode python-mode "Gyp" + "Major mode for editing .gyp files. See http://code.google.com/p/gyp/" + ;; gyp-parse-history is a stack of (POSITION . PARSE-STATE) tuples, + ;; with greater positions at the top of the stack. PARSE-STATE + ;; is a list of section symbols (see gyp-section-name and gyp-parse-to) + ;; with most nested section symbol at the front of the list. + (set (make-local-variable 'gyp-parse-history) '((1 . (list)))) + (gyp-add-font-lock-keywords)) + +(defun gyp-set-indentation () + "Hook function to configure python indentation to suit gyp mode." + (set (make-local-variable 'python-indent-offset) 2) + (set (make-local-variable 'python-continuation-offset) 2) + (set (make-local-variable 'python-indent-guess-indent-offset) t) + (python-indent-guess-indent-offset)) + +(add-hook 'gyp-mode-hook 'gyp-set-indentation) + +(add-to-list 'auto-mode-alist '("\\.gyp\\'" . gyp-mode)) +(add-to-list 'auto-mode-alist '("\\.gypi\\'" . gyp-mode)) +(add-to-list 'auto-mode-alist '("/\\.gclient\\'" . gyp-mode)) + +;;; Font-lock support + +(defconst gyp-dependencies-regexp + (regexp-opt (list "dependencies" "export_dependent_settings")) + "Regular expression to introduce 'dependencies' section") + +(defconst gyp-sources-regexp + (regexp-opt (list "action" "files" "include_dirs" "includes" "inputs" + "libraries" "outputs" "sources")) + "Regular expression to introduce 'sources' sections") + +(defconst gyp-conditions-regexp + (regexp-opt (list "conditions" "target_conditions")) + "Regular expression to introduce conditions sections") + +(defconst gyp-variables-regexp + "^variables" + "Regular expression to introduce variables sections") + +(defconst gyp-defines-regexp + "^defines" + "Regular expression to introduce 'defines' sections") + +(defconst gyp-targets-regexp + "^targets" + "Regular expression to introduce 'targets' sections") + +(defun gyp-section-name (section) + "Map the sections we are interested in from SECTION to symbol. + + SECTION is a string from the buffer that introduces a section. The result is + a symbol representing the kind of section. + + This allows us to treat (for the purposes of font-lock) several different + section names as the same kind of section. For example, a 'sources section + can be introduced by the 'sources', 'inputs', 'outputs' keyword. + + 'other is the default section kind when a more specific match is not made." + (cond ((string-match-p gyp-dependencies-regexp section) 'dependencies) + ((string-match-p gyp-sources-regexp section) 'sources) + ((string-match-p gyp-variables-regexp section) 'variables) + ((string-match-p gyp-conditions-regexp section) 'conditions) + ((string-match-p gyp-targets-regexp section) 'targets) + ((string-match-p gyp-defines-regexp section) 'defines) + (t 'other))) + +(defun gyp-invalidate-parse-states-after (target-point) + "Erase any parse information after target-point." + (while (> (caar gyp-parse-history) target-point) + (setq gyp-parse-history (cdr gyp-parse-history)))) + +(defun gyp-parse-point () + "The point of the last parse state added by gyp-parse-to." + (caar gyp-parse-history)) + +(defun gyp-parse-sections () + "A list of section symbols holding at the last parse state point." + (cdar gyp-parse-history)) + +(defun gyp-inside-dictionary-p () + "Predicate returning true if the parser is inside a dictionary." + (not (eq (cadar gyp-parse-history) 'list))) + +(defun gyp-add-parse-history (point sections) + "Add parse state SECTIONS to the parse history at POINT so that parsing can be + resumed instantly." + (while (>= (caar gyp-parse-history) point) + (setq gyp-parse-history (cdr gyp-parse-history))) + (setq gyp-parse-history (cons (cons point sections) gyp-parse-history))) + +(defun gyp-parse-to (target-point) + "Parses from (point) to TARGET-POINT adding the parse state information to + gyp-parse-state-history. Parsing stops if TARGET-POINT is reached or if a + string literal has been parsed. Returns nil if no further parsing can be + done, otherwise returns the position of the start of a parsed string, leaving + the point at the end of the string." + (let ((parsing t) + string-start) + (while parsing + (setq string-start nil) + ;; Parse up to a character that starts a sexp, or if the nesting + ;; level decreases. + (let ((state (parse-partial-sexp (gyp-parse-point) + target-point + -1 + t)) + (sections (gyp-parse-sections))) + (if (= (nth 0 state) -1) + (setq sections (cdr sections)) ; pop out a level + (cond ((looking-at-p "['\"]") ; a string + (setq string-start (point)) + (goto-char (scan-sexps (point) 1)) + (if (gyp-inside-dictionary-p) + ;; Look for sections inside a dictionary + (let ((section (gyp-section-name + (buffer-substring-no-properties + (+ 1 string-start) + (- (point) 1))))) + (setq sections (cons section (cdr sections))))) + ;; Stop after the string so it can be fontified. + (setq target-point (point))) + ((looking-at-p "{") + ;; Inside a dictionary. Increase nesting. + (forward-char 1) + (setq sections (cons 'unknown sections))) + ((looking-at-p "\\[") + ;; Inside a list. Increase nesting + (forward-char 1) + (setq sections (cons 'list sections))) + ((not (eobp)) + ;; other + (forward-char 1)))) + (gyp-add-parse-history (point) sections) + (setq parsing (< (point) target-point)))) + string-start)) + +(defun gyp-section-at-point () + "Transform the last parse state, which is a list of nested sections and return + the section symbol that should be used to determine font-lock information for + the string. Can return nil indicating the string should not have any attached + section." + (let ((sections (gyp-parse-sections))) + (cond + ((eq (car sections) 'conditions) + ;; conditions can occur in a variables section, but we still want to + ;; highlight it as a keyword. + nil) + ((and (eq (car sections) 'list) + (eq (cadr sections) 'list)) + ;; conditions and sources can have items in [[ ]] + (caddr sections)) + (t (cadr sections))))) + +(defun gyp-section-match (limit) + "Parse from (point) to LIMIT returning by means of match data what was + matched. The group of the match indicates what style font-lock should apply. + See also `gyp-add-font-lock-keywords'." + (gyp-invalidate-parse-states-after (point)) + (let ((group nil) + (string-start t)) + (while (and (< (point) limit) + (not group) + string-start) + (setq string-start (gyp-parse-to limit)) + (if string-start + (setq group (case (gyp-section-at-point) + ('dependencies 1) + ('variables 2) + ('conditions 2) + ('sources 3) + ('defines 4) + (nil nil))))) + (if group + (progn + ;; Set the match data to indicate to the font-lock mechanism the + ;; highlighting to be performed. + (set-match-data (append (list string-start (point)) + (make-list (* (1- group) 2) nil) + (list (1+ string-start) (1- (point))))) + t)))) + +;;; Please see http://code.google.com/p/gyp/wiki/GypLanguageSpecification for +;;; canonical list of keywords. +(defun gyp-add-font-lock-keywords () + "Add gyp-mode keywords to font-lock mechanism." + ;; TODO(jknotten): Move all the keyword highlighting into gyp-section-match + ;; so that we can do the font-locking in a single font-lock pass. + (font-lock-add-keywords + nil + (list + ;; Top-level keywords + (list (concat "['\"]\\(" + (regexp-opt (list "action" "action_name" "actions" "cflags" + "cflags_cc" "conditions" "configurations" + "copies" "defines" "dependencies" "destination" + "direct_dependent_settings" + "export_dependent_settings" "extension" "files" + "include_dirs" "includes" "inputs" "ldflags" "libraries" + "link_settings" "mac_bundle" "message" + "msvs_external_rule" "outputs" "product_name" + "process_outputs_as_sources" "rules" "rule_name" + "sources" "suppress_wildcard" + "target_conditions" "target_defaults" + "target_defines" "target_name" "toolsets" + "targets" "type" "variables" "xcode_settings")) + "[!/+=]?\\)") 1 'font-lock-keyword-face t) + ;; Type of target + (list (concat "['\"]\\(" + (regexp-opt (list "loadable_module" "static_library" + "shared_library" "executable" "none")) + "\\)") 1 'font-lock-type-face t) + (list "\\(?:target\\|action\\)_name['\"]\\s-*:\\s-*['\"]\\([^ '\"]*\\)" 1 + 'font-lock-function-name-face t) + (list 'gyp-section-match + (list 1 'font-lock-function-name-face t t) ; dependencies + (list 2 'font-lock-variable-name-face t t) ; variables, conditions + (list 3 'font-lock-constant-face t t) ; sources + (list 4 'font-lock-preprocessor-face t t)) ; preprocessor + ;; Variable expansion + (list "<@?(\\([^\n )]+\\))" 1 'font-lock-variable-name-face t) + ;; Command expansion + (list "<!@?(\\([^\n )]+\\))" 1 'font-lock-variable-name-face t) + ))) + +(provide 'gyp) diff --git a/deps/gyp/tools/emacs/run-unit-tests.sh b/deps/gyp/tools/emacs/run-unit-tests.sh new file mode 100755 index 0000000000..6e62b9b28c --- /dev/null +++ b/deps/gyp/tools/emacs/run-unit-tests.sh @@ -0,0 +1,7 @@ +#!/bin/sh +# 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. +emacs --no-site-file --no-init-file --batch \ + --load ert.el --load gyp.el --load gyp-tests.el \ + -f ert-run-tests-batch-and-exit diff --git a/deps/gyp/tools/emacs/testdata/media.gyp b/deps/gyp/tools/emacs/testdata/media.gyp new file mode 100644 index 0000000000..29300fe1b8 --- /dev/null +++ b/deps/gyp/tools/emacs/testdata/media.gyp @@ -0,0 +1,1105 @@ +# Copyright (c) 2012 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +{ + 'variables': { + 'chromium_code': 1, + # Override to dynamically link the PulseAudio library. + 'use_pulseaudio%': 0, + # Override to dynamically link the cras (ChromeOS audio) library. + 'use_cras%': 0, + }, + 'targets': [ + { + 'target_name': 'media', + 'type': '<(component)', + 'dependencies': [ + 'yuv_convert', + '../base/base.gyp:base', + '../base/third_party/dynamic_annotations/dynamic_annotations.gyp:dynamic_annotations', + '../build/temp_gyp/googleurl.gyp:googleurl', + '../crypto/crypto.gyp:crypto', + '../third_party/openmax/openmax.gyp:il', + '../ui/ui.gyp:ui', + ], + 'defines': [ + 'MEDIA_IMPLEMENTATION', + ], + 'include_dirs': [ + '..', + ], + 'sources': [ + 'audio/android/audio_manager_android.cc', + 'audio/android/audio_manager_android.h', + 'audio/android/audio_track_output_android.cc', + 'audio/android/audio_track_output_android.h', + 'audio/android/opensles_input.cc', + 'audio/android/opensles_input.h', + 'audio/android/opensles_output.cc', + 'audio/android/opensles_output.h', + 'audio/async_socket_io_handler.h', + 'audio/async_socket_io_handler_posix.cc', + 'audio/async_socket_io_handler_win.cc', + 'audio/audio_buffers_state.cc', + 'audio/audio_buffers_state.h', + 'audio/audio_io.h', + 'audio/audio_input_controller.cc', + 'audio/audio_input_controller.h', + 'audio/audio_input_stream_impl.cc', + 'audio/audio_input_stream_impl.h', + 'audio/audio_device_name.cc', + 'audio/audio_device_name.h', + 'audio/audio_manager.cc', + 'audio/audio_manager.h', + 'audio/audio_manager_base.cc', + 'audio/audio_manager_base.h', + 'audio/audio_output_controller.cc', + 'audio/audio_output_controller.h', + 'audio/audio_output_dispatcher.cc', + 'audio/audio_output_dispatcher.h', + 'audio/audio_output_dispatcher_impl.cc', + 'audio/audio_output_dispatcher_impl.h', + 'audio/audio_output_mixer.cc', + 'audio/audio_output_mixer.h', + 'audio/audio_output_proxy.cc', + 'audio/audio_output_proxy.h', + 'audio/audio_parameters.cc', + 'audio/audio_parameters.h', + 'audio/audio_util.cc', + 'audio/audio_util.h', + 'audio/cross_process_notification.cc', + 'audio/cross_process_notification.h', + 'audio/cross_process_notification_win.cc', + 'audio/cross_process_notification_posix.cc', + 'audio/fake_audio_input_stream.cc', + 'audio/fake_audio_input_stream.h', + 'audio/fake_audio_output_stream.cc', + 'audio/fake_audio_output_stream.h', + 'audio/linux/audio_manager_linux.cc', + 'audio/linux/audio_manager_linux.h', + 'audio/linux/alsa_input.cc', + 'audio/linux/alsa_input.h', + 'audio/linux/alsa_output.cc', + 'audio/linux/alsa_output.h', + 'audio/linux/alsa_util.cc', + 'audio/linux/alsa_util.h', + 'audio/linux/alsa_wrapper.cc', + 'audio/linux/alsa_wrapper.h', + 'audio/linux/cras_output.cc', + 'audio/linux/cras_output.h', + 'audio/openbsd/audio_manager_openbsd.cc', + 'audio/openbsd/audio_manager_openbsd.h', + 'audio/mac/audio_input_mac.cc', + 'audio/mac/audio_input_mac.h', + 'audio/mac/audio_low_latency_input_mac.cc', + 'audio/mac/audio_low_latency_input_mac.h', + 'audio/mac/audio_low_latency_output_mac.cc', + 'audio/mac/audio_low_latency_output_mac.h', + 'audio/mac/audio_manager_mac.cc', + 'audio/mac/audio_manager_mac.h', + 'audio/mac/audio_output_mac.cc', + 'audio/mac/audio_output_mac.h', + 'audio/null_audio_sink.cc', + 'audio/null_audio_sink.h', + 'audio/pulse/pulse_output.cc', + 'audio/pulse/pulse_output.h', + 'audio/sample_rates.cc', + 'audio/sample_rates.h', + 'audio/simple_sources.cc', + 'audio/simple_sources.h', + 'audio/win/audio_low_latency_input_win.cc', + 'audio/win/audio_low_latency_input_win.h', + 'audio/win/audio_low_latency_output_win.cc', + 'audio/win/audio_low_latency_output_win.h', + 'audio/win/audio_manager_win.cc', + 'audio/win/audio_manager_win.h', + 'audio/win/avrt_wrapper_win.cc', + 'audio/win/avrt_wrapper_win.h', + 'audio/win/device_enumeration_win.cc', + 'audio/win/device_enumeration_win.h', + 'audio/win/wavein_input_win.cc', + 'audio/win/wavein_input_win.h', + 'audio/win/waveout_output_win.cc', + 'audio/win/waveout_output_win.h', + 'base/android/media_jni_registrar.cc', + 'base/android/media_jni_registrar.h', + 'base/audio_decoder.cc', + 'base/audio_decoder.h', + 'base/audio_decoder_config.cc', + 'base/audio_decoder_config.h', + 'base/audio_renderer.h', + 'base/audio_renderer_mixer.cc', + 'base/audio_renderer_mixer.h', + 'base/audio_renderer_mixer_input.cc', + 'base/audio_renderer_mixer_input.h', + 'base/bitstream_buffer.h', + 'base/buffers.cc', + 'base/buffers.h', + 'base/byte_queue.cc', + 'base/byte_queue.h', + 'base/channel_layout.cc', + 'base/channel_layout.h', + 'base/clock.cc', + 'base/clock.h', + 'base/composite_filter.cc', + 'base/composite_filter.h', + 'base/data_buffer.cc', + 'base/data_buffer.h', + 'base/data_source.cc', + 'base/data_source.h', + 'base/decoder_buffer.cc', + 'base/decoder_buffer.h', + 'base/decrypt_config.cc', + 'base/decrypt_config.h', + 'base/decryptor.h', + 'base/decryptor_client.h', + 'base/demuxer.cc', + 'base/demuxer.h', + 'base/demuxer_stream.cc', + 'base/demuxer_stream.h', + 'base/djb2.cc', + 'base/djb2.h', + 'base/filter_collection.cc', + 'base/filter_collection.h', + 'base/filter_host.h', + 'base/filters.cc', + 'base/filters.h', + 'base/h264_bitstream_converter.cc', + 'base/h264_bitstream_converter.h', + 'base/media.h', + 'base/media_android.cc', + 'base/media_export.h', + 'base/media_log.cc', + 'base/media_log.h', + 'base/media_log_event.h', + 'base/media_posix.cc', + 'base/media_switches.cc', + 'base/media_switches.h', + 'base/media_win.cc', + 'base/message_loop_factory.cc', + 'base/message_loop_factory.h', + 'base/pipeline.cc', + 'base/pipeline.h', + 'base/pipeline_status.cc', + 'base/pipeline_status.h', + 'base/ranges.cc', + 'base/ranges.h', + 'base/seekable_buffer.cc', + 'base/seekable_buffer.h', + 'base/state_matrix.cc', + 'base/state_matrix.h', + 'base/stream_parser.cc', + 'base/stream_parser.h', + 'base/stream_parser_buffer.cc', + 'base/stream_parser_buffer.h', + 'base/video_decoder.cc', + 'base/video_decoder.h', + 'base/video_decoder_config.cc', + 'base/video_decoder_config.h', + 'base/video_frame.cc', + 'base/video_frame.h', + 'base/video_renderer.h', + 'base/video_util.cc', + 'base/video_util.h', + 'crypto/aes_decryptor.cc', + 'crypto/aes_decryptor.h', + 'ffmpeg/ffmpeg_common.cc', + 'ffmpeg/ffmpeg_common.h', + 'ffmpeg/file_protocol.cc', + 'ffmpeg/file_protocol.h', + 'filters/audio_file_reader.cc', + 'filters/audio_file_reader.h', + 'filters/audio_renderer_algorithm.cc', + 'filters/audio_renderer_algorithm.h', + 'filters/audio_renderer_impl.cc', + 'filters/audio_renderer_impl.h', + 'filters/bitstream_converter.cc', + 'filters/bitstream_converter.h', + 'filters/chunk_demuxer.cc', + 'filters/chunk_demuxer.h', + 'filters/chunk_demuxer_client.h', + 'filters/dummy_demuxer.cc', + 'filters/dummy_demuxer.h', + 'filters/ffmpeg_audio_decoder.cc', + 'filters/ffmpeg_audio_decoder.h', + 'filters/ffmpeg_demuxer.cc', + 'filters/ffmpeg_demuxer.h', + 'filters/ffmpeg_h264_bitstream_converter.cc', + 'filters/ffmpeg_h264_bitstream_converter.h', + 'filters/ffmpeg_glue.cc', + 'filters/ffmpeg_glue.h', + 'filters/ffmpeg_video_decoder.cc', + 'filters/ffmpeg_video_decoder.h', + 'filters/file_data_source.cc', + 'filters/file_data_source.h', + 'filters/gpu_video_decoder.cc', + 'filters/gpu_video_decoder.h', + 'filters/in_memory_url_protocol.cc', + 'filters/in_memory_url_protocol.h', + 'filters/source_buffer_stream.cc', + 'filters/source_buffer_stream.h', + 'filters/video_frame_generator.cc', + 'filters/video_frame_generator.h', + 'filters/video_renderer_base.cc', + 'filters/video_renderer_base.h', + 'video/capture/fake_video_capture_device.cc', + 'video/capture/fake_video_capture_device.h', + 'video/capture/linux/video_capture_device_linux.cc', + 'video/capture/linux/video_capture_device_linux.h', + 'video/capture/mac/video_capture_device_mac.h', + 'video/capture/mac/video_capture_device_mac.mm', + 'video/capture/mac/video_capture_device_qtkit_mac.h', + 'video/capture/mac/video_capture_device_qtkit_mac.mm', + 'video/capture/video_capture.h', + 'video/capture/video_capture_device.h', + 'video/capture/video_capture_device_dummy.cc', + 'video/capture/video_capture_device_dummy.h', + 'video/capture/video_capture_proxy.cc', + 'video/capture/video_capture_proxy.h', + 'video/capture/video_capture_types.h', + 'video/capture/win/filter_base_win.cc', + 'video/capture/win/filter_base_win.h', + 'video/capture/win/pin_base_win.cc', + 'video/capture/win/pin_base_win.h', + 'video/capture/win/sink_filter_observer_win.h', + 'video/capture/win/sink_filter_win.cc', + 'video/capture/win/sink_filter_win.h', + 'video/capture/win/sink_input_pin_win.cc', + 'video/capture/win/sink_input_pin_win.h', + 'video/capture/win/video_capture_device_win.cc', + 'video/capture/win/video_capture_device_win.h', + 'video/picture.cc', + 'video/picture.h', + 'video/video_decode_accelerator.cc', + 'video/video_decode_accelerator.h', + 'webm/webm_constants.h', + 'webm/webm_cluster_parser.cc', + 'webm/webm_cluster_parser.h', + 'webm/webm_content_encodings.cc', + 'webm/webm_content_encodings.h', + 'webm/webm_content_encodings_client.cc', + 'webm/webm_content_encodings_client.h', + 'webm/webm_info_parser.cc', + 'webm/webm_info_parser.h', + 'webm/webm_parser.cc', + 'webm/webm_parser.h', + 'webm/webm_stream_parser.cc', + 'webm/webm_stream_parser.h', + 'webm/webm_tracks_parser.cc', + 'webm/webm_tracks_parser.h', + ], + 'direct_dependent_settings': { + 'include_dirs': [ + '..', + ], + }, + 'conditions': [ + # Android doesn't use ffmpeg, so make the dependency conditional + # and exclude the sources which depend on ffmpeg. + ['OS != "android"', { + 'dependencies': [ + '../third_party/ffmpeg/ffmpeg.gyp:ffmpeg', + ], + }], + ['OS == "android"', { + 'sources!': [ + 'base/media_posix.cc', + 'ffmpeg/ffmpeg_common.cc', + 'ffmpeg/ffmpeg_common.h', + 'ffmpeg/file_protocol.cc', + 'ffmpeg/file_protocol.h', + 'filters/audio_file_reader.cc', + 'filters/audio_file_reader.h', + 'filters/bitstream_converter.cc', + 'filters/bitstream_converter.h', + 'filters/chunk_demuxer.cc', + 'filters/chunk_demuxer.h', + 'filters/chunk_demuxer_client.h', + 'filters/ffmpeg_audio_decoder.cc', + 'filters/ffmpeg_audio_decoder.h', + 'filters/ffmpeg_demuxer.cc', + 'filters/ffmpeg_demuxer.h', + 'filters/ffmpeg_h264_bitstream_converter.cc', + 'filters/ffmpeg_h264_bitstream_converter.h', + 'filters/ffmpeg_glue.cc', + 'filters/ffmpeg_glue.h', + 'filters/ffmpeg_video_decoder.cc', + 'filters/ffmpeg_video_decoder.h', + 'filters/gpu_video_decoder.cc', + 'filters/gpu_video_decoder.h', + 'webm/webm_cluster_parser.cc', + 'webm/webm_cluster_parser.h', + 'webm/webm_stream_parser.cc', + 'webm/webm_stream_parser.h', + ], + }], + # The below 'android' condition were added temporarily and should be + # removed in downstream, because there is no Java environment setup in + # upstream yet. + ['OS == "android"', { + 'sources!':[ + 'audio/android/audio_track_output_android.cc', + ], + 'sources':[ + 'audio/android/audio_track_output_stub_android.cc', + ], + 'link_settings': { + 'libraries': [ + '-lOpenSLES', + ], + }, + }], + ['OS=="linux" or OS=="freebsd" or OS=="solaris"', { + 'link_settings': { + 'libraries': [ + '-lasound', + ], + }, + }], + ['OS=="openbsd"', { + 'sources/': [ ['exclude', '/alsa_' ], + ['exclude', '/audio_manager_linux' ] ], + 'link_settings': { + 'libraries': [ + ], + }, + }], + ['OS!="openbsd"', { + 'sources!': [ + 'audio/openbsd/audio_manager_openbsd.cc', + 'audio/openbsd/audio_manager_openbsd.h', + ], + }], + ['OS=="linux"', { + 'variables': { + 'conditions': [ + ['sysroot!=""', { + 'pkg-config': '../build/linux/pkg-config-wrapper "<(sysroot)" "<(target_arch)"', + }, { + 'pkg-config': 'pkg-config' + }], + ], + }, + 'conditions': [ + ['use_cras == 1', { + 'cflags': [ + '<!@(<(pkg-config) --cflags libcras)', + ], + 'link_settings': { + 'libraries': [ + '<!@(<(pkg-config) --libs libcras)', + ], + }, + 'defines': [ + 'USE_CRAS', + ], + }, { # else: use_cras == 0 + 'sources!': [ + 'audio/linux/cras_output.cc', + 'audio/linux/cras_output.h', + ], + }], + ], + }], + ['os_posix == 1', { + 'conditions': [ + ['use_pulseaudio == 1', { + 'cflags': [ + '<!@(pkg-config --cflags libpulse)', + ], + 'link_settings': { + 'libraries': [ + '<!@(pkg-config --libs-only-l libpulse)', + ], + }, + 'defines': [ + 'USE_PULSEAUDIO', + ], + }, { # else: use_pulseaudio == 0 + 'sources!': [ + 'audio/pulse/pulse_output.cc', + 'audio/pulse/pulse_output.h', + ], + }], + ], + }], + ['os_posix == 1 and OS != "android"', { + # Video capture isn't supported in Android yet. + 'sources!': [ + 'video/capture/video_capture_device_dummy.cc', + 'video/capture/video_capture_device_dummy.h', + ], + }], + ['OS=="mac"', { + 'link_settings': { + 'libraries': [ + '$(SDKROOT)/System/Library/Frameworks/AudioUnit.framework', + '$(SDKROOT)/System/Library/Frameworks/AudioToolbox.framework', + '$(SDKROOT)/System/Library/Frameworks/CoreAudio.framework', + '$(SDKROOT)/System/Library/Frameworks/CoreVideo.framework', + '$(SDKROOT)/System/Library/Frameworks/QTKit.framework', + ], + }, + }], + ['OS=="win"', { + 'sources!': [ + 'audio/pulse/pulse_output.cc', + 'audio/pulse/pulse_output.h', + 'video/capture/video_capture_device_dummy.cc', + 'video/capture/video_capture_device_dummy.h', + ], + }], + ['proprietary_codecs==1 or branding=="Chrome"', { + 'sources': [ + 'mp4/avc.cc', + 'mp4/avc.h', + 'mp4/box_definitions.cc', + 'mp4/box_definitions.h', + 'mp4/box_reader.cc', + 'mp4/box_reader.h', + 'mp4/cenc.cc', + 'mp4/cenc.h', + 'mp4/mp4_stream_parser.cc', + 'mp4/mp4_stream_parser.h', + 'mp4/offset_byte_queue.cc', + 'mp4/offset_byte_queue.h', + 'mp4/track_run_iterator.cc', + 'mp4/track_run_iterator.h', + ], + }], + ], + }, + { + 'target_name': 'yuv_convert', + 'type': 'static_library', + 'include_dirs': [ + '..', + ], + 'conditions': [ + ['order_profiling != 0', { + 'target_conditions' : [ + ['_toolset=="target"', { + 'cflags!': [ '-finstrument-functions' ], + }], + ], + }], + [ 'target_arch == "ia32" or target_arch == "x64"', { + 'dependencies': [ + 'yuv_convert_simd_x86', + ], + }], + [ 'target_arch == "arm"', { + 'dependencies': [ + 'yuv_convert_simd_arm', + ], + }], + ], + 'sources': [ + 'base/yuv_convert.cc', + 'base/yuv_convert.h', + ], + }, + { + 'target_name': 'yuv_convert_simd_x86', + 'type': 'static_library', + 'include_dirs': [ + '..', + ], + 'sources': [ + 'base/simd/convert_rgb_to_yuv_c.cc', + 'base/simd/convert_rgb_to_yuv_sse2.cc', + 'base/simd/convert_rgb_to_yuv_ssse3.asm', + 'base/simd/convert_rgb_to_yuv_ssse3.cc', + 'base/simd/convert_rgb_to_yuv_ssse3.inc', + 'base/simd/convert_yuv_to_rgb_c.cc', + 'base/simd/convert_yuv_to_rgb_x86.cc', + 'base/simd/convert_yuv_to_rgb_mmx.asm', + 'base/simd/convert_yuv_to_rgb_mmx.inc', + 'base/simd/convert_yuv_to_rgb_sse.asm', + 'base/simd/filter_yuv.h', + 'base/simd/filter_yuv_c.cc', + 'base/simd/filter_yuv_mmx.cc', + 'base/simd/filter_yuv_sse2.cc', + 'base/simd/linear_scale_yuv_to_rgb_mmx.asm', + 'base/simd/linear_scale_yuv_to_rgb_mmx.inc', + 'base/simd/linear_scale_yuv_to_rgb_sse.asm', + 'base/simd/scale_yuv_to_rgb_mmx.asm', + 'base/simd/scale_yuv_to_rgb_mmx.inc', + 'base/simd/scale_yuv_to_rgb_sse.asm', + 'base/simd/yuv_to_rgb_table.cc', + 'base/simd/yuv_to_rgb_table.h', + ], + 'conditions': [ + ['order_profiling != 0', { + 'target_conditions' : [ + ['_toolset=="target"', { + 'cflags!': [ '-finstrument-functions' ], + }], + ], + }], + [ 'target_arch == "x64"', { + # Source files optimized for X64 systems. + 'sources': [ + 'base/simd/linear_scale_yuv_to_rgb_mmx_x64.asm', + 'base/simd/scale_yuv_to_rgb_sse2_x64.asm', + ], + }], + [ 'os_posix == 1 and OS != "mac" and OS != "android"', { + 'cflags': [ + '-msse2', + ], + }], + [ 'OS == "mac"', { + 'configurations': { + 'Debug': { + 'xcode_settings': { + # gcc on the mac builds horribly unoptimized sse code in debug + # mode. Since this is rarely going to be debugged, run with full + # optimizations in Debug as well as Release. + 'GCC_OPTIMIZATION_LEVEL': '3', # -O3 + }, + }, + }, + }], + [ 'OS=="win"', { + 'variables': { + 'yasm_flags': [ + '-DWIN32', + '-DMSVC', + '-DCHROMIUM', + '-Isimd', + ], + }, + }], + [ 'OS=="mac"', { + 'variables': { + 'yasm_flags': [ + '-DPREFIX', + '-DMACHO', + '-DCHROMIUM', + '-Isimd', + ], + }, + }], + [ 'os_posix==1 and OS!="mac"', { + 'variables': { + 'conditions': [ + [ 'target_arch=="ia32"', { + 'yasm_flags': [ + '-DX86_32', + '-DELF', + '-DCHROMIUM', + '-Isimd', + ], + }, { + 'yasm_flags': [ + '-DARCH_X86_64', + '-DELF', + '-DPIC', + '-DCHROMIUM', + '-Isimd', + ], + }], + ], + }, + }], + ], + 'variables': { + 'yasm_output_path': '<(SHARED_INTERMEDIATE_DIR)/media', + }, + 'msvs_2010_disable_uldi_when_referenced': 1, + 'includes': [ + '../third_party/yasm/yasm_compile.gypi', + ], + }, + { + 'target_name': 'yuv_convert_simd_arm', + 'type': 'static_library', + 'include_dirs': [ + '..', + ], + 'sources': [ + 'base/simd/convert_rgb_to_yuv_c.cc', + 'base/simd/convert_rgb_to_yuv.h', + 'base/simd/convert_yuv_to_rgb_c.cc', + 'base/simd/convert_yuv_to_rgb.h', + 'base/simd/filter_yuv.h', + 'base/simd/filter_yuv_c.cc', + 'base/simd/yuv_to_rgb_table.cc', + 'base/simd/yuv_to_rgb_table.h', + ], + }, + { + 'target_name': 'media_unittests', + 'type': 'executable', + 'dependencies': [ + 'media', + 'media_test_support', + 'yuv_convert', + '../base/base.gyp:base', + '../base/base.gyp:base_i18n', + '../base/base.gyp:test_support_base', + '../testing/gmock.gyp:gmock', + '../testing/gtest.gyp:gtest', + '../ui/ui.gyp:ui', + ], + 'sources': [ + 'audio/async_socket_io_handler_unittest.cc', + 'audio/audio_input_controller_unittest.cc', + 'audio/audio_input_device_unittest.cc', + 'audio/audio_input_unittest.cc', + 'audio/audio_input_volume_unittest.cc', + 'audio/audio_low_latency_input_output_unittest.cc', + 'audio/audio_output_controller_unittest.cc', + 'audio/audio_output_proxy_unittest.cc', + 'audio/audio_parameters_unittest.cc', + 'audio/audio_util_unittest.cc', + 'audio/cross_process_notification_unittest.cc', + 'audio/linux/alsa_output_unittest.cc', + 'audio/mac/audio_low_latency_input_mac_unittest.cc', + 'audio/mac/audio_output_mac_unittest.cc', + 'audio/simple_sources_unittest.cc', + 'audio/win/audio_low_latency_input_win_unittest.cc', + 'audio/win/audio_low_latency_output_win_unittest.cc', + 'audio/win/audio_output_win_unittest.cc', + 'base/audio_renderer_mixer_unittest.cc', + 'base/audio_renderer_mixer_input_unittest.cc', + 'base/buffers_unittest.cc', + 'base/clock_unittest.cc', + 'base/composite_filter_unittest.cc', + 'base/data_buffer_unittest.cc', + 'base/decoder_buffer_unittest.cc', + 'base/djb2_unittest.cc', + 'base/fake_audio_render_callback.cc', + 'base/fake_audio_render_callback.h', + 'base/filter_collection_unittest.cc', + 'base/h264_bitstream_converter_unittest.cc', + 'base/pipeline_unittest.cc', + 'base/ranges_unittest.cc', + 'base/run_all_unittests.cc', + 'base/seekable_buffer_unittest.cc', + 'base/state_matrix_unittest.cc', + 'base/test_data_util.cc', + 'base/test_data_util.h', + 'base/video_frame_unittest.cc', + 'base/video_util_unittest.cc', + 'base/yuv_convert_unittest.cc', + 'crypto/aes_decryptor_unittest.cc', + 'ffmpeg/ffmpeg_common_unittest.cc', + 'filters/audio_renderer_algorithm_unittest.cc', + 'filters/audio_renderer_impl_unittest.cc', + 'filters/bitstream_converter_unittest.cc', + 'filters/chunk_demuxer_unittest.cc', + 'filters/ffmpeg_audio_decoder_unittest.cc', + 'filters/ffmpeg_decoder_unittest.h', + 'filters/ffmpeg_demuxer_unittest.cc', + 'filters/ffmpeg_glue_unittest.cc', + 'filters/ffmpeg_h264_bitstream_converter_unittest.cc', + 'filters/ffmpeg_video_decoder_unittest.cc', + 'filters/file_data_source_unittest.cc', + 'filters/pipeline_integration_test.cc', + 'filters/pipeline_integration_test_base.cc', + 'filters/source_buffer_stream_unittest.cc', + 'filters/video_renderer_base_unittest.cc', + 'video/capture/video_capture_device_unittest.cc', + 'webm/cluster_builder.cc', + 'webm/cluster_builder.h', + 'webm/webm_cluster_parser_unittest.cc', + 'webm/webm_content_encodings_client_unittest.cc', + 'webm/webm_parser_unittest.cc', + ], + 'conditions': [ + ['os_posix==1 and OS!="mac"', { + 'conditions': [ + ['linux_use_tcmalloc==1', { + 'dependencies': [ + '../base/allocator/allocator.gyp:allocator', + ], + }], + ], + }], + ['OS != "android"', { + 'dependencies': [ + '../third_party/ffmpeg/ffmpeg.gyp:ffmpeg', + ], + }], + ['OS == "android"', { + 'sources!': [ + 'audio/audio_input_volume_unittest.cc', + 'base/test_data_util.cc', + 'base/test_data_util.h', + 'ffmpeg/ffmpeg_common_unittest.cc', + 'filters/ffmpeg_audio_decoder_unittest.cc', + 'filters/bitstream_converter_unittest.cc', + 'filters/chunk_demuxer_unittest.cc', + 'filters/ffmpeg_demuxer_unittest.cc', + 'filters/ffmpeg_glue_unittest.cc', + 'filters/ffmpeg_h264_bitstream_converter_unittest.cc', + 'filters/ffmpeg_video_decoder_unittest.cc', + 'filters/pipeline_integration_test.cc', + 'filters/pipeline_integration_test_base.cc', + 'mp4/mp4_stream_parser_unittest.cc', + 'webm/webm_cluster_parser_unittest.cc', + ], + }], + ['OS == "linux"', { + 'conditions': [ + ['use_cras == 1', { + 'sources': [ + 'audio/linux/cras_output_unittest.cc', + ], + 'defines': [ + 'USE_CRAS', + ], + }], + ], + }], + [ 'target_arch=="ia32" or target_arch=="x64"', { + 'sources': [ + 'base/simd/convert_rgb_to_yuv_unittest.cc', + ], + }], + ['proprietary_codecs==1 or branding=="Chrome"', { + 'sources': [ + 'mp4/avc_unittest.cc', + 'mp4/box_reader_unittest.cc', + 'mp4/mp4_stream_parser_unittest.cc', + 'mp4/offset_byte_queue_unittest.cc', + ], + }], + ], + }, + { + 'target_name': 'media_test_support', + 'type': 'static_library', + 'dependencies': [ + 'media', + '../base/base.gyp:base', + '../testing/gmock.gyp:gmock', + '../testing/gtest.gyp:gtest', + ], + 'sources': [ + 'audio/test_audio_input_controller_factory.cc', + 'audio/test_audio_input_controller_factory.h', + 'base/mock_callback.cc', + 'base/mock_callback.h', + 'base/mock_data_source_host.cc', + 'base/mock_data_source_host.h', + 'base/mock_demuxer_host.cc', + 'base/mock_demuxer_host.h', + 'base/mock_filter_host.cc', + 'base/mock_filter_host.h', + 'base/mock_filters.cc', + 'base/mock_filters.h', + ], + }, + { + 'target_name': 'scaler_bench', + 'type': 'executable', + 'dependencies': [ + 'media', + 'yuv_convert', + '../base/base.gyp:base', + '../skia/skia.gyp:skia', + ], + 'sources': [ + 'tools/scaler_bench/scaler_bench.cc', + ], + }, + { + 'target_name': 'qt_faststart', + 'type': 'executable', + 'sources': [ + 'tools/qt_faststart/qt_faststart.c' + ], + }, + { + 'target_name': 'seek_tester', + 'type': 'executable', + 'dependencies': [ + 'media', + '../base/base.gyp:base', + ], + 'sources': [ + 'tools/seek_tester/seek_tester.cc', + ], + }, + ], + 'conditions': [ + ['OS=="win"', { + 'targets': [ + { + 'target_name': 'player_wtl', + 'type': 'executable', + 'dependencies': [ + 'media', + 'yuv_convert', + '../base/base.gyp:base', + '../base/third_party/dynamic_annotations/dynamic_annotations.gyp:dynamic_annotations', + '../ui/ui.gyp:ui', + ], + 'include_dirs': [ + '<(DEPTH)/third_party/wtl/include', + ], + 'sources': [ + 'tools/player_wtl/list.h', + 'tools/player_wtl/mainfrm.h', + 'tools/player_wtl/movie.cc', + 'tools/player_wtl/movie.h', + 'tools/player_wtl/player_wtl.cc', + 'tools/player_wtl/player_wtl.rc', + 'tools/player_wtl/props.h', + 'tools/player_wtl/seek.h', + 'tools/player_wtl/resource.h', + 'tools/player_wtl/view.h', + ], + 'msvs_settings': { + 'VCLinkerTool': { + 'SubSystem': '2', # Set /SUBSYSTEM:WINDOWS + }, + }, + 'defines': [ + '_CRT_SECURE_NO_WARNINGS=1', + ], + }, + ], + }], + ['OS == "win" or toolkit_uses_gtk == 1', { + 'targets': [ + { + 'target_name': 'shader_bench', + 'type': 'executable', + 'dependencies': [ + 'media', + 'yuv_convert', + '../base/base.gyp:base', + '../ui/gl/gl.gyp:gl', + ], + 'sources': [ + 'tools/shader_bench/shader_bench.cc', + 'tools/shader_bench/cpu_color_painter.cc', + 'tools/shader_bench/cpu_color_painter.h', + 'tools/shader_bench/gpu_color_painter.cc', + 'tools/shader_bench/gpu_color_painter.h', + 'tools/shader_bench/gpu_painter.cc', + 'tools/shader_bench/gpu_painter.h', + 'tools/shader_bench/painter.cc', + 'tools/shader_bench/painter.h', + 'tools/shader_bench/window.cc', + 'tools/shader_bench/window.h', + ], + 'conditions': [ + ['toolkit_uses_gtk == 1', { + 'dependencies': [ + '../build/linux/system.gyp:gtk', + ], + 'sources': [ + 'tools/shader_bench/window_linux.cc', + ], + }], + ['OS=="win"', { + 'dependencies': [ + '../third_party/angle/src/build_angle.gyp:libEGL', + '../third_party/angle/src/build_angle.gyp:libGLESv2', + ], + 'sources': [ + 'tools/shader_bench/window_win.cc', + ], + }], + ], + }, + ], + }], + ['OS == "linux" and target_arch != "arm"', { + 'targets': [ + { + 'target_name': 'tile_render_bench', + 'type': 'executable', + 'dependencies': [ + '../base/base.gyp:base', + '../ui/gl/gl.gyp:gl', + ], + 'libraries': [ + '-lGL', + '-ldl', + ], + 'sources': [ + 'tools/tile_render_bench/tile_render_bench.cc', + ], + }, + ], + }], + ['os_posix == 1 and OS != "mac" and OS != "android"', { + 'targets': [ + { + 'target_name': 'player_x11', + 'type': 'executable', + 'dependencies': [ + 'media', + 'yuv_convert', + '../base/base.gyp:base', + '../ui/gl/gl.gyp:gl', + ], + 'link_settings': { + 'libraries': [ + '-ldl', + '-lX11', + '-lXrender', + '-lXext', + ], + }, + 'sources': [ + 'tools/player_x11/data_source_logger.cc', + 'tools/player_x11/data_source_logger.h', + 'tools/player_x11/gl_video_renderer.cc', + 'tools/player_x11/gl_video_renderer.h', + 'tools/player_x11/player_x11.cc', + 'tools/player_x11/x11_video_renderer.cc', + 'tools/player_x11/x11_video_renderer.h', + ], + }, + ], + }], + ['OS == "android"', { + 'targets': [ + { + 'target_name': 'player_android', + 'type': 'static_library', + 'sources': [ + 'base/android/media_player_bridge.cc', + 'base/android/media_player_bridge.h', + ], + 'dependencies': [ + '../base/base.gyp:base', + ], + 'include_dirs': [ + '<(SHARED_INTERMEDIATE_DIR)/media', + ], + 'actions': [ + { + 'action_name': 'generate-jni-headers', + 'inputs': [ + '../base/android/jni_generator/jni_generator.py', + 'base/android/java/src/org/chromium/media/MediaPlayerListener.java', + ], + 'outputs': [ + '<(SHARED_INTERMEDIATE_DIR)/media/jni/media_player_listener_jni.h', + ], + 'action': [ + 'python', + '<(DEPTH)/base/android/jni_generator/jni_generator.py', + '-o', + '<@(_inputs)', + '<@(_outputs)', + ], + }, + ], + }, + { + 'target_name': 'media_java', + 'type': 'none', + 'dependencies': [ '../base/base.gyp:base_java' ], + 'variables': { + 'package_name': 'media', + 'java_in_dir': 'base/android/java', + }, + 'includes': [ '../build/java.gypi' ], + }, + + ], + }, { # OS != "android"' + # Android does not use ffmpeg, so disable the targets which require it. + 'targets': [ + { + 'target_name': 'ffmpeg_unittests', + 'type': 'executable', + 'dependencies': [ + 'media', + 'media_test_support', + '../base/base.gyp:base', + '../base/base.gyp:base_i18n', + '../base/base.gyp:test_support_base', + '../base/base.gyp:test_support_perf', + '../testing/gtest.gyp:gtest', + '../third_party/ffmpeg/ffmpeg.gyp:ffmpeg', + ], + 'sources': [ + 'ffmpeg/ffmpeg_unittest.cc', + ], + 'conditions': [ + ['toolkit_uses_gtk == 1', { + 'dependencies': [ + # Needed for the following #include chain: + # base/run_all_unittests.cc + # ../base/test_suite.h + # gtk/gtk.h + '../build/linux/system.gyp:gtk', + ], + 'conditions': [ + ['linux_use_tcmalloc==1', { + 'dependencies': [ + '../base/allocator/allocator.gyp:allocator', + ], + }], + ], + }], + ], + }, + { + 'target_name': 'ffmpeg_regression_tests', + 'type': 'executable', + 'dependencies': [ + 'media', + 'media_test_support', + '../base/base.gyp:test_support_base', + '../testing/gmock.gyp:gmock', + '../testing/gtest.gyp:gtest', + '../third_party/ffmpeg/ffmpeg.gyp:ffmpeg', + ], + 'sources': [ + 'base/test_data_util.cc', + 'base/run_all_unittests.cc', + 'ffmpeg/ffmpeg_regression_tests.cc', + 'filters/pipeline_integration_test_base.cc', + ], + 'conditions': [ + ['os_posix==1 and OS!="mac"', { + 'conditions': [ + ['linux_use_tcmalloc==1', { + 'dependencies': [ + '../base/allocator/allocator.gyp:allocator', + ], + }], + ], + }], + ], + }, + { + 'target_name': 'ffmpeg_tests', + 'type': 'executable', + 'dependencies': [ + 'media', + '../base/base.gyp:base', + '../third_party/ffmpeg/ffmpeg.gyp:ffmpeg', + ], + 'sources': [ + 'test/ffmpeg_tests/ffmpeg_tests.cc', + ], + }, + { + 'target_name': 'media_bench', + 'type': 'executable', + 'dependencies': [ + 'media', + '../base/base.gyp:base', + '../third_party/ffmpeg/ffmpeg.gyp:ffmpeg', + ], + 'sources': [ + 'tools/media_bench/media_bench.cc', + ], + }, + ], + }] + ], +} diff --git a/deps/gyp/tools/emacs/testdata/media.gyp.fontified b/deps/gyp/tools/emacs/testdata/media.gyp.fontified new file mode 100644 index 0000000000..962b7b2c43 --- /dev/null +++ b/deps/gyp/tools/emacs/testdata/media.gyp.fontified @@ -0,0 +1,1107 @@ + +#("# Copyright (c) 2012 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +{ + 'variables': { + 'chromium_code': 1, + # Override to dynamically link the PulseAudio library. + 'use_pulseaudio%': 0, + # Override to dynamically link the cras (ChromeOS audio) library. + 'use_cras%': 0, + }, + 'targets': [ + { + 'target_name': 'media', + 'type': '<(component)', + 'dependencies': [ + 'yuv_convert', + '../base/base.gyp:base', + '../base/third_party/dynamic_annotations/dynamic_annotations.gyp:dynamic_annotations', + '../build/temp_gyp/googleurl.gyp:googleurl', + '../crypto/crypto.gyp:crypto', + '../third_party/openmax/openmax.gyp:il', + '../ui/ui.gyp:ui', + ], + 'defines': [ + 'MEDIA_IMPLEMENTATION', + ], + 'include_dirs': [ + '..', + ], + 'sources': [ + 'audio/android/audio_manager_android.cc', + 'audio/android/audio_manager_android.h', + 'audio/android/audio_track_output_android.cc', + 'audio/android/audio_track_output_android.h', + 'audio/android/opensles_input.cc', + 'audio/android/opensles_input.h', + 'audio/android/opensles_output.cc', + 'audio/android/opensles_output.h', + 'audio/async_socket_io_handler.h', + 'audio/async_socket_io_handler_posix.cc', + 'audio/async_socket_io_handler_win.cc', + 'audio/audio_buffers_state.cc', + 'audio/audio_buffers_state.h', + 'audio/audio_io.h', + 'audio/audio_input_controller.cc', + 'audio/audio_input_controller.h', + 'audio/audio_input_stream_impl.cc', + 'audio/audio_input_stream_impl.h', + 'audio/audio_device_name.cc', + 'audio/audio_device_name.h', + 'audio/audio_manager.cc', + 'audio/audio_manager.h', + 'audio/audio_manager_base.cc', + 'audio/audio_manager_base.h', + 'audio/audio_output_controller.cc', + 'audio/audio_output_controller.h', + 'audio/audio_output_dispatcher.cc', + 'audio/audio_output_dispatcher.h', + 'audio/audio_output_dispatcher_impl.cc', + 'audio/audio_output_dispatcher_impl.h', + 'audio/audio_output_mixer.cc', + 'audio/audio_output_mixer.h', + 'audio/audio_output_proxy.cc', + 'audio/audio_output_proxy.h', + 'audio/audio_parameters.cc', + 'audio/audio_parameters.h', + 'audio/audio_util.cc', + 'audio/audio_util.h', + 'audio/cross_process_notification.cc', + 'audio/cross_process_notification.h', + 'audio/cross_process_notification_win.cc', + 'audio/cross_process_notification_posix.cc', + 'audio/fake_audio_input_stream.cc', + 'audio/fake_audio_input_stream.h', + 'audio/fake_audio_output_stream.cc', + 'audio/fake_audio_output_stream.h', + 'audio/linux/audio_manager_linux.cc', + 'audio/linux/audio_manager_linux.h', + 'audio/linux/alsa_input.cc', + 'audio/linux/alsa_input.h', + 'audio/linux/alsa_output.cc', + 'audio/linux/alsa_output.h', + 'audio/linux/alsa_util.cc', + 'audio/linux/alsa_util.h', + 'audio/linux/alsa_wrapper.cc', + 'audio/linux/alsa_wrapper.h', + 'audio/linux/cras_output.cc', + 'audio/linux/cras_output.h', + 'audio/openbsd/audio_manager_openbsd.cc', + 'audio/openbsd/audio_manager_openbsd.h', + 'audio/mac/audio_input_mac.cc', + 'audio/mac/audio_input_mac.h', + 'audio/mac/audio_low_latency_input_mac.cc', + 'audio/mac/audio_low_latency_input_mac.h', + 'audio/mac/audio_low_latency_output_mac.cc', + 'audio/mac/audio_low_latency_output_mac.h', + 'audio/mac/audio_manager_mac.cc', + 'audio/mac/audio_manager_mac.h', + 'audio/mac/audio_output_mac.cc', + 'audio/mac/audio_output_mac.h', + 'audio/null_audio_sink.cc', + 'audio/null_audio_sink.h', + 'audio/pulse/pulse_output.cc', + 'audio/pulse/pulse_output.h', + 'audio/sample_rates.cc', + 'audio/sample_rates.h', + 'audio/simple_sources.cc', + 'audio/simple_sources.h', + 'audio/win/audio_low_latency_input_win.cc', + 'audio/win/audio_low_latency_input_win.h', + 'audio/win/audio_low_latency_output_win.cc', + 'audio/win/audio_low_latency_output_win.h', + 'audio/win/audio_manager_win.cc', + 'audio/win/audio_manager_win.h', + 'audio/win/avrt_wrapper_win.cc', + 'audio/win/avrt_wrapper_win.h', + 'audio/win/device_enumeration_win.cc', + 'audio/win/device_enumeration_win.h', + 'audio/win/wavein_input_win.cc', + 'audio/win/wavein_input_win.h', + 'audio/win/waveout_output_win.cc', + 'audio/win/waveout_output_win.h', + 'base/android/media_jni_registrar.cc', + 'base/android/media_jni_registrar.h', + 'base/audio_decoder.cc', + 'base/audio_decoder.h', + 'base/audio_decoder_config.cc', + 'base/audio_decoder_config.h', + 'base/audio_renderer.h', + 'base/audio_renderer_mixer.cc', + 'base/audio_renderer_mixer.h', + 'base/audio_renderer_mixer_input.cc', + 'base/audio_renderer_mixer_input.h', + 'base/bitstream_buffer.h', + 'base/buffers.cc', + 'base/buffers.h', + 'base/byte_queue.cc', + 'base/byte_queue.h', + 'base/channel_layout.cc', + 'base/channel_layout.h', + 'base/clock.cc', + 'base/clock.h', + 'base/composite_filter.cc', + 'base/composite_filter.h', + 'base/data_buffer.cc', + 'base/data_buffer.h', + 'base/data_source.cc', + 'base/data_source.h', + 'base/decoder_buffer.cc', + 'base/decoder_buffer.h', + 'base/decrypt_config.cc', + 'base/decrypt_config.h', + 'base/decryptor.h', + 'base/decryptor_client.h', + 'base/demuxer.cc', + 'base/demuxer.h', + 'base/demuxer_stream.cc', + 'base/demuxer_stream.h', + 'base/djb2.cc', + 'base/djb2.h', + 'base/filter_collection.cc', + 'base/filter_collection.h', + 'base/filter_host.h', + 'base/filters.cc', + 'base/filters.h', + 'base/h264_bitstream_converter.cc', + 'base/h264_bitstream_converter.h', + 'base/media.h', + 'base/media_android.cc', + 'base/media_export.h', + 'base/media_log.cc', + 'base/media_log.h', + 'base/media_log_event.h', + 'base/media_posix.cc', + 'base/media_switches.cc', + 'base/media_switches.h', + 'base/media_win.cc', + 'base/message_loop_factory.cc', + 'base/message_loop_factory.h', + 'base/pipeline.cc', + 'base/pipeline.h', + 'base/pipeline_status.cc', + 'base/pipeline_status.h', + 'base/ranges.cc', + 'base/ranges.h', + 'base/seekable_buffer.cc', + 'base/seekable_buffer.h', + 'base/state_matrix.cc', + 'base/state_matrix.h', + 'base/stream_parser.cc', + 'base/stream_parser.h', + 'base/stream_parser_buffer.cc', + 'base/stream_parser_buffer.h', + 'base/video_decoder.cc', + 'base/video_decoder.h', + 'base/video_decoder_config.cc', + 'base/video_decoder_config.h', + 'base/video_frame.cc', + 'base/video_frame.h', + 'base/video_renderer.h', + 'base/video_util.cc', + 'base/video_util.h', + 'crypto/aes_decryptor.cc', + 'crypto/aes_decryptor.h', + 'ffmpeg/ffmpeg_common.cc', + 'ffmpeg/ffmpeg_common.h', + 'ffmpeg/file_protocol.cc', + 'ffmpeg/file_protocol.h', + 'filters/audio_file_reader.cc', + 'filters/audio_file_reader.h', + 'filters/audio_renderer_algorithm.cc', + 'filters/audio_renderer_algorithm.h', + 'filters/audio_renderer_impl.cc', + 'filters/audio_renderer_impl.h', + 'filters/bitstream_converter.cc', + 'filters/bitstream_converter.h', + 'filters/chunk_demuxer.cc', + 'filters/chunk_demuxer.h', + 'filters/chunk_demuxer_client.h', + 'filters/dummy_demuxer.cc', + 'filters/dummy_demuxer.h', + 'filters/ffmpeg_audio_decoder.cc', + 'filters/ffmpeg_audio_decoder.h', + 'filters/ffmpeg_demuxer.cc', + 'filters/ffmpeg_demuxer.h', + 'filters/ffmpeg_h264_bitstream_converter.cc', + 'filters/ffmpeg_h264_bitstream_converter.h', + 'filters/ffmpeg_glue.cc', + 'filters/ffmpeg_glue.h', + 'filters/ffmpeg_video_decoder.cc', + 'filters/ffmpeg_video_decoder.h', + 'filters/file_data_source.cc', + 'filters/file_data_source.h', + 'filters/gpu_video_decoder.cc', + 'filters/gpu_video_decoder.h', + 'filters/in_memory_url_protocol.cc', + 'filters/in_memory_url_protocol.h', + 'filters/source_buffer_stream.cc', + 'filters/source_buffer_stream.h', + 'filters/video_frame_generator.cc', + 'filters/video_frame_generator.h', + 'filters/video_renderer_base.cc', + 'filters/video_renderer_base.h', + 'video/capture/fake_video_capture_device.cc', + 'video/capture/fake_video_capture_device.h', + 'video/capture/linux/video_capture_device_linux.cc', + 'video/capture/linux/video_capture_device_linux.h', + 'video/capture/mac/video_capture_device_mac.h', + 'video/capture/mac/video_capture_device_mac.mm', + 'video/capture/mac/video_capture_device_qtkit_mac.h', + 'video/capture/mac/video_capture_device_qtkit_mac.mm', + 'video/capture/video_capture.h', + 'video/capture/video_capture_device.h', + 'video/capture/video_capture_device_dummy.cc', + 'video/capture/video_capture_device_dummy.h', + 'video/capture/video_capture_proxy.cc', + 'video/capture/video_capture_proxy.h', + 'video/capture/video_capture_types.h', + 'video/capture/win/filter_base_win.cc', + 'video/capture/win/filter_base_win.h', + 'video/capture/win/pin_base_win.cc', + 'video/capture/win/pin_base_win.h', + 'video/capture/win/sink_filter_observer_win.h', + 'video/capture/win/sink_filter_win.cc', + 'video/capture/win/sink_filter_win.h', + 'video/capture/win/sink_input_pin_win.cc', + 'video/capture/win/sink_input_pin_win.h', + 'video/capture/win/video_capture_device_win.cc', + 'video/capture/win/video_capture_device_win.h', + 'video/picture.cc', + 'video/picture.h', + 'video/video_decode_accelerator.cc', + 'video/video_decode_accelerator.h', + 'webm/webm_constants.h', + 'webm/webm_cluster_parser.cc', + 'webm/webm_cluster_parser.h', + 'webm/webm_content_encodings.cc', + 'webm/webm_content_encodings.h', + 'webm/webm_content_encodings_client.cc', + 'webm/webm_content_encodings_client.h', + 'webm/webm_info_parser.cc', + 'webm/webm_info_parser.h', + 'webm/webm_parser.cc', + 'webm/webm_parser.h', + 'webm/webm_stream_parser.cc', + 'webm/webm_stream_parser.h', + 'webm/webm_tracks_parser.cc', + 'webm/webm_tracks_parser.h', + ], + 'direct_dependent_settings': { + 'include_dirs': [ + '..', + ], + }, + 'conditions': [ + # Android doesn't use ffmpeg, so make the dependency conditional + # and exclude the sources which depend on ffmpeg. + ['OS != \"android\"', { + 'dependencies': [ + '../third_party/ffmpeg/ffmpeg.gyp:ffmpeg', + ], + }], + ['OS == \"android\"', { + 'sources!': [ + 'base/media_posix.cc', + 'ffmpeg/ffmpeg_common.cc', + 'ffmpeg/ffmpeg_common.h', + 'ffmpeg/file_protocol.cc', + 'ffmpeg/file_protocol.h', + 'filters/audio_file_reader.cc', + 'filters/audio_file_reader.h', + 'filters/bitstream_converter.cc', + 'filters/bitstream_converter.h', + 'filters/chunk_demuxer.cc', + 'filters/chunk_demuxer.h', + 'filters/chunk_demuxer_client.h', + 'filters/ffmpeg_audio_decoder.cc', + 'filters/ffmpeg_audio_decoder.h', + 'filters/ffmpeg_demuxer.cc', + 'filters/ffmpeg_demuxer.h', + 'filters/ffmpeg_h264_bitstream_converter.cc', + 'filters/ffmpeg_h264_bitstream_converter.h', + 'filters/ffmpeg_glue.cc', + 'filters/ffmpeg_glue.h', + 'filters/ffmpeg_video_decoder.cc', + 'filters/ffmpeg_video_decoder.h', + 'filters/gpu_video_decoder.cc', + 'filters/gpu_video_decoder.h', + 'webm/webm_cluster_parser.cc', + 'webm/webm_cluster_parser.h', + 'webm/webm_stream_parser.cc', + 'webm/webm_stream_parser.h', + ], + }], + # The below 'android' condition were added temporarily and should be + # removed in downstream, because there is no Java environment setup in + # upstream yet. + ['OS == \"android\"', { + 'sources!':[ + 'audio/android/audio_track_output_android.cc', + ], + 'sources':[ + 'audio/android/audio_track_output_stub_android.cc', + ], + 'link_settings': { + 'libraries': [ + '-lOpenSLES', + ], + }, + }], + ['OS==\"linux\" or OS==\"freebsd\" or OS==\"solaris\"', { + 'link_settings': { + 'libraries': [ + '-lasound', + ], + }, + }], + ['OS==\"openbsd\"', { + 'sources/': [ ['exclude', '/alsa_' ], + ['exclude', '/audio_manager_linux' ] ], + 'link_settings': { + 'libraries': [ + ], + }, + }], + ['OS!=\"openbsd\"', { + 'sources!': [ + 'audio/openbsd/audio_manager_openbsd.cc', + 'audio/openbsd/audio_manager_openbsd.h', + ], + }], + ['OS==\"linux\"', { + 'variables': { + 'conditions': [ + ['sysroot!=\"\"', { + 'pkg-config': '../build/linux/pkg-config-wrapper \"<(sysroot)\" \"<(target_arch)\"', + }, { + 'pkg-config': 'pkg-config' + }], + ], + }, + 'conditions': [ + ['use_cras == 1', { + 'cflags': [ + '<!@(<(pkg-config) --cflags libcras)', + ], + 'link_settings': { + 'libraries': [ + '<!@(<(pkg-config) --libs libcras)', + ], + }, + 'defines': [ + 'USE_CRAS', + ], + }, { # else: use_cras == 0 + 'sources!': [ + 'audio/linux/cras_output.cc', + 'audio/linux/cras_output.h', + ], + }], + ], + }], + ['os_posix == 1', { + 'conditions': [ + ['use_pulseaudio == 1', { + 'cflags': [ + '<!@(pkg-config --cflags libpulse)', + ], + 'link_settings': { + 'libraries': [ + '<!@(pkg-config --libs-only-l libpulse)', + ], + }, + 'defines': [ + 'USE_PULSEAUDIO', + ], + }, { # else: use_pulseaudio == 0 + 'sources!': [ + 'audio/pulse/pulse_output.cc', + 'audio/pulse/pulse_output.h', + ], + }], + ], + }], + ['os_posix == 1 and OS != \"android\"', { + # Video capture isn't supported in Android yet. + 'sources!': [ + 'video/capture/video_capture_device_dummy.cc', + 'video/capture/video_capture_device_dummy.h', + ], + }], + ['OS==\"mac\"', { + 'link_settings': { + 'libraries': [ + '$(SDKROOT)/System/Library/Frameworks/AudioUnit.framework', + '$(SDKROOT)/System/Library/Frameworks/AudioToolbox.framework', + '$(SDKROOT)/System/Library/Frameworks/CoreAudio.framework', + '$(SDKROOT)/System/Library/Frameworks/CoreVideo.framework', + '$(SDKROOT)/System/Library/Frameworks/QTKit.framework', + ], + }, + }], + ['OS==\"win\"', { + 'sources!': [ + 'audio/pulse/pulse_output.cc', + 'audio/pulse/pulse_output.h', + 'video/capture/video_capture_device_dummy.cc', + 'video/capture/video_capture_device_dummy.h', + ], + }], + ['proprietary_codecs==1 or branding==\"Chrome\"', { + 'sources': [ + 'mp4/avc.cc', + 'mp4/avc.h', + 'mp4/box_definitions.cc', + 'mp4/box_definitions.h', + 'mp4/box_reader.cc', + 'mp4/box_reader.h', + 'mp4/cenc.cc', + 'mp4/cenc.h', + 'mp4/mp4_stream_parser.cc', + 'mp4/mp4_stream_parser.h', + 'mp4/offset_byte_queue.cc', + 'mp4/offset_byte_queue.h', + 'mp4/track_run_iterator.cc', + 'mp4/track_run_iterator.h', + ], + }], + ], + }, + { + 'target_name': 'yuv_convert', + 'type': 'static_library', + 'include_dirs': [ + '..', + ], + 'conditions': [ + ['order_profiling != 0', { + 'target_conditions' : [ + ['_toolset==\"target\"', { + 'cflags!': [ '-finstrument-functions' ], + }], + ], + }], + [ 'target_arch == \"ia32\" or target_arch == \"x64\"', { + 'dependencies': [ + 'yuv_convert_simd_x86', + ], + }], + [ 'target_arch == \"arm\"', { + 'dependencies': [ + 'yuv_convert_simd_arm', + ], + }], + ], + 'sources': [ + 'base/yuv_convert.cc', + 'base/yuv_convert.h', + ], + }, + { + 'target_name': 'yuv_convert_simd_x86', + 'type': 'static_library', + 'include_dirs': [ + '..', + ], + 'sources': [ + 'base/simd/convert_rgb_to_yuv_c.cc', + 'base/simd/convert_rgb_to_yuv_sse2.cc', + 'base/simd/convert_rgb_to_yuv_ssse3.asm', + 'base/simd/convert_rgb_to_yuv_ssse3.cc', + 'base/simd/convert_rgb_to_yuv_ssse3.inc', + 'base/simd/convert_yuv_to_rgb_c.cc', + 'base/simd/convert_yuv_to_rgb_x86.cc', + 'base/simd/convert_yuv_to_rgb_mmx.asm', + 'base/simd/convert_yuv_to_rgb_mmx.inc', + 'base/simd/convert_yuv_to_rgb_sse.asm', + 'base/simd/filter_yuv.h', + 'base/simd/filter_yuv_c.cc', + 'base/simd/filter_yuv_mmx.cc', + 'base/simd/filter_yuv_sse2.cc', + 'base/simd/linear_scale_yuv_to_rgb_mmx.asm', + 'base/simd/linear_scale_yuv_to_rgb_mmx.inc', + 'base/simd/linear_scale_yuv_to_rgb_sse.asm', + 'base/simd/scale_yuv_to_rgb_mmx.asm', + 'base/simd/scale_yuv_to_rgb_mmx.inc', + 'base/simd/scale_yuv_to_rgb_sse.asm', + 'base/simd/yuv_to_rgb_table.cc', + 'base/simd/yuv_to_rgb_table.h', + ], + 'conditions': [ + ['order_profiling != 0', { + 'target_conditions' : [ + ['_toolset==\"target\"', { + 'cflags!': [ '-finstrument-functions' ], + }], + ], + }], + [ 'target_arch == \"x64\"', { + # Source files optimized for X64 systems. + 'sources': [ + 'base/simd/linear_scale_yuv_to_rgb_mmx_x64.asm', + 'base/simd/scale_yuv_to_rgb_sse2_x64.asm', + ], + }], + [ 'os_posix == 1 and OS != \"mac\" and OS != \"android\"', { + 'cflags': [ + '-msse2', + ], + }], + [ 'OS == \"mac\"', { + 'configurations': { + 'Debug': { + 'xcode_settings': { + # gcc on the mac builds horribly unoptimized sse code in debug + # mode. Since this is rarely going to be debugged, run with full + # optimizations in Debug as well as Release. + 'GCC_OPTIMIZATION_LEVEL': '3', # -O3 + }, + }, + }, + }], + [ 'OS==\"win\"', { + 'variables': { + 'yasm_flags': [ + '-DWIN32', + '-DMSVC', + '-DCHROMIUM', + '-Isimd', + ], + }, + }], + [ 'OS==\"mac\"', { + 'variables': { + 'yasm_flags': [ + '-DPREFIX', + '-DMACHO', + '-DCHROMIUM', + '-Isimd', + ], + }, + }], + [ 'os_posix==1 and OS!=\"mac\"', { + 'variables': { + 'conditions': [ + [ 'target_arch==\"ia32\"', { + 'yasm_flags': [ + '-DX86_32', + '-DELF', + '-DCHROMIUM', + '-Isimd', + ], + }, { + 'yasm_flags': [ + '-DARCH_X86_64', + '-DELF', + '-DPIC', + '-DCHROMIUM', + '-Isimd', + ], + }], + ], + }, + }], + ], + 'variables': { + 'yasm_output_path': '<(SHARED_INTERMEDIATE_DIR)/media', + }, + 'msvs_2010_disable_uldi_when_referenced': 1, + 'includes': [ + '../third_party/yasm/yasm_compile.gypi', + ], + }, + { + 'target_name': 'yuv_convert_simd_arm', + 'type': 'static_library', + 'include_dirs': [ + '..', + ], + 'sources': [ + 'base/simd/convert_rgb_to_yuv_c.cc', + 'base/simd/convert_rgb_to_yuv.h', + 'base/simd/convert_yuv_to_rgb_c.cc', + 'base/simd/convert_yuv_to_rgb.h', + 'base/simd/filter_yuv.h', + 'base/simd/filter_yuv_c.cc', + 'base/simd/yuv_to_rgb_table.cc', + 'base/simd/yuv_to_rgb_table.h', + ], + }, + { + 'target_name': 'media_unittests', + 'type': 'executable', + 'dependencies': [ + 'media', + 'media_test_support', + 'yuv_convert', + '../base/base.gyp:base', + '../base/base.gyp:base_i18n', + '../base/base.gyp:test_support_base', + '../testing/gmock.gyp:gmock', + '../testing/gtest.gyp:gtest', + '../ui/ui.gyp:ui', + ], + 'sources': [ + 'audio/async_socket_io_handler_unittest.cc', + 'audio/audio_input_controller_unittest.cc', + 'audio/audio_input_device_unittest.cc', + 'audio/audio_input_unittest.cc', + 'audio/audio_input_volume_unittest.cc', + 'audio/audio_low_latency_input_output_unittest.cc', + 'audio/audio_output_controller_unittest.cc', + 'audio/audio_output_proxy_unittest.cc', + 'audio/audio_parameters_unittest.cc', + 'audio/audio_util_unittest.cc', + 'audio/cross_process_notification_unittest.cc', + 'audio/linux/alsa_output_unittest.cc', + 'audio/mac/audio_low_latency_input_mac_unittest.cc', + 'audio/mac/audio_output_mac_unittest.cc', + 'audio/simple_sources_unittest.cc', + 'audio/win/audio_low_latency_input_win_unittest.cc', + 'audio/win/audio_low_latency_output_win_unittest.cc', + 'audio/win/audio_output_win_unittest.cc', + 'base/audio_renderer_mixer_unittest.cc', + 'base/audio_renderer_mixer_input_unittest.cc', + 'base/buffers_unittest.cc', + 'base/clock_unittest.cc', + 'base/composite_filter_unittest.cc', + 'base/data_buffer_unittest.cc', + 'base/decoder_buffer_unittest.cc', + 'base/djb2_unittest.cc', + 'base/fake_audio_render_callback.cc', + 'base/fake_audio_render_callback.h', + 'base/filter_collection_unittest.cc', + 'base/h264_bitstream_converter_unittest.cc', + 'base/pipeline_unittest.cc', + 'base/ranges_unittest.cc', + 'base/run_all_unittests.cc', + 'base/seekable_buffer_unittest.cc', + 'base/state_matrix_unittest.cc', + 'base/test_data_util.cc', + 'base/test_data_util.h', + 'base/video_frame_unittest.cc', + 'base/video_util_unittest.cc', + 'base/yuv_convert_unittest.cc', + 'crypto/aes_decryptor_unittest.cc', + 'ffmpeg/ffmpeg_common_unittest.cc', + 'filters/audio_renderer_algorithm_unittest.cc', + 'filters/audio_renderer_impl_unittest.cc', + 'filters/bitstream_converter_unittest.cc', + 'filters/chunk_demuxer_unittest.cc', + 'filters/ffmpeg_audio_decoder_unittest.cc', + 'filters/ffmpeg_decoder_unittest.h', + 'filters/ffmpeg_demuxer_unittest.cc', + 'filters/ffmpeg_glue_unittest.cc', + 'filters/ffmpeg_h264_bitstream_converter_unittest.cc', + 'filters/ffmpeg_video_decoder_unittest.cc', + 'filters/file_data_source_unittest.cc', + 'filters/pipeline_integration_test.cc', + 'filters/pipeline_integration_test_base.cc', + 'filters/source_buffer_stream_unittest.cc', + 'filters/video_renderer_base_unittest.cc', + 'video/capture/video_capture_device_unittest.cc', + 'webm/cluster_builder.cc', + 'webm/cluster_builder.h', + 'webm/webm_cluster_parser_unittest.cc', + 'webm/webm_content_encodings_client_unittest.cc', + 'webm/webm_parser_unittest.cc', + ], + 'conditions': [ + ['os_posix==1 and OS!=\"mac\"', { + 'conditions': [ + ['linux_use_tcmalloc==1', { + 'dependencies': [ + '../base/allocator/allocator.gyp:allocator', + ], + }], + ], + }], + ['OS != \"android\"', { + 'dependencies': [ + '../third_party/ffmpeg/ffmpeg.gyp:ffmpeg', + ], + }], + ['OS == \"android\"', { + 'sources!': [ + 'audio/audio_input_volume_unittest.cc', + 'base/test_data_util.cc', + 'base/test_data_util.h', + 'ffmpeg/ffmpeg_common_unittest.cc', + 'filters/ffmpeg_audio_decoder_unittest.cc', + 'filters/bitstream_converter_unittest.cc', + 'filters/chunk_demuxer_unittest.cc', + 'filters/ffmpeg_demuxer_unittest.cc', + 'filters/ffmpeg_glue_unittest.cc', + 'filters/ffmpeg_h264_bitstream_converter_unittest.cc', + 'filters/ffmpeg_video_decoder_unittest.cc', + 'filters/pipeline_integration_test.cc', + 'filters/pipeline_integration_test_base.cc', + 'mp4/mp4_stream_parser_unittest.cc', + 'webm/webm_cluster_parser_unittest.cc', + ], + }], + ['OS == \"linux\"', { + 'conditions': [ + ['use_cras == 1', { + 'sources': [ + 'audio/linux/cras_output_unittest.cc', + ], + 'defines': [ + 'USE_CRAS', + ], + }], + ], + }], + [ 'target_arch==\"ia32\" or target_arch==\"x64\"', { + 'sources': [ + 'base/simd/convert_rgb_to_yuv_unittest.cc', + ], + }], + ['proprietary_codecs==1 or branding==\"Chrome\"', { + 'sources': [ + 'mp4/avc_unittest.cc', + 'mp4/box_reader_unittest.cc', + 'mp4/mp4_stream_parser_unittest.cc', + 'mp4/offset_byte_queue_unittest.cc', + ], + }], + ], + }, + { + 'target_name': 'media_test_support', + 'type': 'static_library', + 'dependencies': [ + 'media', + '../base/base.gyp:base', + '../testing/gmock.gyp:gmock', + '../testing/gtest.gyp:gtest', + ], + 'sources': [ + 'audio/test_audio_input_controller_factory.cc', + 'audio/test_audio_input_controller_factory.h', + 'base/mock_callback.cc', + 'base/mock_callback.h', + 'base/mock_data_source_host.cc', + 'base/mock_data_source_host.h', + 'base/mock_demuxer_host.cc', + 'base/mock_demuxer_host.h', + 'base/mock_filter_host.cc', + 'base/mock_filter_host.h', + 'base/mock_filters.cc', + 'base/mock_filters.h', + ], + }, + { + 'target_name': 'scaler_bench', + 'type': 'executable', + 'dependencies': [ + 'media', + 'yuv_convert', + '../base/base.gyp:base', + '../skia/skia.gyp:skia', + ], + 'sources': [ + 'tools/scaler_bench/scaler_bench.cc', + ], + }, + { + 'target_name': 'qt_faststart', + 'type': 'executable', + 'sources': [ + 'tools/qt_faststart/qt_faststart.c' + ], + }, + { + 'target_name': 'seek_tester', + 'type': 'executable', + 'dependencies': [ + 'media', + '../base/base.gyp:base', + ], + 'sources': [ + 'tools/seek_tester/seek_tester.cc', + ], + }, + ], + 'conditions': [ + ['OS==\"win\"', { + 'targets': [ + { + 'target_name': 'player_wtl', + 'type': 'executable', + 'dependencies': [ + 'media', + 'yuv_convert', + '../base/base.gyp:base', + '../base/third_party/dynamic_annotations/dynamic_annotations.gyp:dynamic_annotations', + '../ui/ui.gyp:ui', + ], + 'include_dirs': [ + '<(DEPTH)/third_party/wtl/include', + ], + 'sources': [ + 'tools/player_wtl/list.h', + 'tools/player_wtl/mainfrm.h', + 'tools/player_wtl/movie.cc', + 'tools/player_wtl/movie.h', + 'tools/player_wtl/player_wtl.cc', + 'tools/player_wtl/player_wtl.rc', + 'tools/player_wtl/props.h', + 'tools/player_wtl/seek.h', + 'tools/player_wtl/resource.h', + 'tools/player_wtl/view.h', + ], + 'msvs_settings': { + 'VCLinkerTool': { + 'SubSystem': '2', # Set /SUBSYSTEM:WINDOWS + }, + }, + 'defines': [ + '_CRT_SECURE_NO_WARNINGS=1', + ], + }, + ], + }], + ['OS == \"win\" or toolkit_uses_gtk == 1', { + 'targets': [ + { + 'target_name': 'shader_bench', + 'type': 'executable', + 'dependencies': [ + 'media', + 'yuv_convert', + '../base/base.gyp:base', + '../ui/gl/gl.gyp:gl', + ], + 'sources': [ + 'tools/shader_bench/shader_bench.cc', + 'tools/shader_bench/cpu_color_painter.cc', + 'tools/shader_bench/cpu_color_painter.h', + 'tools/shader_bench/gpu_color_painter.cc', + 'tools/shader_bench/gpu_color_painter.h', + 'tools/shader_bench/gpu_painter.cc', + 'tools/shader_bench/gpu_painter.h', + 'tools/shader_bench/painter.cc', + 'tools/shader_bench/painter.h', + 'tools/shader_bench/window.cc', + 'tools/shader_bench/window.h', + ], + 'conditions': [ + ['toolkit_uses_gtk == 1', { + 'dependencies': [ + '../build/linux/system.gyp:gtk', + ], + 'sources': [ + 'tools/shader_bench/window_linux.cc', + ], + }], + ['OS==\"win\"', { + 'dependencies': [ + '../third_party/angle/src/build_angle.gyp:libEGL', + '../third_party/angle/src/build_angle.gyp:libGLESv2', + ], + 'sources': [ + 'tools/shader_bench/window_win.cc', + ], + }], + ], + }, + ], + }], + ['OS == \"linux\" and target_arch != \"arm\"', { + 'targets': [ + { + 'target_name': 'tile_render_bench', + 'type': 'executable', + 'dependencies': [ + '../base/base.gyp:base', + '../ui/gl/gl.gyp:gl', + ], + 'libraries': [ + '-lGL', + '-ldl', + ], + 'sources': [ + 'tools/tile_render_bench/tile_render_bench.cc', + ], + }, + ], + }], + ['os_posix == 1 and OS != \"mac\" and OS != \"android\"', { + 'targets': [ + { + 'target_name': 'player_x11', + 'type': 'executable', + 'dependencies': [ + 'media', + 'yuv_convert', + '../base/base.gyp:base', + '../ui/gl/gl.gyp:gl', + ], + 'link_settings': { + 'libraries': [ + '-ldl', + '-lX11', + '-lXrender', + '-lXext', + ], + }, + 'sources': [ + 'tools/player_x11/data_source_logger.cc', + 'tools/player_x11/data_source_logger.h', + 'tools/player_x11/gl_video_renderer.cc', + 'tools/player_x11/gl_video_renderer.h', + 'tools/player_x11/player_x11.cc', + 'tools/player_x11/x11_video_renderer.cc', + 'tools/player_x11/x11_video_renderer.h', + ], + }, + ], + }], + ['OS == \"android\"', { + 'targets': [ + { + 'target_name': 'player_android', + 'type': 'static_library', + 'sources': [ + 'base/android/media_player_bridge.cc', + 'base/android/media_player_bridge.h', + ], + 'dependencies': [ + '../base/base.gyp:base', + ], + 'include_dirs': [ + '<(SHARED_INTERMEDIATE_DIR)/media', + ], + 'actions': [ + { + 'action_name': 'generate-jni-headers', + 'inputs': [ + '../base/android/jni_generator/jni_generator.py', + 'base/android/java/src/org/chromium/media/MediaPlayerListener.java', + ], + 'outputs': [ + '<(SHARED_INTERMEDIATE_DIR)/media/jni/media_player_listener_jni.h', + ], + 'action': [ + 'python', + '<(DEPTH)/base/android/jni_generator/jni_generator.py', + '-o', + '<@(_inputs)', + '<@(_outputs)', + ], + }, + ], + }, + { + 'target_name': 'media_java', + 'type': 'none', + 'dependencies': [ '../base/base.gyp:base_java' ], + 'variables': { + 'package_name': 'media', + 'java_in_dir': 'base/android/java', + }, + 'includes': [ '../build/java.gypi' ], + }, + + ], + }, { # OS != \"android\"' + # Android does not use ffmpeg, so disable the targets which require it. + 'targets': [ + { + 'target_name': 'ffmpeg_unittests', + 'type': 'executable', + 'dependencies': [ + 'media', + 'media_test_support', + '../base/base.gyp:base', + '../base/base.gyp:base_i18n', + '../base/base.gyp:test_support_base', + '../base/base.gyp:test_support_perf', + '../testing/gtest.gyp:gtest', + '../third_party/ffmpeg/ffmpeg.gyp:ffmpeg', + ], + 'sources': [ + 'ffmpeg/ffmpeg_unittest.cc', + ], + 'conditions': [ + ['toolkit_uses_gtk == 1', { + 'dependencies': [ + # Needed for the following #include chain: + # base/run_all_unittests.cc + # ../base/test_suite.h + # gtk/gtk.h + '../build/linux/system.gyp:gtk', + ], + 'conditions': [ + ['linux_use_tcmalloc==1', { + 'dependencies': [ + '../base/allocator/allocator.gyp:allocator', + ], + }], + ], + }], + ], + }, + { + 'target_name': 'ffmpeg_regression_tests', + 'type': 'executable', + 'dependencies': [ + 'media', + 'media_test_support', + '../base/base.gyp:test_support_base', + '../testing/gmock.gyp:gmock', + '../testing/gtest.gyp:gtest', + '../third_party/ffmpeg/ffmpeg.gyp:ffmpeg', + ], + 'sources': [ + 'base/test_data_util.cc', + 'base/run_all_unittests.cc', + 'ffmpeg/ffmpeg_regression_tests.cc', + 'filters/pipeline_integration_test_base.cc', + ], + 'conditions': [ + ['os_posix==1 and OS!=\"mac\"', { + 'conditions': [ + ['linux_use_tcmalloc==1', { + 'dependencies': [ + '../base/allocator/allocator.gyp:allocator', + ], + }], + ], + }], + ], + }, + { + 'target_name': 'ffmpeg_tests', + 'type': 'executable', + 'dependencies': [ + 'media', + '../base/base.gyp:base', + '../third_party/ffmpeg/ffmpeg.gyp:ffmpeg', + ], + 'sources': [ + 'test/ffmpeg_tests/ffmpeg_tests.cc', + ], + }, + { + 'target_name': 'media_bench', + 'type': 'executable', + 'dependencies': [ + 'media', + '../base/base.gyp:base', + '../third_party/ffmpeg/ffmpeg.gyp:ffmpeg', + ], + 'sources': [ + 'tools/media_bench/media_bench.cc', + ], + }, + ], + }] + ], +} +" 0 64 (face font-lock-comment-face) 64 137 (face font-lock-comment-face) 137 166 (face font-lock-comment-face) 166 171 nil 171 172 (face font-lock-string-face) 172 181 (face font-lock-keyword-face) 181 182 (face font-lock-string-face) 182 190 nil 190 191 (face font-lock-string-face) 191 204 (face font-lock-variable-name-face) 204 205 (face font-lock-string-face) 205 214 nil 214 269 (face font-lock-comment-face) 269 273 nil 273 274 (face font-lock-string-face) 274 289 (face font-lock-variable-name-face) 289 290 (face font-lock-string-face) 290 299 nil 299 365 (face font-lock-comment-face) 365 369 nil 369 370 (face font-lock-string-face) 370 379 (face font-lock-variable-name-face) 379 380 (face font-lock-string-face) 380 392 nil 392 393 (face font-lock-string-face) 393 400 (face font-lock-keyword-face) 400 401 (face font-lock-string-face) 401 417 nil 417 418 (face font-lock-string-face) 418 429 (face font-lock-keyword-face) 429 430 (face font-lock-string-face) 430 432 nil 432 433 (face font-lock-string-face) 433 438 (face font-lock-function-name-face) 438 439 (face font-lock-string-face) 439 447 nil 447 448 (face font-lock-string-face) 448 452 (face font-lock-keyword-face) 452 453 (face font-lock-string-face) 453 455 nil 455 458 (face font-lock-string-face) 458 467 (face font-lock-variable-name-face) 467 469 (face font-lock-string-face) 469 477 nil 477 478 (face font-lock-string-face) 478 490 (face font-lock-keyword-face) 490 491 (face font-lock-string-face) 491 503 nil 503 504 (face font-lock-string-face) 504 515 (face font-lock-function-name-face) 515 516 (face font-lock-string-face) 516 526 nil 526 527 (face font-lock-string-face) 527 548 (face font-lock-function-name-face) 548 549 (face font-lock-string-face) 549 559 nil 559 560 (face font-lock-string-face) 560 643 (face font-lock-function-name-face) 643 644 (face font-lock-string-face) 644 654 nil 654 655 (face font-lock-string-face) 655 696 (face font-lock-function-name-face) 696 697 (face font-lock-string-face) 697 707 nil 707 708 (face font-lock-string-face) 708 735 (face font-lock-function-name-face) 735 736 (face font-lock-string-face) 736 746 nil 746 747 (face font-lock-string-face) 747 784 (face font-lock-function-name-face) 784 785 (face font-lock-string-face) 785 795 nil 795 796 (face font-lock-string-face) 796 811 (face font-lock-function-name-face) 811 812 (face font-lock-string-face) 812 829 nil 829 830 (face font-lock-string-face) 830 837 (face font-lock-keyword-face) 837 838 (face font-lock-string-face) 838 850 nil 850 851 (face font-lock-string-face) 851 871 (face font-lock-preprocessor-face) 871 872 (face font-lock-string-face) 872 889 nil 889 890 (face font-lock-string-face) 890 902 (face font-lock-keyword-face) 902 903 (face font-lock-string-face) 903 915 nil 915 916 (face font-lock-string-face) 916 918 (face font-lock-constant-face) 918 919 (face font-lock-string-face) 919 936 nil 936 937 (face font-lock-string-face) 937 944 (face font-lock-keyword-face) 944 945 (face font-lock-string-face) 945 957 nil 957 958 (face font-lock-string-face) 958 996 (face font-lock-constant-face) 996 997 (face font-lock-string-face) 997 1007 nil 1007 1008 (face font-lock-string-face) 1008 1045 (face font-lock-constant-face) 1045 1046 (face font-lock-string-face) 1046 1056 nil 1056 1057 (face font-lock-string-face) 1057 1100 (face font-lock-constant-face) 1100 1101 (face font-lock-string-face) 1101 1111 nil 1111 1112 (face font-lock-string-face) 1112 1154 (face font-lock-constant-face) 1154 1155 (face font-lock-string-face) 1155 1165 nil 1165 1166 (face font-lock-string-face) 1166 1197 (face font-lock-constant-face) 1197 1198 (face font-lock-string-face) 1198 1208 nil 1208 1209 (face font-lock-string-face) 1209 1239 (face font-lock-constant-face) 1239 1240 (face font-lock-string-face) 1240 1250 nil 1250 1251 (face font-lock-string-face) 1251 1283 (face font-lock-constant-face) 1283 1284 (face font-lock-string-face) 1284 1294 nil 1294 1295 (face font-lock-string-face) 1295 1326 (face font-lock-constant-face) 1326 1327 (face font-lock-string-face) 1327 1337 nil 1337 1338 (face font-lock-string-face) 1338 1369 (face font-lock-constant-face) 1369 1370 (face font-lock-string-face) 1370 1380 nil 1380 1381 (face font-lock-string-face) 1381 1419 (face font-lock-constant-face) 1419 1420 (face font-lock-string-face) 1420 1430 nil 1430 1431 (face font-lock-string-face) 1431 1467 (face font-lock-constant-face) 1467 1468 (face font-lock-string-face) 1468 1478 nil 1478 1479 (face font-lock-string-face) 1479 1507 (face font-lock-constant-face) 1507 1508 (face font-lock-string-face) 1508 1518 nil 1518 1519 (face font-lock-string-face) 1519 1546 (face font-lock-constant-face) 1546 1547 (face font-lock-string-face) 1547 1557 nil 1557 1558 (face font-lock-string-face) 1558 1574 (face font-lock-constant-face) 1574 1575 (face font-lock-string-face) 1575 1585 nil 1585 1586 (face font-lock-string-face) 1586 1617 (face font-lock-constant-face) 1617 1618 (face font-lock-string-face) 1618 1628 nil 1628 1629 (face font-lock-string-face) 1629 1659 (face font-lock-constant-face) 1659 1660 (face font-lock-string-face) 1660 1670 nil 1670 1671 (face font-lock-string-face) 1671 1703 (face font-lock-constant-face) 1703 1704 (face font-lock-string-face) 1704 1714 nil 1714 1715 (face font-lock-string-face) 1715 1746 (face font-lock-constant-face) 1746 1747 (face font-lock-string-face) 1747 1757 nil 1757 1758 (face font-lock-string-face) 1758 1784 (face font-lock-constant-face) 1784 1785 (face font-lock-string-face) 1785 1795 nil 1795 1796 (face font-lock-string-face) 1796 1821 (face font-lock-constant-face) 1821 1822 (face font-lock-string-face) 1822 1832 nil 1832 1833 (face font-lock-string-face) 1833 1855 (face font-lock-constant-face) 1855 1856 (face font-lock-string-face) 1856 1866 nil 1866 1867 (face font-lock-string-face) 1867 1888 (face font-lock-constant-face) 1888 1889 (face font-lock-string-face) 1889 1899 nil 1899 1900 (face font-lock-string-face) 1900 1927 (face font-lock-constant-face) 1927 1928 (face font-lock-string-face) 1928 1938 nil 1938 1939 (face font-lock-string-face) 1939 1965 (face font-lock-constant-face) 1965 1966 (face font-lock-string-face) 1966 1976 nil 1976 1977 (face font-lock-string-face) 1977 2009 (face font-lock-constant-face) 2009 2010 (face font-lock-string-face) 2010 2020 nil 2020 2021 (face font-lock-string-face) 2021 2052 (face font-lock-constant-face) 2052 2053 (face font-lock-string-face) 2053 2063 nil 2063 2064 (face font-lock-string-face) 2064 2096 (face font-lock-constant-face) 2096 2097 (face font-lock-string-face) 2097 2107 nil 2107 2108 (face font-lock-string-face) 2108 2139 (face font-lock-constant-face) 2139 2140 (face font-lock-string-face) 2140 2150 nil 2150 2151 (face font-lock-string-face) 2151 2188 (face font-lock-constant-face) 2188 2189 (face font-lock-string-face) 2189 2199 nil 2199 2200 (face font-lock-string-face) 2200 2236 (face font-lock-constant-face) 2236 2237 (face font-lock-string-face) 2237 2247 nil 2247 2248 (face font-lock-string-face) 2248 2275 (face font-lock-constant-face) 2275 2276 (face font-lock-string-face) 2276 2286 nil 2286 2287 (face font-lock-string-face) 2287 2313 (face font-lock-constant-face) 2313 2314 (face font-lock-string-face) 2314 2324 nil 2324 2325 (face font-lock-string-face) 2325 2352 (face font-lock-constant-face) 2352 2353 (face font-lock-string-face) 2353 2363 nil 2363 2364 (face font-lock-string-face) 2364 2390 (face font-lock-constant-face) 2390 2391 (face font-lock-string-face) 2391 2401 nil 2401 2402 (face font-lock-string-face) 2402 2427 (face font-lock-constant-face) 2427 2428 (face font-lock-string-face) 2428 2438 nil 2438 2439 (face font-lock-string-face) 2439 2463 (face font-lock-constant-face) 2463 2464 (face font-lock-string-face) 2464 2474 nil 2474 2475 (face font-lock-string-face) 2475 2494 (face font-lock-constant-face) 2494 2495 (face font-lock-string-face) 2495 2505 nil 2505 2506 (face font-lock-string-face) 2506 2524 (face font-lock-constant-face) 2524 2525 (face font-lock-string-face) 2525 2535 nil 2535 2536 (face font-lock-string-face) 2536 2571 (face font-lock-constant-face) 2571 2572 (face font-lock-string-face) 2572 2582 nil 2582 2583 (face font-lock-string-face) 2583 2617 (face font-lock-constant-face) 2617 2618 (face font-lock-string-face) 2618 2628 nil 2628 2629 (face font-lock-string-face) 2629 2668 (face font-lock-constant-face) 2668 2669 (face font-lock-string-face) 2669 2679 nil 2679 2680 (face font-lock-string-face) 2680 2721 (face font-lock-constant-face) 2721 2722 (face font-lock-string-face) 2722 2732 nil 2732 2733 (face font-lock-string-face) 2733 2765 (face font-lock-constant-face) 2765 2766 (face font-lock-string-face) 2766 2776 nil 2776 2777 (face font-lock-string-face) 2777 2808 (face font-lock-constant-face) 2808 2809 (face font-lock-string-face) 2809 2819 nil 2819 2820 (face font-lock-string-face) 2820 2853 (face font-lock-constant-face) 2853 2854 (face font-lock-string-face) 2854 2864 nil 2864 2865 (face font-lock-string-face) 2865 2897 (face font-lock-constant-face) 2897 2898 (face font-lock-string-face) 2898 2908 nil 2908 2909 (face font-lock-string-face) 2909 2943 (face font-lock-constant-face) 2943 2944 (face font-lock-string-face) 2944 2954 nil 2954 2955 (face font-lock-string-face) 2955 2988 (face font-lock-constant-face) 2988 2989 (face font-lock-string-face) 2989 2999 nil 2999 3000 (face font-lock-string-face) 3000 3025 (face font-lock-constant-face) 3025 3026 (face font-lock-string-face) 3026 3036 nil 3036 3037 (face font-lock-string-face) 3037 3061 (face font-lock-constant-face) 3061 3062 (face font-lock-string-face) 3062 3072 nil 3072 3073 (face font-lock-string-face) 3073 3099 (face font-lock-constant-face) 3099 3100 (face font-lock-string-face) 3100 3110 nil 3110 3111 (face font-lock-string-face) 3111 3136 (face font-lock-constant-face) 3136 3137 (face font-lock-string-face) 3137 3147 nil 3147 3148 (face font-lock-string-face) 3148 3172 (face font-lock-constant-face) 3172 3173 (face font-lock-string-face) 3173 3183 nil 3183 3184 (face font-lock-string-face) 3184 3207 (face font-lock-constant-face) 3207 3208 (face font-lock-string-face) 3208 3218 nil 3218 3219 (face font-lock-string-face) 3219 3246 (face font-lock-constant-face) 3246 3247 (face font-lock-string-face) 3247 3257 nil 3257 3258 (face font-lock-string-face) 3258 3284 (face font-lock-constant-face) 3284 3285 (face font-lock-string-face) 3285 3295 nil 3295 3296 (face font-lock-string-face) 3296 3322 (face font-lock-constant-face) 3322 3323 (face font-lock-string-face) 3323 3333 nil 3333 3334 (face font-lock-string-face) 3334 3359 (face font-lock-constant-face) 3359 3360 (face font-lock-string-face) 3360 3370 nil 3370 3371 (face font-lock-string-face) 3371 3409 (face font-lock-constant-face) 3409 3410 (face font-lock-string-face) 3410 3420 nil 3420 3421 (face font-lock-string-face) 3421 3458 (face font-lock-constant-face) 3458 3459 (face font-lock-string-face) 3459 3469 nil 3469 3470 (face font-lock-string-face) 3470 3498 (face font-lock-constant-face) 3498 3499 (face font-lock-string-face) 3499 3509 nil 3509 3510 (face font-lock-string-face) 3510 3537 (face font-lock-constant-face) 3537 3538 (face font-lock-string-face) 3538 3548 nil 3548 3549 (face font-lock-string-face) 3549 3589 (face font-lock-constant-face) 3589 3590 (face font-lock-string-face) 3590 3600 nil 3600 3601 (face font-lock-string-face) 3601 3640 (face font-lock-constant-face) 3640 3641 (face font-lock-string-face) 3641 3651 nil 3651 3652 (face font-lock-string-face) 3652 3693 (face font-lock-constant-face) 3693 3694 (face font-lock-string-face) 3694 3704 nil 3704 3705 (face font-lock-string-face) 3705 3745 (face font-lock-constant-face) 3745 3746 (face font-lock-string-face) 3746 3756 nil 3756 3757 (face font-lock-string-face) 3757 3787 (face font-lock-constant-face) 3787 3788 (face font-lock-string-face) 3788 3798 nil 3798 3799 (face font-lock-string-face) 3799 3828 (face font-lock-constant-face) 3828 3829 (face font-lock-string-face) 3829 3839 nil 3839 3840 (face font-lock-string-face) 3840 3869 (face font-lock-constant-face) 3869 3870 (face font-lock-string-face) 3870 3880 nil 3880 3881 (face font-lock-string-face) 3881 3909 (face font-lock-constant-face) 3909 3910 (face font-lock-string-face) 3910 3920 nil 3920 3921 (face font-lock-string-face) 3921 3945 (face font-lock-constant-face) 3945 3946 (face font-lock-string-face) 3946 3956 nil 3956 3957 (face font-lock-string-face) 3957 3980 (face font-lock-constant-face) 3980 3981 (face font-lock-string-face) 3981 3991 nil 3991 3992 (face font-lock-string-face) 3992 4019 (face font-lock-constant-face) 4019 4020 (face font-lock-string-face) 4020 4030 nil 4030 4031 (face font-lock-string-face) 4031 4057 (face font-lock-constant-face) 4057 4058 (face font-lock-string-face) 4058 4068 nil 4068 4069 (face font-lock-string-face) 4069 4090 (face font-lock-constant-face) 4090 4091 (face font-lock-string-face) 4091 4101 nil 4101 4102 (face font-lock-string-face) 4102 4122 (face font-lock-constant-face) 4122 4123 (face font-lock-string-face) 4123 4133 nil 4133 4134 (face font-lock-string-face) 4134 4157 (face font-lock-constant-face) 4157 4158 (face font-lock-string-face) 4158 4168 nil 4168 4169 (face font-lock-string-face) 4169 4191 (face font-lock-constant-face) 4191 4192 (face font-lock-string-face) 4192 4202 nil 4202 4203 (face font-lock-string-face) 4203 4243 (face font-lock-constant-face) 4243 4244 (face font-lock-string-face) 4244 4254 nil 4254 4255 (face font-lock-string-face) 4255 4294 (face font-lock-constant-face) 4294 4295 (face font-lock-string-face) 4295 4305 nil 4305 4306 (face font-lock-string-face) 4306 4347 (face font-lock-constant-face) 4347 4348 (face font-lock-string-face) 4348 4358 nil 4358 4359 (face font-lock-string-face) 4359 4399 (face font-lock-constant-face) 4399 4400 (face font-lock-string-face) 4400 4410 nil 4410 4411 (face font-lock-string-face) 4411 4441 (face font-lock-constant-face) 4441 4442 (face font-lock-string-face) 4442 4452 nil 4452 4453 (face font-lock-string-face) 4453 4482 (face font-lock-constant-face) 4482 4483 (face font-lock-string-face) 4483 4493 nil 4493 4494 (face font-lock-string-face) 4494 4523 (face font-lock-constant-face) 4523 4524 (face font-lock-string-face) 4524 4534 nil 4534 4535 (face font-lock-string-face) 4535 4563 (face font-lock-constant-face) 4563 4564 (face font-lock-string-face) 4564 4574 nil 4574 4575 (face font-lock-string-face) 4575 4610 (face font-lock-constant-face) 4610 4611 (face font-lock-string-face) 4611 4621 nil 4621 4622 (face font-lock-string-face) 4622 4656 (face font-lock-constant-face) 4656 4657 (face font-lock-string-face) 4657 4667 nil 4667 4668 (face font-lock-string-face) 4668 4697 (face font-lock-constant-face) 4697 4698 (face font-lock-string-face) 4698 4708 nil 4708 4709 (face font-lock-string-face) 4709 4737 (face font-lock-constant-face) 4737 4738 (face font-lock-string-face) 4738 4748 nil 4748 4749 (face font-lock-string-face) 4749 4780 (face font-lock-constant-face) 4780 4781 (face font-lock-string-face) 4781 4791 nil 4791 4792 (face font-lock-string-face) 4792 4822 (face font-lock-constant-face) 4822 4823 (face font-lock-string-face) 4823 4833 nil 4833 4834 (face font-lock-string-face) 4834 4869 (face font-lock-constant-face) 4869 4870 (face font-lock-string-face) 4870 4880 nil 4880 4881 (face font-lock-string-face) 4881 4915 (face font-lock-constant-face) 4915 4916 (face font-lock-string-face) 4916 4926 nil 4926 4927 (face font-lock-string-face) 4927 4948 (face font-lock-constant-face) 4948 4949 (face font-lock-string-face) 4949 4959 nil 4959 4960 (face font-lock-string-face) 4960 4980 (face font-lock-constant-face) 4980 4981 (face font-lock-string-face) 4981 4991 nil 4991 4992 (face font-lock-string-face) 4992 5020 (face font-lock-constant-face) 5020 5021 (face font-lock-string-face) 5021 5031 nil 5031 5032 (face font-lock-string-face) 5032 5059 (face font-lock-constant-face) 5059 5060 (face font-lock-string-face) 5060 5070 nil 5070 5071 (face font-lock-string-face) 5071 5092 (face font-lock-constant-face) 5092 5093 (face font-lock-string-face) 5093 5103 nil 5103 5104 (face font-lock-string-face) 5104 5132 (face font-lock-constant-face) 5132 5133 (face font-lock-string-face) 5133 5143 nil 5143 5144 (face font-lock-string-face) 5144 5171 (face font-lock-constant-face) 5171 5172 (face font-lock-string-face) 5172 5182 nil 5182 5183 (face font-lock-string-face) 5183 5217 (face font-lock-constant-face) 5217 5218 (face font-lock-string-face) 5218 5228 nil 5228 5229 (face font-lock-string-face) 5229 5262 (face font-lock-constant-face) 5262 5263 (face font-lock-string-face) 5263 5273 nil 5273 5274 (face font-lock-string-face) 5274 5297 (face font-lock-constant-face) 5297 5298 (face font-lock-string-face) 5298 5308 nil 5308 5309 (face font-lock-string-face) 5309 5324 (face font-lock-constant-face) 5324 5325 (face font-lock-string-face) 5325 5335 nil 5335 5336 (face font-lock-string-face) 5336 5350 (face font-lock-constant-face) 5350 5351 (face font-lock-string-face) 5351 5361 nil 5361 5362 (face font-lock-string-face) 5362 5380 (face font-lock-constant-face) 5380 5381 (face font-lock-string-face) 5381 5391 nil 5391 5392 (face font-lock-string-face) 5392 5409 (face font-lock-constant-face) 5409 5410 (face font-lock-string-face) 5410 5420 nil 5420 5421 (face font-lock-string-face) 5421 5443 (face font-lock-constant-face) 5443 5444 (face font-lock-string-face) 5444 5454 nil 5454 5455 (face font-lock-string-face) 5455 5476 (face font-lock-constant-face) 5476 5477 (face font-lock-string-face) 5477 5487 nil 5487 5488 (face font-lock-string-face) 5488 5501 (face font-lock-constant-face) 5501 5502 (face font-lock-string-face) 5502 5512 nil 5512 5513 (face font-lock-string-face) 5513 5525 (face font-lock-constant-face) 5525 5526 (face font-lock-string-face) 5526 5536 nil 5536 5537 (face font-lock-string-face) 5537 5561 (face font-lock-constant-face) 5561 5562 (face font-lock-string-face) 5562 5572 nil 5572 5573 (face font-lock-string-face) 5573 5596 (face font-lock-constant-face) 5596 5597 (face font-lock-string-face) 5597 5607 nil 5607 5608 (face font-lock-string-face) 5608 5627 (face font-lock-constant-face) 5627 5628 (face font-lock-string-face) 5628 5638 nil 5638 5639 (face font-lock-string-face) 5639 5657 (face font-lock-constant-face) 5657 5658 (face font-lock-string-face) 5658 5668 nil 5668 5669 (face font-lock-string-face) 5669 5688 (face font-lock-constant-face) 5688 5689 (face font-lock-string-face) 5689 5699 nil 5699 5700 (face font-lock-string-face) 5700 5718 (face font-lock-constant-face) 5718 5719 (face font-lock-string-face) 5719 5729 nil 5729 5730 (face font-lock-string-face) 5730 5752 (face font-lock-constant-face) 5752 5753 (face font-lock-string-face) 5753 5763 nil 5763 5764 (face font-lock-string-face) 5764 5785 (face font-lock-constant-face) 5785 5786 (face font-lock-string-face) 5786 5796 nil 5796 5797 (face font-lock-string-face) 5797 5819 (face font-lock-constant-face) 5819 5820 (face font-lock-string-face) 5820 5830 nil 5830 5831 (face font-lock-string-face) 5831 5852 (face font-lock-constant-face) 5852 5853 (face font-lock-string-face) 5853 5863 nil 5863 5864 (face font-lock-string-face) 5864 5880 (face font-lock-constant-face) 5880 5881 (face font-lock-string-face) 5881 5891 nil 5891 5892 (face font-lock-string-face) 5892 5915 (face font-lock-constant-face) 5915 5916 (face font-lock-string-face) 5916 5926 nil 5926 5927 (face font-lock-string-face) 5927 5942 (face font-lock-constant-face) 5942 5943 (face font-lock-string-face) 5943 5953 nil 5953 5954 (face font-lock-string-face) 5954 5968 (face font-lock-constant-face) 5968 5969 (face font-lock-string-face) 5969 5979 nil 5979 5980 (face font-lock-string-face) 5980 6002 (face font-lock-constant-face) 6002 6003 (face font-lock-string-face) 6003 6013 nil 6013 6014 (face font-lock-string-face) 6014 6035 (face font-lock-constant-face) 6035 6036 (face font-lock-string-face) 6036 6046 nil 6046 6047 (face font-lock-string-face) 6047 6059 (face font-lock-constant-face) 6059 6060 (face font-lock-string-face) 6060 6070 nil 6070 6071 (face font-lock-string-face) 6071 6082 (face font-lock-constant-face) 6082 6083 (face font-lock-string-face) 6083 6093 nil 6093 6094 (face font-lock-string-face) 6094 6119 (face font-lock-constant-face) 6119 6120 (face font-lock-string-face) 6120 6130 nil 6130 6131 (face font-lock-string-face) 6131 6155 (face font-lock-constant-face) 6155 6156 (face font-lock-string-face) 6156 6166 nil 6166 6167 (face font-lock-string-face) 6167 6185 (face font-lock-constant-face) 6185 6186 (face font-lock-string-face) 6186 6196 nil 6196 6197 (face font-lock-string-face) 6197 6212 (face font-lock-constant-face) 6212 6213 (face font-lock-string-face) 6213 6223 nil 6223 6224 (face font-lock-string-face) 6224 6238 (face font-lock-constant-face) 6238 6239 (face font-lock-string-face) 6239 6249 nil 6249 6250 (face font-lock-string-face) 6250 6282 (face font-lock-constant-face) 6282 6283 (face font-lock-string-face) 6283 6293 nil 6293 6294 (face font-lock-string-face) 6294 6325 (face font-lock-constant-face) 6325 6326 (face font-lock-string-face) 6326 6336 nil 6336 6337 (face font-lock-string-face) 6337 6349 (face font-lock-constant-face) 6349 6350 (face font-lock-string-face) 6350 6360 nil 6360 6361 (face font-lock-string-face) 6361 6382 (face font-lock-constant-face) 6382 6383 (face font-lock-string-face) 6383 6393 nil 6393 6394 (face font-lock-string-face) 6394 6413 (face font-lock-constant-face) 6413 6414 (face font-lock-string-face) 6414 6424 nil 6424 6425 (face font-lock-string-face) 6425 6442 (face font-lock-constant-face) 6442 6443 (face font-lock-string-face) 6443 6453 nil 6453 6454 (face font-lock-string-face) 6454 6470 (face font-lock-constant-face) 6470 6471 (face font-lock-string-face) 6471 6481 nil 6481 6482 (face font-lock-string-face) 6482 6504 (face font-lock-constant-face) 6504 6505 (face font-lock-string-face) 6505 6515 nil 6515 6516 (face font-lock-string-face) 6516 6535 (face font-lock-constant-face) 6535 6536 (face font-lock-string-face) 6536 6546 nil 6546 6547 (face font-lock-string-face) 6547 6569 (face font-lock-constant-face) 6569 6570 (face font-lock-string-face) 6570 6580 nil 6580 6581 (face font-lock-string-face) 6581 6602 (face font-lock-constant-face) 6602 6603 (face font-lock-string-face) 6603 6613 nil 6613 6614 (face font-lock-string-face) 6614 6631 (face font-lock-constant-face) 6631 6632 (face font-lock-string-face) 6632 6642 nil 6642 6643 (face font-lock-string-face) 6643 6671 (face font-lock-constant-face) 6671 6672 (face font-lock-string-face) 6672 6682 nil 6682 6683 (face font-lock-string-face) 6683 6710 (face font-lock-constant-face) 6710 6711 (face font-lock-string-face) 6711 6721 nil 6721 6722 (face font-lock-string-face) 6722 6738 (face font-lock-constant-face) 6738 6739 (face font-lock-string-face) 6739 6749 nil 6749 6750 (face font-lock-string-face) 6750 6765 (face font-lock-constant-face) 6765 6766 (face font-lock-string-face) 6766 6776 nil 6776 6777 (face font-lock-string-face) 6777 6800 (face font-lock-constant-face) 6800 6801 (face font-lock-string-face) 6801 6811 nil 6811 6812 (face font-lock-string-face) 6812 6834 (face font-lock-constant-face) 6834 6835 (face font-lock-string-face) 6835 6845 nil 6845 6846 (face font-lock-string-face) 6846 6860 (face font-lock-constant-face) 6860 6861 (face font-lock-string-face) 6861 6871 nil 6871 6872 (face font-lock-string-face) 6872 6885 (face font-lock-constant-face) 6885 6886 (face font-lock-string-face) 6886 6896 nil 6896 6897 (face font-lock-string-face) 6897 6920 (face font-lock-constant-face) 6920 6921 (face font-lock-string-face) 6921 6931 nil 6931 6932 (face font-lock-string-face) 6932 6954 (face font-lock-constant-face) 6954 6955 (face font-lock-string-face) 6955 6965 nil 6965 6966 (face font-lock-string-face) 6966 6986 (face font-lock-constant-face) 6986 6987 (face font-lock-string-face) 6987 6997 nil 6997 6998 (face font-lock-string-face) 6998 7017 (face font-lock-constant-face) 7017 7018 (face font-lock-string-face) 7018 7028 nil 7028 7029 (face font-lock-string-face) 7029 7050 (face font-lock-constant-face) 7050 7051 (face font-lock-string-face) 7051 7061 nil 7061 7062 (face font-lock-string-face) 7062 7082 (face font-lock-constant-face) 7082 7083 (face font-lock-string-face) 7083 7093 nil 7093 7094 (face font-lock-string-face) 7094 7122 (face font-lock-constant-face) 7122 7123 (face font-lock-string-face) 7123 7133 nil 7133 7134 (face font-lock-string-face) 7134 7161 (face font-lock-constant-face) 7161 7162 (face font-lock-string-face) 7162 7172 nil 7172 7173 (face font-lock-string-face) 7173 7194 (face font-lock-constant-face) 7194 7195 (face font-lock-string-face) 7195 7205 nil 7205 7206 (face font-lock-string-face) 7206 7226 (face font-lock-constant-face) 7226 7227 (face font-lock-string-face) 7227 7237 nil 7237 7238 (face font-lock-string-face) 7238 7266 (face font-lock-constant-face) 7266 7267 (face font-lock-string-face) 7267 7277 nil 7277 7278 (face font-lock-string-face) 7278 7305 (face font-lock-constant-face) 7305 7306 (face font-lock-string-face) 7306 7316 nil 7316 7317 (face font-lock-string-face) 7317 7336 (face font-lock-constant-face) 7336 7337 (face font-lock-string-face) 7337 7347 nil 7347 7348 (face font-lock-string-face) 7348 7366 (face font-lock-constant-face) 7366 7367 (face font-lock-string-face) 7367 7377 nil 7377 7378 (face font-lock-string-face) 7378 7399 (face font-lock-constant-face) 7399 7400 (face font-lock-string-face) 7400 7410 nil 7410 7411 (face font-lock-string-face) 7411 7429 (face font-lock-constant-face) 7429 7430 (face font-lock-string-face) 7430 7440 nil 7440 7441 (face font-lock-string-face) 7441 7458 (face font-lock-constant-face) 7458 7459 (face font-lock-string-face) 7459 7469 nil 7469 7470 (face font-lock-string-face) 7470 7493 (face font-lock-constant-face) 7493 7494 (face font-lock-string-face) 7494 7504 nil 7504 7505 (face font-lock-string-face) 7505 7527 (face font-lock-constant-face) 7527 7528 (face font-lock-string-face) 7528 7538 nil 7538 7539 (face font-lock-string-face) 7539 7562 (face font-lock-constant-face) 7562 7563 (face font-lock-string-face) 7563 7573 nil 7573 7574 (face font-lock-string-face) 7574 7596 (face font-lock-constant-face) 7596 7597 (face font-lock-string-face) 7597 7607 nil 7607 7608 (face font-lock-string-face) 7608 7631 (face font-lock-constant-face) 7631 7632 (face font-lock-string-face) 7632 7642 nil 7642 7643 (face font-lock-string-face) 7643 7665 (face font-lock-constant-face) 7665 7666 (face font-lock-string-face) 7666 7676 nil 7676 7677 (face font-lock-string-face) 7677 7705 (face font-lock-constant-face) 7705 7706 (face font-lock-string-face) 7706 7716 nil 7716 7717 (face font-lock-string-face) 7717 7744 (face font-lock-constant-face) 7744 7745 (face font-lock-string-face) 7745 7755 nil 7755 7756 (face font-lock-string-face) 7756 7791 (face font-lock-constant-face) 7791 7792 (face font-lock-string-face) 7792 7802 nil 7802 7803 (face font-lock-string-face) 7803 7837 (face font-lock-constant-face) 7837 7838 (face font-lock-string-face) 7838 7848 nil 7848 7849 (face font-lock-string-face) 7849 7879 (face font-lock-constant-face) 7879 7880 (face font-lock-string-face) 7880 7890 nil 7890 7891 (face font-lock-string-face) 7891 7920 (face font-lock-constant-face) 7920 7921 (face font-lock-string-face) 7921 7931 nil 7931 7932 (face font-lock-string-face) 7932 7962 (face font-lock-constant-face) 7962 7963 (face font-lock-string-face) 7963 7973 nil 7973 7974 (face font-lock-string-face) 7974 8003 (face font-lock-constant-face) 8003 8004 (face font-lock-string-face) 8004 8014 nil 8014 8015 (face font-lock-string-face) 8015 8039 (face font-lock-constant-face) 8039 8040 (face font-lock-string-face) 8040 8050 nil 8050 8051 (face font-lock-string-face) 8051 8074 (face font-lock-constant-face) 8074 8075 (face font-lock-string-face) 8075 8085 nil 8085 8086 (face font-lock-string-face) 8086 8116 (face font-lock-constant-face) 8116 8117 (face font-lock-string-face) 8117 8127 nil 8127 8128 (face font-lock-string-face) 8128 8152 (face font-lock-constant-face) 8152 8153 (face font-lock-string-face) 8153 8163 nil 8163 8164 (face font-lock-string-face) 8164 8187 (face font-lock-constant-face) 8187 8188 (face font-lock-string-face) 8188 8198 nil 8198 8199 (face font-lock-string-face) 8199 8230 (face font-lock-constant-face) 8230 8231 (face font-lock-string-face) 8231 8241 nil 8241 8242 (face font-lock-string-face) 8242 8272 (face font-lock-constant-face) 8272 8273 (face font-lock-string-face) 8273 8283 nil 8283 8284 (face font-lock-string-face) 8284 8309 (face font-lock-constant-face) 8309 8310 (face font-lock-string-face) 8310 8320 nil 8320 8321 (face font-lock-string-face) 8321 8345 (face font-lock-constant-face) 8345 8346 (face font-lock-string-face) 8346 8356 nil 8356 8357 (face font-lock-string-face) 8357 8399 (face font-lock-constant-face) 8399 8400 (face font-lock-string-face) 8400 8410 nil 8410 8411 (face font-lock-string-face) 8411 8452 (face font-lock-constant-face) 8452 8453 (face font-lock-string-face) 8453 8463 nil 8463 8464 (face font-lock-string-face) 8464 8486 (face font-lock-constant-face) 8486 8487 (face font-lock-string-face) 8487 8497 nil 8497 8498 (face font-lock-string-face) 8498 8519 (face font-lock-constant-face) 8519 8520 (face font-lock-string-face) 8520 8530 nil 8530 8531 (face font-lock-string-face) 8531 8562 (face font-lock-constant-face) 8562 8563 (face font-lock-string-face) 8563 8573 nil 8573 8574 (face font-lock-string-face) 8574 8604 (face font-lock-constant-face) 8604 8605 (face font-lock-string-face) 8605 8615 nil 8615 8616 (face font-lock-string-face) 8616 8643 (face font-lock-constant-face) 8643 8644 (face font-lock-string-face) 8644 8654 nil 8654 8655 (face font-lock-string-face) 8655 8681 (face font-lock-constant-face) 8681 8682 (face font-lock-string-face) 8682 8692 nil 8692 8693 (face font-lock-string-face) 8693 8721 (face font-lock-constant-face) 8721 8722 (face font-lock-string-face) 8722 8732 nil 8732 8733 (face font-lock-string-face) 8733 8760 (face font-lock-constant-face) 8760 8761 (face font-lock-string-face) 8761 8771 nil 8771 8772 (face font-lock-string-face) 8772 8805 (face font-lock-constant-face) 8805 8806 (face font-lock-string-face) 8806 8816 nil 8816 8817 (face font-lock-string-face) 8817 8849 (face font-lock-constant-face) 8849 8850 (face font-lock-string-face) 8850 8860 nil 8860 8861 (face font-lock-string-face) 8861 8892 (face font-lock-constant-face) 8892 8893 (face font-lock-string-face) 8893 8903 nil 8903 8904 (face font-lock-string-face) 8904 8934 (face font-lock-constant-face) 8934 8935 (face font-lock-string-face) 8935 8945 nil 8945 8946 (face font-lock-string-face) 8946 8978 (face font-lock-constant-face) 8978 8979 (face font-lock-string-face) 8979 8989 nil 8989 8990 (face font-lock-string-face) 8990 9021 (face font-lock-constant-face) 9021 9022 (face font-lock-string-face) 9022 9032 nil 9032 9033 (face font-lock-string-face) 9033 9063 (face font-lock-constant-face) 9063 9064 (face font-lock-string-face) 9064 9074 nil 9074 9075 (face font-lock-string-face) 9075 9104 (face font-lock-constant-face) 9104 9105 (face font-lock-string-face) 9105 9115 nil 9115 9116 (face font-lock-string-face) 9116 9158 (face font-lock-constant-face) 9158 9159 (face font-lock-string-face) 9159 9169 nil 9169 9170 (face font-lock-string-face) 9170 9211 (face font-lock-constant-face) 9211 9212 (face font-lock-string-face) 9212 9222 nil 9222 9223 (face font-lock-string-face) 9223 9272 (face font-lock-constant-face) 9272 9273 (face font-lock-string-face) 9273 9283 nil 9283 9284 (face font-lock-string-face) 9284 9332 (face font-lock-constant-face) 9332 9333 (face font-lock-string-face) 9333 9343 nil 9343 9344 (face font-lock-string-face) 9344 9388 (face font-lock-constant-face) 9388 9389 (face font-lock-string-face) 9389 9399 nil 9399 9400 (face font-lock-string-face) 9400 9445 (face font-lock-constant-face) 9445 9446 (face font-lock-string-face) 9446 9456 nil 9456 9457 (face font-lock-string-face) 9457 9507 (face font-lock-constant-face) 9507 9508 (face font-lock-string-face) 9508 9518 nil 9518 9519 (face font-lock-string-face) 9519 9570 (face font-lock-constant-face) 9570 9571 (face font-lock-string-face) 9571 9581 nil 9581 9582 (face font-lock-string-face) 9582 9611 (face font-lock-constant-face) 9611 9612 (face font-lock-string-face) 9612 9622 nil 9622 9623 (face font-lock-string-face) 9623 9659 (face font-lock-constant-face) 9659 9660 (face font-lock-string-face) 9660 9670 nil 9670 9671 (face font-lock-string-face) 9671 9714 (face font-lock-constant-face) 9714 9715 (face font-lock-string-face) 9715 9725 nil 9725 9726 (face font-lock-string-face) 9726 9768 (face font-lock-constant-face) 9768 9769 (face font-lock-string-face) 9769 9779 nil 9779 9780 (face font-lock-string-face) 9780 9816 (face font-lock-constant-face) 9816 9817 (face font-lock-string-face) 9817 9827 nil 9827 9828 (face font-lock-string-face) 9828 9863 (face font-lock-constant-face) 9863 9864 (face font-lock-string-face) 9864 9874 nil 9874 9875 (face font-lock-string-face) 9875 9910 (face font-lock-constant-face) 9910 9911 (face font-lock-string-face) 9911 9921 nil 9921 9922 (face font-lock-string-face) 9922 9958 (face font-lock-constant-face) 9958 9959 (face font-lock-string-face) 9959 9969 nil 9969 9970 (face font-lock-string-face) 9970 10005 (face font-lock-constant-face) 10005 10006 (face font-lock-string-face) 10006 10016 nil 10016 10017 (face font-lock-string-face) 10017 10050 (face font-lock-constant-face) 10050 10051 (face font-lock-string-face) 10051 10061 nil 10061 10062 (face font-lock-string-face) 10062 10094 (face font-lock-constant-face) 10094 10095 (face font-lock-string-face) 10095 10105 nil 10105 10106 (face font-lock-string-face) 10106 10150 (face font-lock-constant-face) 10150 10151 (face font-lock-string-face) 10151 10161 nil 10161 10162 (face font-lock-string-face) 10162 10198 (face font-lock-constant-face) 10198 10199 (face font-lock-string-face) 10199 10209 nil 10209 10210 (face font-lock-string-face) 10210 10245 (face font-lock-constant-face) 10245 10246 (face font-lock-string-face) 10246 10256 nil 10256 10257 (face font-lock-string-face) 10257 10296 (face font-lock-constant-face) 10296 10297 (face font-lock-string-face) 10297 10307 nil 10307 10308 (face font-lock-string-face) 10308 10346 (face font-lock-constant-face) 10346 10347 (face font-lock-string-face) 10347 10357 nil 10357 10358 (face font-lock-string-face) 10358 10403 (face font-lock-constant-face) 10403 10404 (face font-lock-string-face) 10404 10414 nil 10414 10415 (face font-lock-string-face) 10415 10459 (face font-lock-constant-face) 10459 10460 (face font-lock-string-face) 10460 10470 nil 10470 10471 (face font-lock-string-face) 10471 10487 (face font-lock-constant-face) 10487 10488 (face font-lock-string-face) 10488 10498 nil 10498 10499 (face font-lock-string-face) 10499 10514 (face font-lock-constant-face) 10514 10515 (face font-lock-string-face) 10515 10525 nil 10525 10526 (face font-lock-string-face) 10526 10559 (face font-lock-constant-face) 10559 10560 (face font-lock-string-face) 10560 10570 nil 10570 10571 (face font-lock-string-face) 10571 10603 (face font-lock-constant-face) 10603 10604 (face font-lock-string-face) 10604 10614 nil 10614 10615 (face font-lock-string-face) 10615 10636 (face font-lock-constant-face) 10636 10637 (face font-lock-string-face) 10637 10647 nil 10647 10648 (face font-lock-string-face) 10648 10675 (face font-lock-constant-face) 10675 10676 (face font-lock-string-face) 10676 10686 nil 10686 10687 (face font-lock-string-face) 10687 10713 (face font-lock-constant-face) 10713 10714 (face font-lock-string-face) 10714 10724 nil 10724 10725 (face font-lock-string-face) 10725 10755 (face font-lock-constant-face) 10755 10756 (face font-lock-string-face) 10756 10766 nil 10766 10767 (face font-lock-string-face) 10767 10796 (face font-lock-constant-face) 10796 10797 (face font-lock-string-face) 10797 10807 nil 10807 10808 (face font-lock-string-face) 10808 10845 (face font-lock-constant-face) 10845 10846 (face font-lock-string-face) 10846 10856 nil 10856 10857 (face font-lock-string-face) 10857 10893 (face font-lock-constant-face) 10893 10894 (face font-lock-string-face) 10894 10904 nil 10904 10905 (face font-lock-string-face) 10905 10929 (face font-lock-constant-face) 10929 10930 (face font-lock-string-face) 10930 10940 nil 10940 10941 (face font-lock-string-face) 10941 10964 (face font-lock-constant-face) 10964 10965 (face font-lock-string-face) 10965 10975 nil 10975 10976 (face font-lock-string-face) 10976 10995 (face font-lock-constant-face) 10995 10996 (face font-lock-string-face) 10996 11006 nil 11006 11007 (face font-lock-string-face) 11007 11025 (face font-lock-constant-face) 11025 11026 (face font-lock-string-face) 11026 11036 nil 11036 11037 (face font-lock-string-face) 11037 11063 (face font-lock-constant-face) 11063 11064 (face font-lock-string-face) 11064 11074 nil 11074 11075 (face font-lock-string-face) 11075 11100 (face font-lock-constant-face) 11100 11101 (face font-lock-string-face) 11101 11111 nil 11111 11112 (face font-lock-string-face) 11112 11138 (face font-lock-constant-face) 11138 11139 (face font-lock-string-face) 11139 11149 nil 11149 11150 (face font-lock-string-face) 11150 11175 (face font-lock-constant-face) 11175 11176 (face font-lock-string-face) 11176 11193 nil 11193 11194 (face font-lock-string-face) 11194 11219 (face font-lock-keyword-face) 11219 11220 (face font-lock-string-face) 11220 11232 nil 11232 11233 (face font-lock-string-face) 11233 11245 (face font-lock-keyword-face) 11245 11246 (face font-lock-string-face) 11246 11260 nil 11260 11261 (face font-lock-string-face) 11261 11263 (face font-lock-constant-face) 11263 11264 (face font-lock-string-face) 11264 11292 nil 11292 11293 (face font-lock-string-face) 11293 11303 (face font-lock-keyword-face) 11303 11304 (face font-lock-string-face) 11304 11316 nil 11316 11381 (face font-lock-comment-face) 11381 11389 nil 11389 11439 (face font-lock-comment-face) 11439 11448 nil 11448 11449 (face font-lock-string-face) 11449 11464 (face font-lock-variable-name-face) 11464 11465 (face font-lock-string-face) 11465 11479 nil 11479 11480 (face font-lock-string-face) 11480 11492 (face font-lock-keyword-face) 11492 11493 (face font-lock-string-face) 11493 11509 nil 11509 11510 (face font-lock-string-face) 11510 11549 (face font-lock-function-name-face) 11549 11550 (face font-lock-string-face) 11550 11586 nil 11586 11587 (face font-lock-string-face) 11587 11602 (face font-lock-variable-name-face) 11602 11603 (face font-lock-string-face) 11603 11617 nil 11617 11618 (face font-lock-string-face) 11618 11626 (face font-lock-keyword-face) 11626 11627 (face font-lock-string-face) 11627 11643 nil 11643 11644 (face font-lock-string-face) 11644 11663 (face font-lock-constant-face) 11663 11664 (face font-lock-string-face) 11664 11678 nil 11678 11679 (face font-lock-string-face) 11679 11702 (face font-lock-constant-face) 11702 11703 (face font-lock-string-face) 11703 11717 nil 11717 11718 (face font-lock-string-face) 11718 11740 (face font-lock-constant-face) 11740 11741 (face font-lock-string-face) 11741 11755 nil 11755 11756 (face font-lock-string-face) 11756 11779 (face font-lock-constant-face) 11779 11780 (face font-lock-string-face) 11780 11794 nil 11794 11795 (face font-lock-string-face) 11795 11817 (face font-lock-constant-face) 11817 11818 (face font-lock-string-face) 11818 11832 nil 11832 11833 (face font-lock-string-face) 11833 11861 (face font-lock-constant-face) 11861 11862 (face font-lock-string-face) 11862 11876 nil 11876 11877 (face font-lock-string-face) 11877 11904 (face font-lock-constant-face) 11904 11905 (face font-lock-string-face) 11905 11919 nil 11919 11920 (face font-lock-string-face) 11920 11950 (face font-lock-constant-face) 11950 11951 (face font-lock-string-face) 11951 11965 nil 11965 11966 (face font-lock-string-face) 11966 11995 (face font-lock-constant-face) 11995 11996 (face font-lock-string-face) 11996 12010 nil 12010 12011 (face font-lock-string-face) 12011 12035 (face font-lock-constant-face) 12035 12036 (face font-lock-string-face) 12036 12050 nil 12050 12051 (face font-lock-string-face) 12051 12074 (face font-lock-constant-face) 12074 12075 (face font-lock-string-face) 12075 12089 nil 12089 12090 (face font-lock-string-face) 12090 12120 (face font-lock-constant-face) 12120 12121 (face font-lock-string-face) 12121 12135 nil 12135 12136 (face font-lock-string-face) 12136 12167 (face font-lock-constant-face) 12167 12168 (face font-lock-string-face) 12168 12182 nil 12182 12183 (face font-lock-string-face) 12183 12213 (face font-lock-constant-face) 12213 12214 (face font-lock-string-face) 12214 12228 nil 12228 12229 (face font-lock-string-face) 12229 12254 (face font-lock-constant-face) 12254 12255 (face font-lock-string-face) 12255 12269 nil 12269 12270 (face font-lock-string-face) 12270 12294 (face font-lock-constant-face) 12294 12295 (face font-lock-string-face) 12295 12309 nil 12309 12310 (face font-lock-string-face) 12310 12352 (face font-lock-constant-face) 12352 12353 (face font-lock-string-face) 12353 12367 nil 12367 12368 (face font-lock-string-face) 12368 12409 (face font-lock-constant-face) 12409 12410 (face font-lock-string-face) 12410 12424 nil 12424 12425 (face font-lock-string-face) 12425 12447 (face font-lock-constant-face) 12447 12448 (face font-lock-string-face) 12448 12462 nil 12462 12463 (face font-lock-string-face) 12463 12484 (face font-lock-constant-face) 12484 12485 (face font-lock-string-face) 12485 12499 nil 12499 12500 (face font-lock-string-face) 12500 12531 (face font-lock-constant-face) 12531 12532 (face font-lock-string-face) 12532 12546 nil 12546 12547 (face font-lock-string-face) 12547 12577 (face font-lock-constant-face) 12577 12578 (face font-lock-string-face) 12578 12592 nil 12592 12593 (face font-lock-string-face) 12593 12621 (face font-lock-constant-face) 12621 12622 (face font-lock-string-face) 12622 12636 nil 12636 12637 (face font-lock-string-face) 12637 12664 (face font-lock-constant-face) 12664 12665 (face font-lock-string-face) 12665 12679 nil 12679 12680 (face font-lock-string-face) 12680 12707 (face font-lock-constant-face) 12707 12708 (face font-lock-string-face) 12708 12722 nil 12722 12723 (face font-lock-string-face) 12723 12749 (face font-lock-constant-face) 12749 12750 (face font-lock-string-face) 12750 12764 nil 12764 12765 (face font-lock-string-face) 12765 12791 (face font-lock-constant-face) 12791 12792 (face font-lock-string-face) 12792 12806 nil 12806 12807 (face font-lock-string-face) 12807 12832 (face font-lock-constant-face) 12832 12833 (face font-lock-string-face) 12833 12868 nil 12868 12937 (face font-lock-comment-face) 12937 12945 nil 12945 13016 (face font-lock-comment-face) 13016 13024 nil 13024 13040 (face font-lock-comment-face) 13040 13049 nil 13049 13050 (face font-lock-string-face) 13050 13065 (face font-lock-variable-name-face) 13065 13066 (face font-lock-string-face) 13066 13080 nil 13080 13081 (face font-lock-string-face) 13081 13089 (face font-lock-keyword-face) 13089 13090 (face font-lock-string-face) 13090 13105 nil 13105 13106 (face font-lock-string-face) 13106 13149 (face font-lock-constant-face) 13149 13150 (face font-lock-string-face) 13150 13175 nil 13175 13176 (face font-lock-string-face) 13176 13183 (face font-lock-keyword-face) 13183 13184 (face font-lock-string-face) 13184 13199 nil 13199 13200 (face font-lock-string-face) 13200 13248 (face font-lock-constant-face) 13248 13249 (face font-lock-string-face) 13249 13274 nil 13274 13275 (face font-lock-string-face) 13275 13288 (face font-lock-keyword-face) 13288 13289 (face font-lock-string-face) 13289 13305 nil 13305 13306 (face font-lock-string-face) 13306 13315 (face font-lock-keyword-face) 13315 13316 (face font-lock-string-face) 13316 13334 nil 13334 13335 (face font-lock-string-face) 13335 13345 (face font-lock-constant-face) 13345 13346 (face font-lock-string-face) 13346 13397 nil 13397 13398 (face font-lock-string-face) 13398 13443 (face font-lock-variable-name-face) 13443 13444 (face font-lock-string-face) 13444 13458 nil 13458 13459 (face font-lock-string-face) 13459 13472 (face font-lock-keyword-face) 13472 13473 (face font-lock-string-face) 13473 13489 nil 13489 13490 (face font-lock-string-face) 13490 13499 (face font-lock-keyword-face) 13499 13500 (face font-lock-string-face) 13500 13518 nil 13518 13519 (face font-lock-string-face) 13519 13527 (face font-lock-constant-face) 13527 13528 (face font-lock-string-face) 13528 13579 nil 13579 13580 (face font-lock-string-face) 13580 13593 (face font-lock-variable-name-face) 13593 13594 (face font-lock-string-face) 13594 13608 nil 13608 13609 (face font-lock-string-face) 13609 13617 (face font-lock-keyword-face) 13617 13618 (face font-lock-string-face) 13618 13623 nil 13623 13624 (face font-lock-string-face) 13624 13631 (face font-lock-constant-face) 13631 13632 (face font-lock-string-face) 13632 13634 nil 13634 13635 (face font-lock-string-face) 13635 13641 (face font-lock-constant-face) 13641 13642 (face font-lock-string-face) 13642 13671 nil 13671 13672 (face font-lock-string-face) 13672 13679 (face font-lock-constant-face) 13679 13680 (face font-lock-string-face) 13680 13682 nil 13682 13683 (face font-lock-string-face) 13683 13703 (face font-lock-constant-face) 13703 13704 (face font-lock-string-face) 13704 13720 nil 13720 13721 (face font-lock-string-face) 13721 13734 (face font-lock-keyword-face) 13734 13735 (face font-lock-string-face) 13735 13751 nil 13751 13752 (face font-lock-string-face) 13752 13761 (face font-lock-keyword-face) 13761 13762 (face font-lock-string-face) 13762 13815 nil 13815 13816 (face font-lock-string-face) 13816 13829 (face font-lock-variable-name-face) 13829 13830 (face font-lock-string-face) 13830 13844 nil 13844 13845 (face font-lock-string-face) 13845 13853 (face font-lock-keyword-face) 13853 13854 (face font-lock-string-face) 13854 13870 nil 13870 13871 (face font-lock-string-face) 13871 13909 (face font-lock-constant-face) 13909 13910 (face font-lock-string-face) 13910 13924 nil 13924 13925 (face font-lock-string-face) 13925 13962 (face font-lock-constant-face) 13962 13963 (face font-lock-string-face) 13963 13999 nil 13999 14000 (face font-lock-string-face) 14000 14011 (face font-lock-variable-name-face) 14011 14012 (face font-lock-string-face) 14012 14026 nil 14026 14027 (face font-lock-string-face) 14027 14036 (face font-lock-keyword-face) 14036 14037 (face font-lock-string-face) 14037 14053 nil 14053 14054 (face font-lock-string-face) 14054 14064 (face font-lock-keyword-face) 14064 14065 (face font-lock-string-face) 14065 14084 nil 14084 14085 (face font-lock-string-face) 14085 14096 (face font-lock-variable-name-face) 14096 14097 (face font-lock-string-face) 14097 14117 nil 14117 14129 (face font-lock-string-face) 14129 14131 nil 14131 14169 (face font-lock-string-face) 14169 14176 (face font-lock-variable-name-face) 14176 14182 (face font-lock-string-face) 14182 14193 (face font-lock-variable-name-face) 14193 14196 (face font-lock-string-face) 14196 14233 nil 14233 14245 (face font-lock-string-face) 14245 14247 nil 14247 14259 (face font-lock-string-face) 14259 14316 nil 14316 14317 (face font-lock-string-face) 14317 14327 (face font-lock-keyword-face) 14327 14328 (face font-lock-string-face) 14328 14345 nil 14345 14346 (face font-lock-string-face) 14346 14359 (face font-lock-variable-name-face) 14359 14360 (face font-lock-string-face) 14360 14378 nil 14378 14379 (face font-lock-string-face) 14379 14385 (face font-lock-keyword-face) 14385 14386 (face font-lock-string-face) 14386 14406 nil 14406 14411 (face font-lock-string-face) 14411 14413 (face font-lock-variable-name-face) 14413 14423 (face font-lock-variable-name-face) 14423 14443 (face font-lock-string-face) 14443 14476 nil 14476 14477 (face font-lock-string-face) 14477 14490 (face font-lock-keyword-face) 14490 14491 (face font-lock-string-face) 14491 14511 nil 14511 14512 (face font-lock-string-face) 14512 14521 (face font-lock-keyword-face) 14521 14522 (face font-lock-string-face) 14522 14544 nil 14544 14545 (face font-lock-string-face) 14545 14549 (face font-lock-constant-face) 14549 14551 (face font-lock-variable-name-face) 14551 14561 (face font-lock-variable-name-face) 14561 14578 (face font-lock-constant-face) 14578 14579 (face font-lock-string-face) 14579 14631 nil 14631 14632 (face font-lock-string-face) 14632 14639 (face font-lock-keyword-face) 14639 14640 (face font-lock-string-face) 14640 14660 nil 14660 14661 (face font-lock-string-face) 14661 14669 (face font-lock-preprocessor-face) 14669 14670 (face font-lock-string-face) 14670 14707 nil 14707 14729 (face font-lock-comment-face) 14729 14743 nil 14743 14744 (face font-lock-string-face) 14744 14752 (face font-lock-keyword-face) 14752 14753 (face font-lock-string-face) 14753 14773 nil 14773 14774 (face font-lock-string-face) 14774 14800 (face font-lock-constant-face) 14800 14801 (face font-lock-string-face) 14801 14819 nil 14819 14820 (face font-lock-string-face) 14820 14845 (face font-lock-constant-face) 14845 14846 (face font-lock-string-face) 14846 14915 nil 14915 14916 (face font-lock-string-face) 14916 14929 (face font-lock-variable-name-face) 14929 14930 (face font-lock-string-face) 14930 14944 nil 14944 14945 (face font-lock-string-face) 14945 14955 (face font-lock-keyword-face) 14955 14956 (face font-lock-string-face) 14956 14973 nil 14973 14974 (face font-lock-string-face) 14974 14993 (face font-lock-variable-name-face) 14993 14994 (face font-lock-string-face) 14994 15012 nil 15012 15013 (face font-lock-string-face) 15013 15019 (face font-lock-keyword-face) 15019 15020 (face font-lock-string-face) 15020 15040 nil 15040 15075 (face font-lock-string-face) 15075 15108 nil 15108 15109 (face font-lock-string-face) 15109 15122 (face font-lock-keyword-face) 15122 15123 (face font-lock-string-face) 15123 15143 nil 15143 15144 (face font-lock-string-face) 15144 15153 (face font-lock-keyword-face) 15153 15154 (face font-lock-string-face) 15154 15176 nil 15176 15177 (face font-lock-string-face) 15177 15215 (face font-lock-constant-face) 15215 15216 (face font-lock-string-face) 15216 15268 nil 15268 15269 (face font-lock-string-face) 15269 15276 (face font-lock-keyword-face) 15276 15277 (face font-lock-string-face) 15277 15297 nil 15297 15298 (face font-lock-string-face) 15298 15312 (face font-lock-preprocessor-face) 15312 15313 (face font-lock-string-face) 15313 15350 nil 15350 15378 (face font-lock-comment-face) 15378 15392 nil 15392 15393 (face font-lock-string-face) 15393 15401 (face font-lock-keyword-face) 15401 15402 (face font-lock-string-face) 15402 15422 nil 15422 15423 (face font-lock-string-face) 15423 15450 (face font-lock-constant-face) 15450 15451 (face font-lock-string-face) 15451 15469 nil 15469 15470 (face font-lock-string-face) 15470 15496 (face font-lock-constant-face) 15496 15497 (face font-lock-string-face) 15497 15566 nil 15566 15567 (face font-lock-string-face) 15567 15600 (face font-lock-variable-name-face) 15600 15601 (face font-lock-string-face) 15601 15615 nil 15615 15663 (face font-lock-comment-face) 15663 15673 nil 15673 15674 (face font-lock-string-face) 15674 15682 (face font-lock-keyword-face) 15682 15683 (face font-lock-string-face) 15683 15699 nil 15699 15700 (face font-lock-string-face) 15700 15743 (face font-lock-constant-face) 15743 15744 (face font-lock-string-face) 15744 15758 nil 15758 15759 (face font-lock-string-face) 15759 15801 (face font-lock-constant-face) 15801 15802 (face font-lock-string-face) 15802 15838 nil 15838 15839 (face font-lock-string-face) 15839 15848 (face font-lock-variable-name-face) 15848 15849 (face font-lock-string-face) 15849 15863 nil 15863 15864 (face font-lock-string-face) 15864 15877 (face font-lock-keyword-face) 15877 15878 (face font-lock-string-face) 15878 15894 nil 15894 15895 (face font-lock-string-face) 15895 15904 (face font-lock-keyword-face) 15904 15905 (face font-lock-string-face) 15905 15923 nil 15923 15924 (face font-lock-string-face) 15924 15980 (face font-lock-constant-face) 15980 15981 (face font-lock-string-face) 15981 15997 nil 15997 15998 (face font-lock-string-face) 15998 16057 (face font-lock-constant-face) 16057 16058 (face font-lock-string-face) 16058 16074 nil 16074 16075 (face font-lock-string-face) 16075 16131 (face font-lock-constant-face) 16131 16132 (face font-lock-string-face) 16132 16148 nil 16148 16149 (face font-lock-string-face) 16149 16205 (face font-lock-constant-face) 16205 16206 (face font-lock-string-face) 16206 16222 nil 16222 16223 (face font-lock-string-face) 16223 16275 (face font-lock-constant-face) 16275 16276 (face font-lock-string-face) 16276 16327 nil 16327 16328 (face font-lock-string-face) 16328 16337 (face font-lock-variable-name-face) 16337 16338 (face font-lock-string-face) 16338 16352 nil 16352 16353 (face font-lock-string-face) 16353 16361 (face font-lock-keyword-face) 16361 16362 (face font-lock-string-face) 16362 16378 nil 16378 16379 (face font-lock-string-face) 16379 16406 (face font-lock-constant-face) 16406 16407 (face font-lock-string-face) 16407 16421 nil 16421 16422 (face font-lock-string-face) 16422 16448 (face font-lock-constant-face) 16448 16449 (face font-lock-string-face) 16449 16463 nil 16463 16464 (face font-lock-string-face) 16464 16507 (face font-lock-constant-face) 16507 16508 (face font-lock-string-face) 16508 16522 nil 16522 16523 (face font-lock-string-face) 16523 16565 (face font-lock-constant-face) 16565 16566 (face font-lock-string-face) 16566 16602 nil 16602 16603 (face font-lock-string-face) 16603 16646 (face font-lock-variable-name-face) 16646 16647 (face font-lock-string-face) 16647 16661 nil 16661 16662 (face font-lock-string-face) 16662 16669 (face font-lock-keyword-face) 16669 16670 (face font-lock-string-face) 16670 16686 nil 16686 16687 (face font-lock-string-face) 16687 16697 (face font-lock-constant-face) 16697 16698 (face font-lock-string-face) 16698 16712 nil 16712 16713 (face font-lock-string-face) 16713 16722 (face font-lock-constant-face) 16722 16723 (face font-lock-string-face) 16723 16737 nil 16737 16738 (face font-lock-string-face) 16738 16760 (face font-lock-constant-face) 16760 16761 (face font-lock-string-face) 16761 16775 nil 16775 16776 (face font-lock-string-face) 16776 16797 (face font-lock-constant-face) 16797 16798 (face font-lock-string-face) 16798 16812 nil 16812 16813 (face font-lock-string-face) 16813 16830 (face font-lock-constant-face) 16830 16831 (face font-lock-string-face) 16831 16845 nil 16845 16846 (face font-lock-string-face) 16846 16862 (face font-lock-constant-face) 16862 16863 (face font-lock-string-face) 16863 16877 nil 16877 16878 (face font-lock-string-face) 16878 16889 (face font-lock-constant-face) 16889 16890 (face font-lock-string-face) 16890 16904 nil 16904 16905 (face font-lock-string-face) 16905 16915 (face font-lock-constant-face) 16915 16916 (face font-lock-string-face) 16916 16930 nil 16930 16931 (face font-lock-string-face) 16931 16955 (face font-lock-constant-face) 16955 16956 (face font-lock-string-face) 16956 16970 nil 16970 16971 (face font-lock-string-face) 16971 16994 (face font-lock-constant-face) 16994 16995 (face font-lock-string-face) 16995 17009 nil 17009 17010 (face font-lock-string-face) 17010 17034 (face font-lock-constant-face) 17034 17035 (face font-lock-string-face) 17035 17049 nil 17049 17050 (face font-lock-string-face) 17050 17073 (face font-lock-constant-face) 17073 17074 (face font-lock-string-face) 17074 17088 nil 17088 17089 (face font-lock-string-face) 17089 17114 (face font-lock-constant-face) 17114 17115 (face font-lock-string-face) 17115 17129 nil 17129 17130 (face font-lock-string-face) 17130 17154 (face font-lock-constant-face) 17154 17155 (face font-lock-string-face) 17155 17210 nil 17210 17211 (face font-lock-string-face) 17211 17222 (face font-lock-keyword-face) 17222 17223 (face font-lock-string-face) 17223 17225 nil 17225 17226 (face font-lock-string-face) 17226 17237 (face font-lock-function-name-face) 17237 17238 (face font-lock-string-face) 17238 17246 nil 17246 17247 (face font-lock-string-face) 17247 17251 (face font-lock-keyword-face) 17251 17252 (face font-lock-string-face) 17252 17254 nil 17254 17255 (face font-lock-string-face) 17255 17269 (face font-lock-type-face) 17269 17270 (face font-lock-string-face) 17270 17278 nil 17278 17279 (face font-lock-string-face) 17279 17291 (face font-lock-keyword-face) 17291 17292 (face font-lock-string-face) 17292 17304 nil 17304 17305 (face font-lock-string-face) 17305 17307 (face font-lock-constant-face) 17307 17308 (face font-lock-string-face) 17308 17325 nil 17325 17326 (face font-lock-string-face) 17326 17336 (face font-lock-keyword-face) 17336 17337 (face font-lock-string-face) 17337 17350 nil 17350 17351 (face font-lock-string-face) 17351 17371 (face font-lock-variable-name-face) 17371 17372 (face font-lock-string-face) 17372 17386 nil 17386 17387 (face font-lock-string-face) 17387 17404 (face font-lock-keyword-face) 17404 17405 (face font-lock-string-face) 17405 17423 nil 17423 17424 (face font-lock-string-face) 17424 17442 (face font-lock-variable-name-face) 17442 17443 (face font-lock-string-face) 17443 17461 nil 17461 17462 (face font-lock-string-face) 17462 17469 (face font-lock-keyword-face) 17469 17470 (face font-lock-string-face) 17470 17474 nil 17474 17498 (face font-lock-string-face) 17498 17553 nil 17553 17554 (face font-lock-string-face) 17554 17599 (face font-lock-variable-name-face) 17599 17600 (face font-lock-string-face) 17600 17614 nil 17614 17615 (face font-lock-string-face) 17615 17627 (face font-lock-keyword-face) 17627 17628 (face font-lock-string-face) 17628 17644 nil 17644 17645 (face font-lock-string-face) 17645 17665 (face font-lock-function-name-face) 17665 17666 (face font-lock-string-face) 17666 17703 nil 17703 17704 (face font-lock-string-face) 17704 17724 (face font-lock-variable-name-face) 17724 17725 (face font-lock-string-face) 17725 17739 nil 17739 17740 (face font-lock-string-face) 17740 17752 (face font-lock-keyword-face) 17752 17753 (face font-lock-string-face) 17753 17769 nil 17769 17770 (face font-lock-string-face) 17770 17790 (face font-lock-function-name-face) 17790 17791 (face font-lock-string-face) 17791 17833 nil 17833 17834 (face font-lock-string-face) 17834 17841 (face font-lock-keyword-face) 17841 17842 (face font-lock-string-face) 17842 17854 nil 17854 17855 (face font-lock-string-face) 17855 17874 (face font-lock-constant-face) 17874 17875 (face font-lock-string-face) 17875 17885 nil 17885 17886 (face font-lock-string-face) 17886 17904 (face font-lock-constant-face) 17904 17905 (face font-lock-string-face) 17905 17935 nil 17935 17936 (face font-lock-string-face) 17936 17947 (face font-lock-keyword-face) 17947 17948 (face font-lock-string-face) 17948 17950 nil 17950 17951 (face font-lock-string-face) 17951 17971 (face font-lock-function-name-face) 17971 17972 (face font-lock-string-face) 17972 17980 nil 17980 17981 (face font-lock-string-face) 17981 17985 (face font-lock-keyword-face) 17985 17986 (face font-lock-string-face) 17986 17988 nil 17988 17989 (face font-lock-string-face) 17989 18003 (face font-lock-type-face) 18003 18004 (face font-lock-string-face) 18004 18012 nil 18012 18013 (face font-lock-string-face) 18013 18025 (face font-lock-keyword-face) 18025 18026 (face font-lock-string-face) 18026 18038 nil 18038 18039 (face font-lock-string-face) 18039 18041 (face font-lock-constant-face) 18041 18042 (face font-lock-string-face) 18042 18059 nil 18059 18060 (face font-lock-string-face) 18060 18067 (face font-lock-keyword-face) 18067 18068 (face font-lock-string-face) 18068 18080 nil 18080 18081 (face font-lock-string-face) 18081 18114 (face font-lock-constant-face) 18114 18115 (face font-lock-string-face) 18115 18125 nil 18125 18126 (face font-lock-string-face) 18126 18162 (face font-lock-constant-face) 18162 18163 (face font-lock-string-face) 18163 18173 nil 18173 18174 (face font-lock-string-face) 18174 18212 (face font-lock-constant-face) 18212 18213 (face font-lock-string-face) 18213 18223 nil 18223 18224 (face font-lock-string-face) 18224 18261 (face font-lock-constant-face) 18261 18262 (face font-lock-string-face) 18262 18272 nil 18272 18273 (face font-lock-string-face) 18273 18311 (face font-lock-constant-face) 18311 18312 (face font-lock-string-face) 18312 18322 nil 18322 18323 (face font-lock-string-face) 18323 18356 (face font-lock-constant-face) 18356 18357 (face font-lock-string-face) 18357 18367 nil 18367 18368 (face font-lock-string-face) 18368 18403 (face font-lock-constant-face) 18403 18404 (face font-lock-string-face) 18404 18414 nil 18414 18415 (face font-lock-string-face) 18415 18451 (face font-lock-constant-face) 18451 18452 (face font-lock-string-face) 18452 18462 nil 18462 18463 (face font-lock-string-face) 18463 18499 (face font-lock-constant-face) 18499 18500 (face font-lock-string-face) 18500 18510 nil 18510 18511 (face font-lock-string-face) 18511 18547 (face font-lock-constant-face) 18547 18548 (face font-lock-string-face) 18548 18558 nil 18558 18559 (face font-lock-string-face) 18559 18581 (face font-lock-constant-face) 18581 18582 (face font-lock-string-face) 18582 18592 nil 18592 18593 (face font-lock-string-face) 18593 18618 (face font-lock-constant-face) 18618 18619 (face font-lock-string-face) 18619 18629 nil 18629 18630 (face font-lock-string-face) 18630 18657 (face font-lock-constant-face) 18657 18658 (face font-lock-string-face) 18658 18668 nil 18668 18669 (face font-lock-string-face) 18669 18697 (face font-lock-constant-face) 18697 18698 (face font-lock-string-face) 18698 18708 nil 18708 18709 (face font-lock-string-face) 18709 18750 (face font-lock-constant-face) 18750 18751 (face font-lock-string-face) 18751 18761 nil 18761 18762 (face font-lock-string-face) 18762 18803 (face font-lock-constant-face) 18803 18804 (face font-lock-string-face) 18804 18814 nil 18814 18815 (face font-lock-string-face) 18815 18856 (face font-lock-constant-face) 18856 18857 (face font-lock-string-face) 18857 18867 nil 18867 18868 (face font-lock-string-face) 18868 18902 (face font-lock-constant-face) 18902 18903 (face font-lock-string-face) 18903 18913 nil 18913 18914 (face font-lock-string-face) 18914 18948 (face font-lock-constant-face) 18948 18949 (face font-lock-string-face) 18949 18959 nil 18959 18960 (face font-lock-string-face) 18960 18994 (face font-lock-constant-face) 18994 18995 (face font-lock-string-face) 18995 19005 nil 19005 19006 (face font-lock-string-face) 19006 19035 (face font-lock-constant-face) 19035 19036 (face font-lock-string-face) 19036 19046 nil 19046 19047 (face font-lock-string-face) 19047 19075 (face font-lock-constant-face) 19075 19076 (face font-lock-string-face) 19076 19093 nil 19093 19094 (face font-lock-string-face) 19094 19104 (face font-lock-keyword-face) 19104 19105 (face font-lock-string-face) 19105 19118 nil 19118 19119 (face font-lock-string-face) 19119 19139 (face font-lock-variable-name-face) 19139 19140 (face font-lock-string-face) 19140 19154 nil 19154 19155 (face font-lock-string-face) 19155 19172 (face font-lock-keyword-face) 19172 19173 (face font-lock-string-face) 19173 19191 nil 19191 19192 (face font-lock-string-face) 19192 19210 (face font-lock-variable-name-face) 19210 19211 (face font-lock-string-face) 19211 19229 nil 19229 19230 (face font-lock-string-face) 19230 19237 (face font-lock-keyword-face) 19237 19238 (face font-lock-string-face) 19238 19242 nil 19242 19266 (face font-lock-string-face) 19266 19321 nil 19321 19322 (face font-lock-string-face) 19322 19342 (face font-lock-variable-name-face) 19342 19343 (face font-lock-string-face) 19343 19357 nil 19357 19399 (face font-lock-comment-face) 19399 19409 nil 19409 19410 (face font-lock-string-face) 19410 19417 (face font-lock-keyword-face) 19417 19418 (face font-lock-string-face) 19418 19434 nil 19434 19435 (face font-lock-string-face) 19435 19480 (face font-lock-constant-face) 19480 19481 (face font-lock-string-face) 19481 19495 nil 19495 19496 (face font-lock-string-face) 19496 19535 (face font-lock-constant-face) 19535 19536 (face font-lock-string-face) 19536 19573 nil 19573 19574 (face font-lock-string-face) 19574 19623 (face font-lock-variable-name-face) 19623 19624 (face font-lock-string-face) 19624 19638 nil 19638 19639 (face font-lock-string-face) 19639 19645 (face font-lock-keyword-face) 19645 19646 (face font-lock-string-face) 19646 19662 nil 19662 19670 (face font-lock-string-face) 19670 19707 nil 19707 19708 (face font-lock-string-face) 19708 19719 (face font-lock-variable-name-face) 19719 19720 (face font-lock-string-face) 19720 19734 nil 19734 19735 (face font-lock-string-face) 19735 19749 (face font-lock-keyword-face) 19749 19750 (face font-lock-string-face) 19750 19766 nil 19766 19773 (face font-lock-string-face) 19773 19791 nil 19791 19792 (face font-lock-string-face) 19792 19806 (face font-lock-keyword-face) 19806 19807 (face font-lock-string-face) 19807 19827 nil 19827 19890 (face font-lock-comment-face) 19890 19906 nil 19906 19971 (face font-lock-comment-face) 19971 19987 nil 19987 20032 (face font-lock-comment-face) 20032 20048 nil 20048 20072 (face font-lock-string-face) 20072 20074 nil 20074 20077 (face font-lock-string-face) 20077 20080 nil 20080 20086 (face font-lock-comment-face) 20086 20155 nil 20155 20156 (face font-lock-string-face) 20156 20165 (face font-lock-variable-name-face) 20165 20166 (face font-lock-string-face) 20166 20180 nil 20180 20181 (face font-lock-string-face) 20181 20190 (face font-lock-keyword-face) 20190 20191 (face font-lock-string-face) 20191 20207 nil 20207 20208 (face font-lock-string-face) 20208 20218 (face font-lock-variable-name-face) 20218 20219 (face font-lock-string-face) 20219 20237 nil 20237 20246 (face font-lock-string-face) 20246 20262 nil 20262 20270 (face font-lock-string-face) 20270 20286 nil 20286 20298 (face font-lock-string-face) 20298 20314 nil 20314 20322 (face font-lock-string-face) 20322 20374 nil 20374 20375 (face font-lock-string-face) 20375 20384 (face font-lock-variable-name-face) 20384 20385 (face font-lock-string-face) 20385 20399 nil 20399 20400 (face font-lock-string-face) 20400 20409 (face font-lock-keyword-face) 20409 20410 (face font-lock-string-face) 20410 20426 nil 20426 20427 (face font-lock-string-face) 20427 20437 (face font-lock-variable-name-face) 20437 20438 (face font-lock-string-face) 20438 20456 nil 20456 20466 (face font-lock-string-face) 20466 20482 nil 20482 20491 (face font-lock-string-face) 20491 20507 nil 20507 20519 (face font-lock-string-face) 20519 20535 nil 20535 20543 (face font-lock-string-face) 20543 20595 nil 20595 20596 (face font-lock-string-face) 20596 20621 (face font-lock-variable-name-face) 20621 20622 (face font-lock-string-face) 20622 20636 nil 20636 20637 (face font-lock-string-face) 20637 20646 (face font-lock-keyword-face) 20646 20647 (face font-lock-string-face) 20647 20663 nil 20663 20664 (face font-lock-string-face) 20664 20674 (face font-lock-keyword-face) 20674 20675 (face font-lock-string-face) 20675 20695 nil 20695 20696 (face font-lock-string-face) 20696 20715 (face font-lock-variable-name-face) 20715 20716 (face font-lock-string-face) 20716 20736 nil 20736 20748 (face font-lock-string-face) 20748 20770 nil 20770 20780 (face font-lock-string-face) 20780 20800 nil 20800 20807 (face font-lock-string-face) 20807 20827 nil 20827 20839 (face font-lock-string-face) 20839 20859 nil 20859 20867 (face font-lock-string-face) 20867 20923 nil 20923 20935 (face font-lock-string-face) 20935 20957 nil 20957 20972 (face font-lock-string-face) 20972 20992 nil 20992 20999 (face font-lock-string-face) 20999 21019 nil 21019 21026 (face font-lock-string-face) 21026 21046 nil 21046 21058 (face font-lock-string-face) 21058 21078 nil 21078 21086 (face font-lock-string-face) 21086 21180 nil 21180 21181 (face font-lock-string-face) 21181 21190 (face font-lock-keyword-face) 21190 21191 (face font-lock-string-face) 21191 21203 nil 21203 21204 (face font-lock-string-face) 21204 21220 (face font-lock-variable-name-face) 21220 21221 (face font-lock-string-face) 21221 21223 nil 21223 21224 (face font-lock-string-face) 21224 21256 (face font-lock-variable-name-face) 21256 21257 (face font-lock-string-face) 21257 21274 nil 21274 21314 (face font-lock-string-face) 21314 21325 nil 21325 21326 (face font-lock-string-face) 21326 21334 (face font-lock-keyword-face) 21334 21335 (face font-lock-string-face) 21335 21347 nil 21347 21348 (face font-lock-string-face) 21348 21385 (face font-lock-constant-face) 21385 21386 (face font-lock-string-face) 21386 21416 nil 21416 21417 (face font-lock-string-face) 21417 21428 (face font-lock-keyword-face) 21428 21429 (face font-lock-string-face) 21429 21431 nil 21431 21432 (face font-lock-string-face) 21432 21452 (face font-lock-function-name-face) 21452 21453 (face font-lock-string-face) 21453 21461 nil 21461 21462 (face font-lock-string-face) 21462 21466 (face font-lock-keyword-face) 21466 21467 (face font-lock-string-face) 21467 21469 nil 21469 21470 (face font-lock-string-face) 21470 21484 (face font-lock-type-face) 21484 21485 (face font-lock-string-face) 21485 21493 nil 21493 21494 (face font-lock-string-face) 21494 21506 (face font-lock-keyword-face) 21506 21507 (face font-lock-string-face) 21507 21519 nil 21519 21520 (face font-lock-string-face) 21520 21522 (face font-lock-constant-face) 21522 21523 (face font-lock-string-face) 21523 21540 nil 21540 21541 (face font-lock-string-face) 21541 21548 (face font-lock-keyword-face) 21548 21549 (face font-lock-string-face) 21549 21561 nil 21561 21562 (face font-lock-string-face) 21562 21595 (face font-lock-constant-face) 21595 21596 (face font-lock-string-face) 21596 21606 nil 21606 21607 (face font-lock-string-face) 21607 21637 (face font-lock-constant-face) 21637 21638 (face font-lock-string-face) 21638 21648 nil 21648 21649 (face font-lock-string-face) 21649 21682 (face font-lock-constant-face) 21682 21683 (face font-lock-string-face) 21683 21693 nil 21693 21694 (face font-lock-string-face) 21694 21724 (face font-lock-constant-face) 21724 21725 (face font-lock-string-face) 21725 21735 nil 21735 21736 (face font-lock-string-face) 21736 21758 (face font-lock-constant-face) 21758 21759 (face font-lock-string-face) 21759 21769 nil 21769 21770 (face font-lock-string-face) 21770 21795 (face font-lock-constant-face) 21795 21796 (face font-lock-string-face) 21796 21806 nil 21806 21807 (face font-lock-string-face) 21807 21836 (face font-lock-constant-face) 21836 21837 (face font-lock-string-face) 21837 21847 nil 21847 21848 (face font-lock-string-face) 21848 21876 (face font-lock-constant-face) 21876 21877 (face font-lock-string-face) 21877 21907 nil 21907 21908 (face font-lock-string-face) 21908 21919 (face font-lock-keyword-face) 21919 21920 (face font-lock-string-face) 21920 21922 nil 21922 21923 (face font-lock-string-face) 21923 21938 (face font-lock-function-name-face) 21938 21939 (face font-lock-string-face) 21939 21947 nil 21947 21948 (face font-lock-string-face) 21948 21952 (face font-lock-keyword-face) 21952 21953 (face font-lock-string-face) 21953 21955 nil 21955 21956 (face font-lock-string-face) 21956 21966 (face font-lock-type-face) 21966 21967 (face font-lock-string-face) 21967 21975 nil 21975 21976 (face font-lock-string-face) 21976 21988 (face font-lock-keyword-face) 21988 21989 (face font-lock-string-face) 21989 22001 nil 22001 22002 (face font-lock-string-face) 22002 22007 (face font-lock-function-name-face) 22007 22008 (face font-lock-string-face) 22008 22018 nil 22018 22019 (face font-lock-string-face) 22019 22037 (face font-lock-function-name-face) 22037 22038 (face font-lock-string-face) 22038 22048 nil 22048 22049 (face font-lock-string-face) 22049 22060 (face font-lock-function-name-face) 22060 22061 (face font-lock-string-face) 22061 22071 nil 22071 22072 (face font-lock-string-face) 22072 22093 (face font-lock-function-name-face) 22093 22094 (face font-lock-string-face) 22094 22104 nil 22104 22105 (face font-lock-string-face) 22105 22131 (face font-lock-function-name-face) 22131 22132 (face font-lock-string-face) 22132 22142 nil 22142 22143 (face font-lock-string-face) 22143 22177 (face font-lock-function-name-face) 22177 22178 (face font-lock-string-face) 22178 22188 nil 22188 22189 (face font-lock-string-face) 22189 22215 (face font-lock-function-name-face) 22215 22216 (face font-lock-string-face) 22216 22226 nil 22226 22227 (face font-lock-string-face) 22227 22253 (face font-lock-function-name-face) 22253 22254 (face font-lock-string-face) 22254 22264 nil 22264 22265 (face font-lock-string-face) 22265 22280 (face font-lock-function-name-face) 22280 22281 (face font-lock-string-face) 22281 22298 nil 22298 22299 (face font-lock-string-face) 22299 22306 (face font-lock-keyword-face) 22306 22307 (face font-lock-string-face) 22307 22319 nil 22319 22320 (face font-lock-string-face) 22320 22361 (face font-lock-constant-face) 22361 22362 (face font-lock-string-face) 22362 22372 nil 22372 22373 (face font-lock-string-face) 22373 22413 (face font-lock-constant-face) 22413 22414 (face font-lock-string-face) 22414 22424 nil 22424 22425 (face font-lock-string-face) 22425 22461 (face font-lock-constant-face) 22461 22462 (face font-lock-string-face) 22462 22472 nil 22472 22473 (face font-lock-string-face) 22473 22502 (face font-lock-constant-face) 22502 22503 (face font-lock-string-face) 22503 22513 nil 22513 22514 (face font-lock-string-face) 22514 22550 (face font-lock-constant-face) 22550 22551 (face font-lock-string-face) 22551 22561 nil 22561 22562 (face font-lock-string-face) 22562 22610 (face font-lock-constant-face) 22610 22611 (face font-lock-string-face) 22611 22621 nil 22621 22622 (face font-lock-string-face) 22622 22663 (face font-lock-constant-face) 22663 22664 (face font-lock-string-face) 22664 22674 nil 22674 22675 (face font-lock-string-face) 22675 22711 (face font-lock-constant-face) 22711 22712 (face font-lock-string-face) 22712 22722 nil 22722 22723 (face font-lock-string-face) 22723 22757 (face font-lock-constant-face) 22757 22758 (face font-lock-string-face) 22758 22768 nil 22768 22769 (face font-lock-string-face) 22769 22797 (face font-lock-constant-face) 22797 22798 (face font-lock-string-face) 22798 22808 nil 22808 22809 (face font-lock-string-face) 22809 22853 (face font-lock-constant-face) 22853 22854 (face font-lock-string-face) 22854 22864 nil 22864 22865 (face font-lock-string-face) 22865 22900 (face font-lock-constant-face) 22900 22901 (face font-lock-string-face) 22901 22911 nil 22911 22912 (face font-lock-string-face) 22912 22961 (face font-lock-constant-face) 22961 22962 (face font-lock-string-face) 22962 22972 nil 22972 22973 (face font-lock-string-face) 22973 23011 (face font-lock-constant-face) 23011 23012 (face font-lock-string-face) 23012 23022 nil 23022 23023 (face font-lock-string-face) 23023 23055 (face font-lock-constant-face) 23055 23056 (face font-lock-string-face) 23056 23066 nil 23066 23067 (face font-lock-string-face) 23067 23116 (face font-lock-constant-face) 23116 23117 (face font-lock-string-face) 23117 23127 nil 23127 23128 (face font-lock-string-face) 23128 23178 (face font-lock-constant-face) 23178 23179 (face font-lock-string-face) 23179 23189 nil 23189 23190 (face font-lock-string-face) 23190 23228 (face font-lock-constant-face) 23228 23229 (face font-lock-string-face) 23229 23239 nil 23239 23240 (face font-lock-string-face) 23240 23277 (face font-lock-constant-face) 23277 23278 (face font-lock-string-face) 23278 23288 nil 23288 23289 (face font-lock-string-face) 23289 23332 (face font-lock-constant-face) 23332 23333 (face font-lock-string-face) 23333 23343 nil 23343 23344 (face font-lock-string-face) 23344 23368 (face font-lock-constant-face) 23368 23369 (face font-lock-string-face) 23369 23379 nil 23379 23380 (face font-lock-string-face) 23380 23402 (face font-lock-constant-face) 23402 23403 (face font-lock-string-face) 23403 23413 nil 23413 23414 (face font-lock-string-face) 23414 23447 (face font-lock-constant-face) 23447 23448 (face font-lock-string-face) 23448 23458 nil 23458 23459 (face font-lock-string-face) 23459 23487 (face font-lock-constant-face) 23487 23488 (face font-lock-string-face) 23488 23498 nil 23498 23499 (face font-lock-string-face) 23499 23530 (face font-lock-constant-face) 23530 23531 (face font-lock-string-face) 23531 23541 nil 23541 23542 (face font-lock-string-face) 23542 23563 (face font-lock-constant-face) 23563 23564 (face font-lock-string-face) 23564 23574 nil 23574 23575 (face font-lock-string-face) 23575 23609 (face font-lock-constant-face) 23609 23610 (face font-lock-string-face) 23610 23620 nil 23620 23621 (face font-lock-string-face) 23621 23654 (face font-lock-constant-face) 23654 23655 (face font-lock-string-face) 23655 23665 nil 23665 23666 (face font-lock-string-face) 23666 23700 (face font-lock-constant-face) 23700 23701 (face font-lock-string-face) 23701 23711 nil 23711 23712 (face font-lock-string-face) 23712 23753 (face font-lock-constant-face) 23753 23754 (face font-lock-string-face) 23754 23764 nil 23764 23765 (face font-lock-string-face) 23765 23790 (face font-lock-constant-face) 23790 23791 (face font-lock-string-face) 23791 23801 nil 23801 23802 (face font-lock-string-face) 23802 23825 (face font-lock-constant-face) 23825 23826 (face font-lock-string-face) 23826 23836 nil 23836 23837 (face font-lock-string-face) 23837 23862 (face font-lock-constant-face) 23862 23863 (face font-lock-string-face) 23863 23873 nil 23873 23874 (face font-lock-string-face) 23874 23906 (face font-lock-constant-face) 23906 23907 (face font-lock-string-face) 23907 23917 nil 23917 23918 (face font-lock-string-face) 23918 23947 (face font-lock-constant-face) 23947 23948 (face font-lock-string-face) 23948 23958 nil 23958 23959 (face font-lock-string-face) 23959 23981 (face font-lock-constant-face) 23981 23982 (face font-lock-string-face) 23982 23992 nil 23992 23993 (face font-lock-string-face) 23993 24014 (face font-lock-constant-face) 24014 24015 (face font-lock-string-face) 24015 24025 nil 24025 24026 (face font-lock-string-face) 24026 24054 (face font-lock-constant-face) 24054 24055 (face font-lock-string-face) 24055 24065 nil 24065 24066 (face font-lock-string-face) 24066 24093 (face font-lock-constant-face) 24093 24094 (face font-lock-string-face) 24094 24104 nil 24104 24105 (face font-lock-string-face) 24105 24133 (face font-lock-constant-face) 24133 24134 (face font-lock-string-face) 24134 24144 nil 24144 24145 (face font-lock-string-face) 24145 24177 (face font-lock-constant-face) 24177 24178 (face font-lock-string-face) 24178 24188 nil 24188 24189 (face font-lock-string-face) 24189 24221 (face font-lock-constant-face) 24221 24222 (face font-lock-string-face) 24222 24232 nil 24232 24233 (face font-lock-string-face) 24233 24277 (face font-lock-constant-face) 24277 24278 (face font-lock-string-face) 24278 24288 nil 24288 24289 (face font-lock-string-face) 24289 24328 (face font-lock-constant-face) 24328 24329 (face font-lock-string-face) 24329 24339 nil 24339 24340 (face font-lock-string-face) 24340 24379 (face font-lock-constant-face) 24379 24380 (face font-lock-string-face) 24380 24390 nil 24390 24391 (face font-lock-string-face) 24391 24424 (face font-lock-constant-face) 24424 24425 (face font-lock-string-face) 24425 24435 nil 24435 24436 (face font-lock-string-face) 24436 24476 (face font-lock-constant-face) 24476 24477 (face font-lock-string-face) 24477 24487 nil 24487 24488 (face font-lock-string-face) 24488 24521 (face font-lock-constant-face) 24521 24522 (face font-lock-string-face) 24522 24532 nil 24532 24533 (face font-lock-string-face) 24533 24567 (face font-lock-constant-face) 24567 24568 (face font-lock-string-face) 24568 24578 nil 24578 24579 (face font-lock-string-face) 24579 24610 (face font-lock-constant-face) 24610 24611 (face font-lock-string-face) 24611 24621 nil 24621 24622 (face font-lock-string-face) 24622 24673 (face font-lock-constant-face) 24673 24674 (face font-lock-string-face) 24674 24684 nil 24684 24685 (face font-lock-string-face) 24685 24725 (face font-lock-constant-face) 24725 24726 (face font-lock-string-face) 24726 24736 nil 24736 24737 (face font-lock-string-face) 24737 24773 (face font-lock-constant-face) 24773 24774 (face font-lock-string-face) 24774 24784 nil 24784 24785 (face font-lock-string-face) 24785 24821 (face font-lock-constant-face) 24821 24822 (face font-lock-string-face) 24822 24832 nil 24832 24833 (face font-lock-string-face) 24833 24874 (face font-lock-constant-face) 24874 24875 (face font-lock-string-face) 24875 24885 nil 24885 24886 (face font-lock-string-face) 24886 24926 (face font-lock-constant-face) 24926 24927 (face font-lock-string-face) 24927 24937 nil 24937 24938 (face font-lock-string-face) 24938 24977 (face font-lock-constant-face) 24977 24978 (face font-lock-string-face) 24978 24988 nil 24988 24989 (face font-lock-string-face) 24989 25035 (face font-lock-constant-face) 25035 25036 (face font-lock-string-face) 25036 25046 nil 25046 25047 (face font-lock-string-face) 25047 25070 (face font-lock-constant-face) 25070 25071 (face font-lock-string-face) 25071 25081 nil 25081 25082 (face font-lock-string-face) 25082 25104 (face font-lock-constant-face) 25104 25105 (face font-lock-string-face) 25105 25115 nil 25115 25116 (face font-lock-string-face) 25116 25152 (face font-lock-constant-face) 25152 25153 (face font-lock-string-face) 25153 25163 nil 25163 25164 (face font-lock-string-face) 25164 25210 (face font-lock-constant-face) 25210 25211 (face font-lock-string-face) 25211 25221 nil 25221 25222 (face font-lock-string-face) 25222 25250 (face font-lock-constant-face) 25250 25251 (face font-lock-string-face) 25251 25268 nil 25268 25269 (face font-lock-string-face) 25269 25279 (face font-lock-keyword-face) 25279 25280 (face font-lock-string-face) 25280 25293 nil 25293 25294 (face font-lock-string-face) 25294 25319 (face font-lock-variable-name-face) 25319 25320 (face font-lock-string-face) 25320 25334 nil 25334 25335 (face font-lock-string-face) 25335 25345 (face font-lock-keyword-face) 25345 25346 (face font-lock-string-face) 25346 25363 nil 25363 25364 (face font-lock-string-face) 25364 25385 (face font-lock-variable-name-face) 25385 25386 (face font-lock-string-face) 25386 25404 nil 25404 25405 (face font-lock-string-face) 25405 25417 (face font-lock-keyword-face) 25417 25418 (face font-lock-string-face) 25418 25438 nil 25438 25439 (face font-lock-string-face) 25439 25480 (face font-lock-function-name-face) 25480 25481 (face font-lock-string-face) 25481 25550 nil 25550 25551 (face font-lock-string-face) 25551 25566 (face font-lock-variable-name-face) 25566 25567 (face font-lock-string-face) 25567 25581 nil 25581 25582 (face font-lock-string-face) 25582 25594 (face font-lock-keyword-face) 25594 25595 (face font-lock-string-face) 25595 25611 nil 25611 25612 (face font-lock-string-face) 25612 25651 (face font-lock-function-name-face) 25651 25652 (face font-lock-string-face) 25652 25688 nil 25688 25689 (face font-lock-string-face) 25689 25704 (face font-lock-variable-name-face) 25704 25705 (face font-lock-string-face) 25705 25719 nil 25719 25720 (face font-lock-string-face) 25720 25728 (face font-lock-keyword-face) 25728 25729 (face font-lock-string-face) 25729 25745 nil 25745 25746 (face font-lock-string-face) 25746 25782 (face font-lock-constant-face) 25782 25783 (face font-lock-string-face) 25783 25797 nil 25797 25798 (face font-lock-string-face) 25798 25820 (face font-lock-constant-face) 25820 25821 (face font-lock-string-face) 25821 25835 nil 25835 25836 (face font-lock-string-face) 25836 25857 (face font-lock-constant-face) 25857 25858 (face font-lock-string-face) 25858 25872 nil 25872 25873 (face font-lock-string-face) 25873 25905 (face font-lock-constant-face) 25905 25906 (face font-lock-string-face) 25906 25920 nil 25920 25921 (face font-lock-string-face) 25921 25961 (face font-lock-constant-face) 25961 25962 (face font-lock-string-face) 25962 25976 nil 25976 25977 (face font-lock-string-face) 25977 26016 (face font-lock-constant-face) 26016 26017 (face font-lock-string-face) 26017 26031 nil 26031 26032 (face font-lock-string-face) 26032 26065 (face font-lock-constant-face) 26065 26066 (face font-lock-string-face) 26066 26080 nil 26080 26081 (face font-lock-string-face) 26081 26115 (face font-lock-constant-face) 26115 26116 (face font-lock-string-face) 26116 26130 nil 26130 26131 (face font-lock-string-face) 26131 26162 (face font-lock-constant-face) 26162 26163 (face font-lock-string-face) 26163 26177 nil 26177 26178 (face font-lock-string-face) 26178 26229 (face font-lock-constant-face) 26229 26230 (face font-lock-string-face) 26230 26244 nil 26244 26245 (face font-lock-string-face) 26245 26285 (face font-lock-constant-face) 26285 26286 (face font-lock-string-face) 26286 26300 nil 26300 26301 (face font-lock-string-face) 26301 26337 (face font-lock-constant-face) 26337 26338 (face font-lock-string-face) 26338 26352 nil 26352 26353 (face font-lock-string-face) 26353 26394 (face font-lock-constant-face) 26394 26395 (face font-lock-string-face) 26395 26409 nil 26409 26410 (face font-lock-string-face) 26410 26443 (face font-lock-constant-face) 26443 26444 (face font-lock-string-face) 26444 26458 nil 26458 26459 (face font-lock-string-face) 26459 26495 (face font-lock-constant-face) 26495 26496 (face font-lock-string-face) 26496 26532 nil 26532 26533 (face font-lock-string-face) 26533 26546 (face font-lock-variable-name-face) 26546 26547 (face font-lock-string-face) 26547 26561 nil 26561 26562 (face font-lock-string-face) 26562 26572 (face font-lock-keyword-face) 26572 26573 (face font-lock-string-face) 26573 26590 nil 26590 26591 (face font-lock-string-face) 26591 26604 (face font-lock-variable-name-face) 26604 26605 (face font-lock-string-face) 26605 26623 nil 26623 26624 (face font-lock-string-face) 26624 26631 (face font-lock-keyword-face) 26631 26632 (face font-lock-string-face) 26632 26652 nil 26652 26653 (face font-lock-string-face) 26653 26688 (face font-lock-constant-face) 26688 26689 (face font-lock-string-face) 26689 26722 nil 26722 26723 (face font-lock-string-face) 26723 26730 (face font-lock-keyword-face) 26730 26731 (face font-lock-string-face) 26731 26751 nil 26751 26752 (face font-lock-string-face) 26752 26760 (face font-lock-preprocessor-face) 26760 26761 (face font-lock-string-face) 26761 26831 nil 26831 26832 (face font-lock-string-face) 26832 26873 (face font-lock-variable-name-face) 26873 26874 (face font-lock-string-face) 26874 26888 nil 26888 26889 (face font-lock-string-face) 26889 26896 (face font-lock-keyword-face) 26896 26897 (face font-lock-string-face) 26897 26913 nil 26913 26914 (face font-lock-string-face) 26914 26954 (face font-lock-constant-face) 26954 26955 (face font-lock-string-face) 26955 26991 nil 26991 26992 (face font-lock-string-face) 26992 27035 (face font-lock-variable-name-face) 27035 27036 (face font-lock-string-face) 27036 27050 nil 27050 27051 (face font-lock-string-face) 27051 27058 (face font-lock-keyword-face) 27058 27059 (face font-lock-string-face) 27059 27075 nil 27075 27076 (face font-lock-string-face) 27076 27095 (face font-lock-constant-face) 27095 27096 (face font-lock-string-face) 27096 27110 nil 27110 27111 (face font-lock-string-face) 27111 27137 (face font-lock-constant-face) 27137 27138 (face font-lock-string-face) 27138 27152 nil 27152 27153 (face font-lock-string-face) 27153 27186 (face font-lock-constant-face) 27186 27187 (face font-lock-string-face) 27187 27201 nil 27201 27202 (face font-lock-string-face) 27202 27235 (face font-lock-constant-face) 27235 27236 (face font-lock-string-face) 27236 27291 nil 27291 27292 (face font-lock-string-face) 27292 27303 (face font-lock-keyword-face) 27303 27304 (face font-lock-string-face) 27304 27306 nil 27306 27307 (face font-lock-string-face) 27307 27325 (face font-lock-function-name-face) 27325 27326 (face font-lock-string-face) 27326 27334 nil 27334 27335 (face font-lock-string-face) 27335 27339 (face font-lock-keyword-face) 27339 27340 (face font-lock-string-face) 27340 27342 nil 27342 27343 (face font-lock-string-face) 27343 27357 (face font-lock-type-face) 27357 27358 (face font-lock-string-face) 27358 27366 nil 27366 27367 (face font-lock-string-face) 27367 27379 (face font-lock-keyword-face) 27379 27380 (face font-lock-string-face) 27380 27392 nil 27392 27393 (face font-lock-string-face) 27393 27398 (face font-lock-function-name-face) 27398 27399 (face font-lock-string-face) 27399 27409 nil 27409 27410 (face font-lock-string-face) 27410 27431 (face font-lock-function-name-face) 27431 27432 (face font-lock-string-face) 27432 27442 nil 27442 27443 (face font-lock-string-face) 27443 27469 (face font-lock-function-name-face) 27469 27470 (face font-lock-string-face) 27470 27480 nil 27480 27481 (face font-lock-string-face) 27481 27507 (face font-lock-function-name-face) 27507 27508 (face font-lock-string-face) 27508 27525 nil 27525 27526 (face font-lock-string-face) 27526 27533 (face font-lock-keyword-face) 27533 27534 (face font-lock-string-face) 27534 27546 nil 27546 27547 (face font-lock-string-face) 27547 27591 (face font-lock-constant-face) 27591 27592 (face font-lock-string-face) 27592 27602 nil 27602 27603 (face font-lock-string-face) 27603 27646 (face font-lock-constant-face) 27646 27647 (face font-lock-string-face) 27647 27657 nil 27657 27658 (face font-lock-string-face) 27658 27679 (face font-lock-constant-face) 27679 27680 (face font-lock-string-face) 27680 27690 nil 27690 27691 (face font-lock-string-face) 27691 27711 (face font-lock-constant-face) 27711 27712 (face font-lock-string-face) 27712 27722 nil 27722 27723 (face font-lock-string-face) 27723 27752 (face font-lock-constant-face) 27752 27753 (face font-lock-string-face) 27753 27763 nil 27763 27764 (face font-lock-string-face) 27764 27792 (face font-lock-constant-face) 27792 27793 (face font-lock-string-face) 27793 27803 nil 27803 27804 (face font-lock-string-face) 27804 27829 (face font-lock-constant-face) 27829 27830 (face font-lock-string-face) 27830 27840 nil 27840 27841 (face font-lock-string-face) 27841 27865 (face font-lock-constant-face) 27865 27866 (face font-lock-string-face) 27866 27876 nil 27876 27877 (face font-lock-string-face) 27877 27901 (face font-lock-constant-face) 27901 27902 (face font-lock-string-face) 27902 27912 nil 27912 27913 (face font-lock-string-face) 27913 27936 (face font-lock-constant-face) 27936 27937 (face font-lock-string-face) 27937 27947 nil 27947 27948 (face font-lock-string-face) 27948 27968 (face font-lock-constant-face) 27968 27969 (face font-lock-string-face) 27969 27979 nil 27979 27980 (face font-lock-string-face) 27980 27999 (face font-lock-constant-face) 27999 28000 (face font-lock-string-face) 28000 28030 nil 28030 28031 (face font-lock-string-face) 28031 28042 (face font-lock-keyword-face) 28042 28043 (face font-lock-string-face) 28043 28045 nil 28045 28046 (face font-lock-string-face) 28046 28058 (face font-lock-function-name-face) 28058 28059 (face font-lock-string-face) 28059 28067 nil 28067 28068 (face font-lock-string-face) 28068 28072 (face font-lock-keyword-face) 28072 28073 (face font-lock-string-face) 28073 28075 nil 28075 28076 (face font-lock-string-face) 28076 28086 (face font-lock-type-face) 28086 28087 (face font-lock-string-face) 28087 28095 nil 28095 28096 (face font-lock-string-face) 28096 28108 (face font-lock-keyword-face) 28108 28109 (face font-lock-string-face) 28109 28121 nil 28121 28122 (face font-lock-string-face) 28122 28127 (face font-lock-function-name-face) 28127 28128 (face font-lock-string-face) 28128 28138 nil 28138 28139 (face font-lock-string-face) 28139 28150 (face font-lock-function-name-face) 28150 28151 (face font-lock-string-face) 28151 28161 nil 28161 28162 (face font-lock-string-face) 28162 28183 (face font-lock-function-name-face) 28183 28184 (face font-lock-string-face) 28184 28194 nil 28194 28195 (face font-lock-string-face) 28195 28216 (face font-lock-function-name-face) 28216 28217 (face font-lock-string-face) 28217 28234 nil 28234 28235 (face font-lock-string-face) 28235 28242 (face font-lock-keyword-face) 28242 28243 (face font-lock-string-face) 28243 28255 nil 28255 28256 (face font-lock-string-face) 28256 28290 (face font-lock-constant-face) 28290 28291 (face font-lock-string-face) 28291 28321 nil 28321 28322 (face font-lock-string-face) 28322 28333 (face font-lock-keyword-face) 28333 28334 (face font-lock-string-face) 28334 28336 nil 28336 28337 (face font-lock-string-face) 28337 28349 (face font-lock-function-name-face) 28349 28350 (face font-lock-string-face) 28350 28358 nil 28358 28359 (face font-lock-string-face) 28359 28363 (face font-lock-keyword-face) 28363 28364 (face font-lock-string-face) 28364 28366 nil 28366 28367 (face font-lock-string-face) 28367 28377 (face font-lock-type-face) 28377 28378 (face font-lock-string-face) 28378 28386 nil 28386 28387 (face font-lock-string-face) 28387 28394 (face font-lock-keyword-face) 28394 28395 (face font-lock-string-face) 28395 28407 nil 28407 28408 (face font-lock-string-face) 28408 28441 (face font-lock-constant-face) 28441 28442 (face font-lock-string-face) 28442 28471 nil 28471 28472 (face font-lock-string-face) 28472 28483 (face font-lock-keyword-face) 28483 28484 (face font-lock-string-face) 28484 28486 nil 28486 28487 (face font-lock-string-face) 28487 28498 (face font-lock-function-name-face) 28498 28499 (face font-lock-string-face) 28499 28507 nil 28507 28508 (face font-lock-string-face) 28508 28512 (face font-lock-keyword-face) 28512 28513 (face font-lock-string-face) 28513 28515 nil 28515 28516 (face font-lock-string-face) 28516 28526 (face font-lock-type-face) 28526 28527 (face font-lock-string-face) 28527 28535 nil 28535 28536 (face font-lock-string-face) 28536 28548 (face font-lock-keyword-face) 28548 28549 (face font-lock-string-face) 28549 28561 nil 28561 28562 (face font-lock-string-face) 28562 28567 (face font-lock-function-name-face) 28567 28568 (face font-lock-string-face) 28568 28578 nil 28578 28579 (face font-lock-string-face) 28579 28600 (face font-lock-function-name-face) 28600 28601 (face font-lock-string-face) 28601 28618 nil 28618 28619 (face font-lock-string-face) 28619 28626 (face font-lock-keyword-face) 28626 28627 (face font-lock-string-face) 28627 28639 nil 28639 28640 (face font-lock-string-face) 28640 28672 (face font-lock-constant-face) 28672 28673 (face font-lock-string-face) 28673 28698 nil 28698 28699 (face font-lock-string-face) 28699 28709 (face font-lock-keyword-face) 28709 28710 (face font-lock-string-face) 28710 28719 nil 28719 28720 (face font-lock-string-face) 28720 28729 (face font-lock-variable-name-face) 28729 28730 (face font-lock-string-face) 28730 28740 nil 28740 28741 (face font-lock-string-face) 28741 28748 (face font-lock-keyword-face) 28748 28749 (face font-lock-string-face) 28749 28773 nil 28773 28774 (face font-lock-string-face) 28774 28785 (face font-lock-keyword-face) 28785 28786 (face font-lock-string-face) 28786 28788 nil 28788 28789 (face font-lock-string-face) 28789 28799 (face font-lock-function-name-face) 28799 28800 (face font-lock-string-face) 28800 28812 nil 28812 28813 (face font-lock-string-face) 28813 28817 (face font-lock-keyword-face) 28817 28818 (face font-lock-string-face) 28818 28820 nil 28820 28821 (face font-lock-string-face) 28821 28831 (face font-lock-type-face) 28831 28832 (face font-lock-string-face) 28832 28844 nil 28844 28845 (face font-lock-string-face) 28845 28857 (face font-lock-keyword-face) 28857 28858 (face font-lock-string-face) 28858 28874 nil 28874 28875 (face font-lock-string-face) 28875 28880 (face font-lock-function-name-face) 28880 28881 (face font-lock-string-face) 28881 28895 nil 28895 28896 (face font-lock-string-face) 28896 28907 (face font-lock-function-name-face) 28907 28908 (face font-lock-string-face) 28908 28922 nil 28922 28923 (face font-lock-string-face) 28923 28944 (face font-lock-function-name-face) 28944 28945 (face font-lock-string-face) 28945 28959 nil 28959 28960 (face font-lock-string-face) 28960 29043 (face font-lock-function-name-face) 29043 29044 (face font-lock-string-face) 29044 29058 nil 29058 29059 (face font-lock-string-face) 29059 29074 (face font-lock-function-name-face) 29074 29075 (face font-lock-string-face) 29075 29100 nil 29100 29101 (face font-lock-string-face) 29101 29113 (face font-lock-keyword-face) 29113 29114 (face font-lock-string-face) 29114 29130 nil 29130 29131 (face font-lock-string-face) 29131 29133 (face font-lock-constant-face) 29133 29138 (face font-lock-variable-name-face) 29138 29163 (face font-lock-constant-face) 29163 29164 (face font-lock-string-face) 29164 29189 nil 29189 29190 (face font-lock-string-face) 29190 29197 (face font-lock-keyword-face) 29197 29198 (face font-lock-string-face) 29198 29214 nil 29214 29215 (face font-lock-string-face) 29215 29238 (face font-lock-constant-face) 29238 29239 (face font-lock-string-face) 29239 29253 nil 29253 29254 (face font-lock-string-face) 29254 29280 (face font-lock-constant-face) 29280 29281 (face font-lock-string-face) 29281 29295 nil 29295 29296 (face font-lock-string-face) 29296 29321 (face font-lock-constant-face) 29321 29322 (face font-lock-string-face) 29322 29336 nil 29336 29337 (face font-lock-string-face) 29337 29361 (face font-lock-constant-face) 29361 29362 (face font-lock-string-face) 29362 29376 nil 29376 29377 (face font-lock-string-face) 29377 29407 (face font-lock-constant-face) 29407 29408 (face font-lock-string-face) 29408 29422 nil 29422 29423 (face font-lock-string-face) 29423 29453 (face font-lock-constant-face) 29453 29454 (face font-lock-string-face) 29454 29468 nil 29468 29469 (face font-lock-string-face) 29469 29493 (face font-lock-constant-face) 29493 29494 (face font-lock-string-face) 29494 29508 nil 29508 29509 (face font-lock-string-face) 29509 29532 (face font-lock-constant-face) 29532 29533 (face font-lock-string-face) 29533 29547 nil 29547 29548 (face font-lock-string-face) 29548 29575 (face font-lock-constant-face) 29575 29576 (face font-lock-string-face) 29576 29590 nil 29590 29591 (face font-lock-string-face) 29591 29614 (face font-lock-constant-face) 29614 29615 (face font-lock-string-face) 29615 29640 nil 29640 29655 (face font-lock-string-face) 29655 29671 nil 29671 29685 (face font-lock-string-face) 29685 29703 nil 29703 29714 (face font-lock-string-face) 29714 29716 nil 29716 29719 (face font-lock-string-face) 29719 29729 nil 29729 29754 (face font-lock-comment-face) 29754 29792 nil 29792 29793 (face font-lock-string-face) 29793 29800 (face font-lock-keyword-face) 29800 29801 (face font-lock-string-face) 29801 29817 nil 29817 29818 (face font-lock-string-face) 29818 29843 (face font-lock-preprocessor-face) 29843 29844 (face font-lock-string-face) 29844 29892 nil 29892 29893 (face font-lock-string-face) 29893 29929 (face font-lock-variable-name-face) 29929 29930 (face font-lock-string-face) 29930 29940 nil 29940 29941 (face font-lock-string-face) 29941 29948 (face font-lock-keyword-face) 29948 29949 (face font-lock-string-face) 29949 29973 nil 29973 29974 (face font-lock-string-face) 29974 29985 (face font-lock-keyword-face) 29985 29986 (face font-lock-string-face) 29986 29988 nil 29988 29989 (face font-lock-string-face) 29989 30001 (face font-lock-function-name-face) 30001 30002 (face font-lock-string-face) 30002 30014 nil 30014 30015 (face font-lock-string-face) 30015 30019 (face font-lock-keyword-face) 30019 30020 (face font-lock-string-face) 30020 30022 nil 30022 30023 (face font-lock-string-face) 30023 30033 (face font-lock-type-face) 30033 30034 (face font-lock-string-face) 30034 30046 nil 30046 30047 (face font-lock-string-face) 30047 30059 (face font-lock-keyword-face) 30059 30060 (face font-lock-string-face) 30060 30076 nil 30076 30077 (face font-lock-string-face) 30077 30082 (face font-lock-function-name-face) 30082 30083 (face font-lock-string-face) 30083 30097 nil 30097 30098 (face font-lock-string-face) 30098 30109 (face font-lock-function-name-face) 30109 30110 (face font-lock-string-face) 30110 30124 nil 30124 30125 (face font-lock-string-face) 30125 30146 (face font-lock-function-name-face) 30146 30147 (face font-lock-string-face) 30147 30161 nil 30161 30162 (face font-lock-string-face) 30162 30180 (face font-lock-function-name-face) 30180 30181 (face font-lock-string-face) 30181 30206 nil 30206 30207 (face font-lock-string-face) 30207 30214 (face font-lock-keyword-face) 30214 30215 (face font-lock-string-face) 30215 30231 nil 30231 30232 (face font-lock-string-face) 30232 30266 (face font-lock-constant-face) 30266 30267 (face font-lock-string-face) 30267 30281 nil 30281 30282 (face font-lock-string-face) 30282 30321 (face font-lock-constant-face) 30321 30322 (face font-lock-string-face) 30322 30336 nil 30336 30337 (face font-lock-string-face) 30337 30375 (face font-lock-constant-face) 30375 30376 (face font-lock-string-face) 30376 30390 nil 30390 30391 (face font-lock-string-face) 30391 30430 (face font-lock-constant-face) 30430 30431 (face font-lock-string-face) 30431 30445 nil 30445 30446 (face font-lock-string-face) 30446 30484 (face font-lock-constant-face) 30484 30485 (face font-lock-string-face) 30485 30499 nil 30499 30500 (face font-lock-string-face) 30500 30533 (face font-lock-constant-face) 30533 30534 (face font-lock-string-face) 30534 30548 nil 30548 30549 (face font-lock-string-face) 30549 30581 (face font-lock-constant-face) 30581 30582 (face font-lock-string-face) 30582 30596 nil 30596 30597 (face font-lock-string-face) 30597 30626 (face font-lock-constant-face) 30626 30627 (face font-lock-string-face) 30627 30641 nil 30641 30642 (face font-lock-string-face) 30642 30670 (face font-lock-constant-face) 30670 30671 (face font-lock-string-face) 30671 30685 nil 30685 30686 (face font-lock-string-face) 30686 30714 (face font-lock-constant-face) 30714 30715 (face font-lock-string-face) 30715 30729 nil 30729 30730 (face font-lock-string-face) 30730 30757 (face font-lock-constant-face) 30757 30758 (face font-lock-string-face) 30758 30783 nil 30783 30784 (face font-lock-string-face) 30784 30794 (face font-lock-keyword-face) 30794 30795 (face font-lock-string-face) 30795 30812 nil 30812 30813 (face font-lock-string-face) 30813 30834 (face font-lock-variable-name-face) 30834 30835 (face font-lock-string-face) 30835 30853 nil 30853 30854 (face font-lock-string-face) 30854 30866 (face font-lock-keyword-face) 30866 30867 (face font-lock-string-face) 30867 30887 nil 30887 30888 (face font-lock-string-face) 30888 30917 (face font-lock-function-name-face) 30917 30918 (face font-lock-string-face) 30918 30951 nil 30951 30952 (face font-lock-string-face) 30952 30959 (face font-lock-keyword-face) 30959 30960 (face font-lock-string-face) 30960 30980 nil 30980 30981 (face font-lock-string-face) 30981 31015 (face font-lock-constant-face) 31015 31016 (face font-lock-string-face) 31016 31064 nil 31064 31065 (face font-lock-string-face) 31065 31074 (face font-lock-variable-name-face) 31074 31075 (face font-lock-string-face) 31075 31093 nil 31093 31094 (face font-lock-string-face) 31094 31106 (face font-lock-keyword-face) 31106 31107 (face font-lock-string-face) 31107 31127 nil 31127 31128 (face font-lock-string-face) 31128 31175 (face font-lock-function-name-face) 31175 31176 (face font-lock-string-face) 31176 31194 nil 31194 31195 (face font-lock-string-face) 31195 31245 (face font-lock-function-name-face) 31245 31246 (face font-lock-string-face) 31246 31279 nil 31279 31280 (face font-lock-string-face) 31280 31287 (face font-lock-keyword-face) 31287 31288 (face font-lock-string-face) 31288 31308 nil 31308 31309 (face font-lock-string-face) 31309 31341 (face font-lock-constant-face) 31341 31342 (face font-lock-string-face) 31342 31423 nil 31423 31424 (face font-lock-string-face) 31424 31462 (face font-lock-variable-name-face) 31462 31463 (face font-lock-string-face) 31463 31473 nil 31473 31474 (face font-lock-string-face) 31474 31481 (face font-lock-keyword-face) 31481 31482 (face font-lock-string-face) 31482 31506 nil 31506 31507 (face font-lock-string-face) 31507 31518 (face font-lock-keyword-face) 31518 31519 (face font-lock-string-face) 31519 31521 nil 31521 31522 (face font-lock-string-face) 31522 31539 (face font-lock-function-name-face) 31539 31540 (face font-lock-string-face) 31540 31552 nil 31552 31553 (face font-lock-string-face) 31553 31557 (face font-lock-keyword-face) 31557 31558 (face font-lock-string-face) 31558 31560 nil 31560 31561 (face font-lock-string-face) 31561 31571 (face font-lock-type-face) 31571 31572 (face font-lock-string-face) 31572 31584 nil 31584 31585 (face font-lock-string-face) 31585 31597 (face font-lock-keyword-face) 31597 31598 (face font-lock-string-face) 31598 31614 nil 31614 31615 (face font-lock-string-face) 31615 31636 (face font-lock-function-name-face) 31636 31637 (face font-lock-string-face) 31637 31651 nil 31651 31652 (face font-lock-string-face) 31652 31670 (face font-lock-function-name-face) 31670 31671 (face font-lock-string-face) 31671 31696 nil 31696 31697 (face font-lock-string-face) 31697 31706 (face font-lock-keyword-face) 31706 31707 (face font-lock-string-face) 31707 31723 nil 31723 31724 (face font-lock-string-face) 31724 31728 (face font-lock-constant-face) 31728 31729 (face font-lock-string-face) 31729 31743 nil 31743 31744 (face font-lock-string-face) 31744 31748 (face font-lock-constant-face) 31748 31749 (face font-lock-string-face) 31749 31774 nil 31774 31775 (face font-lock-string-face) 31775 31782 (face font-lock-keyword-face) 31782 31783 (face font-lock-string-face) 31783 31799 nil 31799 31800 (face font-lock-string-face) 31800 31844 (face font-lock-constant-face) 31844 31845 (face font-lock-string-face) 31845 31893 nil 31893 31894 (face font-lock-string-face) 31894 31943 (face font-lock-variable-name-face) 31943 31944 (face font-lock-string-face) 31944 31954 nil 31954 31955 (face font-lock-string-face) 31955 31962 (face font-lock-keyword-face) 31962 31963 (face font-lock-string-face) 31963 31987 nil 31987 31988 (face font-lock-string-face) 31988 31999 (face font-lock-keyword-face) 31999 32000 (face font-lock-string-face) 32000 32002 nil 32002 32003 (face font-lock-string-face) 32003 32013 (face font-lock-function-name-face) 32013 32014 (face font-lock-string-face) 32014 32026 nil 32026 32027 (face font-lock-string-face) 32027 32031 (face font-lock-keyword-face) 32031 32032 (face font-lock-string-face) 32032 32034 nil 32034 32035 (face font-lock-string-face) 32035 32045 (face font-lock-type-face) 32045 32046 (face font-lock-string-face) 32046 32058 nil 32058 32059 (face font-lock-string-face) 32059 32071 (face font-lock-keyword-face) 32071 32072 (face font-lock-string-face) 32072 32088 nil 32088 32089 (face font-lock-string-face) 32089 32094 (face font-lock-function-name-face) 32094 32095 (face font-lock-string-face) 32095 32109 nil 32109 32110 (face font-lock-string-face) 32110 32121 (face font-lock-function-name-face) 32121 32122 (face font-lock-string-face) 32122 32136 nil 32136 32137 (face font-lock-string-face) 32137 32158 (face font-lock-function-name-face) 32158 32159 (face font-lock-string-face) 32159 32173 nil 32173 32174 (face font-lock-string-face) 32174 32192 (face font-lock-function-name-face) 32192 32193 (face font-lock-string-face) 32193 32218 nil 32218 32219 (face font-lock-string-face) 32219 32232 (face font-lock-keyword-face) 32232 32233 (face font-lock-string-face) 32233 32249 nil 32249 32250 (face font-lock-string-face) 32250 32259 (face font-lock-keyword-face) 32259 32260 (face font-lock-string-face) 32260 32278 nil 32278 32279 (face font-lock-string-face) 32279 32283 (face font-lock-constant-face) 32283 32284 (face font-lock-string-face) 32284 32300 nil 32300 32301 (face font-lock-string-face) 32301 32306 (face font-lock-constant-face) 32306 32307 (face font-lock-string-face) 32307 32323 nil 32323 32324 (face font-lock-string-face) 32324 32333 (face font-lock-constant-face) 32333 32334 (face font-lock-string-face) 32334 32350 nil 32350 32351 (face font-lock-string-face) 32351 32357 (face font-lock-constant-face) 32357 32358 (face font-lock-string-face) 32358 32398 nil 32398 32399 (face font-lock-string-face) 32399 32406 (face font-lock-keyword-face) 32406 32407 (face font-lock-string-face) 32407 32423 nil 32423 32424 (face font-lock-string-face) 32424 32462 (face font-lock-constant-face) 32462 32463 (face font-lock-string-face) 32463 32477 nil 32477 32478 (face font-lock-string-face) 32478 32515 (face font-lock-constant-face) 32515 32516 (face font-lock-string-face) 32516 32530 nil 32530 32531 (face font-lock-string-face) 32531 32568 (face font-lock-constant-face) 32568 32569 (face font-lock-string-face) 32569 32583 nil 32583 32584 (face font-lock-string-face) 32584 32620 (face font-lock-constant-face) 32620 32621 (face font-lock-string-face) 32621 32635 nil 32635 32636 (face font-lock-string-face) 32636 32666 (face font-lock-constant-face) 32666 32667 (face font-lock-string-face) 32667 32681 nil 32681 32682 (face font-lock-string-face) 32682 32720 (face font-lock-constant-face) 32720 32721 (face font-lock-string-face) 32721 32735 nil 32735 32736 (face font-lock-string-face) 32736 32773 (face font-lock-constant-face) 32773 32774 (face font-lock-string-face) 32774 32822 nil 32822 32823 (face font-lock-string-face) 32823 32838 (face font-lock-variable-name-face) 32838 32839 (face font-lock-string-face) 32839 32849 nil 32849 32850 (face font-lock-string-face) 32850 32857 (face font-lock-keyword-face) 32857 32858 (face font-lock-string-face) 32858 32882 nil 32882 32883 (face font-lock-string-face) 32883 32894 (face font-lock-keyword-face) 32894 32895 (face font-lock-string-face) 32895 32897 nil 32897 32898 (face font-lock-string-face) 32898 32912 (face font-lock-function-name-face) 32912 32913 (face font-lock-string-face) 32913 32925 nil 32925 32926 (face font-lock-string-face) 32926 32930 (face font-lock-keyword-face) 32930 32931 (face font-lock-string-face) 32931 32933 nil 32933 32934 (face font-lock-string-face) 32934 32948 (face font-lock-type-face) 32948 32949 (face font-lock-string-face) 32949 32961 nil 32961 32962 (face font-lock-string-face) 32962 32969 (face font-lock-keyword-face) 32969 32970 (face font-lock-string-face) 32970 32986 nil 32986 32987 (face font-lock-string-face) 32987 33022 (face font-lock-constant-face) 33022 33023 (face font-lock-string-face) 33023 33037 nil 33037 33038 (face font-lock-string-face) 33038 33072 (face font-lock-constant-face) 33072 33073 (face font-lock-string-face) 33073 33098 nil 33098 33099 (face font-lock-string-face) 33099 33111 (face font-lock-keyword-face) 33111 33112 (face font-lock-string-face) 33112 33128 nil 33128 33129 (face font-lock-string-face) 33129 33150 (face font-lock-function-name-face) 33150 33151 (face font-lock-string-face) 33151 33176 nil 33176 33177 (face font-lock-string-face) 33177 33189 (face font-lock-keyword-face) 33189 33190 (face font-lock-string-face) 33190 33206 nil 33206 33207 (face font-lock-string-face) 33207 33209 (face font-lock-constant-face) 33209 33232 (face font-lock-variable-name-face) 33232 33239 (face font-lock-constant-face) 33239 33240 (face font-lock-string-face) 33240 33265 nil 33265 33266 (face font-lock-string-face) 33266 33273 (face font-lock-keyword-face) 33273 33274 (face font-lock-string-face) 33274 33306 nil 33306 33307 (face font-lock-string-face) 33307 33318 (face font-lock-keyword-face) 33318 33319 (face font-lock-string-face) 33319 33321 nil 33321 33322 (face font-lock-string-face) 33322 33342 (face font-lock-function-name-face) 33342 33343 (face font-lock-string-face) 33343 33359 nil 33359 33360 (face font-lock-string-face) 33360 33366 (face font-lock-keyword-face) 33366 33367 (face font-lock-string-face) 33367 33387 nil 33387 33388 (face font-lock-string-face) 33388 33434 (face font-lock-constant-face) 33434 33435 (face font-lock-string-face) 33435 33453 nil 33453 33454 (face font-lock-string-face) 33454 33519 (face font-lock-constant-face) 33519 33520 (face font-lock-string-face) 33520 33553 nil 33553 33554 (face font-lock-string-face) 33554 33561 (face font-lock-keyword-face) 33561 33562 (face font-lock-string-face) 33562 33582 nil 33582 33583 (face font-lock-string-face) 33583 33585 (face font-lock-constant-face) 33585 33608 (face font-lock-variable-name-face) 33608 33647 (face font-lock-constant-face) 33647 33648 (face font-lock-string-face) 33648 33681 nil 33681 33682 (face font-lock-string-face) 33682 33688 (face font-lock-keyword-face) 33688 33689 (face font-lock-string-face) 33689 33709 nil 33709 33710 (face font-lock-string-face) 33710 33716 (face font-lock-constant-face) 33716 33717 (face font-lock-string-face) 33717 33735 nil 33735 33736 (face font-lock-string-face) 33736 33738 (face font-lock-constant-face) 33738 33743 (face font-lock-variable-name-face) 33743 33788 (face font-lock-constant-face) 33788 33789 (face font-lock-string-face) 33789 33807 nil 33807 33808 (face font-lock-string-face) 33808 33810 (face font-lock-constant-face) 33810 33811 (face font-lock-string-face) 33811 33829 nil 33829 33830 (face font-lock-string-face) 33830 33833 (face font-lock-constant-face) 33833 33840 (face font-lock-variable-name-face) 33840 33841 (face font-lock-constant-face) 33841 33842 (face font-lock-string-face) 33842 33860 nil 33860 33861 (face font-lock-string-face) 33861 33864 (face font-lock-constant-face) 33864 33872 (face font-lock-variable-name-face) 33872 33873 (face font-lock-constant-face) 33873 33874 (face font-lock-string-face) 33874 33952 nil 33952 33953 (face font-lock-string-face) 33953 33964 (face font-lock-keyword-face) 33964 33965 (face font-lock-string-face) 33965 33967 nil 33967 33968 (face font-lock-string-face) 33968 33978 (face font-lock-function-name-face) 33978 33979 (face font-lock-string-face) 33979 33991 nil 33991 33992 (face font-lock-string-face) 33992 33996 (face font-lock-keyword-face) 33996 33997 (face font-lock-string-face) 33997 33999 nil 33999 34000 (face font-lock-string-face) 34000 34004 (face font-lock-type-face) 34004 34005 (face font-lock-string-face) 34005 34017 nil 34017 34018 (face font-lock-string-face) 34018 34030 (face font-lock-keyword-face) 34030 34031 (face font-lock-string-face) 34031 34035 nil 34035 34036 (face font-lock-string-face) 34036 34062 (face font-lock-function-name-face) 34062 34063 (face font-lock-string-face) 34063 34077 nil 34077 34078 (face font-lock-string-face) 34078 34087 (face font-lock-keyword-face) 34087 34088 (face font-lock-string-face) 34088 34104 nil 34104 34105 (face font-lock-string-face) 34105 34117 (face font-lock-variable-name-face) 34117 34118 (face font-lock-string-face) 34118 34120 nil 34120 34121 (face font-lock-string-face) 34121 34126 (face font-lock-variable-name-face) 34126 34127 (face font-lock-string-face) 34127 34141 nil 34141 34142 (face font-lock-string-face) 34142 34153 (face font-lock-variable-name-face) 34153 34154 (face font-lock-string-face) 34154 34156 nil 34156 34157 (face font-lock-string-face) 34157 34174 (face font-lock-variable-name-face) 34174 34175 (face font-lock-string-face) 34175 34200 nil 34200 34201 (face font-lock-string-face) 34201 34209 (face font-lock-keyword-face) 34209 34210 (face font-lock-string-face) 34210 34214 nil 34214 34215 (face font-lock-string-face) 34215 34233 (face font-lock-constant-face) 34233 34234 (face font-lock-string-face) 34234 34268 nil 34268 34287 (face font-lock-comment-face) 34287 34293 nil 34293 34365 (face font-lock-comment-face) 34365 34371 nil 34371 34372 (face font-lock-string-face) 34372 34379 (face font-lock-keyword-face) 34379 34380 (face font-lock-string-face) 34380 34404 nil 34404 34405 (face font-lock-string-face) 34405 34416 (face font-lock-keyword-face) 34416 34417 (face font-lock-string-face) 34417 34419 nil 34419 34420 (face font-lock-string-face) 34420 34436 (face font-lock-function-name-face) 34436 34437 (face font-lock-string-face) 34437 34449 nil 34449 34450 (face font-lock-string-face) 34450 34454 (face font-lock-keyword-face) 34454 34455 (face font-lock-string-face) 34455 34457 nil 34457 34458 (face font-lock-string-face) 34458 34468 (face font-lock-type-face) 34468 34469 (face font-lock-string-face) 34469 34481 nil 34481 34482 (face font-lock-string-face) 34482 34494 (face font-lock-keyword-face) 34494 34495 (face font-lock-string-face) 34495 34511 nil 34511 34512 (face font-lock-string-face) 34512 34517 (face font-lock-function-name-face) 34517 34518 (face font-lock-string-face) 34518 34532 nil 34532 34533 (face font-lock-string-face) 34533 34551 (face font-lock-function-name-face) 34551 34552 (face font-lock-string-face) 34552 34566 nil 34566 34567 (face font-lock-string-face) 34567 34588 (face font-lock-function-name-face) 34588 34589 (face font-lock-string-face) 34589 34603 nil 34603 34604 (face font-lock-string-face) 34604 34630 (face font-lock-function-name-face) 34630 34631 (face font-lock-string-face) 34631 34645 nil 34645 34646 (face font-lock-string-face) 34646 34680 (face font-lock-function-name-face) 34680 34681 (face font-lock-string-face) 34681 34695 nil 34695 34696 (face font-lock-string-face) 34696 34730 (face font-lock-function-name-face) 34730 34731 (face font-lock-string-face) 34731 34745 nil 34745 34746 (face font-lock-string-face) 34746 34772 (face font-lock-function-name-face) 34772 34773 (face font-lock-string-face) 34773 34787 nil 34787 34788 (face font-lock-string-face) 34788 34827 (face font-lock-function-name-face) 34827 34828 (face font-lock-string-face) 34828 34853 nil 34853 34854 (face font-lock-string-face) 34854 34861 (face font-lock-keyword-face) 34861 34862 (face font-lock-string-face) 34862 34878 nil 34878 34879 (face font-lock-string-face) 34879 34904 (face font-lock-constant-face) 34904 34905 (face font-lock-string-face) 34905 34930 nil 34930 34931 (face font-lock-string-face) 34931 34941 (face font-lock-keyword-face) 34941 34942 (face font-lock-string-face) 34942 34959 nil 34959 34960 (face font-lock-string-face) 34960 34981 (face font-lock-variable-name-face) 34981 34982 (face font-lock-string-face) 34982 35000 nil 35000 35001 (face font-lock-string-face) 35001 35013 (face font-lock-keyword-face) 35013 35014 (face font-lock-string-face) 35014 35034 nil 35034 35077 (face font-lock-comment-face) 35077 35093 nil 35093 35123 (face font-lock-comment-face) 35123 35139 nil 35139 35164 (face font-lock-comment-face) 35164 35180 nil 35180 35194 (face font-lock-comment-face) 35194 35210 nil 35210 35211 (face font-lock-string-face) 35211 35240 (face font-lock-function-name-face) 35240 35241 (face font-lock-string-face) 35241 35274 nil 35274 35275 (face font-lock-string-face) 35275 35285 (face font-lock-keyword-face) 35285 35286 (face font-lock-string-face) 35286 35307 nil 35307 35308 (face font-lock-string-face) 35308 35329 (face font-lock-variable-name-face) 35329 35330 (face font-lock-string-face) 35330 35352 nil 35352 35353 (face font-lock-string-face) 35353 35365 (face font-lock-keyword-face) 35365 35366 (face font-lock-string-face) 35366 35390 nil 35390 35391 (face font-lock-string-face) 35391 35432 (face font-lock-function-name-face) 35432 35433 (face font-lock-string-face) 35433 35553 nil 35553 35554 (face font-lock-string-face) 35554 35565 (face font-lock-keyword-face) 35565 35566 (face font-lock-string-face) 35566 35568 nil 35568 35569 (face font-lock-string-face) 35569 35592 (face font-lock-function-name-face) 35592 35593 (face font-lock-string-face) 35593 35605 nil 35605 35606 (face font-lock-string-face) 35606 35610 (face font-lock-keyword-face) 35610 35611 (face font-lock-string-face) 35611 35613 nil 35613 35614 (face font-lock-string-face) 35614 35624 (face font-lock-type-face) 35624 35625 (face font-lock-string-face) 35625 35637 nil 35637 35638 (face font-lock-string-face) 35638 35650 (face font-lock-keyword-face) 35650 35651 (face font-lock-string-face) 35651 35667 nil 35667 35668 (face font-lock-string-face) 35668 35673 (face font-lock-function-name-face) 35673 35674 (face font-lock-string-face) 35674 35688 nil 35688 35689 (face font-lock-string-face) 35689 35707 (face font-lock-function-name-face) 35707 35708 (face font-lock-string-face) 35708 35722 nil 35722 35723 (face font-lock-string-face) 35723 35757 (face font-lock-function-name-face) 35757 35758 (face font-lock-string-face) 35758 35772 nil 35772 35773 (face font-lock-string-face) 35773 35799 (face font-lock-function-name-face) 35799 35800 (face font-lock-string-face) 35800 35814 nil 35814 35815 (face font-lock-string-face) 35815 35841 (face font-lock-function-name-face) 35841 35842 (face font-lock-string-face) 35842 35856 nil 35856 35857 (face font-lock-string-face) 35857 35896 (face font-lock-function-name-face) 35896 35897 (face font-lock-string-face) 35897 35922 nil 35922 35923 (face font-lock-string-face) 35923 35930 (face font-lock-keyword-face) 35930 35931 (face font-lock-string-face) 35931 35947 nil 35947 35948 (face font-lock-string-face) 35948 35970 (face font-lock-constant-face) 35970 35971 (face font-lock-string-face) 35971 35985 nil 35985 35986 (face font-lock-string-face) 35986 36011 (face font-lock-constant-face) 36011 36012 (face font-lock-string-face) 36012 36026 nil 36026 36027 (face font-lock-string-face) 36027 36060 (face font-lock-constant-face) 36060 36061 (face font-lock-string-face) 36061 36075 nil 36075 36076 (face font-lock-string-face) 36076 36117 (face font-lock-constant-face) 36117 36118 (face font-lock-string-face) 36118 36143 nil 36143 36144 (face font-lock-string-face) 36144 36154 (face font-lock-keyword-face) 36154 36155 (face font-lock-string-face) 36155 36172 nil 36172 36173 (face font-lock-string-face) 36173 36198 (face font-lock-variable-name-face) 36198 36199 (face font-lock-string-face) 36199 36217 nil 36217 36218 (face font-lock-string-face) 36218 36228 (face font-lock-keyword-face) 36228 36229 (face font-lock-string-face) 36229 36250 nil 36250 36251 (face font-lock-string-face) 36251 36272 (face font-lock-variable-name-face) 36272 36273 (face font-lock-string-face) 36273 36295 nil 36295 36296 (face font-lock-string-face) 36296 36308 (face font-lock-keyword-face) 36308 36309 (face font-lock-string-face) 36309 36333 nil 36333 36334 (face font-lock-string-face) 36334 36375 (face font-lock-function-name-face) 36375 36376 (face font-lock-string-face) 36376 36496 nil 36496 36497 (face font-lock-string-face) 36497 36508 (face font-lock-keyword-face) 36508 36509 (face font-lock-string-face) 36509 36511 nil 36511 36512 (face font-lock-string-face) 36512 36524 (face font-lock-function-name-face) 36524 36525 (face font-lock-string-face) 36525 36537 nil 36537 36538 (face font-lock-string-face) 36538 36542 (face font-lock-keyword-face) 36542 36543 (face font-lock-string-face) 36543 36545 nil 36545 36546 (face font-lock-string-face) 36546 36556 (face font-lock-type-face) 36556 36557 (face font-lock-string-face) 36557 36569 nil 36569 36570 (face font-lock-string-face) 36570 36582 (face font-lock-keyword-face) 36582 36583 (face font-lock-string-face) 36583 36599 nil 36599 36600 (face font-lock-string-face) 36600 36605 (face font-lock-function-name-face) 36605 36606 (face font-lock-string-face) 36606 36620 nil 36620 36621 (face font-lock-string-face) 36621 36642 (face font-lock-function-name-face) 36642 36643 (face font-lock-string-face) 36643 36657 nil 36657 36658 (face font-lock-string-face) 36658 36697 (face font-lock-function-name-face) 36697 36698 (face font-lock-string-face) 36698 36723 nil 36723 36724 (face font-lock-string-face) 36724 36731 (face font-lock-keyword-face) 36731 36732 (face font-lock-string-face) 36732 36748 nil 36748 36749 (face font-lock-string-face) 36749 36782 (face font-lock-constant-face) 36782 36783 (face font-lock-string-face) 36783 36829 nil 36829 36830 (face font-lock-string-face) 36830 36841 (face font-lock-keyword-face) 36841 36842 (face font-lock-string-face) 36842 36844 nil 36844 36845 (face font-lock-string-face) 36845 36856 (face font-lock-function-name-face) 36856 36857 (face font-lock-string-face) 36857 36869 nil 36869 36870 (face font-lock-string-face) 36870 36874 (face font-lock-keyword-face) 36874 36875 (face font-lock-string-face) 36875 36877 nil 36877 36878 (face font-lock-string-face) 36878 36888 (face font-lock-type-face) 36888 36889 (face font-lock-string-face) 36889 36901 nil 36901 36902 (face font-lock-string-face) 36902 36914 (face font-lock-keyword-face) 36914 36915 (face font-lock-string-face) 36915 36931 nil 36931 36932 (face font-lock-string-face) 36932 36937 (face font-lock-function-name-face) 36937 36938 (face font-lock-string-face) 36938 36952 nil 36952 36953 (face font-lock-string-face) 36953 36974 (face font-lock-function-name-face) 36974 36975 (face font-lock-string-face) 36975 36989 nil 36989 36990 (face font-lock-string-face) 36990 37029 (face font-lock-function-name-face) 37029 37030 (face font-lock-string-face) 37030 37055 nil 37055 37056 (face font-lock-string-face) 37056 37063 (face font-lock-keyword-face) 37063 37064 (face font-lock-string-face) 37064 37080 nil 37080 37081 (face font-lock-string-face) 37081 37113 (face font-lock-constant-face) 37113 37114 (face font-lock-string-face) 37114 37163 nil) diff --git a/deps/gyp/tools/graphviz.py b/deps/gyp/tools/graphviz.py new file mode 100755 index 0000000000..326ae221cf --- /dev/null +++ b/deps/gyp/tools/graphviz.py @@ -0,0 +1,100 @@ +#!/usr/bin/env python + +# Copyright (c) 2011 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. + +"""Using the JSON dumped by the dump-dependency-json generator, +generate input suitable for graphviz to render a dependency graph of +targets.""" + +import collections +import json +import sys + + +def ParseTarget(target): + target, _, suffix = target.partition('#') + filename, _, target = target.partition(':') + return filename, target, suffix + + +def LoadEdges(filename, targets): + """Load the edges map from the dump file, and filter it to only + show targets in |targets| and their depedendents.""" + + file = open('dump.json') + edges = json.load(file) + file.close() + + # Copy out only the edges we're interested in from the full edge list. + target_edges = {} + to_visit = targets[:] + while to_visit: + src = to_visit.pop() + if src in target_edges: + continue + target_edges[src] = edges[src] + to_visit.extend(edges[src]) + + return target_edges + + +def WriteGraph(edges): + """Print a graphviz graph to stdout. + |edges| is a map of target to a list of other targets it depends on.""" + + # Bucket targets by file. + files = collections.defaultdict(list) + for src, dst in edges.items(): + build_file, target_name, toolset = ParseTarget(src) + files[build_file].append(src) + + print 'digraph D {' + print ' fontsize=8' # Used by subgraphs. + print ' node [fontsize=8]' + + # Output nodes by file. We must first write out each node within + # its file grouping before writing out any edges that may refer + # to those nodes. + for filename, targets in files.items(): + if len(targets) == 1: + # If there's only one node for this file, simplify + # the display by making it a box without an internal node. + target = targets[0] + build_file, target_name, toolset = ParseTarget(target) + print ' "%s" [shape=box, label="%s\\n%s"]' % (target, filename, + target_name) + else: + # Group multiple nodes together in a subgraph. + print ' subgraph "cluster_%s" {' % filename + print ' label = "%s"' % filename + for target in targets: + build_file, target_name, toolset = ParseTarget(target) + print ' "%s" [label="%s"]' % (target, target_name) + print ' }' + + # Now that we've placed all the nodes within subgraphs, output all + # the edges between nodes. + for src, dsts in edges.items(): + for dst in dsts: + print ' "%s" -> "%s"' % (src, dst) + + print '}' + + +def main(): + if len(sys.argv) < 2: + print >>sys.stderr, __doc__ + print >>sys.stderr + print >>sys.stderr, 'usage: %s target1 target2...' % (sys.argv[0]) + return 1 + + edges = LoadEdges('dump.json', sys.argv[1:]) + + WriteGraph(edges) + return 0 + + +if __name__ == '__main__': + sys.exit(main()) diff --git a/deps/gyp/tools/pretty_gyp.py b/deps/gyp/tools/pretty_gyp.py new file mode 100755 index 0000000000..c51d35872c --- /dev/null +++ b/deps/gyp/tools/pretty_gyp.py @@ -0,0 +1,155 @@ +#!/usr/bin/env python + +# 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. + +"""Pretty-prints the contents of a GYP file.""" + +import sys +import re + + +# Regex to remove comments when we're counting braces. +COMMENT_RE = re.compile(r'\s*#.*') + +# Regex to remove quoted strings when we're counting braces. +# It takes into account quoted quotes, and makes sure that the quotes match. +# NOTE: It does not handle quotes that span more than one line, or +# cases where an escaped quote is preceeded by an escaped backslash. +QUOTE_RE_STR = r'(?P<q>[\'"])(.*?)(?<![^\\][\\])(?P=q)' +QUOTE_RE = re.compile(QUOTE_RE_STR) + + +def comment_replace(matchobj): + return matchobj.group(1) + matchobj.group(2) + '#' * len(matchobj.group(3)) + + +def mask_comments(input): + """Mask the quoted strings so we skip braces inside quoted strings.""" + search_re = re.compile(r'(.*?)(#)(.*)') + return [search_re.sub(comment_replace, line) for line in input] + + +def quote_replace(matchobj): + return "%s%s%s%s" % (matchobj.group(1), + matchobj.group(2), + 'x'*len(matchobj.group(3)), + matchobj.group(2)) + + +def mask_quotes(input): + """Mask the quoted strings so we skip braces inside quoted strings.""" + search_re = re.compile(r'(.*?)' + QUOTE_RE_STR) + return [search_re.sub(quote_replace, line) for line in input] + + +def do_split(input, masked_input, search_re): + output = [] + mask_output = [] + for (line, masked_line) in zip(input, masked_input): + m = search_re.match(masked_line) + while m: + split = len(m.group(1)) + line = line[:split] + r'\n' + line[split:] + masked_line = masked_line[:split] + r'\n' + masked_line[split:] + m = search_re.match(masked_line) + output.extend(line.split(r'\n')) + mask_output.extend(masked_line.split(r'\n')) + return (output, mask_output) + + +def split_double_braces(input): + """Masks out the quotes and comments, and then splits appropriate + lines (lines that matche the double_*_brace re's above) before + indenting them below. + + These are used to split lines which have multiple braces on them, so + that the indentation looks prettier when all laid out (e.g. closing + braces make a nice diagonal line). + """ + double_open_brace_re = re.compile(r'(.*?[\[\{\(,])(\s*)([\[\{\(])') + double_close_brace_re = re.compile(r'(.*?[\]\}\)],?)(\s*)([\]\}\)])') + + masked_input = mask_quotes(input) + masked_input = mask_comments(masked_input) + + (output, mask_output) = do_split(input, masked_input, double_open_brace_re) + (output, mask_output) = do_split(output, mask_output, double_close_brace_re) + + return output + + +def count_braces(line): + """keeps track of the number of braces on a given line and returns the result. + + It starts at zero and subtracts for closed braces, and adds for open braces. + """ + open_braces = ['[', '(', '{'] + close_braces = [']', ')', '}'] + closing_prefix_re = re.compile(r'(.*?[^\s\]\}\)]+.*?)([\]\}\)],?)\s*$') + cnt = 0 + stripline = COMMENT_RE.sub(r'', line) + stripline = QUOTE_RE.sub(r"''", stripline) + for char in stripline: + for brace in open_braces: + if char == brace: + cnt += 1 + for brace in close_braces: + if char == brace: + cnt -= 1 + + after = False + if cnt > 0: + after = True + + # This catches the special case of a closing brace having something + # other than just whitespace ahead of it -- we don't want to + # unindent that until after this line is printed so it stays with + # the previous indentation level. + if cnt < 0 and closing_prefix_re.match(stripline): + after = True + return (cnt, after) + + +def prettyprint_input(lines): + """Does the main work of indenting the input based on the brace counts.""" + indent = 0 + basic_offset = 2 + last_line = "" + for line in lines: + if COMMENT_RE.match(line): + print line + else: + line = line.strip('\r\n\t ') # Otherwise doesn't strip \r on Unix. + if len(line) > 0: + (brace_diff, after) = count_braces(line) + if brace_diff != 0: + if after: + print " " * (basic_offset * indent) + line + indent += brace_diff + else: + indent += brace_diff + print " " * (basic_offset * indent) + line + else: + print " " * (basic_offset * indent) + line + else: + print "" + last_line = line + + +def main(): + if len(sys.argv) > 1: + data = open(sys.argv[1]).read().splitlines() + else: + data = sys.stdin.read().splitlines() + # Split up the double braces. + lines = split_double_braces(data) + + # Indent and print the output. + prettyprint_input(lines) + return 0 + + +if __name__ == '__main__': + sys.exit(main()) diff --git a/deps/gyp/tools/pretty_sln.py b/deps/gyp/tools/pretty_sln.py new file mode 100755 index 0000000000..ca8cf4ad3f --- /dev/null +++ b/deps/gyp/tools/pretty_sln.py @@ -0,0 +1,169 @@ +#!/usr/bin/env python + +# 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. + +"""Prints the information in a sln file in a diffable way. + + It first outputs each projects in alphabetical order with their + dependencies. + + Then it outputs a possible build order. +""" + +__author__ = 'nsylvain (Nicolas Sylvain)' + +import os +import re +import sys +import pretty_vcproj + +def BuildProject(project, built, projects, deps): + # if all dependencies are done, we can build it, otherwise we try to build the + # dependency. + # This is not infinite-recursion proof. + for dep in deps[project]: + if dep not in built: + BuildProject(dep, built, projects, deps) + print project + built.append(project) + +def ParseSolution(solution_file): + # All projects, their clsid and paths. + projects = dict() + + # A list of dependencies associated with a project. + dependencies = dict() + + # Regular expressions that matches the SLN format. + # The first line of a project definition. + begin_project = re.compile(r'^Project\("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942' + r'}"\) = "(.*)", "(.*)", "(.*)"$') + # The last line of a project definition. + end_project = re.compile('^EndProject$') + # The first line of a dependency list. + begin_dep = re.compile( + r'ProjectSection\(ProjectDependencies\) = postProject$') + # The last line of a dependency list. + end_dep = re.compile('EndProjectSection$') + # A line describing a dependency. + dep_line = re.compile(' *({.*}) = ({.*})$') + + in_deps = False + solution = open(solution_file) + for line in solution: + results = begin_project.search(line) + if results: + # Hack to remove icu because the diff is too different. + if results.group(1).find('icu') != -1: + continue + # We remove "_gyp" from the names because it helps to diff them. + current_project = results.group(1).replace('_gyp', '') + projects[current_project] = [results.group(2).replace('_gyp', ''), + results.group(3), + results.group(2)] + dependencies[current_project] = [] + continue + + results = end_project.search(line) + if results: + current_project = None + continue + + results = begin_dep.search(line) + if results: + in_deps = True + continue + + results = end_dep.search(line) + if results: + in_deps = False + continue + + results = dep_line.search(line) + if results and in_deps and current_project: + dependencies[current_project].append(results.group(1)) + continue + + # Change all dependencies clsid to name instead. + for project in dependencies: + # For each dependencies in this project + new_dep_array = [] + for dep in dependencies[project]: + # Look for the project name matching this cldis + for project_info in projects: + if projects[project_info][1] == dep: + new_dep_array.append(project_info) + dependencies[project] = sorted(new_dep_array) + + return (projects, dependencies) + +def PrintDependencies(projects, deps): + print "---------------------------------------" + print "Dependencies for all projects" + print "---------------------------------------" + print "-- --" + + for (project, dep_list) in sorted(deps.items()): + print "Project : %s" % project + print "Path : %s" % projects[project][0] + if dep_list: + for dep in dep_list: + print " - %s" % dep + print "" + + print "-- --" + +def PrintBuildOrder(projects, deps): + print "---------------------------------------" + print "Build order " + print "---------------------------------------" + print "-- --" + + built = [] + for (project, _) in sorted(deps.items()): + if project not in built: + BuildProject(project, built, projects, deps) + + print "-- --" + +def PrintVCProj(projects): + + for project in projects: + print "-------------------------------------" + print "-------------------------------------" + print project + print project + print project + print "-------------------------------------" + print "-------------------------------------" + + project_path = os.path.abspath(os.path.join(os.path.dirname(sys.argv[1]), + projects[project][2])) + + pretty = pretty_vcproj + argv = [ '', + project_path, + '$(SolutionDir)=%s\\' % os.path.dirname(sys.argv[1]), + ] + argv.extend(sys.argv[3:]) + pretty.main(argv) + +def main(): + # check if we have exactly 1 parameter. + if len(sys.argv) < 2: + print 'Usage: %s "c:\\path\\to\\project.sln"' % sys.argv[0] + return 1 + + (projects, deps) = ParseSolution(sys.argv[1]) + PrintDependencies(projects, deps) + PrintBuildOrder(projects, deps) + + if '--recursive' in sys.argv: + PrintVCProj(projects) + return 0 + + +if __name__ == '__main__': + sys.exit(main()) diff --git a/deps/gyp/tools/pretty_vcproj.py b/deps/gyp/tools/pretty_vcproj.py new file mode 100755 index 0000000000..6099bd7cc4 --- /dev/null +++ b/deps/gyp/tools/pretty_vcproj.py @@ -0,0 +1,329 @@ +#!/usr/bin/env python + +# 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. + +"""Make the format of a vcproj really pretty. + + This script normalize and sort an xml. It also fetches all the properties + inside linked vsprops and include them explicitly in the vcproj. + + It outputs the resulting xml to stdout. +""" + +__author__ = 'nsylvain (Nicolas Sylvain)' + +import os +import sys + +from xml.dom.minidom import parse +from xml.dom.minidom import Node + +REPLACEMENTS = dict() +ARGUMENTS = None + + +class CmpTuple(object): + """Compare function between 2 tuple.""" + def __call__(self, x, y): + return cmp(x[0], y[0]) + + +class CmpNode(object): + """Compare function between 2 xml nodes.""" + + def __call__(self, x, y): + def get_string(node): + node_string = "node" + node_string += node.nodeName + if node.nodeValue: + node_string += node.nodeValue + + if node.attributes: + # We first sort by name, if present. + node_string += node.getAttribute("Name") + + all_nodes = [] + for (name, value) in node.attributes.items(): + all_nodes.append((name, value)) + + all_nodes.sort(CmpTuple()) + for (name, value) in all_nodes: + node_string += name + node_string += value + + return node_string + + return cmp(get_string(x), get_string(y)) + + +def PrettyPrintNode(node, indent=0): + if node.nodeType == Node.TEXT_NODE: + if node.data.strip(): + print '%s%s' % (' '*indent, node.data.strip()) + return + + if node.childNodes: + node.normalize() + # Get the number of attributes + attr_count = 0 + if node.attributes: + attr_count = node.attributes.length + + # Print the main tag + if attr_count == 0: + print '%s<%s>' % (' '*indent, node.nodeName) + else: + print '%s<%s' % (' '*indent, node.nodeName) + + all_attributes = [] + for (name, value) in node.attributes.items(): + all_attributes.append((name, value)) + all_attributes.sort(CmpTuple()) + for (name, value) in all_attributes: + print '%s %s="%s"' % (' '*indent, name, value) + print '%s>' % (' '*indent) + if node.nodeValue: + print '%s %s' % (' '*indent, node.nodeValue) + + for sub_node in node.childNodes: + PrettyPrintNode(sub_node, indent=indent+2) + print '%s</%s>' % (' '*indent, node.nodeName) + + +def FlattenFilter(node): + """Returns a list of all the node and sub nodes.""" + node_list = [] + + if (node.attributes and + node.getAttribute('Name') == '_excluded_files'): + # We don't add the "_excluded_files" filter. + return [] + + for current in node.childNodes: + if current.nodeName == 'Filter': + node_list.extend(FlattenFilter(current)) + else: + node_list.append(current) + + return node_list + + +def FixFilenames(filenames, current_directory): + new_list = [] + for filename in filenames: + if filename: + for key in REPLACEMENTS: + filename = filename.replace(key, REPLACEMENTS[key]) + os.chdir(current_directory) + filename = filename.strip('"\' ') + if filename.startswith('$'): + new_list.append(filename) + else: + new_list.append(os.path.abspath(filename)) + return new_list + + +def AbsoluteNode(node): + """Makes all the properties we know about in this node absolute.""" + if node.attributes: + for (name, value) in node.attributes.items(): + if name in ['InheritedPropertySheets', 'RelativePath', + 'AdditionalIncludeDirectories', + 'IntermediateDirectory', 'OutputDirectory', + 'AdditionalLibraryDirectories']: + # We want to fix up these paths + path_list = value.split(';') + new_list = FixFilenames(path_list, os.path.dirname(ARGUMENTS[1])) + node.setAttribute(name, ';'.join(new_list)) + if not value: + node.removeAttribute(name) + + +def CleanupVcproj(node): + """For each sub node, we call recursively this function.""" + for sub_node in node.childNodes: + AbsoluteNode(sub_node) + CleanupVcproj(sub_node) + + # Normalize the node, and remove all extranous whitespaces. + for sub_node in node.childNodes: + if sub_node.nodeType == Node.TEXT_NODE: + sub_node.data = sub_node.data.replace("\r", "") + sub_node.data = sub_node.data.replace("\n", "") + sub_node.data = sub_node.data.rstrip() + + # Fix all the semicolon separated attributes to be sorted, and we also + # remove the dups. + if node.attributes: + for (name, value) in node.attributes.items(): + sorted_list = sorted(value.split(';')) + unique_list = [] + for i in sorted_list: + if not unique_list.count(i): + unique_list.append(i) + node.setAttribute(name, ';'.join(unique_list)) + if not value: + node.removeAttribute(name) + + if node.childNodes: + node.normalize() + + # For each node, take a copy, and remove it from the list. + node_array = [] + while node.childNodes and node.childNodes[0]: + # Take a copy of the node and remove it from the list. + current = node.childNodes[0] + node.removeChild(current) + + # If the child is a filter, we want to append all its children + # to this same list. + if current.nodeName == 'Filter': + node_array.extend(FlattenFilter(current)) + else: + node_array.append(current) + + + # Sort the list. + node_array.sort(CmpNode()) + + # Insert the nodes in the correct order. + for new_node in node_array: + # But don't append empty tool node. + if new_node.nodeName == 'Tool': + if new_node.attributes and new_node.attributes.length == 1: + # This one was empty. + continue + if new_node.nodeName == 'UserMacro': + continue + node.appendChild(new_node) + + +def GetConfiguationNodes(vcproj): + #TODO(nsylvain): Find a better way to navigate the xml. + nodes = [] + for node in vcproj.childNodes: + if node.nodeName == "Configurations": + for sub_node in node.childNodes: + if sub_node.nodeName == "Configuration": + nodes.append(sub_node) + + return nodes + + +def GetChildrenVsprops(filename): + dom = parse(filename) + if dom.documentElement.attributes: + vsprops = dom.documentElement.getAttribute('InheritedPropertySheets') + return FixFilenames(vsprops.split(';'), os.path.dirname(filename)) + return [] + +def SeekToNode(node1, child2): + # A text node does not have properties. + if child2.nodeType == Node.TEXT_NODE: + return None + + # Get the name of the current node. + current_name = child2.getAttribute("Name") + if not current_name: + # There is no name. We don't know how to merge. + return None + + # Look through all the nodes to find a match. + for sub_node in node1.childNodes: + if sub_node.nodeName == child2.nodeName: + name = sub_node.getAttribute("Name") + if name == current_name: + return sub_node + + # No match. We give up. + return None + + +def MergeAttributes(node1, node2): + # No attributes to merge? + if not node2.attributes: + return + + for (name, value2) in node2.attributes.items(): + # Don't merge the 'Name' attribute. + if name == 'Name': + continue + value1 = node1.getAttribute(name) + if value1: + # The attribute exist in the main node. If it's equal, we leave it + # untouched, otherwise we concatenate it. + if value1 != value2: + node1.setAttribute(name, ';'.join([value1, value2])) + else: + # The attribute does nto exist in the main node. We append this one. + node1.setAttribute(name, value2) + + # If the attribute was a property sheet attributes, we remove it, since + # they are useless. + if name == 'InheritedPropertySheets': + node1.removeAttribute(name) + + +def MergeProperties(node1, node2): + MergeAttributes(node1, node2) + for child2 in node2.childNodes: + child1 = SeekToNode(node1, child2) + if child1: + MergeProperties(child1, child2) + else: + node1.appendChild(child2.cloneNode(True)) + + +def main(argv): + """Main function of this vcproj prettifier.""" + global ARGUMENTS + ARGUMENTS = argv + + # check if we have exactly 1 parameter. + if len(argv) < 2: + print ('Usage: %s "c:\\path\\to\\vcproj.vcproj" [key1=value1] ' + '[key2=value2]' % argv[0]) + return 1 + + # Parse the keys + for i in range(2, len(argv)): + (key, value) = argv[i].split('=') + REPLACEMENTS[key] = value + + # Open the vcproj and parse the xml. + dom = parse(argv[1]) + + # First thing we need to do is find the Configuration Node and merge them + # with the vsprops they include. + for configuration_node in GetConfiguationNodes(dom.documentElement): + # Get the property sheets associated with this configuration. + vsprops = configuration_node.getAttribute('InheritedPropertySheets') + + # Fix the filenames to be absolute. + vsprops_list = FixFilenames(vsprops.strip().split(';'), + os.path.dirname(argv[1])) + + # Extend the list of vsprops with all vsprops contained in the current + # vsprops. + for current_vsprops in vsprops_list: + vsprops_list.extend(GetChildrenVsprops(current_vsprops)) + + # Now that we have all the vsprops, we need to merge them. + for current_vsprops in vsprops_list: + MergeProperties(configuration_node, + parse(current_vsprops).documentElement) + + # Now that everything is merged, we need to cleanup the xml. + CleanupVcproj(dom.documentElement) + + # Finally, we use the prett xml function to print the vcproj back to the + # user. + #print dom.toprettyxml(newl="\n") + PrettyPrintNode(dom.documentElement) + return 0 + + +if __name__ == '__main__': + sys.exit(main(sys.argv)) |