diff options
Diffstat (limited to 'third_party/python/gyp/test')
1578 files changed, 50553 insertions, 0 deletions
diff --git a/third_party/python/gyp/test/actions-bare/gyptest-bare.py b/third_party/python/gyp/test/actions-bare/gyptest-bare.py new file mode 100755 index 0000000000..e3d6db1029 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/actions-bare/src/bare.gyp b/third_party/python/gyp/test/actions-bare/src/bare.gyp new file mode 100644 index 0000000000..3d28f099d4 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/actions-bare/src/bare.py b/third_party/python/gyp/test/actions-bare/src/bare.py new file mode 100755 index 0000000000..e153b774f9 --- /dev/null +++ b/third_party/python/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], 'w') +f.write('Hello from bare.py\n') +f.close() diff --git a/third_party/python/gyp/test/actions-depfile/depfile.gyp b/third_party/python/gyp/test/actions-depfile/depfile.gyp new file mode 100644 index 0000000000..617fe705b5 --- /dev/null +++ b/third_party/python/gyp/test/actions-depfile/depfile.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': 'depfile_target', + 'type': 'none', + 'actions': [ + { + 'action_name': 'depfile_action', + 'inputs': [ + 'input.txt', + ], + 'outputs': [ + 'output.txt', + ], + 'depfile': 'depfile_action.d', + 'action': [ + 'python', 'touch.py', '<(PRODUCT_DIR)/<(_depfile)', + ], + 'msvs_cygwin_shell': 0, + }, + { + 'action_name': 'depfile_action_intermediate_dir', + 'inputs': [ + 'input.txt', + ], + 'outputs': [ + 'output-intermediate.txt', + ], + 'depfile': '<(INTERMEDIATE_DIR)/depfile_action_intermediate_dir.d', + 'action': [ + 'python', 'touch.py', '<(_depfile)', + ], + 'msvs_cygwin_shell': 0, + }, + ], + }, + ], +} diff --git a/third_party/python/gyp/test/actions-depfile/gyptest-all.py b/third_party/python/gyp/test/actions-depfile/gyptest-all.py new file mode 100644 index 0000000000..68b32d611c --- /dev/null +++ b/third_party/python/gyp/test/actions-depfile/gyptest-all.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. + +"""Verifies that depfile fields are output in ninja rules.""" + +import TestGyp +import os + +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_action.d', + 'depfile = ' + os.path.join( + 'obj', 'depfile_target.gen/depfile_action_intermediate_dir.d'), + ] + test.must_contain_all_lines(contents, expected) + + test.build('depfile.gyp') + test.built_file_must_exist('depfile_action.d') + test.built_file_must_exist( + 'obj/depfile_target.gen/depfile_action_intermediate_dir.d') + + test.pass_test() diff --git a/third_party/python/gyp/test/actions-depfile/input.txt b/third_party/python/gyp/test/actions-depfile/input.txt new file mode 100644 index 0000000000..3f9177e45e --- /dev/null +++ b/third_party/python/gyp/test/actions-depfile/input.txt @@ -0,0 +1 @@ +input diff --git a/third_party/python/gyp/test/actions-depfile/touch.py b/third_party/python/gyp/test/actions-depfile/touch.py new file mode 100644 index 0000000000..57f8316093 --- /dev/null +++ b/third_party/python/gyp/test/actions-depfile/touch.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. + +import os +import sys + +"""Cross-platform touch.""" + +for fname in sys.argv[1:]: + if os.path.exists(fname): + os.utime(fname, None) + else: + if not os.path.exists(os.path.join('.', os.path.dirname(fname))): + os.makedirs(os.path.dirname(fname)) + open(fname, 'w').close() diff --git a/third_party/python/gyp/test/actions-multiple-outputs-with-dependencies/gyptest-action.py b/third_party/python/gyp/test/actions-multiple-outputs-with-dependencies/gyptest-action.py new file mode 100755 index 0000000000..a9d218282c --- /dev/null +++ b/third_party/python/gyp/test/actions-multiple-outputs-with-dependencies/gyptest-action.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. + +""" +Verifies actions with multiple outputs & dependncies will correctly rebuild. + +This is a regression test for crrev.com/1177163002. +""" + +from __future__ import print_function + +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/third_party/python/gyp/test/actions-multiple-outputs-with-dependencies/src/action.gyp b/third_party/python/gyp/test/actions-multiple-outputs-with-dependencies/src/action.gyp new file mode 100644 index 0000000000..a305d65ea9 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/actions-multiple-outputs-with-dependencies/src/rcopy.py b/third_party/python/gyp/test/actions-multiple-outputs-with-dependencies/src/rcopy.py new file mode 100644 index 0000000000..fb029598c4 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/actions-multiple-outputs/gyptest-multiple-outputs.py b/third_party/python/gyp/test/actions-multiple-outputs/gyptest-multiple-outputs.py new file mode 100755 index 0000000000..5e2682d00f --- /dev/null +++ b/third_party/python/gyp/test/actions-multiple-outputs/gyptest-multiple-outputs.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. + +""" +Verifies actions with multiple outputs will correctly rebuild. +""" + +from __future__ import print_function + +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/third_party/python/gyp/test/actions-multiple-outputs/src/multiple-outputs.gyp b/third_party/python/gyp/test/actions-multiple-outputs/src/multiple-outputs.gyp new file mode 100644 index 0000000000..7a3d74b11a --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/actions-multiple-outputs/src/touch.py b/third_party/python/gyp/test/actions-multiple-outputs/src/touch.py new file mode 100644 index 0000000000..bc61267f39 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/actions-multiple/gyptest-all.py b/third_party/python/gyp/test/actions-multiple/gyptest-all.py new file mode 100755 index 0000000000..2a083de9b0 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/actions-multiple/src/actions.gyp b/third_party/python/gyp/test/actions-multiple/src/actions.gyp new file mode 100644 index 0000000000..d7423b589f --- /dev/null +++ b/third_party/python/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': [ + 'copyfile.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': [ + 'copyfile.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': [ + 'copyfile.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': [ + 'copyfile.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': [ + 'copyfile.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': [ + 'copyfile.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': [ + 'copyfile.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/third_party/python/gyp/test/actions-multiple/src/copyfile.py b/third_party/python/gyp/test/actions-multiple/src/copyfile.py new file mode 100755 index 0000000000..0774679380 --- /dev/null +++ b/third_party/python/gyp/test/actions-multiple/src/copyfile.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/third_party/python/gyp/test/actions-multiple/src/filter.py b/third_party/python/gyp/test/actions-multiple/src/filter.py new file mode 100755 index 0000000000..f61a5fa59a --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/actions-multiple/src/foo.c b/third_party/python/gyp/test/actions-multiple/src/foo.c new file mode 100644 index 0000000000..23c4ef7f26 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/actions-multiple/src/input.txt b/third_party/python/gyp/test/actions-multiple/src/input.txt new file mode 100644 index 0000000000..c7c7da3c64 --- /dev/null +++ b/third_party/python/gyp/test/actions-multiple/src/input.txt @@ -0,0 +1 @@ +hello there diff --git a/third_party/python/gyp/test/actions-multiple/src/main.c b/third_party/python/gyp/test/actions-multiple/src/main.c new file mode 100644 index 0000000000..0a420b9034 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/actions-none/gyptest-none.py b/third_party/python/gyp/test/actions-none/gyptest-none.py new file mode 100755 index 0000000000..933cfad30c --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/actions-none/src/fake_cross.py b/third_party/python/gyp/test/actions-none/src/fake_cross.py new file mode 100644 index 0000000000..a03ea87fc9 --- /dev/null +++ b/third_party/python/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], 'w') +for filename in sys.argv[1:-1]: + fh.write(open(filename).read()) +fh.close() diff --git a/third_party/python/gyp/test/actions-none/src/foo.cc b/third_party/python/gyp/test/actions-none/src/foo.cc new file mode 100644 index 0000000000..c6c61745ba --- /dev/null +++ b/third_party/python/gyp/test/actions-none/src/foo.cc @@ -0,0 +1 @@ +foo.cc diff --git a/third_party/python/gyp/test/actions-none/src/none_with_source_files.gyp b/third_party/python/gyp/test/actions-none/src/none_with_source_files.gyp new file mode 100644 index 0000000000..e2aaebc10a --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/actions-subdir/gyptest-action.py b/third_party/python/gyp/test/actions-subdir/gyptest-action.py new file mode 100755 index 0000000000..09cfef1893 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/actions-subdir/src/make-file.py b/third_party/python/gyp/test/actions-subdir/src/make-file.py new file mode 100755 index 0000000000..6055ab9bb3 --- /dev/null +++ b/third_party/python/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], 'w').write(contents) diff --git a/third_party/python/gyp/test/actions-subdir/src/none.gyp b/third_party/python/gyp/test/actions-subdir/src/none.gyp new file mode 100644 index 0000000000..23f8d25a53 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/actions-subdir/src/subdir/make-subdir-file.py b/third_party/python/gyp/test/actions-subdir/src/subdir/make-subdir-file.py new file mode 100755 index 0000000000..02c090a021 --- /dev/null +++ b/third_party/python/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], 'w').write(contents) diff --git a/third_party/python/gyp/test/actions-subdir/src/subdir/subdir.gyp b/third_party/python/gyp/test/actions-subdir/src/subdir/subdir.gyp new file mode 100644 index 0000000000..0315d4eb83 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/actions/generated-header/action.py b/third_party/python/gyp/test/actions/generated-header/action.py new file mode 100644 index 0000000000..9be98798d6 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/actions/generated-header/main.cc b/third_party/python/gyp/test/actions/generated-header/main.cc new file mode 100644 index 0000000000..7973781bc6 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/actions/generated-header/test.gyp b/third_party/python/gyp/test/actions/generated-header/test.gyp new file mode 100644 index 0000000000..209b951ef6 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/actions/gyptest-all.py b/third_party/python/gyp/test/actions/gyptest-all.py new file mode 100755 index 0000000000..c8833a5d1e --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/actions/gyptest-default.py b/third_party/python/gyp/test/actions/gyptest-default.py new file mode 100755 index 0000000000..70c99ec9ce --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/actions/gyptest-errors.py b/third_party/python/gyp/test/actions/gyptest-errors.py new file mode 100755 index 0000000000..e1ef883e1e --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/actions/gyptest-generated-header.py b/third_party/python/gyp/test/actions/gyptest-generated-header.py new file mode 100644 index 0000000000..cd5bd691a6 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/actions/src/action_missing_name.gyp b/third_party/python/gyp/test/actions/src/action_missing_name.gyp new file mode 100644 index 0000000000..6647aac3b5 --- /dev/null +++ b/third_party/python/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', + 'from __future__ import print_function; print(\'missing name\')', + ], + }, + ], + }, + ], +} diff --git a/third_party/python/gyp/test/actions/src/actions.gyp b/third_party/python/gyp/test/actions/src/actions.gyp new file mode 100644 index 0000000000..5d2db1955e --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/actions/src/confirm-dep-files.py b/third_party/python/gyp/test/actions/src/confirm-dep-files.py new file mode 100755 index 0000000000..3b8463057d --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/actions/src/subdir1/counter.py b/third_party/python/gyp/test/actions/src/subdir1/counter.py new file mode 100755 index 0000000000..d888f2e803 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/actions/src/subdir1/executable.gyp b/third_party/python/gyp/test/actions/src/subdir1/executable.gyp new file mode 100644 index 0000000000..6a1ce4f91e --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/actions/src/subdir1/make-prog1.py b/third_party/python/gyp/test/actions/src/subdir1/make-prog1.py new file mode 100755 index 0000000000..7ea1d8a2d4 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/actions/src/subdir1/make-prog2.py b/third_party/python/gyp/test/actions/src/subdir1/make-prog2.py new file mode 100755 index 0000000000..0bfe4973c2 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/actions/src/subdir1/program.c b/third_party/python/gyp/test/actions/src/subdir1/program.c new file mode 100644 index 0000000000..c0931534eb --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/actions/src/subdir2/make-file.py b/third_party/python/gyp/test/actions/src/subdir2/make-file.py new file mode 100755 index 0000000000..088a05e0b0 --- /dev/null +++ b/third_party/python/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], 'w').write(contents) diff --git a/third_party/python/gyp/test/actions/src/subdir2/none.gyp b/third_party/python/gyp/test/actions/src/subdir2/none.gyp new file mode 100644 index 0000000000..2caa97d55c --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/actions/src/subdir3/generate_main.py b/third_party/python/gyp/test/actions/src/subdir3/generate_main.py new file mode 100755 index 0000000000..804d38df31 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/actions/src/subdir3/null_input.gyp b/third_party/python/gyp/test/actions/src/subdir3/null_input.gyp new file mode 100644 index 0000000000..9b0bea5fdb --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/additional-targets/gyptest-additional.py b/third_party/python/gyp/test/additional-targets/gyptest-additional.py new file mode 100755 index 0000000000..466283e55c --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/additional-targets/src/all.gyp b/third_party/python/gyp/test/additional-targets/src/all.gyp new file mode 100644 index 0000000000..21c83080aa --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/additional-targets/src/dir1/actions.gyp b/third_party/python/gyp/test/additional-targets/src/dir1/actions.gyp new file mode 100644 index 0000000000..5089c80913 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/additional-targets/src/dir1/emit.py b/third_party/python/gyp/test/additional-targets/src/dir1/emit.py new file mode 100755 index 0000000000..96db7a57df --- /dev/null +++ b/third_party/python/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], 'w') +f.write('Hello from emit.py\n') +f.close() diff --git a/third_party/python/gyp/test/additional-targets/src/dir1/lib1.c b/third_party/python/gyp/test/additional-targets/src/dir1/lib1.c new file mode 100644 index 0000000000..df4cb10f79 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/analyzer/common.gypi b/third_party/python/gyp/test/analyzer/common.gypi new file mode 100644 index 0000000000..7c664e40da --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/analyzer/gyptest-analyzer.py b/third_party/python/gyp/test/analyzer/gyptest-analyzer.py new file mode 100644 index 0000000000..58a1ce6f07 --- /dev/null +++ b/third_party/python/gyp/test/analyzer/gyptest-analyzer.py @@ -0,0 +1,427 @@ +#!/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 +""" + +from __future__ import print_function + +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/third_party/python/gyp/test/analyzer/static_library_test.gyp b/third_party/python/gyp/test/analyzer/static_library_test.gyp new file mode 100644 index 0000000000..2c8e4bd826 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/analyzer/subdir/subdir.gyp b/third_party/python/gyp/test/analyzer/subdir/subdir.gyp new file mode 100644 index 0000000000..bfa2df48e1 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/analyzer/subdir/subdir2/subdir2.gyp b/third_party/python/gyp/test/analyzer/subdir/subdir2/subdir2.gyp new file mode 100644 index 0000000000..e5aaa92b18 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/analyzer/subdir2/subdir.gyp b/third_party/python/gyp/test/analyzer/subdir2/subdir.gyp new file mode 100644 index 0000000000..d6c709c9ef --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/analyzer/subdir2/subdir.includes.gypi b/third_party/python/gyp/test/analyzer/subdir2/subdir.includes.gypi new file mode 100644 index 0000000000..324e92bcd4 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/analyzer/test.gyp b/third_party/python/gyp/test/analyzer/test.gyp new file mode 100644 index 0000000000..c25ca73bff --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/analyzer/test2.gyp b/third_party/python/gyp/test/analyzer/test2.gyp new file mode 100644 index 0000000000..782b6e6428 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/analyzer/test2.includes.gypi b/third_party/python/gyp/test/analyzer/test2.includes.gypi new file mode 100644 index 0000000000..3e21de23cb --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/analyzer/test2.includes.includes.gypi b/third_party/python/gyp/test/analyzer/test2.includes.includes.gypi new file mode 100644 index 0000000000..de3a025dbb --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/analyzer/test2.toplevel_includes.gypi b/third_party/python/gyp/test/analyzer/test2.toplevel_includes.gypi new file mode 100644 index 0000000000..54fa453b08 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/analyzer/test3.gyp b/third_party/python/gyp/test/analyzer/test3.gyp new file mode 100644 index 0000000000..e52f6bc7d3 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/analyzer/test4.gyp b/third_party/python/gyp/test/analyzer/test4.gyp new file mode 100644 index 0000000000..91cea56c1f --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/analyzer/test5.gyp b/third_party/python/gyp/test/analyzer/test5.gyp new file mode 100644 index 0000000000..f3ea5b0061 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/arflags/gyptest-arflags.py b/third_party/python/gyp/test/arflags/gyptest-arflags.py new file mode 100644 index 0000000000..870a2d8946 --- /dev/null +++ b/third_party/python/gyp/test/arflags/gyptest-arflags.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 building a target with invalid arflags fails. +""" + +from __future__ import print_function + +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/third_party/python/gyp/test/arflags/lib.cc b/third_party/python/gyp/test/arflags/lib.cc new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/third_party/python/gyp/test/arflags/lib.cc diff --git a/third_party/python/gyp/test/arflags/test.gyp b/third_party/python/gyp/test/arflags/test.gyp new file mode 100644 index 0000000000..f7430fae2d --- /dev/null +++ b/third_party/python/gyp/test/arflags/test.gyp @@ -0,0 +1,10 @@ +{ + 'targets': [ + { + 'target_name': 'lib', + 'type': 'static_library', + 'sources': ['lib.cc'], + 'arflags': ['--nonexistent'], + }, + ], +} diff --git a/third_party/python/gyp/test/assembly/gyptest-assembly.py b/third_party/python/gyp/test/assembly/gyptest-assembly.py new file mode 100755 index 0000000000..8a84310544 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/assembly/gyptest-override.py b/third_party/python/gyp/test/assembly/gyptest-override.py new file mode 100644 index 0000000000..e84a23e855 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/assembly/src/as.bat b/third_party/python/gyp/test/assembly/src/as.bat new file mode 100644 index 0000000000..b796db97ca --- /dev/null +++ b/third_party/python/gyp/test/assembly/src/as.bat @@ -0,0 +1,4 @@ +@echo off +:: Mock windows assembler. +cl /MD /c %1 /Fo"%2" + diff --git a/third_party/python/gyp/test/assembly/src/assembly.gyp b/third_party/python/gyp/test/assembly/src/assembly.gyp new file mode 100644 index 0000000000..565cb0fa0e --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/assembly/src/lib1.S b/third_party/python/gyp/test/assembly/src/lib1.S new file mode 100644 index 0000000000..7de9f19cf9 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/assembly/src/lib1.c b/third_party/python/gyp/test/assembly/src/lib1.c new file mode 100644 index 0000000000..be21ecd5f6 --- /dev/null +++ b/third_party/python/gyp/test/assembly/src/lib1.c @@ -0,0 +1,3 @@ +int lib1_function(void) { + return 42; +} diff --git a/third_party/python/gyp/test/assembly/src/override.gyp b/third_party/python/gyp/test/assembly/src/override.gyp new file mode 100644 index 0000000000..39a4072eff --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/assembly/src/override_asm.asm b/third_party/python/gyp/test/assembly/src/override_asm.asm new file mode 100644 index 0000000000..be93b23baa --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/assembly/src/program.c b/third_party/python/gyp/test/assembly/src/program.c new file mode 100644 index 0000000000..eee862712e --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/build-option/gyptest-build.py b/third_party/python/gyp/test/build-option/gyptest-build.py new file mode 100755 index 0000000000..34a9e11d35 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/build-option/hello.c b/third_party/python/gyp/test/build-option/hello.c new file mode 100644 index 0000000000..f6ad129fd7 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/build-option/hello.gyp b/third_party/python/gyp/test/build-option/hello.gyp new file mode 100644 index 0000000000..1974d51ccd --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/builddir/gyptest-all.py b/third_party/python/gyp/test/builddir/gyptest-all.py new file mode 100755 index 0000000000..a26543f49e --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/builddir/gyptest-default.py b/third_party/python/gyp/test/builddir/gyptest-default.py new file mode 100755 index 0000000000..4904cdab42 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/builddir/src/builddir.gypi b/third_party/python/gyp/test/builddir/src/builddir.gypi new file mode 100644 index 0000000000..ce175db8f8 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/builddir/src/func1.c b/third_party/python/gyp/test/builddir/src/func1.c new file mode 100644 index 0000000000..b8e6a06951 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/builddir/src/func2.c b/third_party/python/gyp/test/builddir/src/func2.c new file mode 100644 index 0000000000..14aabac475 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/builddir/src/func3.c b/third_party/python/gyp/test/builddir/src/func3.c new file mode 100644 index 0000000000..3b4edeae6d --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/builddir/src/func4.c b/third_party/python/gyp/test/builddir/src/func4.c new file mode 100644 index 0000000000..732891b79a --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/builddir/src/func5.c b/third_party/python/gyp/test/builddir/src/func5.c new file mode 100644 index 0000000000..18fdfabbbe --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/builddir/src/prog1.c b/third_party/python/gyp/test/builddir/src/prog1.c new file mode 100644 index 0000000000..a32aaf04f9 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/builddir/src/prog1.gyp b/third_party/python/gyp/test/builddir/src/prog1.gyp new file mode 100644 index 0000000000..5b96f035ec --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/builddir/src/subdir2/prog2.c b/third_party/python/gyp/test/builddir/src/subdir2/prog2.c new file mode 100644 index 0000000000..9d682cd783 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/builddir/src/subdir2/prog2.gyp b/third_party/python/gyp/test/builddir/src/subdir2/prog2.gyp new file mode 100644 index 0000000000..96299b646d --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/builddir/src/subdir2/subdir3/prog3.c b/third_party/python/gyp/test/builddir/src/subdir2/subdir3/prog3.c new file mode 100644 index 0000000000..da74965985 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/builddir/src/subdir2/subdir3/prog3.gyp b/third_party/python/gyp/test/builddir/src/subdir2/subdir3/prog3.gyp new file mode 100644 index 0000000000..d7df43c7bd --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/builddir/src/subdir2/subdir3/subdir4/prog4.c b/third_party/python/gyp/test/builddir/src/subdir2/subdir3/subdir4/prog4.c new file mode 100644 index 0000000000..5787d5fa43 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/builddir/src/subdir2/subdir3/subdir4/prog4.gyp b/third_party/python/gyp/test/builddir/src/subdir2/subdir3/subdir4/prog4.gyp new file mode 100644 index 0000000000..862a8a18cd --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/builddir/src/subdir2/subdir3/subdir4/subdir5/prog5.c b/third_party/python/gyp/test/builddir/src/subdir2/subdir3/subdir4/subdir5/prog5.c new file mode 100644 index 0000000000..c6e2ab521f --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/builddir/src/subdir2/subdir3/subdir4/subdir5/prog5.gyp b/third_party/python/gyp/test/builddir/src/subdir2/subdir3/subdir4/subdir5/prog5.gyp new file mode 100644 index 0000000000..fe1c9cbf50 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/cflags/cflags.c b/third_party/python/gyp/test/cflags/cflags.c new file mode 100644 index 0000000000..0a02ba9074 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/cflags/cflags.gyp b/third_party/python/gyp/test/cflags/cflags.gyp new file mode 100644 index 0000000000..2840dc6318 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/cflags/gyptest-cflags.py b/third_party/python/gyp/test/cflags/gyptest-cflags.py new file mode 100755 index 0000000000..f4efccba9b --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/compilable/gyptest-headers.py b/third_party/python/gyp/test/compilable/gyptest-headers.py new file mode 100755 index 0000000000..91760216fb --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/compilable/src/headers.gyp b/third_party/python/gyp/test/compilable/src/headers.gyp new file mode 100644 index 0000000000..b6c2a8857b --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/compilable/src/lib1.cpp b/third_party/python/gyp/test/compilable/src/lib1.cpp new file mode 100644 index 0000000000..51bc31a40b --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/compilable/src/lib1.hpp b/third_party/python/gyp/test/compilable/src/lib1.hpp new file mode 100644 index 0000000000..72e63e8acd --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/compilable/src/program.cpp b/third_party/python/gyp/test/compilable/src/program.cpp new file mode 100644 index 0000000000..8af2c9b6ff --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/compiler-override/compiler-exe.gyp b/third_party/python/gyp/test/compiler-override/compiler-exe.gyp new file mode 100644 index 0000000000..c2f3002f20 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/compiler-override/compiler-global-settings.gyp.in b/third_party/python/gyp/test/compiler-override/compiler-global-settings.gyp.in new file mode 100644 index 0000000000..ca13a53e8d --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/compiler-override/compiler-host.gyp b/third_party/python/gyp/test/compiler-override/compiler-host.gyp new file mode 100644 index 0000000000..ab3d247e0b --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/compiler-override/compiler-shared-lib.gyp b/third_party/python/gyp/test/compiler-override/compiler-shared-lib.gyp new file mode 100644 index 0000000000..d3e4316135 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/compiler-override/cxxtest.cc b/third_party/python/gyp/test/compiler-override/cxxtest.cc new file mode 100644 index 0000000000..517a353619 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/compiler-override/gyptest-compiler-env-toolchain.py b/third_party/python/gyp/test/compiler-override/gyptest-compiler-env-toolchain.py new file mode 100644 index 0000000000..2361d0c7c2 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/compiler-override/gyptest-compiler-env.py b/third_party/python/gyp/test/compiler-override/gyptest-compiler-env.py new file mode 100755 index 0000000000..bb38b6e55b --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/compiler-override/gyptest-compiler-global-settings.py b/third_party/python/gyp/test/compiler-override/gyptest-compiler-global-settings.py new file mode 100755 index 0000000000..9f062a4fef --- /dev/null +++ b/third_party/python/gyp/test/compiler-override/gyptest-compiler-global-settings.py @@ -0,0 +1,82 @@ +#!/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. +""" +from __future__ import print_function + +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) + +print("This test is currently disabled: https://crbug.com/483696.") +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/third_party/python/gyp/test/compiler-override/my_cc.py b/third_party/python/gyp/test/compiler-override/my_cc.py new file mode 100755 index 0000000000..09e1d3c58d --- /dev/null +++ b/third_party/python/gyp/test/compiler-override/my_cc.py @@ -0,0 +1,7 @@ +#!/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 __future__ import print_function +import sys +print(sys.argv) diff --git a/third_party/python/gyp/test/compiler-override/my_cxx.py b/third_party/python/gyp/test/compiler-override/my_cxx.py new file mode 100755 index 0000000000..09e1d3c58d --- /dev/null +++ b/third_party/python/gyp/test/compiler-override/my_cxx.py @@ -0,0 +1,7 @@ +#!/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 __future__ import print_function +import sys +print(sys.argv) diff --git a/third_party/python/gyp/test/compiler-override/my_ld.py b/third_party/python/gyp/test/compiler-override/my_ld.py new file mode 100755 index 0000000000..09e1d3c58d --- /dev/null +++ b/third_party/python/gyp/test/compiler-override/my_ld.py @@ -0,0 +1,7 @@ +#!/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 __future__ import print_function +import sys +print(sys.argv) diff --git a/third_party/python/gyp/test/compiler-override/my_nm.py b/third_party/python/gyp/test/compiler-override/my_nm.py new file mode 100755 index 0000000000..2c4e678110 --- /dev/null +++ b/third_party/python/gyp/test/compiler-override/my_nm.py @@ -0,0 +1,9 @@ +#!/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. +from __future__ import print_function +import sys +print(sys.argv) +with open('RAN_MY_NM', 'w') as f: + f.write('RAN_MY_NM') diff --git a/third_party/python/gyp/test/compiler-override/my_readelf.py b/third_party/python/gyp/test/compiler-override/my_readelf.py new file mode 100755 index 0000000000..626665435e --- /dev/null +++ b/third_party/python/gyp/test/compiler-override/my_readelf.py @@ -0,0 +1,9 @@ +#!/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. +from __future__ import print_function +import sys +print(sys.argv) +with open('RAN_MY_READELF', 'w') as f: + f.write('RAN_MY_READELF') diff --git a/third_party/python/gyp/test/compiler-override/test.c b/third_party/python/gyp/test/compiler-override/test.c new file mode 100644 index 0000000000..517a353619 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/conditions/elseif/elseif.gyp b/third_party/python/gyp/test/conditions/elseif/elseif.gyp new file mode 100644 index 0000000000..6367ff7d7a --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/conditions/elseif/elseif_bad1.gyp b/third_party/python/gyp/test/conditions/elseif/elseif_bad1.gyp new file mode 100644 index 0000000000..35c8455cca --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/conditions/elseif/elseif_bad2.gyp b/third_party/python/gyp/test/conditions/elseif/elseif_bad2.gyp new file mode 100644 index 0000000000..b529f292c0 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/conditions/elseif/elseif_bad3.gyp b/third_party/python/gyp/test/conditions/elseif/elseif_bad3.gyp new file mode 100644 index 0000000000..126e186053 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/conditions/elseif/elseif_conditions.gypi b/third_party/python/gyp/test/conditions/elseif/elseif_conditions.gypi new file mode 100644 index 0000000000..4310ccc031 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/conditions/elseif/gyptest_elseif.py b/third_party/python/gyp/test/conditions/elseif/gyptest_elseif.py new file mode 100644 index 0000000000..9d030cf3fe --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/conditions/elseif/program.cc b/third_party/python/gyp/test/conditions/elseif/program.cc new file mode 100644 index 0000000000..147fe2f75e --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/configurations/basics/configurations.c b/third_party/python/gyp/test/configurations/basics/configurations.c new file mode 100644 index 0000000000..39e13c9c83 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/configurations/basics/configurations.gyp b/third_party/python/gyp/test/configurations/basics/configurations.gyp new file mode 100644 index 0000000000..93f1d8d5c7 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/configurations/basics/gyptest-configurations.py b/third_party/python/gyp/test/configurations/basics/gyptest-configurations.py new file mode 100755 index 0000000000..27cd2e87d2 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/configurations/inheritance/configurations.c b/third_party/python/gyp/test/configurations/inheritance/configurations.c new file mode 100644 index 0000000000..ebb9f8450e --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/configurations/inheritance/configurations.gyp b/third_party/python/gyp/test/configurations/inheritance/configurations.gyp new file mode 100644 index 0000000000..9441376b4d --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/configurations/inheritance/duplicates.gyp b/third_party/python/gyp/test/configurations/inheritance/duplicates.gyp new file mode 100644 index 0000000000..6930ce3b39 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/configurations/inheritance/duplicates.gypd.golden b/third_party/python/gyp/test/configurations/inheritance/duplicates.gypd.golden new file mode 100644 index 0000000000..719b70861e --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/configurations/inheritance/gyptest-duplicates.py b/third_party/python/gyp/test/configurations/inheritance/gyptest-duplicates.py new file mode 100755 index 0000000000..f015638b6d --- /dev/null +++ b/third_party/python/gyp/test/configurations/inheritance/gyptest-duplicates.py @@ -0,0 +1,36 @@ +#!/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. +""" + +from __future__ import print_function + +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/third_party/python/gyp/test/configurations/inheritance/gyptest-inheritance.py b/third_party/python/gyp/test/configurations/inheritance/gyptest-inheritance.py new file mode 100755 index 0000000000..22c73a3754 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/configurations/invalid/actions.gyp b/third_party/python/gyp/test/configurations/invalid/actions.gyp new file mode 100644 index 0000000000..a6e42089eb --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/configurations/invalid/all_dependent_settings.gyp b/third_party/python/gyp/test/configurations/invalid/all_dependent_settings.gyp new file mode 100644 index 0000000000..b16a245df5 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/configurations/invalid/configurations.gyp b/third_party/python/gyp/test/configurations/invalid/configurations.gyp new file mode 100644 index 0000000000..2cfc960049 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/configurations/invalid/dependencies.gyp b/third_party/python/gyp/test/configurations/invalid/dependencies.gyp new file mode 100644 index 0000000000..74633f3f11 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/configurations/invalid/direct_dependent_settings.gyp b/third_party/python/gyp/test/configurations/invalid/direct_dependent_settings.gyp new file mode 100644 index 0000000000..8a0f2e95ea --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/configurations/invalid/gyptest-configurations.py b/third_party/python/gyp/test/configurations/invalid/gyptest-configurations.py new file mode 100755 index 0000000000..bd844b95dd --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/configurations/invalid/libraries.gyp b/third_party/python/gyp/test/configurations/invalid/libraries.gyp new file mode 100644 index 0000000000..c4014ed406 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/configurations/invalid/link_settings.gyp b/third_party/python/gyp/test/configurations/invalid/link_settings.gyp new file mode 100644 index 0000000000..2f0e1c46f5 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/configurations/invalid/sources.gyp b/third_party/python/gyp/test/configurations/invalid/sources.gyp new file mode 100644 index 0000000000..b38cca0381 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/configurations/invalid/standalone_static_library.gyp b/third_party/python/gyp/test/configurations/invalid/standalone_static_library.gyp new file mode 100644 index 0000000000..2edb9febd6 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/configurations/invalid/target_name.gyp b/third_party/python/gyp/test/configurations/invalid/target_name.gyp new file mode 100644 index 0000000000..83baad95d6 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/configurations/invalid/type.gyp b/third_party/python/gyp/test/configurations/invalid/type.gyp new file mode 100644 index 0000000000..bc55898b89 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/configurations/target_platform/configurations.gyp b/third_party/python/gyp/test/configurations/target_platform/configurations.gyp new file mode 100644 index 0000000000..d15429f4e5 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/configurations/target_platform/front.c b/third_party/python/gyp/test/configurations/target_platform/front.c new file mode 100644 index 0000000000..7a91689ff5 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/configurations/target_platform/gyptest-target_platform.py b/third_party/python/gyp/test/configurations/target_platform/gyptest-target_platform.py new file mode 100755 index 0000000000..1645d6ec08 --- /dev/null +++ b/third_party/python/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 as 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/third_party/python/gyp/test/configurations/target_platform/left.c b/third_party/python/gyp/test/configurations/target_platform/left.c new file mode 100644 index 0000000000..1ce2ea1227 --- /dev/null +++ b/third_party/python/gyp/test/configurations/target_platform/left.c @@ -0,0 +1,3 @@ +const char *message(void) { + return "left"; +} diff --git a/third_party/python/gyp/test/configurations/target_platform/right.c b/third_party/python/gyp/test/configurations/target_platform/right.c new file mode 100644 index 0000000000..b1578492fe --- /dev/null +++ b/third_party/python/gyp/test/configurations/target_platform/right.c @@ -0,0 +1,3 @@ +const char *message(void) { + return "right"; +} diff --git a/third_party/python/gyp/test/configurations/x64/configurations.c b/third_party/python/gyp/test/configurations/x64/configurations.c new file mode 100644 index 0000000000..37018438fc --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/configurations/x64/configurations.gyp b/third_party/python/gyp/test/configurations/x64/configurations.gyp new file mode 100644 index 0000000000..8b0139f141 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/configurations/x64/gyptest-x86.py b/third_party/python/gyp/test/configurations/x64/gyptest-x86.py new file mode 100755 index 0000000000..8675d8f7e7 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/copies/gyptest-all.py b/third_party/python/gyp/test/copies/gyptest-all.py new file mode 100755 index 0000000000..aeccf3324c --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/copies/gyptest-attribs.py b/third_party/python/gyp/test/copies/gyptest-attribs.py new file mode 100644 index 0000000000..70d717a45e --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/copies/gyptest-default.py b/third_party/python/gyp/test/copies/gyptest-default.py new file mode 100755 index 0000000000..a916869f0d --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/copies/gyptest-samedir.py b/third_party/python/gyp/test/copies/gyptest-samedir.py new file mode 100755 index 0000000000..923ca61557 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/copies/gyptest-slash.py b/third_party/python/gyp/test/copies/gyptest-slash.py new file mode 100755 index 0000000000..f7a2e549eb --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/copies/gyptest-sourceless-shared-lib.py b/third_party/python/gyp/test/copies/gyptest-sourceless-shared-lib.py new file mode 100644 index 0000000000..6ec2e512ad --- /dev/null +++ b/third_party/python/gyp/test/copies/gyptest-sourceless-shared-lib.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. + +""" +Verifies copies in sourceless shared_library targets are executed. +""" + +import TestGyp + +test = TestGyp.TestGyp() +test.run_gyp('copies-sourceless-shared-lib.gyp', chdir='src') +test.relocate('src', 'relocate/src') +test.build('copies-sourceless-shared-lib.gyp', chdir='relocate/src') +test.built_file_must_match('copies-out/file1', + 'file1 contents\n', + chdir='relocate/src') +test.pass_test() diff --git a/third_party/python/gyp/test/copies/gyptest-updir.py b/third_party/python/gyp/test/copies/gyptest-updir.py new file mode 100755 index 0000000000..47a2ca2e1d --- /dev/null +++ b/third_party/python/gyp/test/copies/gyptest-updir.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 file copies where the destination is one level above an expansion that +yields a make variable. +""" + +from __future__ import print_function + +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/third_party/python/gyp/test/copies/src/copies-attribs.gyp b/third_party/python/gyp/test/copies/src/copies-attribs.gyp new file mode 100644 index 0000000000..073e0d0cf6 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/copies/src/copies-samedir.gyp b/third_party/python/gyp/test/copies/src/copies-samedir.gyp new file mode 100644 index 0000000000..2919ce503e --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/copies/src/copies-slash.gyp b/third_party/python/gyp/test/copies/src/copies-slash.gyp new file mode 100644 index 0000000000..9bf54bd181 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/copies/src/copies-sourceless-shared-lib.gyp b/third_party/python/gyp/test/copies/src/copies-sourceless-shared-lib.gyp new file mode 100644 index 0000000000..7908f716a9 --- /dev/null +++ b/third_party/python/gyp/test/copies/src/copies-sourceless-shared-lib.gyp @@ -0,0 +1,27 @@ +# 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': 'mylib', + 'type': 'static_library', + 'sources': [ 'foo.c' ], + }, + { + 'target_name': 'mysolib', + 'type': 'shared_library', + 'dependencies': [ 'mylib' ], + 'copies': [ + { + 'destination': '<(PRODUCT_DIR)/copies-out', + 'files': [ 'file1' ], + }, + ], + # link.exe gets confused by sourceless shared libraries and needs this + # to become unconfused. + 'msvs_settings': { 'VCLinkerTool': { 'TargetMachine': '1', }, }, + }, + ], +} diff --git a/third_party/python/gyp/test/copies/src/copies-updir.gyp b/third_party/python/gyp/test/copies/src/copies-updir.gyp new file mode 100644 index 0000000000..bd3bfdd1d2 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/copies/src/copies.gyp b/third_party/python/gyp/test/copies/src/copies.gyp new file mode 100644 index 0000000000..ce2e0cabca --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/copies/src/directory/file3 b/third_party/python/gyp/test/copies/src/directory/file3 new file mode 100644 index 0000000000..43f16f3522 --- /dev/null +++ b/third_party/python/gyp/test/copies/src/directory/file3 @@ -0,0 +1 @@ +file3 contents diff --git a/third_party/python/gyp/test/copies/src/directory/file4 b/third_party/python/gyp/test/copies/src/directory/file4 new file mode 100644 index 0000000000..5f7270a084 --- /dev/null +++ b/third_party/python/gyp/test/copies/src/directory/file4 @@ -0,0 +1 @@ +file4 contents diff --git a/third_party/python/gyp/test/copies/src/directory/subdir/file5 b/third_party/python/gyp/test/copies/src/directory/subdir/file5 new file mode 100644 index 0000000000..41f47186bd --- /dev/null +++ b/third_party/python/gyp/test/copies/src/directory/subdir/file5 @@ -0,0 +1 @@ +file5 contents diff --git a/third_party/python/gyp/test/copies/src/executable-file.sh b/third_party/python/gyp/test/copies/src/executable-file.sh new file mode 100755 index 0000000000..796953a1a2 --- /dev/null +++ b/third_party/python/gyp/test/copies/src/executable-file.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +echo echo echo echo cho ho o o diff --git a/third_party/python/gyp/test/copies/src/file1 b/third_party/python/gyp/test/copies/src/file1 new file mode 100644 index 0000000000..84d55c5759 --- /dev/null +++ b/third_party/python/gyp/test/copies/src/file1 @@ -0,0 +1 @@ +file1 contents diff --git a/third_party/python/gyp/test/copies/src/file2 b/third_party/python/gyp/test/copies/src/file2 new file mode 100644 index 0000000000..af1b8ae35d --- /dev/null +++ b/third_party/python/gyp/test/copies/src/file2 @@ -0,0 +1 @@ +file2 contents diff --git a/third_party/python/gyp/test/copies/src/foo.c b/third_party/python/gyp/test/copies/src/foo.c new file mode 100644 index 0000000000..99a4c103ba --- /dev/null +++ b/third_party/python/gyp/test/copies/src/foo.c @@ -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. +int f() { return 42; } + +#ifdef _MSC_VER +// link.exe gets confused by sourceless shared libraries and needs this +// to become unconfused. +int __stdcall _DllMainCRTStartup( + unsigned hInst, unsigned reason, void* reserved) { + return 1; +} +#endif diff --git a/third_party/python/gyp/test/copies/src/parentdir/subdir/file6 b/third_party/python/gyp/test/copies/src/parentdir/subdir/file6 new file mode 100644 index 0000000000..f5d5757348 --- /dev/null +++ b/third_party/python/gyp/test/copies/src/parentdir/subdir/file6 @@ -0,0 +1 @@ +file6 contents diff --git a/third_party/python/gyp/test/custom-generator/gyptest-custom-generator.py b/third_party/python/gyp/test/custom-generator/gyptest-custom-generator.py new file mode 100755 index 0000000000..85fd0724a1 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/custom-generator/mygenerator.py b/third_party/python/gyp/test/custom-generator/mygenerator.py new file mode 100644 index 0000000000..5fcac3d779 --- /dev/null +++ b/third_party/python/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", "w") + f.write("Testing...\n") + f.close() diff --git a/third_party/python/gyp/test/custom-generator/test.gyp b/third_party/python/gyp/test/custom-generator/test.gyp new file mode 100644 index 0000000000..aa5f864a3b --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/cxxflags/cxxflags.cc b/third_party/python/gyp/test/cxxflags/cxxflags.cc new file mode 100644 index 0000000000..e70e39dfd3 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/cxxflags/cxxflags.gyp b/third_party/python/gyp/test/cxxflags/cxxflags.gyp new file mode 100644 index 0000000000..a082d49492 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/cxxflags/gyptest-cxxflags.py b/third_party/python/gyp/test/cxxflags/gyptest-cxxflags.py new file mode 100755 index 0000000000..117a1800de --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/defines-escaping/defines-escaping.c b/third_party/python/gyp/test/defines-escaping/defines-escaping.c new file mode 100644 index 0000000000..a0aa4c286d --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/defines-escaping/defines-escaping.gyp b/third_party/python/gyp/test/defines-escaping/defines-escaping.gyp new file mode 100644 index 0000000000..6f0f3fde41 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/defines-escaping/gyptest-defines-escaping.py b/third_party/python/gyp/test/defines-escaping/gyptest-defines-escaping.py new file mode 100755 index 0000000000..eb18a3d369 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/defines/defines-env.gyp b/third_party/python/gyp/test/defines/defines-env.gyp new file mode 100644 index 0000000000..1781546ae0 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/defines/defines.c b/third_party/python/gyp/test/defines/defines.c new file mode 100644 index 0000000000..dda139275d --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/defines/defines.gyp b/third_party/python/gyp/test/defines/defines.gyp new file mode 100644 index 0000000000..90a755eb84 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/defines/gyptest-define-override.py b/third_party/python/gyp/test/defines/gyptest-define-override.py new file mode 100755 index 0000000000..9730455b67 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/defines/gyptest-defines-env-regyp.py b/third_party/python/gyp/test/defines/gyptest-defines-env-regyp.py new file mode 100755 index 0000000000..f2d931c2f7 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/defines/gyptest-defines-env.py b/third_party/python/gyp/test/defines/gyptest-defines-env.py new file mode 100755 index 0000000000..6b4e7175a6 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/defines/gyptest-defines.py b/third_party/python/gyp/test/defines/gyptest-defines.py new file mode 100755 index 0000000000..77a3af53b9 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/dependencies/a.c b/third_party/python/gyp/test/dependencies/a.c new file mode 100755 index 0000000000..3bba111d24 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/dependencies/adso/all_dependent_settings_order.gyp b/third_party/python/gyp/test/dependencies/adso/all_dependent_settings_order.gyp new file mode 100644 index 0000000000..89817d6bbb --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/dependencies/adso/write_args.py b/third_party/python/gyp/test/dependencies/adso/write_args.py new file mode 100755 index 0000000000..5e388b8f70 --- /dev/null +++ b/third_party/python/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], 'w') +f.write(' '.join(sys.argv[2:])) +f.close() diff --git a/third_party/python/gyp/test/dependencies/b/b.c b/third_party/python/gyp/test/dependencies/b/b.c new file mode 100755 index 0000000000..b5e771bcc7 --- /dev/null +++ b/third_party/python/gyp/test/dependencies/b/b.c @@ -0,0 +1,3 @@ +int funcB() { + return 2; +} diff --git a/third_party/python/gyp/test/dependencies/b/b.gyp b/third_party/python/gyp/test/dependencies/b/b.gyp new file mode 100755 index 0000000000..893dc64d65 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/dependencies/b/b3.c b/third_party/python/gyp/test/dependencies/b/b3.c new file mode 100755 index 0000000000..287f67ff31 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/dependencies/c/c.c b/third_party/python/gyp/test/dependencies/c/c.c new file mode 100644 index 0000000000..4949daf3ee --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/dependencies/c/c.gyp b/third_party/python/gyp/test/dependencies/c/c.gyp new file mode 100644 index 0000000000..eabebea9ef --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/dependencies/c/d.c b/third_party/python/gyp/test/dependencies/c/d.c new file mode 100644 index 0000000000..05465fc1af --- /dev/null +++ b/third_party/python/gyp/test/dependencies/c/d.c @@ -0,0 +1,3 @@ +int funcD() { + return 4; +} diff --git a/third_party/python/gyp/test/dependencies/double_dependency.gyp b/third_party/python/gyp/test/dependencies/double_dependency.gyp new file mode 100644 index 0000000000..c4a2d00139 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/dependencies/double_dependent.gyp b/third_party/python/gyp/test/dependencies/double_dependent.gyp new file mode 100644 index 0000000000..334caff723 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/dependencies/extra_targets.gyp b/third_party/python/gyp/test/dependencies/extra_targets.gyp new file mode 100644 index 0000000000..c1a26de422 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/dependencies/gyptest-all-dependent-settings-order.py b/third_party/python/gyp/test/dependencies/gyptest-all-dependent-settings-order.py new file mode 100644 index 0000000000..715f322f41 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/dependencies/gyptest-double-dependency.py b/third_party/python/gyp/test/dependencies/gyptest-double-dependency.py new file mode 100644 index 0000000000..7692740c54 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/dependencies/gyptest-extra-targets.py b/third_party/python/gyp/test/dependencies/gyptest-extra-targets.py new file mode 100755 index 0000000000..09b00d958b --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/dependencies/gyptest-indirect-module-dependency.py b/third_party/python/gyp/test/dependencies/gyptest-indirect-module-dependency.py new file mode 100644 index 0000000000..d001b57e7d --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/dependencies/gyptest-lib-only.py b/third_party/python/gyp/test/dependencies/gyptest-lib-only.py new file mode 100755 index 0000000000..3a99a7f4aa --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/dependencies/gyptest-none-traversal.py b/third_party/python/gyp/test/dependencies/gyptest-none-traversal.py new file mode 100755 index 0000000000..c09063dad3 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/dependencies/gyptest-sharedlib-linksettings.py b/third_party/python/gyp/test/dependencies/gyptest-sharedlib-linksettings.py new file mode 100644 index 0000000000..87428af459 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/dependencies/lib_only.gyp b/third_party/python/gyp/test/dependencies/lib_only.gyp new file mode 100755 index 0000000000..f6c84dea64 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/dependencies/main.c b/third_party/python/gyp/test/dependencies/main.c new file mode 100644 index 0000000000..185bd482f2 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/dependencies/module-dep/a.cc b/third_party/python/gyp/test/dependencies/module-dep/a.cc new file mode 100644 index 0000000000..231fc7a9df --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/dependencies/module-dep/dll.cc b/third_party/python/gyp/test/dependencies/module-dep/dll.cc new file mode 100644 index 0000000000..e1eea0205b --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/dependencies/module-dep/exe.cc b/third_party/python/gyp/test/dependencies/module-dep/exe.cc new file mode 100644 index 0000000000..b3039ace96 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/dependencies/module-dep/indirect-module-dependency.gyp b/third_party/python/gyp/test/dependencies/module-dep/indirect-module-dependency.gyp new file mode 100644 index 0000000000..f3fb5320fe --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/dependencies/none_traversal.gyp b/third_party/python/gyp/test/dependencies/none_traversal.gyp new file mode 100755 index 0000000000..3d8ab30aff --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/dependencies/sharedlib-linksettings/program.c b/third_party/python/gyp/test/dependencies/sharedlib-linksettings/program.c new file mode 100644 index 0000000000..b7c15edcd6 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/dependencies/sharedlib-linksettings/sharedlib.c b/third_party/python/gyp/test/dependencies/sharedlib-linksettings/sharedlib.c new file mode 100644 index 0000000000..3199bccd66 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/dependencies/sharedlib-linksettings/staticlib.c b/third_party/python/gyp/test/dependencies/sharedlib-linksettings/staticlib.c new file mode 100644 index 0000000000..e889b419fd --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/dependencies/sharedlib-linksettings/test.gyp b/third_party/python/gyp/test/dependencies/sharedlib-linksettings/test.gyp new file mode 100644 index 0000000000..830ce3236d --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/dependency-copy/gyptest-copy.py b/third_party/python/gyp/test/dependency-copy/gyptest-copy.py new file mode 100755 index 0000000000..5ba7c73d41 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/dependency-copy/src/copies.gyp b/third_party/python/gyp/test/dependency-copy/src/copies.gyp new file mode 100644 index 0000000000..4176b18787 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/dependency-copy/src/file1.c b/third_party/python/gyp/test/dependency-copy/src/file1.c new file mode 100644 index 0000000000..d7c3159186 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/dependency-copy/src/file2.c b/third_party/python/gyp/test/dependency-copy/src/file2.c new file mode 100644 index 0000000000..cf40f57f94 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/dependent-settings/nested-dependent-settings/all-dependent-settings.gyp b/third_party/python/gyp/test/dependent-settings/nested-dependent-settings/all-dependent-settings.gyp new file mode 100644 index 0000000000..b67ccaeb69 --- /dev/null +++ b/third_party/python/gyp/test/dependent-settings/nested-dependent-settings/all-dependent-settings.gyp @@ -0,0 +1,19 @@ +{ + "targets": [ + { + "target_name": "settings", + "type": "none", + "all_dependent_settings": { + "target_conditions": [ + ["'library' in _type", {"all_dependent_settings": {}}] + ] + }, + }, + { + "target_name": "library", + "type": "static_library", + "dependencies": ["settings"], + }, + ] +} + diff --git a/third_party/python/gyp/test/dependent-settings/nested-dependent-settings/direct-dependent-settings.gyp b/third_party/python/gyp/test/dependent-settings/nested-dependent-settings/direct-dependent-settings.gyp new file mode 100644 index 0000000000..6e8a6165e4 --- /dev/null +++ b/third_party/python/gyp/test/dependent-settings/nested-dependent-settings/direct-dependent-settings.gyp @@ -0,0 +1,19 @@ +{ + "targets": [ + { + "target_name": "settings", + "type": "none", + "all_dependent_settings": { + "target_conditions": [ + ["'library' in _type", {"direct_dependent_settings": {}}] + ] + }, + }, + { + "target_name": "library", + "type": "static_library", + "dependencies": ["settings"], + }, + ] +} + diff --git a/third_party/python/gyp/test/dependent-settings/nested-dependent-settings/gyptest-nested-dependent-settings.py b/third_party/python/gyp/test/dependent-settings/nested-dependent-settings/gyptest-nested-dependent-settings.py new file mode 100644 index 0000000000..a45de898a4 --- /dev/null +++ b/third_party/python/gyp/test/dependent-settings/nested-dependent-settings/gyptest-nested-dependent-settings.py @@ -0,0 +1,18 @@ +#!/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 nested dependent_settings directives project generation. +""" + +import TestGyp + +test = TestGyp.TestGyp() + +test.run_gyp("all-dependent-settings.gyp") +test.run_gyp("direct-dependent-settings.gyp") + +test.pass_test() diff --git a/third_party/python/gyp/test/determinism/determinism.gyp b/third_party/python/gyp/test/determinism/determinism.gyp new file mode 100644 index 0000000000..81346748a1 --- /dev/null +++ b/third_party/python/gyp/test/determinism/determinism.gyp @@ -0,0 +1,59 @@ +# 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': 'determinism', + 'type': 'none', + 'actions': [ + { + 'action_name': 'depfile_action', + 'inputs': [ + 'input.txt', + ], + 'outputs': [ + 'output.txt', + ], + 'depfile': 'depfile.d', + 'action': [ ] + }, + ], + }, + { + 'target_name': 'determinism2', + 'type': 'none', + 'actions': [ + { + 'action_name': 'depfile_action', + 'inputs': [ + 'input.txt', + ], + 'outputs': [ + 'output.txt', + ], + 'depfile': 'depfile.d', + 'action': [ ] + }, + ], + }, + { + 'target_name': 'determinism3', + 'type': 'none', + 'actions': [ + { + 'action_name': 'depfile_action', + 'inputs': [ + 'input.txt', + ], + 'outputs': [ + 'output.txt', + ], + 'depfile': 'depfile.d', + 'action': [ ] + }, + ], + }, + ], +} diff --git a/third_party/python/gyp/test/determinism/empty-targets.gyp b/third_party/python/gyp/test/determinism/empty-targets.gyp new file mode 100644 index 0000000000..a4ccdd703c --- /dev/null +++ b/third_party/python/gyp/test/determinism/empty-targets.gyp @@ -0,0 +1,32 @@ +# 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': 'empty_target1', + 'type': 'none', + }, + { + 'target_name': 'empty_target2', + 'type': 'none', + }, + { + 'target_name': 'empty_target3', + 'type': 'none', + }, + { + 'target_name': 'empty_target4', + 'type': 'none', + }, + { + 'target_name': 'empty_target5', + 'type': 'none', + }, + { + 'target_name': 'empty_target6', + 'type': 'none', + }, + ], +} diff --git a/third_party/python/gyp/test/determinism/gyptest-determinism.py b/third_party/python/gyp/test/determinism/gyptest-determinism.py new file mode 100644 index 0000000000..670cb4bc9f --- /dev/null +++ b/third_party/python/gyp/test/determinism/gyptest-determinism.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. + +""" +Verifies builds are the same even with different PYTHONHASHSEEDs. +Tests target_short_names and FlattenToList. +""" + +import os +import sys +import TestGyp + +test = TestGyp.TestGyp() +if test.format == 'ninja': + os.environ["PYTHONHASHSEED"] = "1" + test.run_gyp('determinism.gyp') + base = open(test.built_file_path('build.ninja')).read() + + for i in range(1,5): + os.environ["PYTHONHASHSEED"] = str(i) + test.run_gyp('determinism.gyp') + contents = open(test.built_file_path('build.ninja')).read() + if base != contents: + test.fail_test() + + del os.environ["PYTHONHASHSEED"] + test.pass_test() diff --git a/third_party/python/gyp/test/determinism/gyptest-empty-target-names.py b/third_party/python/gyp/test/determinism/gyptest-empty-target-names.py new file mode 100644 index 0000000000..cf49f50084 --- /dev/null +++ b/third_party/python/gyp/test/determinism/gyptest-empty-target-names.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. + +""" +Verifies builds are the same even with different PYTHONHASHSEEDs. +Tests both solibs and implicit_deps. +""" + +import os +import sys +import TestGyp + +test = TestGyp.TestGyp() +if test.format == 'ninja': + os.environ["PYTHONHASHSEED"] = "1" + test.run_gyp('empty-targets.gyp') + base = open(test.built_file_path('build.ninja')).read() + + for i in range(1,5): + os.environ["PYTHONHASHSEED"] = str(i) + test.run_gyp('empty-targets.gyp') + contents = open(test.built_file_path('build.ninja')).read() + if base != contents: + test.fail_test() + + del os.environ["PYTHONHASHSEED"] + test.pass_test() diff --git a/third_party/python/gyp/test/determinism/gyptest-needed-variables.py b/third_party/python/gyp/test/determinism/gyptest-needed-variables.py new file mode 100644 index 0000000000..7b97cca0d2 --- /dev/null +++ b/third_party/python/gyp/test/determinism/gyptest-needed-variables.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. + +""" +Verifies builds are the same even with different PYTHONHASHSEEDs. +Tests needed_variables. +""" + +import os +import sys +import TestGyp + +test = TestGyp.TestGyp() +if test.format == 'ninja': + os.environ["PYTHONHASHSEED"] = "1" + test.run_gyp('needed-variables.gyp') + base = open(test.built_file_path('test.ninja', subdir='obj')).read() + + for i in range(1,5): + os.environ["PYTHONHASHSEED"] = str(i) + test.run_gyp('needed-variables.gyp') + contents = open(test.built_file_path('test.ninja', subdir='obj')).read() + if base != contents: + test.fail_test() + + del os.environ["PYTHONHASHSEED"] + test.pass_test() diff --git a/third_party/python/gyp/test/determinism/gyptest-solibs.py b/third_party/python/gyp/test/determinism/gyptest-solibs.py new file mode 100644 index 0000000000..a9c312573b --- /dev/null +++ b/third_party/python/gyp/test/determinism/gyptest-solibs.py @@ -0,0 +1,37 @@ +#!/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 builds are the same even with different PYTHONHASHSEEDs. +Tests all_targets, implicit_deps and solibs. +""" + +from __future__ import print_function + +import os +import sys +import TestGyp + +test = TestGyp.TestGyp() +if test.format == 'ninja': + os.environ["PYTHONHASHSEED"] = "1" + test.run_gyp('solibs.gyp') + base1 = open(test.built_file_path('c.ninja', subdir='obj')).read() + base2 = open(test.built_file_path('build.ninja')).read() + + for i in range(1,5): + os.environ["PYTHONHASHSEED"] = str(i) + test.run_gyp('solibs.gyp') + contents1 = open(test.built_file_path('c.ninja', subdir='obj')).read() + contents2 = open(test.built_file_path('build.ninja')).read() + if base1 != contents1: + test.fail_test() + if base2 != contents2: + print(base2) + test.fail_test() + + del os.environ["PYTHONHASHSEED"] + test.pass_test() diff --git a/third_party/python/gyp/test/determinism/main.cc b/third_party/python/gyp/test/determinism/main.cc new file mode 100644 index 0000000000..2cd74d3c77 --- /dev/null +++ b/third_party/python/gyp/test/determinism/main.cc @@ -0,0 +1,5 @@ +extern int foo(); + +int main() { + return foo(); +} diff --git a/third_party/python/gyp/test/determinism/needed-variables.gyp b/third_party/python/gyp/test/determinism/needed-variables.gyp new file mode 100644 index 0000000000..022165bebd --- /dev/null +++ b/third_party/python/gyp/test/determinism/needed-variables.gyp @@ -0,0 +1,33 @@ +# 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': 'executable', + 'sources': ['rule.ext'], + 'rules': [{ + 'rule_name': 'rule', + 'extension': 'ext', + 'inputs': [ 'rule.py', ], + 'action': [ + 'python', + 'rule.py', + '<(RULE_INPUT_ROOT)', + '<(RULE_INPUT_EXT)', + '<(RULE_INPUT_DIRNAME)', + '<(RULE_INPUT_NAME)', + '<(RULE_INPUT_PATH)', + ], + 'outputs': [ 'hello_world.txt' ], + 'sources': ['rule.ext'], + '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/third_party/python/gyp/test/determinism/rule.py b/third_party/python/gyp/test/determinism/rule.py new file mode 100644 index 0000000000..e18c314557 --- /dev/null +++ b/third_party/python/gyp/test/determinism/rule.py @@ -0,0 +1,8 @@ +#!/usr/bin/env python +# Copyright (c) 2017 Google 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 __future__ import print_function + +print('Hello World') diff --git a/third_party/python/gyp/test/determinism/solib.cc b/third_party/python/gyp/test/determinism/solib.cc new file mode 100644 index 0000000000..0856cd4e00 --- /dev/null +++ b/third_party/python/gyp/test/determinism/solib.cc @@ -0,0 +1,8 @@ +#ifdef _MSC_VER +__declspec(dllexport) +#else +__attribute__((visibility("default"))) +#endif +int foo() { + return 42; +} diff --git a/third_party/python/gyp/test/determinism/solibs.gyp b/third_party/python/gyp/test/determinism/solibs.gyp new file mode 100644 index 0000000000..9ae3246d63 --- /dev/null +++ b/third_party/python/gyp/test/determinism/solibs.gyp @@ -0,0 +1,32 @@ +# 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. + +# This test both tests solibs and implicit_deps. +{ + 'targets': [ + { + 'target_name': 'a', + 'type': 'shared_library', + 'sources': [ 'solib.cc' ], + }, + { + 'target_name': 'b', + 'type': 'shared_library', + 'sources': [ 'solib.cc' ], + }, + { + 'target_name': 'c', + 'type': 'executable', + 'sources': [ 'main.cc' ], + 'dependencies': [ 'a', 'b' ], + }, + ], + 'conditions': [ + ['OS=="linux"', { + 'target_defaults': { + 'cflags': ['-fPIC'], + }, + }], + ], +} diff --git a/third_party/python/gyp/test/empty-target/empty-target.gyp b/third_party/python/gyp/test/empty-target/empty-target.gyp new file mode 100644 index 0000000000..feefa28058 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/empty-target/gyptest-empty-target.py b/third_party/python/gyp/test/empty-target/gyptest-empty-target.py new file mode 100644 index 0000000000..ecadd4a87f --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/errors/dependency_cycle.gyp b/third_party/python/gyp/test/errors/dependency_cycle.gyp new file mode 100644 index 0000000000..eef44bc9eb --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/errors/duplicate_basenames.gyp b/third_party/python/gyp/test/errors/duplicate_basenames.gyp new file mode 100644 index 0000000000..b3dceb3949 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/errors/duplicate_node.gyp b/third_party/python/gyp/test/errors/duplicate_node.gyp new file mode 100644 index 0000000000..d6096096bd --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/errors/duplicate_rule.gyp b/third_party/python/gyp/test/errors/duplicate_rule.gyp new file mode 100644 index 0000000000..dab98e96c2 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/errors/duplicate_targets.gyp b/third_party/python/gyp/test/errors/duplicate_targets.gyp new file mode 100644 index 0000000000..aec470eefa --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/errors/error_command.gyp b/third_party/python/gyp/test/errors/error_command.gyp new file mode 100644 index 0000000000..1736fc9882 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/errors/file_cycle0.gyp b/third_party/python/gyp/test/errors/file_cycle0.gyp new file mode 100644 index 0000000000..3bfafb6cb3 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/errors/file_cycle1.gyp b/third_party/python/gyp/test/errors/file_cycle1.gyp new file mode 100644 index 0000000000..fbd7a0d167 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/errors/gyptest-errors.py b/third_party/python/gyp/test/errors/gyptest-errors.py new file mode 100755 index 0000000000..0296f800f5 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/errors/missing_command.gyp b/third_party/python/gyp/test/errors/missing_command.gyp new file mode 100644 index 0000000000..c93d9542c6 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/errors/missing_dep.gyp b/third_party/python/gyp/test/errors/missing_dep.gyp new file mode 100644 index 0000000000..08746be3d7 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/errors/missing_targets.gyp b/third_party/python/gyp/test/errors/missing_targets.gyp new file mode 100644 index 0000000000..13d4f924c1 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/escaping/colon/test.gyp b/third_party/python/gyp/test/escaping/colon/test.gyp new file mode 100644 index 0000000000..715f95490e --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/escaping/gyptest-colon.py b/third_party/python/gyp/test/escaping/gyptest-colon.py new file mode 100644 index 0000000000..f62f8dc65e --- /dev/null +++ b/third_party/python/gyp/test/escaping/gyptest-colon.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. + +""" +Tests that filenames that contain colons are handled correctly. +(This is important for absolute paths on Windows.) +""" + +from __future__ import print_function + +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/third_party/python/gyp/test/exclusion/exclusion.gyp b/third_party/python/gyp/test/exclusion/exclusion.gyp new file mode 100644 index 0000000000..1232dabaef --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/exclusion/gyptest-exclusion.py b/third_party/python/gyp/test/exclusion/gyptest-exclusion.py new file mode 100755 index 0000000000..1fc32bf871 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/exclusion/hello.c b/third_party/python/gyp/test/exclusion/hello.c new file mode 100644 index 0000000000..6e7dc8e419 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/external-cross-compile/gyptest-cross.py b/third_party/python/gyp/test/external-cross-compile/gyptest-cross.py new file mode 100755 index 0000000000..a837ec57dc --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/external-cross-compile/src/bogus1.cc b/third_party/python/gyp/test/external-cross-compile/src/bogus1.cc new file mode 100644 index 0000000000..1b8d01199b --- /dev/null +++ b/third_party/python/gyp/test/external-cross-compile/src/bogus1.cc @@ -0,0 +1 @@ +From bogus1.cc diff --git a/third_party/python/gyp/test/external-cross-compile/src/bogus2.c b/third_party/python/gyp/test/external-cross-compile/src/bogus2.c new file mode 100644 index 0000000000..cbf4a123c4 --- /dev/null +++ b/third_party/python/gyp/test/external-cross-compile/src/bogus2.c @@ -0,0 +1 @@ +From bogus2.c diff --git a/third_party/python/gyp/test/external-cross-compile/src/cross.gyp b/third_party/python/gyp/test/external-cross-compile/src/cross.gyp new file mode 100644 index 0000000000..aeda76b5bd --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/external-cross-compile/src/cross_compile.gypi b/third_party/python/gyp/test/external-cross-compile/src/cross_compile.gypi new file mode 100644 index 0000000000..36e651903f --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/external-cross-compile/src/fake_cross.py b/third_party/python/gyp/test/external-cross-compile/src/fake_cross.py new file mode 100644 index 0000000000..05eacc6a63 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/external-cross-compile/src/program.cc b/third_party/python/gyp/test/external-cross-compile/src/program.cc new file mode 100644 index 0000000000..5172ae90fe --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/external-cross-compile/src/test1.cc b/third_party/python/gyp/test/external-cross-compile/src/test1.cc new file mode 100644 index 0000000000..b584c31d15 --- /dev/null +++ b/third_party/python/gyp/test/external-cross-compile/src/test1.cc @@ -0,0 +1 @@ +From test1.cc diff --git a/third_party/python/gyp/test/external-cross-compile/src/test2.c b/third_party/python/gyp/test/external-cross-compile/src/test2.c new file mode 100644 index 0000000000..367ae19ea0 --- /dev/null +++ b/third_party/python/gyp/test/external-cross-compile/src/test2.c @@ -0,0 +1 @@ +From test2.c diff --git a/third_party/python/gyp/test/external-cross-compile/src/test3.cc b/third_party/python/gyp/test/external-cross-compile/src/test3.cc new file mode 100644 index 0000000000..9eb64735b8 --- /dev/null +++ b/third_party/python/gyp/test/external-cross-compile/src/test3.cc @@ -0,0 +1 @@ +From test3.cc diff --git a/third_party/python/gyp/test/external-cross-compile/src/test4.c b/third_party/python/gyp/test/external-cross-compile/src/test4.c new file mode 100644 index 0000000000..8ecc33ec16 --- /dev/null +++ b/third_party/python/gyp/test/external-cross-compile/src/test4.c @@ -0,0 +1 @@ +From test4.c diff --git a/third_party/python/gyp/test/external-cross-compile/src/tochar.py b/third_party/python/gyp/test/external-cross-compile/src/tochar.py new file mode 100644 index 0000000000..c0780d984f --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/generator-output/actions/actions.gyp b/third_party/python/gyp/test/generator-output/actions/actions.gyp new file mode 100644 index 0000000000..dded59aff3 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/generator-output/actions/build/README.txt b/third_party/python/gyp/test/generator-output/actions/build/README.txt new file mode 100644 index 0000000000..1b052c9a24 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/generator-output/actions/subdir1/actions-out/README.txt b/third_party/python/gyp/test/generator-output/actions/subdir1/actions-out/README.txt new file mode 100644 index 0000000000..1b052c9a24 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/generator-output/actions/subdir1/build/README.txt b/third_party/python/gyp/test/generator-output/actions/subdir1/build/README.txt new file mode 100644 index 0000000000..1b052c9a24 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/generator-output/actions/subdir1/executable.gyp b/third_party/python/gyp/test/generator-output/actions/subdir1/executable.gyp new file mode 100644 index 0000000000..6bdd60a1fb --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/generator-output/actions/subdir1/make-prog1.py b/third_party/python/gyp/test/generator-output/actions/subdir1/make-prog1.py new file mode 100755 index 0000000000..7ea1d8a2d4 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/generator-output/actions/subdir1/make-prog2.py b/third_party/python/gyp/test/generator-output/actions/subdir1/make-prog2.py new file mode 100755 index 0000000000..0bfe4973c2 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/generator-output/actions/subdir1/program.c b/third_party/python/gyp/test/generator-output/actions/subdir1/program.c new file mode 100644 index 0000000000..c0931534eb --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/generator-output/actions/subdir2/actions-out/README.txt b/third_party/python/gyp/test/generator-output/actions/subdir2/actions-out/README.txt new file mode 100644 index 0000000000..1b052c9a24 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/generator-output/actions/subdir2/build/README.txt b/third_party/python/gyp/test/generator-output/actions/subdir2/build/README.txt new file mode 100644 index 0000000000..1b052c9a24 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/generator-output/actions/subdir2/make-file.py b/third_party/python/gyp/test/generator-output/actions/subdir2/make-file.py new file mode 100755 index 0000000000..088a05e0b0 --- /dev/null +++ b/third_party/python/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], 'w').write(contents) diff --git a/third_party/python/gyp/test/generator-output/actions/subdir2/none.gyp b/third_party/python/gyp/test/generator-output/actions/subdir2/none.gyp new file mode 100644 index 0000000000..f98f52753d --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/generator-output/copies/build/README.txt b/third_party/python/gyp/test/generator-output/copies/build/README.txt new file mode 100644 index 0000000000..90ef886193 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/generator-output/copies/copies-out/README.txt b/third_party/python/gyp/test/generator-output/copies/copies-out/README.txt new file mode 100644 index 0000000000..90ef886193 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/generator-output/copies/copies.gyp b/third_party/python/gyp/test/generator-output/copies/copies.gyp new file mode 100644 index 0000000000..479a3d9b6e --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/generator-output/copies/file1 b/third_party/python/gyp/test/generator-output/copies/file1 new file mode 100644 index 0000000000..84d55c5759 --- /dev/null +++ b/third_party/python/gyp/test/generator-output/copies/file1 @@ -0,0 +1 @@ +file1 contents diff --git a/third_party/python/gyp/test/generator-output/copies/file2 b/third_party/python/gyp/test/generator-output/copies/file2 new file mode 100644 index 0000000000..af1b8ae35d --- /dev/null +++ b/third_party/python/gyp/test/generator-output/copies/file2 @@ -0,0 +1 @@ +file2 contents diff --git a/third_party/python/gyp/test/generator-output/copies/subdir/build/README.txt b/third_party/python/gyp/test/generator-output/copies/subdir/build/README.txt new file mode 100644 index 0000000000..90ef886193 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/generator-output/copies/subdir/copies-out/README.txt b/third_party/python/gyp/test/generator-output/copies/subdir/copies-out/README.txt new file mode 100644 index 0000000000..90ef886193 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/generator-output/copies/subdir/file3 b/third_party/python/gyp/test/generator-output/copies/subdir/file3 new file mode 100644 index 0000000000..43f16f3522 --- /dev/null +++ b/third_party/python/gyp/test/generator-output/copies/subdir/file3 @@ -0,0 +1 @@ +file3 contents diff --git a/third_party/python/gyp/test/generator-output/copies/subdir/file4 b/third_party/python/gyp/test/generator-output/copies/subdir/file4 new file mode 100644 index 0000000000..5f7270a084 --- /dev/null +++ b/third_party/python/gyp/test/generator-output/copies/subdir/file4 @@ -0,0 +1 @@ +file4 contents diff --git a/third_party/python/gyp/test/generator-output/copies/subdir/subdir.gyp b/third_party/python/gyp/test/generator-output/copies/subdir/subdir.gyp new file mode 100644 index 0000000000..af031d283a --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/generator-output/gyptest-actions.py b/third_party/python/gyp/test/generator-output/gyptest-actions.py new file mode 100755 index 0000000000..47121d0770 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/generator-output/gyptest-copies.py b/third_party/python/gyp/test/generator-output/gyptest-copies.py new file mode 100755 index 0000000000..262dfc30fa --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/generator-output/gyptest-depth.py b/third_party/python/gyp/test/generator-output/gyptest-depth.py new file mode 100755 index 0000000000..ee59a11f04 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/generator-output/gyptest-mac-bundle.py b/third_party/python/gyp/test/generator-output/gyptest-mac-bundle.py new file mode 100644 index 0000000000..14597d8de2 --- /dev/null +++ b/third_party/python/gyp/test/generator-output/gyptest-mac-bundle.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 mac bundles work with --generator-output. +""" + +from __future__ import print_function + +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/third_party/python/gyp/test/generator-output/gyptest-relocate.py b/third_party/python/gyp/test/generator-output/gyptest-relocate.py new file mode 100755 index 0000000000..b867a6cffb --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/generator-output/gyptest-rules.py b/third_party/python/gyp/test/generator-output/gyptest-rules.py new file mode 100755 index 0000000000..a3ff8bd858 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/generator-output/gyptest-subdir2-deep.py b/third_party/python/gyp/test/generator-output/gyptest-subdir2-deep.py new file mode 100755 index 0000000000..ec7862ddd9 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/generator-output/gyptest-symlink.py b/third_party/python/gyp/test/generator-output/gyptest-symlink.py new file mode 100755 index 0000000000..d7fe05830f --- /dev/null +++ b/third_party/python/gyp/test/generator-output/gyptest-symlink.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 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 +import sys + +test = TestGyp.TestGyp() +if not hasattr(os, 'symlink') or sys.platform == 'win32': + # Python3 on windows has symlink but it doesn't work reliably. + test.skip_test('Missing or bad 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/third_party/python/gyp/test/generator-output/gyptest-top-all.py b/third_party/python/gyp/test/generator-output/gyptest-top-all.py new file mode 100755 index 0000000000..b1776776ea --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/generator-output/mac-bundle/Info.plist b/third_party/python/gyp/test/generator-output/mac-bundle/Info.plist new file mode 100644 index 0000000000..8cb142e9f5 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/generator-output/mac-bundle/app.order b/third_party/python/gyp/test/generator-output/mac-bundle/app.order new file mode 100644 index 0000000000..4eb9e89d39 --- /dev/null +++ b/third_party/python/gyp/test/generator-output/mac-bundle/app.order @@ -0,0 +1 @@ +_main diff --git a/third_party/python/gyp/test/generator-output/mac-bundle/header.h b/third_party/python/gyp/test/generator-output/mac-bundle/header.h new file mode 100644 index 0000000000..7ed7775122 --- /dev/null +++ b/third_party/python/gyp/test/generator-output/mac-bundle/header.h @@ -0,0 +1 @@ +int f(); diff --git a/third_party/python/gyp/test/generator-output/mac-bundle/main.c b/third_party/python/gyp/test/generator-output/mac-bundle/main.c new file mode 100644 index 0000000000..237c8ce181 --- /dev/null +++ b/third_party/python/gyp/test/generator-output/mac-bundle/main.c @@ -0,0 +1 @@ +int main() {} diff --git a/third_party/python/gyp/test/generator-output/mac-bundle/resource.sb b/third_party/python/gyp/test/generator-output/mac-bundle/resource.sb new file mode 100644 index 0000000000..731befc457 --- /dev/null +++ b/third_party/python/gyp/test/generator-output/mac-bundle/resource.sb @@ -0,0 +1 @@ +A text file. diff --git a/third_party/python/gyp/test/generator-output/mac-bundle/test.gyp b/third_party/python/gyp/test/generator-output/mac-bundle/test.gyp new file mode 100644 index 0000000000..35ac674f6d --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/generator-output/rules/build/README.txt b/third_party/python/gyp/test/generator-output/rules/build/README.txt new file mode 100644 index 0000000000..1b052c9a24 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/generator-output/rules/copy-file.py b/third_party/python/gyp/test/generator-output/rules/copy-file.py new file mode 100755 index 0000000000..80c6749f93 --- /dev/null +++ b/third_party/python/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], 'w').write(contents) + +sys.exit(0) diff --git a/third_party/python/gyp/test/generator-output/rules/rules.gyp b/third_party/python/gyp/test/generator-output/rules/rules.gyp new file mode 100644 index 0000000000..dded59aff3 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/generator-output/rules/subdir1/build/README.txt b/third_party/python/gyp/test/generator-output/rules/subdir1/build/README.txt new file mode 100644 index 0000000000..1b052c9a24 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/generator-output/rules/subdir1/define3.in0 b/third_party/python/gyp/test/generator-output/rules/subdir1/define3.in0 new file mode 100644 index 0000000000..cc29c643f3 --- /dev/null +++ b/third_party/python/gyp/test/generator-output/rules/subdir1/define3.in0 @@ -0,0 +1 @@ +#define STRING3 "Hello from define3.in0\n" diff --git a/third_party/python/gyp/test/generator-output/rules/subdir1/define4.in0 b/third_party/python/gyp/test/generator-output/rules/subdir1/define4.in0 new file mode 100644 index 0000000000..c9b0467b32 --- /dev/null +++ b/third_party/python/gyp/test/generator-output/rules/subdir1/define4.in0 @@ -0,0 +1 @@ +#define STRING4 "Hello from define4.in0\n" diff --git a/third_party/python/gyp/test/generator-output/rules/subdir1/executable.gyp b/third_party/python/gyp/test/generator-output/rules/subdir1/executable.gyp new file mode 100644 index 0000000000..42bee4d746 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/generator-output/rules/subdir1/function1.in1 b/third_party/python/gyp/test/generator-output/rules/subdir1/function1.in1 new file mode 100644 index 0000000000..545e7ca16b --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/generator-output/rules/subdir1/function2.in1 b/third_party/python/gyp/test/generator-output/rules/subdir1/function2.in1 new file mode 100644 index 0000000000..6bad43f9cf --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/generator-output/rules/subdir1/program.c b/third_party/python/gyp/test/generator-output/rules/subdir1/program.c new file mode 100644 index 0000000000..56b320632a --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/generator-output/rules/subdir2/build/README.txt b/third_party/python/gyp/test/generator-output/rules/subdir2/build/README.txt new file mode 100644 index 0000000000..1b052c9a24 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/generator-output/rules/subdir2/file1.in0 b/third_party/python/gyp/test/generator-output/rules/subdir2/file1.in0 new file mode 100644 index 0000000000..7aca64f4ce --- /dev/null +++ b/third_party/python/gyp/test/generator-output/rules/subdir2/file1.in0 @@ -0,0 +1 @@ +Hello from file1.in0 diff --git a/third_party/python/gyp/test/generator-output/rules/subdir2/file2.in0 b/third_party/python/gyp/test/generator-output/rules/subdir2/file2.in0 new file mode 100644 index 0000000000..80a281a2a9 --- /dev/null +++ b/third_party/python/gyp/test/generator-output/rules/subdir2/file2.in0 @@ -0,0 +1 @@ +Hello from file2.in0 diff --git a/third_party/python/gyp/test/generator-output/rules/subdir2/file3.in1 b/third_party/python/gyp/test/generator-output/rules/subdir2/file3.in1 new file mode 100644 index 0000000000..60ae2e7931 --- /dev/null +++ b/third_party/python/gyp/test/generator-output/rules/subdir2/file3.in1 @@ -0,0 +1 @@ +Hello from file3.in1 diff --git a/third_party/python/gyp/test/generator-output/rules/subdir2/file4.in1 b/third_party/python/gyp/test/generator-output/rules/subdir2/file4.in1 new file mode 100644 index 0000000000..5a3c30720e --- /dev/null +++ b/third_party/python/gyp/test/generator-output/rules/subdir2/file4.in1 @@ -0,0 +1 @@ +Hello from file4.in1 diff --git a/third_party/python/gyp/test/generator-output/rules/subdir2/none.gyp b/third_party/python/gyp/test/generator-output/rules/subdir2/none.gyp new file mode 100644 index 0000000000..664cbd9cb7 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/generator-output/rules/subdir2/rules-out/README.txt b/third_party/python/gyp/test/generator-output/rules/subdir2/rules-out/README.txt new file mode 100644 index 0000000000..1b052c9a24 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/generator-output/src/build/README.txt b/third_party/python/gyp/test/generator-output/src/build/README.txt new file mode 100644 index 0000000000..90ef886193 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/generator-output/src/inc.h b/third_party/python/gyp/test/generator-output/src/inc.h new file mode 100644 index 0000000000..57aa1a5a74 --- /dev/null +++ b/third_party/python/gyp/test/generator-output/src/inc.h @@ -0,0 +1 @@ +#define INC_STRING "inc.h" diff --git a/third_party/python/gyp/test/generator-output/src/inc1/include1.h b/third_party/python/gyp/test/generator-output/src/inc1/include1.h new file mode 100644 index 0000000000..1d59065fc9 --- /dev/null +++ b/third_party/python/gyp/test/generator-output/src/inc1/include1.h @@ -0,0 +1 @@ +#define INCLUDE1_STRING "inc1/include1.h" diff --git a/third_party/python/gyp/test/generator-output/src/prog1.c b/third_party/python/gyp/test/generator-output/src/prog1.c new file mode 100644 index 0000000000..bf7c2a17bd --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/generator-output/src/prog1.gyp b/third_party/python/gyp/test/generator-output/src/prog1.gyp new file mode 100644 index 0000000000..d50e6fb0a7 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/generator-output/src/subdir2/build/README.txt b/third_party/python/gyp/test/generator-output/src/subdir2/build/README.txt new file mode 100644 index 0000000000..90ef886193 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/generator-output/src/subdir2/deeper/build/README.txt b/third_party/python/gyp/test/generator-output/src/subdir2/deeper/build/README.txt new file mode 100644 index 0000000000..90ef886193 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/generator-output/src/subdir2/deeper/deeper.c b/third_party/python/gyp/test/generator-output/src/subdir2/deeper/deeper.c new file mode 100644 index 0000000000..843505cd11 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/generator-output/src/subdir2/deeper/deeper.gyp b/third_party/python/gyp/test/generator-output/src/subdir2/deeper/deeper.gyp new file mode 100644 index 0000000000..8648770872 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/generator-output/src/subdir2/deeper/deeper.h b/third_party/python/gyp/test/generator-output/src/subdir2/deeper/deeper.h new file mode 100644 index 0000000000..f6484a0fe5 --- /dev/null +++ b/third_party/python/gyp/test/generator-output/src/subdir2/deeper/deeper.h @@ -0,0 +1 @@ +#define DEEPER_STRING "subdir2/deeper/deeper.h" diff --git a/third_party/python/gyp/test/generator-output/src/subdir2/inc2/include2.h b/third_party/python/gyp/test/generator-output/src/subdir2/inc2/include2.h new file mode 100644 index 0000000000..1ccfa5dea7 --- /dev/null +++ b/third_party/python/gyp/test/generator-output/src/subdir2/inc2/include2.h @@ -0,0 +1 @@ +#define INCLUDE2_STRING "inc2/include2.h" diff --git a/third_party/python/gyp/test/generator-output/src/subdir2/prog2.c b/third_party/python/gyp/test/generator-output/src/subdir2/prog2.c new file mode 100644 index 0000000000..d80d871984 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/generator-output/src/subdir2/prog2.gyp b/third_party/python/gyp/test/generator-output/src/subdir2/prog2.gyp new file mode 100644 index 0000000000..7176ed8be7 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/generator-output/src/subdir3/build/README.txt b/third_party/python/gyp/test/generator-output/src/subdir3/build/README.txt new file mode 100644 index 0000000000..90ef886193 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/generator-output/src/subdir3/inc3/include3.h b/third_party/python/gyp/test/generator-output/src/subdir3/inc3/include3.h new file mode 100644 index 0000000000..bf53bf1f00 --- /dev/null +++ b/third_party/python/gyp/test/generator-output/src/subdir3/inc3/include3.h @@ -0,0 +1 @@ +#define INCLUDE3_STRING "inc3/include3.h" diff --git a/third_party/python/gyp/test/generator-output/src/subdir3/prog3.c b/third_party/python/gyp/test/generator-output/src/subdir3/prog3.c new file mode 100644 index 0000000000..c72233da19 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/generator-output/src/subdir3/prog3.gyp b/third_party/python/gyp/test/generator-output/src/subdir3/prog3.gyp new file mode 100644 index 0000000000..46c5e000a2 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/generator-output/src/symroot.gypi b/third_party/python/gyp/test/generator-output/src/symroot.gypi new file mode 100644 index 0000000000..519916427c --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/gyp-defines/defines.gyp b/third_party/python/gyp/test/gyp-defines/defines.gyp new file mode 100644 index 0000000000..f59bbd20d2 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/gyp-defines/echo.py b/third_party/python/gyp/test/gyp-defines/echo.py new file mode 100644 index 0000000000..b85add12f6 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/gyp-defines/gyptest-multiple-values.py b/third_party/python/gyp/test/gyp-defines/gyptest-multiple-values.py new file mode 100644 index 0000000000..67735cce6a --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/gyp-defines/gyptest-regyp.py b/third_party/python/gyp/test/gyp-defines/gyptest-regyp.py new file mode 100644 index 0000000000..0895d81d4f --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/hard_dependency/gyptest-exported-hard-dependency.py b/third_party/python/gyp/test/hard_dependency/gyptest-exported-hard-dependency.py new file mode 100755 index 0000000000..ba51528800 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/hard_dependency/gyptest-no-exported-hard-dependency.py b/third_party/python/gyp/test/hard_dependency/gyptest-no-exported-hard-dependency.py new file mode 100755 index 0000000000..10774ca2a0 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/hard_dependency/src/a.c b/third_party/python/gyp/test/hard_dependency/src/a.c new file mode 100644 index 0000000000..0fa0223c97 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/hard_dependency/src/a.h b/third_party/python/gyp/test/hard_dependency/src/a.h new file mode 100644 index 0000000000..854a06504a --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/hard_dependency/src/b.c b/third_party/python/gyp/test/hard_dependency/src/b.c new file mode 100644 index 0000000000..0baace929e --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/hard_dependency/src/b.h b/third_party/python/gyp/test/hard_dependency/src/b.h new file mode 100644 index 0000000000..22b48cefe2 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/hard_dependency/src/c.c b/third_party/python/gyp/test/hard_dependency/src/c.c new file mode 100644 index 0000000000..7d0068208e --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/hard_dependency/src/c.h b/third_party/python/gyp/test/hard_dependency/src/c.h new file mode 100644 index 0000000000..f4ea7fefa2 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/hard_dependency/src/d.c b/third_party/python/gyp/test/hard_dependency/src/d.c new file mode 100644 index 0000000000..d016c3ce71 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/hard_dependency/src/emit.py b/third_party/python/gyp/test/hard_dependency/src/emit.py new file mode 100755 index 0000000000..8ed12f7393 --- /dev/null +++ b/third_party/python/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], 'w') +f.write('/* Hello World */\n') +f.close() diff --git a/third_party/python/gyp/test/hard_dependency/src/hard_dependency.gyp b/third_party/python/gyp/test/hard_dependency/src/hard_dependency.gyp new file mode 100644 index 0000000000..4479c5f045 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/hello/gyptest-all.py b/third_party/python/gyp/test/hello/gyptest-all.py new file mode 100755 index 0000000000..1739b6886e --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/hello/gyptest-default.py b/third_party/python/gyp/test/hello/gyptest-default.py new file mode 100755 index 0000000000..22377e7ac5 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/hello/gyptest-disable-regyp.py b/third_party/python/gyp/test/hello/gyptest-disable-regyp.py new file mode 100755 index 0000000000..1e4b306674 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/hello/gyptest-regyp-output.py b/third_party/python/gyp/test/hello/gyptest-regyp-output.py new file mode 100644 index 0000000000..fd88a85503 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/hello/gyptest-regyp.py b/third_party/python/gyp/test/hello/gyptest-regyp.py new file mode 100755 index 0000000000..b513edcd07 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/hello/gyptest-target.py b/third_party/python/gyp/test/hello/gyptest-target.py new file mode 100755 index 0000000000..1abaf7057b --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/hello/hello.c b/third_party/python/gyp/test/hello/hello.c new file mode 100644 index 0000000000..0a4c806019 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/hello/hello.gyp b/third_party/python/gyp/test/hello/hello.gyp new file mode 100644 index 0000000000..1974d51ccd --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/hello/hello2.c b/third_party/python/gyp/test/hello/hello2.c new file mode 100644 index 0000000000..b14299cae0 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/hello/hello2.gyp b/third_party/python/gyp/test/hello/hello2.gyp new file mode 100644 index 0000000000..25b08caf3c --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/home_dot_gyp/gyptest-home-includes-config-arg.py b/third_party/python/gyp/test/home_dot_gyp/gyptest-home-includes-config-arg.py new file mode 100755 index 0000000000..82e39f9d07 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/home_dot_gyp/gyptest-home-includes-config-env.py b/third_party/python/gyp/test/home_dot_gyp/gyptest-home-includes-config-env.py new file mode 100755 index 0000000000..6f4b299ede --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/home_dot_gyp/gyptest-home-includes-regyp.py b/third_party/python/gyp/test/home_dot_gyp/gyptest-home-includes-regyp.py new file mode 100755 index 0000000000..fdf8b14464 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/home_dot_gyp/gyptest-home-includes.py b/third_party/python/gyp/test/home_dot_gyp/gyptest-home-includes.py new file mode 100755 index 0000000000..8ad52556be --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/home_dot_gyp/home/.gyp/include.gypi b/third_party/python/gyp/test/home_dot_gyp/home/.gyp/include.gypi new file mode 100644 index 0000000000..fcfb39befd --- /dev/null +++ b/third_party/python/gyp/test/home_dot_gyp/home/.gyp/include.gypi @@ -0,0 +1,5 @@ +{ + 'variables': { + 'foo': '"fromhome"', + }, +} diff --git a/third_party/python/gyp/test/home_dot_gyp/home2/.gyp/include.gypi b/third_party/python/gyp/test/home_dot_gyp/home2/.gyp/include.gypi new file mode 100644 index 0000000000..f0d84b31ad --- /dev/null +++ b/third_party/python/gyp/test/home_dot_gyp/home2/.gyp/include.gypi @@ -0,0 +1,5 @@ +{ + 'variables': { + 'foo': '"fromhome2"', + }, +} diff --git a/third_party/python/gyp/test/home_dot_gyp/home2/.gyp_new/include.gypi b/third_party/python/gyp/test/home_dot_gyp/home2/.gyp_new/include.gypi new file mode 100644 index 0000000000..4094dfd2f8 --- /dev/null +++ b/third_party/python/gyp/test/home_dot_gyp/home2/.gyp_new/include.gypi @@ -0,0 +1,5 @@ +{ + 'variables': { + 'foo': '"fromhome3"', + }, +} diff --git a/third_party/python/gyp/test/home_dot_gyp/src/all.gyp b/third_party/python/gyp/test/home_dot_gyp/src/all.gyp new file mode 100644 index 0000000000..14b6aea285 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/home_dot_gyp/src/printfoo.c b/third_party/python/gyp/test/home_dot_gyp/src/printfoo.c new file mode 100644 index 0000000000..9bb67181b9 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/include_dirs/gyptest-all.py b/third_party/python/gyp/test/include_dirs/gyptest-all.py new file mode 100755 index 0000000000..d64bc6a9ca --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/include_dirs/gyptest-default.py b/third_party/python/gyp/test/include_dirs/gyptest-default.py new file mode 100755 index 0000000000..fc6141587e --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/include_dirs/src/inc.h b/third_party/python/gyp/test/include_dirs/src/inc.h new file mode 100644 index 0000000000..0398d6915f --- /dev/null +++ b/third_party/python/gyp/test/include_dirs/src/inc.h @@ -0,0 +1 @@ +#define INC_STRING "inc.h" diff --git a/third_party/python/gyp/test/include_dirs/src/inc1/include1.h b/third_party/python/gyp/test/include_dirs/src/inc1/include1.h new file mode 100644 index 0000000000..43356b5f47 --- /dev/null +++ b/third_party/python/gyp/test/include_dirs/src/inc1/include1.h @@ -0,0 +1 @@ +#define INCLUDE1_STRING "include1.h" diff --git a/third_party/python/gyp/test/include_dirs/src/includes.c b/third_party/python/gyp/test/include_dirs/src/includes.c new file mode 100644 index 0000000000..6e2a23cdff --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/include_dirs/src/includes.gyp b/third_party/python/gyp/test/include_dirs/src/includes.gyp new file mode 100644 index 0000000000..3592690208 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/include_dirs/src/shadow1/shadow.h b/third_party/python/gyp/test/include_dirs/src/shadow1/shadow.h new file mode 100644 index 0000000000..80f6de20b8 --- /dev/null +++ b/third_party/python/gyp/test/include_dirs/src/shadow1/shadow.h @@ -0,0 +1 @@ +#define SHADOW_STRING "shadow1/shadow.h" diff --git a/third_party/python/gyp/test/include_dirs/src/shadow2/shadow.h b/third_party/python/gyp/test/include_dirs/src/shadow2/shadow.h new file mode 100644 index 0000000000..fad5ccd085 --- /dev/null +++ b/third_party/python/gyp/test/include_dirs/src/shadow2/shadow.h @@ -0,0 +1 @@ +#define SHADOW_STRING "shadow2/shadow.h" diff --git a/third_party/python/gyp/test/include_dirs/src/subdir/inc.h b/third_party/python/gyp/test/include_dirs/src/subdir/inc.h new file mode 100644 index 0000000000..0a68d7b36a --- /dev/null +++ b/third_party/python/gyp/test/include_dirs/src/subdir/inc.h @@ -0,0 +1 @@ +#define INC_STRING "subdir/inc.h" diff --git a/third_party/python/gyp/test/include_dirs/src/subdir/inc2/include2.h b/third_party/python/gyp/test/include_dirs/src/subdir/inc2/include2.h new file mode 100644 index 0000000000..721577effb --- /dev/null +++ b/third_party/python/gyp/test/include_dirs/src/subdir/inc2/include2.h @@ -0,0 +1 @@ +#define INCLUDE2_STRING "subdir/inc2/include2.h" diff --git a/third_party/python/gyp/test/include_dirs/src/subdir/subdir_includes.c b/third_party/python/gyp/test/include_dirs/src/subdir/subdir_includes.c new file mode 100644 index 0000000000..4623543c43 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/include_dirs/src/subdir/subdir_includes.gyp b/third_party/python/gyp/test/include_dirs/src/subdir/subdir_includes.gyp new file mode 100644 index 0000000000..257d052c3c --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/intermediate_dir/gyptest-intermediate-dir.py b/third_party/python/gyp/test/intermediate_dir/gyptest-intermediate-dir.py new file mode 100755 index 0000000000..bf4b91a2fc --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/intermediate_dir/src/script.py b/third_party/python/gyp/test/intermediate_dir/src/script.py new file mode 100755 index 0000000000..2eb73ac206 --- /dev/null +++ b/third_party/python/gyp/test/intermediate_dir/src/script.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. + +# 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) + +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/third_party/python/gyp/test/intermediate_dir/src/shared_infile.txt b/third_party/python/gyp/test/intermediate_dir/src/shared_infile.txt new file mode 100644 index 0000000000..e2aba15d04 --- /dev/null +++ b/third_party/python/gyp/test/intermediate_dir/src/shared_infile.txt @@ -0,0 +1 @@ +dummy input diff --git a/third_party/python/gyp/test/intermediate_dir/src/test.gyp b/third_party/python/gyp/test/intermediate_dir/src/test.gyp new file mode 100644 index 0000000000..b61e7e8ea5 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/intermediate_dir/src/test2.gyp b/third_party/python/gyp/test/intermediate_dir/src/test2.gyp new file mode 100644 index 0000000000..41f5564663 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/ios/app-bundle/TestApp/English.lproj/InfoPlist-error.strings b/third_party/python/gyp/test/ios/app-bundle/TestApp/English.lproj/InfoPlist-error.strings new file mode 100644 index 0000000000..452e7fabf9 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/ios/app-bundle/TestApp/English.lproj/InfoPlist.strings b/third_party/python/gyp/test/ios/app-bundle/TestApp/English.lproj/InfoPlist.strings new file mode 100644 index 0000000000..35bd33a96e --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/ios/app-bundle/TestApp/English.lproj/LanguageMap.plist b/third_party/python/gyp/test/ios/app-bundle/TestApp/English.lproj/LanguageMap.plist new file mode 100644 index 0000000000..6b94882328 --- /dev/null +++ b/third_party/python/gyp/test/ios/app-bundle/TestApp/English.lproj/LanguageMap.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>en</key> + <string>en</string> +</dict> +</plist> diff --git a/third_party/python/gyp/test/ios/app-bundle/TestApp/English.lproj/MainMenu.xib b/third_party/python/gyp/test/ios/app-bundle/TestApp/English.lproj/MainMenu.xib new file mode 100644 index 0000000000..21b60448ad --- /dev/null +++ b/third_party/python/gyp/test/ios/app-bundle/TestApp/English.lproj/MainMenu.xib @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="9060" systemVersion="15B42" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES"> + <dependencies> + <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="9051"/> + <capability name="Aspect ratio constraints" minToolsVersion="5.1"/> + <capability name="Constraints with non-1.0 multipliers" minToolsVersion="5.1"/> + </dependencies> + <objects> + <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/> + <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/> + <viewController id="Ssz-5V-cv2"> + <view key="view" contentMode="scaleToFill" id="tRS-Cx-RH3"> + </view> + <point key="canvasLocation" x="548" y="1086"/> + </viewController> + </objects> +</document> diff --git a/third_party/python/gyp/test/ios/app-bundle/TestApp/English.lproj/Main_iPhone.storyboard b/third_party/python/gyp/test/ios/app-bundle/TestApp/English.lproj/Main_iPhone.storyboard new file mode 100644 index 0000000000..723bc85122 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/ios/app-bundle/TestApp/Images.xcassets/AppIcon.appiconset/Contents.json b/third_party/python/gyp/test/ios/app-bundle/TestApp/Images.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000000..2db2b1c7c6 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/ios/app-bundle/TestApp/Images.xcassets/image.imageset/Contents.json b/third_party/python/gyp/test/ios/app-bundle/TestApp/Images.xcassets/image.imageset/Contents.json new file mode 100644 index 0000000000..0a87b6edc6 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/ios/app-bundle/TestApp/Images.xcassets/image.imageset/super_sylvain.png b/third_party/python/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/third_party/python/gyp/test/ios/app-bundle/TestApp/Images.xcassets/image.imageset/super_sylvain.png diff --git a/third_party/python/gyp/test/ios/app-bundle/TestApp/Images.xcassets/image.imageset/super_sylvain@2x.png b/third_party/python/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/third_party/python/gyp/test/ios/app-bundle/TestApp/Images.xcassets/image.imageset/super_sylvain@2x.png diff --git a/third_party/python/gyp/test/ios/app-bundle/TestApp/Images.xcassets/image.imageset/super_sylvain@3x.png b/third_party/python/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/third_party/python/gyp/test/ios/app-bundle/TestApp/Images.xcassets/image.imageset/super_sylvain@3x.png diff --git a/third_party/python/gyp/test/ios/app-bundle/TestApp/TestApp-Info.plist b/third_party/python/gyp/test/ios/app-bundle/TestApp/TestApp-Info.plist new file mode 100644 index 0000000000..bb90043682 --- /dev/null +++ b/third_party/python/gyp/test/ios/app-bundle/TestApp/TestApp-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>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>NSMainNibFile</key> + <string>MainMenu</string> + <key>NSPrincipalClass</key> + <string>NSApplication</string> +</dict> +</plist> diff --git a/third_party/python/gyp/test/ios/app-bundle/TestApp/check_no_signature.py b/third_party/python/gyp/test/ios/app-bundle/TestApp/check_no_signature.py new file mode 100644 index 0000000000..4f6e340072 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/ios/app-bundle/TestApp/main.m b/third_party/python/gyp/test/ios/app-bundle/TestApp/main.m new file mode 100644 index 0000000000..ec93e0e237 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/ios/app-bundle/TestApp/only-compile-in-32-bits.m b/third_party/python/gyp/test/ios/app-bundle/TestApp/only-compile-in-32-bits.m new file mode 100644 index 0000000000..28bb117788 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/ios/app-bundle/TestApp/only-compile-in-64-bits.m b/third_party/python/gyp/test/ios/app-bundle/TestApp/only-compile-in-64-bits.m new file mode 100644 index 0000000000..e6d2558418 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/ios/app-bundle/test-archs.gyp b/third_party/python/gyp/test/ios/app-bundle/test-archs.gyp new file mode 100644 index 0000000000..fa935c4fb4 --- /dev/null +++ b/third_party/python/gyp/test/ios/app-bundle/test-archs.gyp @@ -0,0 +1,109 @@ +# 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': { + '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': 'iphoneos', # -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/third_party/python/gyp/test/ios/app-bundle/test-assets-catalog.gyp b/third_party/python/gyp/test/ios/app-bundle/test-assets-catalog.gyp new file mode 100644 index 0000000000..9a12d07af7 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/ios/app-bundle/test-crosscompile.gyp b/third_party/python/gyp/test/ios/app-bundle/test-crosscompile.gyp new file mode 100644 index 0000000000..d9049588ba --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/ios/app-bundle/test-device.gyp b/third_party/python/gyp/test/ios/app-bundle/test-device.gyp new file mode 100644 index 0000000000..a0cfff7cdb --- /dev/null +++ b/third_party/python/gyp/test/ios/app-bundle/test-device.gyp @@ -0,0 +1,109 @@ +# 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)"=="xcode"', { + 'target_defaults': { + 'configurations': { + 'Default': { + 'xcode_settings': { + 'SDKROOT': 'iphonesimulator', + 'CONFIGURATION_BUILD_DIR':'build/Default', + } + }, + 'Default-iphoneos': { + 'xcode_settings': { + 'SDKROOT': 'iphoneos', + 'CONFIGURATION_BUILD_DIR':'build/Default-iphoneos', + } + }, + }, + }, + }, { + 'target_defaults': { + 'configurations': { + 'Default': { + 'xcode_settings': { + 'SDKROOT': 'iphonesimulator', + } + }, + }, + }, + }], + ], + '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', + ], + '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_OUTPUT_FORMAT':'xml', + 'GCC_VERSION': 'com.apple.compilers.llvm.clang.1_0', + 'INFOPLIST_FILE': 'TestApp/TestApp-Info.plist', + 'IPHONEOS_DEPLOYMENT_TARGET': '8.0', + 'CODE_SIGNING_REQUIRED': 'NO', + 'CODE_SIGN_IDENTITY[sdk=iphoneos*]': '', + + }, + }, + { + 'target_name': 'sig_test', + 'product_name': 'sigtest', + 'type': 'executable', + '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_OUTPUT_FORMAT':'xml', + 'INFOPLIST_FILE': 'TestApp/TestApp-Info.plist', + 'IPHONEOS_DEPLOYMENT_TARGET': '8.0', + 'CONFIGURATION_BUILD_DIR':'buildsig/Default', + }, + }, + ], +} diff --git a/third_party/python/gyp/test/ios/app-bundle/test.gyp b/third_party/python/gyp/test/ios/app-bundle/test.gyp new file mode 100644 index 0000000000..544c589f60 --- /dev/null +++ b/third_party/python/gyp/test/ios/app-bundle/test.gyp @@ -0,0 +1,75 @@ +# 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/LanguageMap.plist', + '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/third_party/python/gyp/test/ios/app-bundle/tool_main.cc b/third_party/python/gyp/test/ios/app-bundle/tool_main.cc new file mode 100644 index 0000000000..9dc3c94f34 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/ios/copies-with-xcode-envvars/Info.plist b/third_party/python/gyp/test/ios/copies-with-xcode-envvars/Info.plist new file mode 100644 index 0000000000..a0985c3e4d --- /dev/null +++ b/third_party/python/gyp/test/ios/copies-with-xcode-envvars/Info.plist @@ -0,0 +1,24 @@ +<?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>CFBundleIdentifier</key> + <string>$(PRODUCT_BUNDLE_IDENTIFIER)</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> +</dict> +</plist> diff --git a/third_party/python/gyp/test/ios/copies-with-xcode-envvars/copies-with-xcode-envvars.gyp b/third_party/python/gyp/test/ios/copies-with-xcode-envvars/copies-with-xcode-envvars.gyp new file mode 100644 index 0000000000..217dbb0479 --- /dev/null +++ b/third_party/python/gyp/test/ios/copies-with-xcode-envvars/copies-with-xcode-envvars.gyp @@ -0,0 +1,97 @@ +# Copyright (c) 2016 Mark Callow. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. +# +# For testing use of the UI settings & environment variables +# available in Xcode's PBXCopyFilesBuildPhase. +{ + 'targets': [ + { + 'target_name': 'copies-with-xcode-envvars', + 'type': 'executable', + 'mac_bundle': 1, + 'xcode_settings': { + 'SDKROOT': 'iphoneos', + 'TARGETED_DEVICE_FAMILY': '1,2', + 'IPHONEOS_DEPLOYMENT_TARGET': '7.0', + 'CODE_SIGNING_REQUIRED': 'NO', + 'INFOPLIST_FILE': 'Info.plist', + # This is where the test framework looks for results. Without + # this line the result will be in build/Default-iphoneos. + 'CONFIGURATION_BUILD_DIR':'build/Default', + }, + 'sources': [ 'empty.c' ], + 'conditions': [ + ['OS == "ios" or OS == "mac"', { + 'copies': [{ + 'destination': '$(BUILT_PRODUCTS_DIR)', + 'files': [ + 'file0', + ], + }, { + 'destination': '$(BUILT_PRODUCTS_DIR)/$(WRAPPER_NAME)', + 'files': [ + 'file1', + ], + }, { + 'destination': '<(PRODUCT_DIR)/$(EXECUTABLE_FOLDER_PATH)', + 'files': [ + 'file2', + ], + }, { + 'destination': '<(PRODUCT_DIR)/$(UNLOCALIZED_RESOURCES_FOLDER_PATH)', + 'files': [ + 'file3', + ], + }, { + 'destination': '<(PRODUCT_DIR)/$(UNLOCALIZED_RESOURCES_FOLDER_PATH)/testimages', + 'files': [ + 'file4', + ], + }, { + 'destination': '$(BUILT_PRODUCTS_DIR)/$(JAVA_FOLDER_PATH)', + 'files': [ + 'file5', + ], + }, { + 'destination': '<(PRODUCT_DIR)/$(FRAMEWORKS_FOLDER_PATH)', + 'files': [ + 'file6', + ], + }, { + # NOTE: This is not an Xcode macro name but + # xcodeproj_file.py recognizes it and sends + # the output to the same place as + # $(FRAMEWORKS_FOLDER_PATH). xcode_emulation.py + # sets its value to an absolute path. + 'destination': '$(BUILT_FRAMEWORKS_DIR)', + 'files': [ + 'file7', + ], + }, { + 'destination': '<(PRODUCT_DIR)/$(SHARED_FRAMEWORKS_FOLDER_PATH)', + 'files': [ + 'file8', + ], + }, { + 'destination': '<(PRODUCT_DIR)/$(SHARED_SUPPORT_FOLDER_PATH)', + 'files': [ + 'file9', + ], + }, { + 'destination': '<(PRODUCT_DIR)/$(PLUGINS_FOLDER_PATH)', + 'files': [ + 'file10', + ], + }, { + 'destination': '<(PRODUCT_DIR)/$(XPCSERVICES_FOLDER_PATH)', + 'files': [ + 'file11', + ], + }], # copies + }], # OS == "ios" or OS == "mac" + ], # conditions + }], # targets +} + +# vim:ai:ts=4:sts=4:sw=2:expandtab:textwidth=70 diff --git a/third_party/python/gyp/test/ios/copies-with-xcode-envvars/empty.c b/third_party/python/gyp/test/ios/copies-with-xcode-envvars/empty.c new file mode 100644 index 0000000000..237c8ce181 --- /dev/null +++ b/third_party/python/gyp/test/ios/copies-with-xcode-envvars/empty.c @@ -0,0 +1 @@ +int main() {} diff --git a/third_party/python/gyp/test/ios/copies-with-xcode-envvars/file0 b/third_party/python/gyp/test/ios/copies-with-xcode-envvars/file0 new file mode 100644 index 0000000000..117889361f --- /dev/null +++ b/third_party/python/gyp/test/ios/copies-with-xcode-envvars/file0 @@ -0,0 +1 @@ +file0 contents diff --git a/third_party/python/gyp/test/ios/copies-with-xcode-envvars/file1 b/third_party/python/gyp/test/ios/copies-with-xcode-envvars/file1 new file mode 100644 index 0000000000..84d55c5759 --- /dev/null +++ b/third_party/python/gyp/test/ios/copies-with-xcode-envvars/file1 @@ -0,0 +1 @@ +file1 contents diff --git a/third_party/python/gyp/test/ios/copies-with-xcode-envvars/file10 b/third_party/python/gyp/test/ios/copies-with-xcode-envvars/file10 new file mode 100644 index 0000000000..372e992ef9 --- /dev/null +++ b/third_party/python/gyp/test/ios/copies-with-xcode-envvars/file10 @@ -0,0 +1 @@ +file10 contents diff --git a/third_party/python/gyp/test/ios/copies-with-xcode-envvars/file11 b/third_party/python/gyp/test/ios/copies-with-xcode-envvars/file11 new file mode 100644 index 0000000000..923e760e1f --- /dev/null +++ b/third_party/python/gyp/test/ios/copies-with-xcode-envvars/file11 @@ -0,0 +1 @@ +file11 contents diff --git a/third_party/python/gyp/test/ios/copies-with-xcode-envvars/file2 b/third_party/python/gyp/test/ios/copies-with-xcode-envvars/file2 new file mode 100644 index 0000000000..af1b8ae35d --- /dev/null +++ b/third_party/python/gyp/test/ios/copies-with-xcode-envvars/file2 @@ -0,0 +1 @@ +file2 contents diff --git a/third_party/python/gyp/test/ios/copies-with-xcode-envvars/file3 b/third_party/python/gyp/test/ios/copies-with-xcode-envvars/file3 new file mode 100644 index 0000000000..43f16f3522 --- /dev/null +++ b/third_party/python/gyp/test/ios/copies-with-xcode-envvars/file3 @@ -0,0 +1 @@ +file3 contents diff --git a/third_party/python/gyp/test/ios/copies-with-xcode-envvars/file4 b/third_party/python/gyp/test/ios/copies-with-xcode-envvars/file4 new file mode 100644 index 0000000000..5f7270a084 --- /dev/null +++ b/third_party/python/gyp/test/ios/copies-with-xcode-envvars/file4 @@ -0,0 +1 @@ +file4 contents diff --git a/third_party/python/gyp/test/ios/copies-with-xcode-envvars/file5 b/third_party/python/gyp/test/ios/copies-with-xcode-envvars/file5 new file mode 100644 index 0000000000..41f47186bd --- /dev/null +++ b/third_party/python/gyp/test/ios/copies-with-xcode-envvars/file5 @@ -0,0 +1 @@ +file5 contents diff --git a/third_party/python/gyp/test/ios/copies-with-xcode-envvars/file6 b/third_party/python/gyp/test/ios/copies-with-xcode-envvars/file6 new file mode 100644 index 0000000000..f5d5757348 --- /dev/null +++ b/third_party/python/gyp/test/ios/copies-with-xcode-envvars/file6 @@ -0,0 +1 @@ +file6 contents diff --git a/third_party/python/gyp/test/ios/copies-with-xcode-envvars/file7 b/third_party/python/gyp/test/ios/copies-with-xcode-envvars/file7 new file mode 100644 index 0000000000..90dbe6e9e1 --- /dev/null +++ b/third_party/python/gyp/test/ios/copies-with-xcode-envvars/file7 @@ -0,0 +1 @@ +file7 contents diff --git a/third_party/python/gyp/test/ios/copies-with-xcode-envvars/file8 b/third_party/python/gyp/test/ios/copies-with-xcode-envvars/file8 new file mode 100644 index 0000000000..9eb613fabb --- /dev/null +++ b/third_party/python/gyp/test/ios/copies-with-xcode-envvars/file8 @@ -0,0 +1 @@ +file8 contents diff --git a/third_party/python/gyp/test/ios/copies-with-xcode-envvars/file9 b/third_party/python/gyp/test/ios/copies-with-xcode-envvars/file9 new file mode 100644 index 0000000000..e37ac72ada --- /dev/null +++ b/third_party/python/gyp/test/ios/copies-with-xcode-envvars/file9 @@ -0,0 +1 @@ +file9 contents diff --git a/third_party/python/gyp/test/ios/deployment-target/check-version-min.c b/third_party/python/gyp/test/ios/deployment-target/check-version-min.c new file mode 100644 index 0000000000..761c529085 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/ios/deployment-target/deployment-target.gyp b/third_party/python/gyp/test/ios/deployment-target/deployment-target.gyp new file mode 100644 index 0000000000..bdc1439b5e --- /dev/null +++ b/third_party/python/gyp/test/ios/deployment-target/deployment-target.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. +{ + 'make_global_settings': [ + ['CC', '/usr/bin/clang'], + ['CXX', '/usr/bin/clang++'], + ], + 'targets': [ + { + 'target_name': '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': 'iphoneos', + 'IPHONEOS_DEPLOYMENT_TARGET': '4.3', + }, + }, + { + 'target_name': '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': 'iphoneos', + 'IPHONEOS_DEPLOYMENT_TARGET': '5.0', + }, + } + ], +} + diff --git a/third_party/python/gyp/test/ios/extension/ActionExtension/ActionViewController.h b/third_party/python/gyp/test/ios/extension/ActionExtension/ActionViewController.h new file mode 100644 index 0000000000..1c92509029 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/ios/extension/ActionExtension/ActionViewController.m b/third_party/python/gyp/test/ios/extension/ActionExtension/ActionViewController.m new file mode 100644 index 0000000000..d37bacdae1 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/ios/extension/ActionExtension/Info.plist b/third_party/python/gyp/test/ios/extension/ActionExtension/Info.plist new file mode 100644 index 0000000000..f89cd790bc --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/ios/extension/ActionExtension/MainInterface.storyboard b/third_party/python/gyp/test/ios/extension/ActionExtension/MainInterface.storyboard new file mode 100644 index 0000000000..5aa58184e8 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/ios/extension/ExtensionContainer/AppDelegate.h b/third_party/python/gyp/test/ios/extension/ExtensionContainer/AppDelegate.h new file mode 100644 index 0000000000..510e2300b1 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/ios/extension/ExtensionContainer/AppDelegate.m b/third_party/python/gyp/test/ios/extension/ExtensionContainer/AppDelegate.m new file mode 100644 index 0000000000..1197bc1bbc --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/ios/extension/ExtensionContainer/Base.lproj/Main.storyboard b/third_party/python/gyp/test/ios/extension/ExtensionContainer/Base.lproj/Main.storyboard new file mode 100644 index 0000000000..e8f3cfb40c --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/ios/extension/ExtensionContainer/Images.xcassets/AppIcon.appiconset/Contents.json b/third_party/python/gyp/test/ios/extension/ExtensionContainer/Images.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000000..f697f61f4a --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/ios/extension/ExtensionContainer/Images.xcassets/LaunchImage.launchimage/Contents.json b/third_party/python/gyp/test/ios/extension/ExtensionContainer/Images.xcassets/LaunchImage.launchimage/Contents.json new file mode 100644 index 0000000000..4458b40c05 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/ios/extension/ExtensionContainer/Info.plist b/third_party/python/gyp/test/ios/extension/ExtensionContainer/Info.plist new file mode 100644 index 0000000000..31ccf4cc82 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/ios/extension/ExtensionContainer/ViewController.h b/third_party/python/gyp/test/ios/extension/ExtensionContainer/ViewController.h new file mode 100644 index 0000000000..fad7754714 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/ios/extension/ExtensionContainer/ViewController.m b/third_party/python/gyp/test/ios/extension/ExtensionContainer/ViewController.m new file mode 100644 index 0000000000..3810fa9cba --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/ios/extension/ExtensionContainer/main.m b/third_party/python/gyp/test/ios/extension/ExtensionContainer/main.m new file mode 100644 index 0000000000..47aecb5148 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/ios/extension/extension.gyp b/third_party/python/gyp/test/ios/extension/extension.gyp new file mode 100644 index 0000000000..91c068413d --- /dev/null +++ b/third_party/python/gyp/test/ios/extension/extension.gyp @@ -0,0 +1,91 @@ +# 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_SIGNING_REQUIRED': 'NO', + 'DEPLOYMENT_POSTPROCESSING': 'YES', + 'STRIP_INSTALLED_PRODUCT': 'YES', + 'CONFIGURATION_BUILD_DIR':'build/Default', + }, + }, + { + '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_SIGNING_REQUIRED': 'NO', + 'DEPLOYMENT_POSTPROCESSING': 'YES', + 'STRIP_INSTALLED_PRODUCT': 'YES', + 'CONFIGURATION_BUILD_DIR':'build/Default', + }, + }, + ], +} + diff --git a/third_party/python/gyp/test/ios/framework/framework.gyp b/third_party/python/gyp/test/ios/framework/framework.gyp new file mode 100644 index 0000000000..2c6fdd5b27 --- /dev/null +++ b/third_party/python/gyp/test/ios/framework/framework.gyp @@ -0,0 +1,43 @@ +# Copyright 2016 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': 'iOSFramework', + 'type': 'shared_library', + 'mac_bundle': 1, + 'sources': [ + 'iOSFramework/iOSFramework.h', + 'iOSFramework/Thing.h', + 'iOSFramework/Thing.m', + ], + 'link_settings': { + 'libraries': [ + '$(SDKROOT)/System/Library/Frameworks/Foundation.framework', + '$(SDKROOT)/System/Library/Frameworks/UIKit.framework', + ], + }, + 'mac_framework_headers': [ + # Using two headers here tests mac_tool.py NextGreaterPowerOf2. + 'iOSFramework/iOSFramework.h', + 'iOSFramework/Thing.h', + ], + 'mac_framework_dirs': [ + '$(SDKROOT)/../../Library/Frameworks', + ], + 'xcode_settings': { + 'OTHER_CFLAGS': [ + '-fobjc-abi-version=2', + ], + 'INFOPLIST_FILE': 'iOSFramework/Info.plist', + 'GCC_VERSION': 'com.apple.compilers.llvm.clang.1_0', + 'SDKROOT': 'iphoneos', + 'IPHONEOS_DEPLOYMENT_TARGET': '8.0', + 'CONFIGURATION_BUILD_DIR':'build/Default', + 'CODE_SIGN_IDENTITY[sdk=iphoneos*]': 'iPhone Developer', + }, + }, + ], +} diff --git a/third_party/python/gyp/test/ios/framework/iOSFramework/Info.plist b/third_party/python/gyp/test/ios/framework/iOSFramework/Info.plist new file mode 100644 index 0000000000..d3de8eefb6 --- /dev/null +++ b/third_party/python/gyp/test/ios/framework/iOSFramework/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>CFBundleDevelopmentRegion</key> + <string>en</string> + <key>CFBundleExecutable</key> + <string>$(EXECUTABLE_NAME)</string> + <key>CFBundleIdentifier</key> + <string>$(PRODUCT_BUNDLE_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>$(CURRENT_PROJECT_VERSION)</string> + <key>NSPrincipalClass</key> + <string></string> +</dict> +</plist> diff --git a/third_party/python/gyp/test/ios/framework/iOSFramework/Thing.h b/third_party/python/gyp/test/ios/framework/iOSFramework/Thing.h new file mode 100644 index 0000000000..a34e908fc9 --- /dev/null +++ b/third_party/python/gyp/test/ios/framework/iOSFramework/Thing.h @@ -0,0 +1,10 @@ +#import <Foundation/Foundation.h> +#import <UIKit/UIKit.h> + +@interface Thing : NSObject + ++ (instancetype)thing; + +- (void)sayHello; + +@end diff --git a/third_party/python/gyp/test/ios/framework/iOSFramework/Thing.m b/third_party/python/gyp/test/ios/framework/iOSFramework/Thing.m new file mode 100644 index 0000000000..5b2b54925e --- /dev/null +++ b/third_party/python/gyp/test/ios/framework/iOSFramework/Thing.m @@ -0,0 +1,22 @@ +#import "Thing.h" + +@interface Thing () + +@end + +@implementation Thing + ++ (instancetype)thing { + static Thing* thing = nil; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + thing = [[[self class] alloc] init]; + }); + return thing; +} + +- (void)sayHello { + NSLog(@"Hello World"); +} + +@end diff --git a/third_party/python/gyp/test/ios/framework/iOSFramework/iOSFramework.h b/third_party/python/gyp/test/ios/framework/iOSFramework/iOSFramework.h new file mode 100644 index 0000000000..e86b524d17 --- /dev/null +++ b/third_party/python/gyp/test/ios/framework/iOSFramework/iOSFramework.h @@ -0,0 +1,9 @@ +#import <UIKit/UIKit.h> + +//! Project version number for iOSFramework. +FOUNDATION_EXPORT double iOSFrameworkVersionNumber; + +//! Project version string for iOSFramework. +FOUNDATION_EXPORT const unsigned char iOSFrameworkVersionString[]; + +#import <iOSFramework/Thing.h> diff --git a/third_party/python/gyp/test/ios/gyptest-app-ios-assets-catalog.py b/third_party/python/gyp/test/ios/gyptest-app-ios-assets-catalog.py new file mode 100755 index 0000000000..efd96ac752 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/ios/gyptest-app-ios.py b/third_party/python/gyp/test/ios/gyptest-app-ios.py new file mode 100755 index 0000000000..99f9e865dc --- /dev/null +++ b/third_party/python/gyp/test/ios/gyptest-app-ios.py @@ -0,0 +1,76 @@ +#!/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]) + if not 'XML 1.0 document text' in output: + print('File: Expected XML 1.0 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) + + extra_plist_file = test.built_file_path( + 'Test App Gyp.app/English.lproj/LanguageMap.plist', + chdir='app-bundle') + test.built_file_must_exist(extra_plist_file) + CheckFileBinaryPropertyList(extra_plist_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/third_party/python/gyp/test/ios/gyptest-archs.py b/third_party/python/gyp/test/ios/gyptest-archs.py new file mode 100644 index 0000000000..c3340431bd --- /dev/null +++ b/third_party/python/gyp/test/ios/gyptest-archs.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 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']) + + if test.format == 'xcode': + # This test appears to hang flakily. + test.skip_test() # bug=532 + + 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.app/%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/third_party/python/gyp/test/ios/gyptest-copies-with-xcode-envvars.py b/third_party/python/gyp/test/ios/gyptest-copies-with-xcode-envvars.py new file mode 100644 index 0000000000..88d9e028b8 --- /dev/null +++ b/third_party/python/gyp/test/ios/gyptest-copies-with-xcode-envvars.py @@ -0,0 +1,65 @@ +#!/usr/bin/env python + +# Copyright (c) 2016 Mark Callow. 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 are copied to the correct destinations when those +destinations are specified using environment variables available in +Xcode's PBXCopyFilesBuildPhase. +""" + +import TestGyp + +import os +import stat +import sys + + +test = TestGyp.TestGyp(formats=['ninja', 'xcode']) + +if sys.platform == 'darwin': + test.run_gyp('copies-with-xcode-envvars.gyp', + chdir='copies-with-xcode-envvars') + + test.build('copies-with-xcode-envvars.gyp', chdir='copies-with-xcode-envvars') + + wrapper_name = 'copies-with-xcode-envvars.app/' + contents_path = wrapper_name + out_path = test.built_file_path('file0', chdir='copies-with-xcode-envvars') + test.must_contain(out_path, 'file0 contents\n') + out_path = test.built_file_path(wrapper_name + 'file1', + chdir='copies-with-xcode-envvars') + test.must_contain(out_path, 'file1 contents\n') + out_path = test.built_file_path(contents_path + 'file2', + chdir='copies-with-xcode-envvars') + test.must_contain(out_path, 'file2 contents\n') + out_path = test.built_file_path(contents_path + 'file3', + chdir='copies-with-xcode-envvars') + test.must_contain(out_path, 'file3 contents\n') + out_path = test.built_file_path(contents_path + 'testimages/file4', + chdir='copies-with-xcode-envvars') + test.must_contain(out_path, 'file4 contents\n') + out_path = test.built_file_path(contents_path + 'Java/file5', + chdir='copies-with-xcode-envvars') + test.must_contain(out_path, 'file5 contents\n') + out_path = test.built_file_path(contents_path + 'Frameworks/file6', + chdir='copies-with-xcode-envvars') + test.must_contain(out_path, 'file6 contents\n') + out_path = test.built_file_path(contents_path + 'Frameworks/file7', + chdir='copies-with-xcode-envvars') + test.must_contain(out_path, 'file7 contents\n') + out_path = test.built_file_path(contents_path + 'SharedFrameworks/file8', + chdir='copies-with-xcode-envvars') + test.must_contain(out_path, 'file8 contents\n') + out_path = test.built_file_path(contents_path + 'SharedSupport/file9', + chdir='copies-with-xcode-envvars') + test.must_contain(out_path, 'file9 contents\n') + out_path = test.built_file_path(contents_path + 'PlugIns/file10', + chdir='copies-with-xcode-envvars') + test.must_contain(out_path, 'file10 contents\n') + out_path = test.built_file_path(contents_path + 'XPCServices/file11', + chdir='copies-with-xcode-envvars') + test.must_contain(out_path, 'file11 contents\n') + test.pass_test() diff --git a/third_party/python/gyp/test/ios/gyptest-crosscompile.py b/third_party/python/gyp/test/ios/gyptest-crosscompile.py new file mode 100644 index 0000000000..a0816836e5 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/ios/gyptest-deployment-target.py b/third_party/python/gyp/test/ios/gyptest-deployment-target.py new file mode 100644 index 0000000000..6c09d9dc04 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/ios/gyptest-extension.py b/third_party/python/gyp/test/ios/gyptest-extension.py new file mode 100755 index 0000000000..bb239ae5b8 --- /dev/null +++ b/third_party/python/gyp/test/ios/gyptest-extension.py @@ -0,0 +1,51 @@ +#!/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. +""" + +from __future__ import print_function + +import TestGyp +import TestMac +import subprocess +import sys + +def CheckStrip(p, expected): + if expected not in subprocess.check_output(['nm','-gU', p]): + print(expected + " shouldn't get stripped out.") + test.fail_test() + +def CheckEntrypoint(p, expected): + if expected not in subprocess.check_output(['nm', p]): + print(expected + "not found.") + test.fail_test() + +if sys.platform == 'darwin' and TestMac.Xcode.Version()>="0600": + + test = TestGyp.TestGyp(formats=['ninja', 'xcode']) + + if test.format in ('ninja', 'xcode-ninja'): + test.skip_test() # bug=534 + + 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') + + path = test.built_file_path( + 'ExtensionContainer.app/PlugIns/ActionExtension.appex/ActionExtension', + chdir='extension') + CheckStrip(path, "ActionViewController") + CheckEntrypoint(path, "_NSExtensionMain") + + test.pass_test() + diff --git a/third_party/python/gyp/test/ios/gyptest-framework.py b/third_party/python/gyp/test/ios/gyptest-framework.py new file mode 100755 index 0000000000..a6dd857b20 --- /dev/null +++ b/third_party/python/gyp/test/ios/gyptest-framework.py @@ -0,0 +1,37 @@ +#!/usr/bin/env python + +# Copyright 2016 Google 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 frameworks are built correctly. +""" + +import TestGyp +import TestMac +import subprocess +import sys + +if sys.platform == 'darwin' and TestMac.Xcode.Version()>="0700": + + test = TestGyp.TestGyp(formats=['ninja']) + if test.format == 'xcode-ninja': + test.skip_test() + + test.run_gyp('framework.gyp', chdir='framework') + + test.build('framework.gyp', 'iOSFramework', chdir='framework') + + test.built_file_must_exist( + 'iOSFramework.framework/Headers/iOSFramework.h', + chdir='framework') + test.built_file_must_exist( + 'iOSFramework.framework/Headers/Thing.h', + chdir='framework') + test.built_file_must_exist( + 'iOSFramework.framework/iOSFramework', + chdir='framework') + + test.pass_test() + diff --git a/third_party/python/gyp/test/ios/gyptest-per-config-settings.py b/third_party/python/gyp/test/ios/gyptest-per-config-settings.py new file mode 100644 index 0000000000..c3a22e0562 --- /dev/null +++ b/third_party/python/gyp/test/ios/gyptest-per-config-settings.py @@ -0,0 +1,190 @@ +#!/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. +""" + +from __future__ import print_function + +import plistlib +import TestGyp +import os +import struct +import subprocess +import sys +import tempfile +import TestMac + +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 GetXcodeVersionValue(type): + args = ['xcodebuild', '-version', '-sdk', 'iphoneos', type] + job = subprocess.Popen(args, stdout=subprocess.PIPE) + return job.communicate()[0].strip() + +def GetMachineBuild(): + args = ['sw_vers', '-buildVersion'] + 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'] + 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.app/Test App Gyp', + chdir='app-bundle') + test.must_exist(result_file) + info_plist = test.built_file_path('Test App Gyp.app/Info.plist', + chdir='app-bundle') + plist = plistlib.readPlist(info_plist) + xcode_version = TestMac.Xcode.Version() + if xcode_version >= '0720': + if len(plist) != 23: + print('plist should have 23 entries, but it has %s' % len(plist)) + test.fail_test() + + # Values that will hopefully never change. + CheckPlistvalue(plist, 'CFBundleDevelopmentRegion', 'English') + CheckPlistvalue(plist, 'CFBundleExecutable', 'Test App Gyp') + CheckPlistvalue(plist, 'CFBundleIdentifier', 'com.google.Test App Gyp') + CheckPlistvalue(plist, 'CFBundleInfoDictionaryVersion', '6.0') + CheckPlistvalue(plist, 'CFBundleName', 'Test App Gyp') + CheckPlistvalue(plist, 'CFBundlePackageType', 'APPL') + CheckPlistvalue(plist, 'CFBundleShortVersionString', '1.0') + CheckPlistvalue(plist, 'CFBundleSignature', 'ause') + CheckPlistvalue(plist, 'CFBundleVersion', '1') + CheckPlistvalue(plist, 'NSMainNibFile', 'MainMenu') + CheckPlistvalue(plist, 'NSPrincipalClass', 'NSApplication') + CheckPlistvalue(plist, 'UIDeviceFamily', [1, 2]) + + # Values that get pulled from xcodebuild. + machine_build = GetMachineBuild() + platform_version = GetXcodeVersionValue('ProductVersion') + sdk_build = GetXcodeVersionValue('ProductBuildVersion') + xcode_build = TestMac.Xcode.Build() + + # Xcode keeps changing what gets included in executable plists, and it + # changes between device and simuator builds. Allow the strictest tests for + # Xcode 7.2 and above. + if xcode_version >= '0720': + CheckPlistvalue(plist, 'BuildMachineOSBuild', machine_build) + CheckPlistvalue(plist, 'DTCompiler', 'com.apple.compilers.llvm.clang.1_0') + CheckPlistvalue(plist, 'DTPlatformVersion', platform_version) + CheckPlistvalue(plist, 'DTSDKBuild', sdk_build) + CheckPlistvalue(plist, 'DTXcode', xcode_version) + CheckPlistvalue(plist, 'DTXcodeBuild', xcode_build) + CheckPlistvalue(plist, 'MinimumOSVersion', '8.0') + + + if configuration == 'Default-iphoneos': + platform_name = 'iphoneos' + CheckFileType(result_file, 'armv7') + CheckPlistvalue(plist, 'CFBundleSupportedPlatforms', ['iPhoneOS']) + # Apple keeps changing their mind. + if xcode_version >= '0720': + CheckPlistvalue(plist, 'DTPlatformBuild', sdk_build) + else: + platform_name = 'iphonesimulator' + CheckFileType(result_file, 'i386') + CheckPlistvalue(plist, 'CFBundleSupportedPlatforms', ['iPhoneSimulator']) + if xcode_version >= '0720': + CheckPlistvalue(plist, 'DTPlatformBuild', '') + + CheckPlistvalue(plist, 'DTPlatformName', platform_name) + CheckPlistvalue(plist, 'DTSDKName', platform_name + platform_version) + + + if HasCerts() and configuration == 'Default-iphoneos': + test.build('test-device.gyp', 'sig_test', chdir='app-bundle') + result_file = test.built_file_path('sigtest.app/sigtest', + chdir='app-bundle') + CheckSignature(result_file) + info_plist = test.built_file_path('sigtest.app/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/third_party/python/gyp/test/ios/gyptest-watch.py b/third_party/python/gyp/test/ios/gyptest-watch.py new file mode 100755 index 0000000000..39bab49bb0 --- /dev/null +++ b/third_party/python/gyp/test/ios/gyptest-watch.py @@ -0,0 +1,44 @@ +#!/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. +""" + +from __future__ import print_function + +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/third_party/python/gyp/test/ios/gyptest-xcode-ninja.py b/third_party/python/gyp/test/ios/gyptest-xcode-ninja.py new file mode 100644 index 0000000000..609db8c98f --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/ios/watch/WatchApp/Images.xcassets/AppIcon.appiconset/Contents.json b/third_party/python/gyp/test/ios/watch/WatchApp/Images.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000000..562c5eff97 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/ios/watch/WatchApp/Images.xcassets/LaunchImage.launchimage/Contents.json b/third_party/python/gyp/test/ios/watch/WatchApp/Images.xcassets/LaunchImage.launchimage/Contents.json new file mode 100644 index 0000000000..ed123feff6 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/ios/watch/WatchApp/Info.plist b/third_party/python/gyp/test/ios/watch/WatchApp/Info.plist new file mode 100644 index 0000000000..3cf65b8285 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/ios/watch/WatchApp/Interface.storyboard b/third_party/python/gyp/test/ios/watch/WatchApp/Interface.storyboard new file mode 100644 index 0000000000..5f52cb6c90 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/ios/watch/WatchContainer/AppDelegate.h b/third_party/python/gyp/test/ios/watch/WatchContainer/AppDelegate.h new file mode 100644 index 0000000000..510e2300b1 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/ios/watch/WatchContainer/AppDelegate.m b/third_party/python/gyp/test/ios/watch/WatchContainer/AppDelegate.m new file mode 100644 index 0000000000..1197bc1bbc --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/ios/watch/WatchContainer/Base.lproj/Main.storyboard b/third_party/python/gyp/test/ios/watch/WatchContainer/Base.lproj/Main.storyboard new file mode 100644 index 0000000000..e8f3cfb40c --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/ios/watch/WatchContainer/Images.xcassets/AppIcon.appiconset/Contents.json b/third_party/python/gyp/test/ios/watch/WatchContainer/Images.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000000..f697f61f4a --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/ios/watch/WatchContainer/Images.xcassets/LaunchImage.launchimage/Contents.json b/third_party/python/gyp/test/ios/watch/WatchContainer/Images.xcassets/LaunchImage.launchimage/Contents.json new file mode 100644 index 0000000000..4458b40c05 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/ios/watch/WatchContainer/Info.plist b/third_party/python/gyp/test/ios/watch/WatchContainer/Info.plist new file mode 100644 index 0000000000..a40319c78e --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/ios/watch/WatchContainer/ViewController.h b/third_party/python/gyp/test/ios/watch/WatchContainer/ViewController.h new file mode 100644 index 0000000000..fad7754714 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/ios/watch/WatchContainer/ViewController.m b/third_party/python/gyp/test/ios/watch/WatchContainer/ViewController.m new file mode 100644 index 0000000000..3810fa9cba --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/ios/watch/WatchContainer/main.m b/third_party/python/gyp/test/ios/watch/WatchContainer/main.m new file mode 100644 index 0000000000..47aecb5148 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/ios/watch/WatchKitExtension/Images.xcassets/MyImage.imageset/Contents.json b/third_party/python/gyp/test/ios/watch/WatchKitExtension/Images.xcassets/MyImage.imageset/Contents.json new file mode 100644 index 0000000000..f80d950868 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/ios/watch/WatchKitExtension/Info.plist b/third_party/python/gyp/test/ios/watch/WatchKitExtension/Info.plist new file mode 100644 index 0000000000..7a354643ef --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/ios/watch/WatchKitExtension/InterfaceController.h b/third_party/python/gyp/test/ios/watch/WatchKitExtension/InterfaceController.h new file mode 100644 index 0000000000..c3395eb484 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/ios/watch/WatchKitExtension/InterfaceController.m b/third_party/python/gyp/test/ios/watch/WatchKitExtension/InterfaceController.m new file mode 100644 index 0000000000..564b7d1da5 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/ios/watch/WatchKitExtension/MainInterface.storyboard b/third_party/python/gyp/test/ios/watch/WatchKitExtension/MainInterface.storyboard new file mode 100644 index 0000000000..5aa58184e8 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/ios/watch/watch.gyp b/third_party/python/gyp/test/ios/watch/watch.gyp new file mode 100644 index 0000000000..49be5554ee --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/ios/xctests/App/AppDelegate.h b/third_party/python/gyp/test/ios/xctests/App/AppDelegate.h new file mode 100644 index 0000000000..f8efce97ed --- /dev/null +++ b/third_party/python/gyp/test/ios/xctests/App/AppDelegate.h @@ -0,0 +1,11 @@ +// Copyright 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. + +#import <UIKit/UIKit.h> + +@interface AppDelegate : UIResponder<UIApplicationDelegate> + +@property(strong, nonatomic) UIWindow* window; + +@end diff --git a/third_party/python/gyp/test/ios/xctests/App/AppDelegate.m b/third_party/python/gyp/test/ios/xctests/App/AppDelegate.m new file mode 100644 index 0000000000..825dda75b7 --- /dev/null +++ b/third_party/python/gyp/test/ios/xctests/App/AppDelegate.m @@ -0,0 +1,18 @@ +// Copyright 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. + +#import "AppDelegate.h" + +@interface AppDelegate () + +@end + +@implementation AppDelegate + +- (BOOL)application:(UIApplication*)application + didFinishLaunchingWithOptions:(NSDictionary*)launchOptions { + return YES; +} + +@end diff --git a/third_party/python/gyp/test/ios/xctests/App/Base.lproj/LaunchScreen.xib b/third_party/python/gyp/test/ios/xctests/App/Base.lproj/LaunchScreen.xib new file mode 100644 index 0000000000..063dc5ea79 --- /dev/null +++ b/third_party/python/gyp/test/ios/xctests/App/Base.lproj/LaunchScreen.xib @@ -0,0 +1,41 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="6214" systemVersion="14A314h" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES"> + <dependencies> + <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="6207"/> + <capability name="Constraints with non-1.0 multipliers" minToolsVersion="5.1"/> + </dependencies> + <objects> + <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/> + <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/> + <view contentMode="scaleToFill" id="iN0-l3-epB"> + <rect key="frame" x="0.0" y="0.0" width="480" height="480"/> + <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> + <subviews> + <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text=" Copyright (c) 2014 Google. All rights reserved." textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumFontSize="9" translatesAutoresizingMaskIntoConstraints="NO" id="8ie-xW-0ye"> + <rect key="frame" x="20" y="439" width="441" height="21"/> + <fontDescription key="fontDescription" type="system" pointSize="17"/> + <color key="textColor" cocoaTouchSystemColor="darkTextColor"/> + <nil key="highlightedColor"/> + </label> + <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="App" textAlignment="center" lineBreakMode="middleTruncation" baselineAdjustment="alignBaselines" minimumFontSize="18" translatesAutoresizingMaskIntoConstraints="NO" id="kId-c2-rCX"> + <rect key="frame" x="20" y="140" width="441" height="43"/> + <fontDescription key="fontDescription" type="boldSystem" pointSize="36"/> + <color key="textColor" cocoaTouchSystemColor="darkTextColor"/> + <nil key="highlightedColor"/> + </label> + </subviews> + <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/> + <constraints> + <constraint firstItem="kId-c2-rCX" firstAttribute="centerY" secondItem="iN0-l3-epB" secondAttribute="bottom" multiplier="1/3" constant="1" id="5cJ-9S-tgC"/> + <constraint firstAttribute="centerX" secondItem="kId-c2-rCX" secondAttribute="centerX" id="Koa-jz-hwk"/> + <constraint firstAttribute="bottom" secondItem="8ie-xW-0ye" secondAttribute="bottom" constant="20" id="Kzo-t9-V3l"/> + <constraint firstItem="8ie-xW-0ye" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" constant="20" symbolic="YES" id="MfP-vx-nX0"/> + <constraint firstAttribute="centerX" secondItem="8ie-xW-0ye" secondAttribute="centerX" id="ZEH-qu-HZ9"/> + <constraint firstItem="kId-c2-rCX" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" constant="20" symbolic="YES" id="fvb-Df-36g"/> + </constraints> + <nil key="simulatedStatusBarMetrics"/> + <freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/> + <point key="canvasLocation" x="548" y="455"/> + </view> + </objects> +</document> diff --git a/third_party/python/gyp/test/ios/xctests/App/Base.lproj/Main.storyboard b/third_party/python/gyp/test/ios/xctests/App/Base.lproj/Main.storyboard new file mode 100644 index 0000000000..f56d2f3bb5 --- /dev/null +++ b/third_party/python/gyp/test/ios/xctests/App/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="6211" systemVersion="14A298i" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" initialViewController="BYZ-38-t0r"> + <dependencies> + <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="6204"/> + </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="600" height="600"/> + <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/third_party/python/gyp/test/ios/xctests/App/Images.xcassets/AppIcon.appiconset/Contents.json b/third_party/python/gyp/test/ios/xctests/App/Images.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000000..36d2c80d88 --- /dev/null +++ b/third_party/python/gyp/test/ios/xctests/App/Images.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,68 @@ +{ + "images" : [ + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "60x60", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "60x60", + "scale" : "3x" + }, + { + "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" + } +}
\ No newline at end of file diff --git a/third_party/python/gyp/test/ios/xctests/App/Info.plist b/third_party/python/gyp/test/ios/xctests/App/Info.plist new file mode 100644 index 0000000000..3f938f60f4 --- /dev/null +++ b/third_party/python/gyp/test/ios/xctests/App/Info.plist @@ -0,0 +1,47 @@ +<?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>${EXECUTABLE_NAME}</string> + <key>CFBundleIdentifier</key> + <string>com.google.gyptest.App</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>UILaunchStoryboardName</key> + <string>LaunchScreen</string> + <key>UIMainStoryboardFile</key> + <string>Main</string> + <key>UIRequiredDeviceCapabilities</key> + <array> + <string>armv7</string> + </array> + <key>UISupportedInterfaceOrientations</key> + <array> + <string>UIInterfaceOrientationPortrait</string> + <string>UIInterfaceOrientationLandscapeLeft</string> + <string>UIInterfaceOrientationLandscapeRight</string> + </array> + <key>UISupportedInterfaceOrientations~ipad</key> + <array> + <string>UIInterfaceOrientationPortrait</string> + <string>UIInterfaceOrientationPortraitUpsideDown</string> + <string>UIInterfaceOrientationLandscapeLeft</string> + <string>UIInterfaceOrientationLandscapeRight</string> + </array> +</dict> +</plist> diff --git a/third_party/python/gyp/test/ios/xctests/App/ViewController.h b/third_party/python/gyp/test/ios/xctests/App/ViewController.h new file mode 100644 index 0000000000..95a281e8d8 --- /dev/null +++ b/third_party/python/gyp/test/ios/xctests/App/ViewController.h @@ -0,0 +1,9 @@ +// Copyright 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. + +#import <UIKit/UIKit.h> + +@interface ViewController : UIViewController + +@end diff --git a/third_party/python/gyp/test/ios/xctests/App/ViewController.m b/third_party/python/gyp/test/ios/xctests/App/ViewController.m new file mode 100644 index 0000000000..d38e3c5bb7 --- /dev/null +++ b/third_party/python/gyp/test/ios/xctests/App/ViewController.m @@ -0,0 +1,21 @@ +// Copyright 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. + +#import "ViewController.h" + +@interface ViewController () + +@end + +@implementation ViewController + +- (void)viewDidLoad { + [super viewDidLoad]; +} + +- (void)didReceiveMemoryWarning { + [super didReceiveMemoryWarning]; +} + +@end diff --git a/third_party/python/gyp/test/ios/xctests/App/main.m b/third_party/python/gyp/test/ios/xctests/App/main.m new file mode 100644 index 0000000000..83368075cd --- /dev/null +++ b/third_party/python/gyp/test/ios/xctests/App/main.m @@ -0,0 +1,13 @@ +// Copyright 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. + +#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/third_party/python/gyp/test/ios/xctests/AppTests/AppTests.m b/third_party/python/gyp/test/ios/xctests/AppTests/AppTests.m new file mode 100644 index 0000000000..22121b089d --- /dev/null +++ b/third_party/python/gyp/test/ios/xctests/AppTests/AppTests.m @@ -0,0 +1,31 @@ +// Copyright 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. + +#import <UIKit/UIKit.h> +#import <XCTest/XCTest.h> + +@interface AppTests : XCTestCase + +@end + +@implementation AppTests + +- (void)setUp { + [super setUp]; +} + +- (void)tearDown { + [super tearDown]; +} + +- (void)testExample { + XCTAssert(YES, @"Pass"); +} + +- (void)testPerformanceExample { + [self measureBlock:^{ + }]; +} + +@end diff --git a/third_party/python/gyp/test/ios/xctests/AppTests/Info.plist b/third_party/python/gyp/test/ios/xctests/AppTests/Info.plist new file mode 100644 index 0000000000..d43ff4ba8d --- /dev/null +++ b/third_party/python/gyp/test/ios/xctests/AppTests/Info.plist @@ -0,0 +1,24 @@ +<?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>${EXECUTABLE_NAME}</string> + <key>CFBundleIdentifier</key> + <string>com.google.gyptest.AppTests</string> + <key>CFBundleInfoDictionaryVersion</key> + <string>6.0</string> + <key>CFBundleName</key> + <string>${PRODUCT_NAME}</string> + <key>CFBundlePackageType</key> + <string>BNDL</string> + <key>CFBundleShortVersionString</key> + <string>1.0</string> + <key>CFBundleSignature</key> + <string>????</string> + <key>CFBundleVersion</key> + <string>1</string> +</dict> +</plist> diff --git a/third_party/python/gyp/test/ios/xctests/gyptest-xctests.py b/third_party/python/gyp/test/ios/xctests/gyptest-xctests.py new file mode 100644 index 0000000000..6642cfb938 --- /dev/null +++ b/third_party/python/gyp/test/ios/xctests/gyptest-xctests.py @@ -0,0 +1,49 @@ +#!/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 iOS XCTests can be built correctly. +""" + +import TestGyp + +import os +import subprocess +import sys + +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() + +if sys.platform == "darwin": + # This test appears to be flaky and hangs some of the time. + sys.exit(2) # bug=531 + + test = TestGyp.TestGyp(formats=['xcode', 'ninja']) + test.run_gyp('xctests.gyp') + test_configs = ['Default'] + # TODO(crbug.com/557418): Enable this once xcodebuild works for iOS devices. + #if HasCerts() and test.format == 'xcode': + # test_configs.append('Default-iphoneos') + for config in test_configs: + test.set_configuration(config) + test.build('xctests.gyp', test.ALL) + test.built_file_must_exist('app_under_test.app/app_under_test') + test.built_file_must_exist('app_tests.xctest/app_tests') + if 'ninja' in test.format: + test.built_file_must_exist('obj/AppTests/app_tests.AppTests.i386.o') + test.built_file_must_exist('obj/AppTests/app_tests.AppTests.x86_64.o') + elif test.format == 'xcode': + xcode_object_path = os.path.join('..', 'xctests.build', + 'Default-iphonesimulator', + 'app_tests.build', 'Objects-normal', + '%s', 'AppTests.o') + test.built_file_must_exist(xcode_object_path % 'i386') + test.built_file_must_exist(xcode_object_path % 'x86_64') + test.pass_test() diff --git a/third_party/python/gyp/test/ios/xctests/xctests.gyp b/third_party/python/gyp/test/ios/xctests/xctests.gyp new file mode 100644 index 0000000000..8d4d6393b7 --- /dev/null +++ b/third_party/python/gyp/test/ios/xctests/xctests.gyp @@ -0,0 +1,74 @@ +# Copyright 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. +{ + 'conditions': [ + ['"<(GENERATOR)"=="ninja"', { + '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': 'iphonesimulator', # -isysroot + 'CONFIGURATION_BUILD_DIR':'build/Default', + 'IPHONEOS_DEPLOYMENT_TARGET': '9.0', + 'CODE_SIGN_IDENTITY[sdk=iphoneos*]': 'iPhone Developer', + } + }, + 'targets': [ + { + 'target_name': 'app_under_test', + 'type': 'executable', + 'mac_bundle': 1, + 'mac_bundle_resources': [ + 'App/Base.lproj/LaunchScreen.xib', + 'App/Base.lproj/Main.storyboard', + ], + 'sources': [ + 'App/AppDelegate.h', + 'App/AppDelegate.m', + 'App/ViewController.h', + 'App/ViewController.m', + 'App/main.m', + ], + 'link_settings': { + 'libraries': [ + '$(SDKROOT)/System/Library/Frameworks/Foundation.framework', + '$(SDKROOT)/System/Library/Frameworks/UIKit.framework', + ], + }, + 'xcode_settings': { + 'INFOPLIST_FILE': 'App/Info.plist', + }, + }, + { + 'target_name': 'app_tests', + 'type': 'loadable_module', + 'mac_xctest_bundle': 1, + 'sources': [ + 'AppTests/AppTests.m', + ], + 'dependencies': [ + 'app_under_test' + ], + 'link_settings': { + 'libraries': [ + '$(SDKROOT)/System/Library/Frameworks/Foundation.framework', + ], + }, + 'xcode_settings': { + 'WRAPPER_EXTENSION': 'xctest', + 'INFOPLIST_FILE': 'AppTests/Info.plist', + 'BUNDLE_LOADER': '$(BUILT_PRODUCTS_DIR)/app_under_test.app/app_under_test', + 'TEST_HOST': '$(BUNDLE_LOADER)', + }, + }, + ], +} diff --git a/third_party/python/gyp/test/lib/README.txt b/third_party/python/gyp/test/lib/README.txt new file mode 100644 index 0000000000..b3d724574e --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/lib/TestCmd.py b/third_party/python/gyp/test/lib/TestCmd.py new file mode 100644 index 0000000000..1ec50933a4 --- /dev/null +++ b/third_party/python/gyp/test/lib/TestCmd.py @@ -0,0 +1,1597 @@ +# Copyright (c) 2018 Google Inc. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +""" +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. + +from __future__ import print_function + +__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 sys +import tempfile +import time +import traceback +try: + from UserList import UserList +except ImportError: + from collections 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 list) or isinstance(e, UserList) + +try: + from UserString import UserString +except ImportError: + try: + from collections import UserString + except ImportError: + class UserString: + pass + +try: + # basestring was removed in python3. + basestring +except NameError: + basestring = str + +def is_String(e): + return isinstance(e, basestring) 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 + for test in reversed(_Cleanup): + if test: + test.cleanup() + del _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 range(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 = lines.split("\n") + if not is_List(matches): + matches = matches.split("\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 = lines.split("\n") + if not is_List(res): + res = res.split("\n") + if len(lines) != len(res): + return + for i in range(len(lines)): + s = "^" + res[i] + "$" + try: + expr = re.compile(s) + except re.error as 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 = "\n".join(lines) + if not type(res) is type(""): + res = "\n".join(res) + s = "^" + res + "$" + try: + expr = re.compile(s, re.DOTALL) + except re.error as 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 as 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 = path.split(os.pathsep) + if pathext is None: + pathext = os.environ['PATHEXT'] + if is_String(pathext): + pathext = pathext.split(os.pathsep) + for ext in pathext: + if ext.lower() == file[-len(ext):].lower(): + 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 = path.split(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]) & 0o111: + 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': + popen2.Popen4.__init__(self, command, 1) + else: + popen2.Popen3.__init__(self, command, 1) + self.stdin = self.tochild + self.stdout = self.fromchild + self.stderr = self.childerr + def wait(self, *args, **kw): + resultcode = 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 sys.platform == 'win32': + 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 sys.platform == 'win32': + 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) as 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) as 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 as 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) + +def send_all(p, data): + data = memoryview(data) + while len(data): + sent = p.send(data) + if sent is None: + raise Exception(disconnect_message) + data = data[sent:] + + + +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 'PRESERVE' in os.environ and os.environ['PRESERVE'] is not '': + 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 = arg.replace(slash, slash+slash) + for c in special: + arg = arg.replace(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 = os.path.join(*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 = arguments.split() + 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 = 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 = 'r'): + """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 + 'r' (string 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 = ' '.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 = os.path.join(*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 = drive.upper() + 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 = os.path.join(*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 os.path.join(self.workdir, *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.walk() is top-down, we'll enable + # read permission on any directories that have it disabled + # before os.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.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.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.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]|0o200)) + else: + def do_chmod(fname): + try: st = os.stat(fname) + except OSError: pass + else: os.chmod(fname, stat.S_IMODE(st[stat.ST_MODE]&~0o200)) + + if os.path.isfile(top): + do_chmod(top) + else: + col = Collector(top) + os.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.walk() is top-down, we'll enable + # execute permission on any directories that have it disabled + # before os.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.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.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.walk(top, col, None) + col.entries.reverse() + for d in col.entries: do_chmod(d) + + def write(self, file, content, mode = 'w'): + """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 'w' (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/third_party/python/gyp/test/lib/TestCommon.py b/third_party/python/gyp/test/lib/TestCommon.py new file mode 100644 index 0000000000..6850ce9ada --- /dev/null +++ b/third_party/python/gyp/test/lib/TestCommon.py @@ -0,0 +1,591 @@ +# Copyright (c) 2017 Google Inc. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +""" +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. + +from __future__ import print_function + +__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 sys +try: + from UserList import UserList +except ImportError: + from collections 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 sys.platform.find('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 sys.platform.find('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 sys.platform.find('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 list \ + or isinstance(e, 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. + """ + 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: os.path.join(*x) if is_List(x) else x), files) + existing, missing = separate_files(files) + unwritable = [x for x in existing if not is_writable(x)] + if missing: + print("Missing files: `%s'" % "', `".join(missing)) + if unwritable: + print("Unwritable files: `%s'" % "', `".join(unwritable)) + self.fail_test(missing + unwritable) + + def must_contain(self, file, required, mode = 'r'): + """Ensures that the specified file contains the required text. + """ + file_contents = self.read(file, mode) + contains = (file_contents.find(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: o.find(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: o.find(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: os.path.join(*x) if is_List(x) else x), files) + missing = [f for f in files if not os.path.exists(f)] + if missing: + print("Missing files: `%s'" % "', `".join(missing)) + self.fail_test(missing) + + def must_match(self, file, expect, mode = 'r'): + """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 = 'r'): + """Ensures that the specified file doesn't contain the banned text. + """ + file_contents = self.read(file, mode) + contains = (file_contents.find(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: o.find(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: os.path.join(*x) if is_List(x) else x), files) + existing = [f for f in files if os.path.exists(f)] + if existing: + print("Unexpected files exist: `%s'" % "', `".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: os.path.join(*x) if is_List(x) else x), files) + existing, missing = separate_files(files) + writable = [x for x in existing if is_writable(x)] + if missing: + print("Missing files: `%s'" % "', `".join(missing)) + if writable: + print("Writable files: `%s'" % "', `".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 TestCmd.start(self, program, interpreter, arguments, + universal_newlines, **kw) + except KeyboardInterrupt: + raise + except Exception as 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. + """ + 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) + 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/third_party/python/gyp/test/lib/TestGyp.py b/third_party/python/gyp/test/lib/TestGyp.py new file mode 100644 index 0000000000..cba2d3ccbc --- /dev/null +++ b/third_party/python/gyp/test/lib/TestGyp.py @@ -0,0 +1,1259 @@ +# Copyright (c) 2012 Google 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. +""" +from __future__ import print_function + +import collections +import errno +import itertools +import os +import re +import shutil +import subprocess +import sys +import tempfile + +from contextlib import contextmanager + +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) + + # The gyp tests are run with HOME pointing to |dest_dir| to provide an + # hermetic environment. Symlink login.keychain and the 'Provisioning + # Profiles' folder to allow codesign to access to the data required for + # signing binaries. + if sys.platform == 'darwin': + old_keychain = GetDefaultKeychainPath() + old_provisioning_profiles = os.path.join( + os.environ['HOME'], 'Library', 'MobileDevice', + 'Provisioning Profiles') + + new_keychain = os.path.join(dest_dir, 'Library', 'Keychains') + MakeDirs(new_keychain) + os.symlink(old_keychain, os.path.join(new_keychain, 'login.keychain')) + + if os.path.exists(old_provisioning_profiles): + new_provisioning_profiles = os.path.join( + dest_dir, 'Library', 'MobileDevice') + MakeDirs(new_provisioning_profiles) + os.symlink(old_provisioning_profiles, + os.path.join(new_provisioning_profiles, 'Provisioning Profiles')) + + 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', '.*') + if self is TestGypXcodeNinja: + 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 'SYMROOT' in kw: + 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 MakeDirs(new_dir): + """A wrapper around os.makedirs() that emulates "mkdir -p".""" + try: + os.makedirs(new_dir) + except OSError as e: + if e.errno != errno.EEXIST: + raise + +def GetDefaultKeychainPath(): + """Get the keychain path, for used before updating HOME.""" + assert sys.platform == 'darwin' + # Format is: + # $ security default-keychain + # "/Some/Path/To/default.keychain" + path = subprocess.check_output(['security', 'default-keychain']).decode( + 'utf-8', 'ignore').strip() + return path[1:-1] + +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. + """ + override_build_tool = os.environ.get('GYP_BUILD_TOOL') + if override_build_tool: + return override_build_tool, True, override_build_tool + + possible_roots = ['%s:\\Program Files%s' % (chr(drive), suffix) + for drive in range(ord('C'), ord('Z') + 1) + for suffix in ['', ' (x86)']] + possible_paths = { + '2017': r'Microsoft Visual Studio\2017', + '2015': r'Microsoft Visual Studio 14.0\Common7\IDE\devenv.com', + '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 ['2017', 'auto']: + msbuild_exes = [] + try: + path = possible_paths['2017'] + for r in possible_roots: + build_tool = os.path.join(r, path) + if os.path.exists(build_tool): + break; + else: + build_tool = None + if not build_tool: + args1 = ['reg', 'query', + 'HKLM\Software\Microsoft\VisualStudio\SxS\VS7', + '/v', '15.0', '/reg:32'] + build_tool = subprocess.check_output(args1).decode( + 'utf-8', 'ignore').strip().split(b'\r\n').pop().split(b' ').pop() + build_tool = build_tool.decode('utf-8') + if build_tool: + args2 = ['cmd.exe', '/d', '/c', + 'cd', '/d', build_tool, + '&', 'dir', '/b', '/s', 'msbuild.exe'] + msbuild_exes = subprocess.check_output(args2).strip().split(b'\r\n') + msbuild_exes = [m.decode('utf-8') for m in msbuild_exes] + if len(msbuild_exes): + msbuild_Path = os.path.join(build_tool, msbuild_exes[0]) + if os.path.exists(msbuild_Path): + os.environ['GYP_MSVS_VERSION'] = '2017' + os.environ['GYP_BUILD_TOOL'] = msbuild_Path + return msbuild_Path, True, msbuild_Path + except Exception as e: + pass + + 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] + + # Check for location of Community install (in VS2017, at least). + vcvars_path = os.path.join(devenv_path, '..', '..', '..', '..', 'VC', + 'Auxiliary', 'Build', 'vcvars32.bat') + if os.path.exists(vcvars_path): + return os.path.abspath(vcvars_path) + + vsvars_path = os.path.join(devenv_path, '..', '..', 'Tools', + 'vsvars32.bat') + return os.path.abspath(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].decode('utf-8', 'ignore') + 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. + """ + if '15.0' in self.build_tool: + configuration = '/p:Configuration=' + ( + self.configuration or self.configuration_buildname()) + build = '/t' + if target not in (None, self.ALL, self.DEFAULT): + build += ':' + target + if clean: + build += ':Clean' + elif rebuild: + build += ':Rebuild' + elif ':' not in build: + build += ':Build' + arguments = kw.get('arguments', [])[:] + arguments.extend([gyp_file.replace('.gyp', '.sln'), + build, configuration]) + else: + 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): + r""" + 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 and + 'Beginning test session' not in a and + 'Writing diagnostic log' not in a and + 'Logs/Test/' 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/third_party/python/gyp/test/lib/TestMac.py b/third_party/python/gyp/test/lib/TestMac.py new file mode 100644 index 0000000000..d13afd5781 --- /dev/null +++ b/third_party/python/gyp/test/lib/TestMac.py @@ -0,0 +1,76 @@ +# 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. +""" + +from __future__ import print_function + +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].decode('utf-8').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].decode('utf-8').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'].decode('utf-8') + 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/third_party/python/gyp/test/lib/TestWin.py b/third_party/python/gyp/test/lib/TestWin.py new file mode 100644 index 0000000000..ef676db121 --- /dev/null +++ b/third_party/python/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].decode('utf-8', 'ignore') + # 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 as 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/third_party/python/gyp/test/library/gyptest-shared-obj-install-path.py b/third_party/python/gyp/test/library/gyptest-shared-obj-install-path.py new file mode 100755 index 0000000000..af335365f9 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/library/gyptest-shared.py b/third_party/python/gyp/test/library/gyptest-shared.py new file mode 100755 index 0000000000..a1d2985d91 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/library/gyptest-static.py b/third_party/python/gyp/test/library/gyptest-static.py new file mode 100755 index 0000000000..4bc71c4962 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/library/src/lib1.c b/third_party/python/gyp/test/library/src/lib1.c new file mode 100644 index 0000000000..3866b1b845 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/library/src/lib1_moveable.c b/third_party/python/gyp/test/library/src/lib1_moveable.c new file mode 100644 index 0000000000..5d3cc1d9aa --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/library/src/lib2.c b/third_party/python/gyp/test/library/src/lib2.c new file mode 100644 index 0000000000..21dda72653 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/library/src/lib2_moveable.c b/third_party/python/gyp/test/library/src/lib2_moveable.c new file mode 100644 index 0000000000..f645071d1e --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/library/src/library.gyp b/third_party/python/gyp/test/library/src/library.gyp new file mode 100644 index 0000000000..bc35516426 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/library/src/program.c b/third_party/python/gyp/test/library/src/program.c new file mode 100644 index 0000000000..d460f60e40 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/library/src/shared_dependency.gyp b/third_party/python/gyp/test/library/src/shared_dependency.gyp new file mode 100644 index 0000000000..7d29f5de59 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/library_dirs/gyptest-library-dirs.py b/third_party/python/gyp/test/library_dirs/gyptest-library-dirs.py new file mode 100644 index 0000000000..e725dd1176 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/library_dirs/subdir/README.txt b/third_party/python/gyp/test/library_dirs/subdir/README.txt new file mode 100644 index 0000000000..4031ded85f --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/library_dirs/subdir/hello.cc b/third_party/python/gyp/test/library_dirs/subdir/hello.cc new file mode 100644 index 0000000000..5dbbd48d34 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/library_dirs/subdir/mylib.cc b/third_party/python/gyp/test/library_dirs/subdir/mylib.cc new file mode 100644 index 0000000000..654f3d0e6c --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/library_dirs/subdir/mylib.h b/third_party/python/gyp/test/library_dirs/subdir/mylib.h new file mode 100644 index 0000000000..84b4022e7b --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/library_dirs/subdir/test-win.gyp b/third_party/python/gyp/test/library_dirs/subdir/test-win.gyp new file mode 100644 index 0000000000..033b6f7fdd --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/library_dirs/subdir/test.gyp b/third_party/python/gyp/test/library_dirs/subdir/test.gyp new file mode 100644 index 0000000000..f83d7f2bf1 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/link-dependency/gyptest-link-dependency.py b/third_party/python/gyp/test/link-dependency/gyptest-link-dependency.py new file mode 100755 index 0000000000..3a8300d44e --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/link-dependency/main.c b/third_party/python/gyp/test/link-dependency/main.c new file mode 100644 index 0000000000..543d8b6951 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/link-dependency/mymalloc.c b/third_party/python/gyp/test/link-dependency/mymalloc.c new file mode 100644 index 0000000000..f80bc02a62 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/link-dependency/test.gyp b/third_party/python/gyp/test/link-dependency/test.gyp new file mode 100644 index 0000000000..47cec15005 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/link-objects/base.c b/third_party/python/gyp/test/link-objects/base.c new file mode 100644 index 0000000000..3327459205 --- /dev/null +++ b/third_party/python/gyp/test/link-objects/base.c @@ -0,0 +1,6 @@ +void extra(); + +int main(void) { + extra(); + return 0; +} diff --git a/third_party/python/gyp/test/link-objects/extra.c b/third_party/python/gyp/test/link-objects/extra.c new file mode 100644 index 0000000000..1d7ee09b10 --- /dev/null +++ b/third_party/python/gyp/test/link-objects/extra.c @@ -0,0 +1,5 @@ +#include <stdio.h> + +void extra() { + printf("PASS\n"); +} diff --git a/third_party/python/gyp/test/link-objects/gyptest-all.py b/third_party/python/gyp/test/link-objects/gyptest-all.py new file mode 100755 index 0000000000..45bd6e1891 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/link-objects/link-objects.gyp b/third_party/python/gyp/test/link-objects/link-objects.gyp new file mode 100644 index 0000000000..ab72855531 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/linux/gyptest-implicit-rpath.py b/third_party/python/gyp/test/linux/gyptest-implicit-rpath.py new file mode 100644 index 0000000000..8e17a3f16d --- /dev/null +++ b/third_party/python/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].decode('utf-8') + 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/third_party/python/gyp/test/linux/gyptest-ldflags-duplicates.py b/third_party/python/gyp/test/linux/gyptest-ldflags-duplicates.py new file mode 100644 index 0000000000..43a4607adf --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/linux/gyptest-ldflags-from-environment.py b/third_party/python/gyp/test/linux/gyptest-ldflags-from-environment.py new file mode 100644 index 0000000000..4aea193e4b --- /dev/null +++ b/third_party/python/gyp/test/linux/gyptest-ldflags-from-environment.py @@ -0,0 +1,45 @@ +#!/usr/bin/env python + +# Copyright (c) 2017 Google 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 linker flags in environment variables. + +In this test, gyp and build both run in same local environment. +""" + +import TestGyp + +import re +import subprocess +import sys + +FORMATS = ('make', 'ninja') + +if sys.platform.startswith('linux'): + test = TestGyp.TestGyp(formats=FORMATS) + + CHDIR = 'ldflags-from-environment' + with TestGyp.LocalEnv({'LDFLAGS': '-Wl,--dynamic-linker=/target', + 'LDFLAGS_host': '-Wl,--dynamic-linker=/host', + 'GYP_CROSSCOMPILE': '1'}): + test.run_gyp('test.gyp', chdir=CHDIR) + test.build('test.gyp', chdir=CHDIR) + + def GetDynamicLinker(p): + p = test.built_file_path(p, chdir=CHDIR) + r = re.compile(r'\[Requesting program interpreter: ([^\]]+)\]') + proc = subprocess.Popen(['readelf', '-l', p], stdout=subprocess.PIPE) + o = proc.communicate()[0].decode('utf-8') + assert not proc.returncode + return r.search(o).group(1) + + if GetDynamicLinker('ldflags') != '/target': + test.fail_test() + + if GetDynamicLinker('ldflags_host') != '/host': + test.fail_test() + + test.pass_test() diff --git a/third_party/python/gyp/test/linux/gyptest-target-rpath.py b/third_party/python/gyp/test/linux/gyptest-target-rpath.py new file mode 100644 index 0000000000..f275caaece --- /dev/null +++ b/third_party/python/gyp/test/linux/gyptest-target-rpath.py @@ -0,0 +1,43 @@ +#!/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. + +""" +Check target_rpath generator flag for ninja. +""" + +import TestGyp + +import re +import subprocess +import sys + +if sys.platform.startswith('linux'): + test = TestGyp.TestGyp(formats=['ninja']) + + CHDIR = 'target-rpath' + test.run_gyp('test.gyp', '-G', 'target_rpath=/usr/lib/gyptest/', 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].decode('utf-8') + assert not proc.returncode + return r.findall(o) + + expect = '/usr/lib/gyptest/' + + 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/third_party/python/gyp/test/linux/implicit-rpath/file.c b/third_party/python/gyp/test/linux/implicit-rpath/file.c new file mode 100644 index 0000000000..56757a701b --- /dev/null +++ b/third_party/python/gyp/test/linux/implicit-rpath/file.c @@ -0,0 +1 @@ +void f() {} diff --git a/third_party/python/gyp/test/linux/implicit-rpath/main.c b/third_party/python/gyp/test/linux/implicit-rpath/main.c new file mode 100644 index 0000000000..237c8ce181 --- /dev/null +++ b/third_party/python/gyp/test/linux/implicit-rpath/main.c @@ -0,0 +1 @@ +int main() {} diff --git a/third_party/python/gyp/test/linux/implicit-rpath/test.gyp b/third_party/python/gyp/test/linux/implicit-rpath/test.gyp new file mode 100644 index 0000000000..b546106986 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/linux/ldflags-duplicates/check-ldflags.py b/third_party/python/gyp/test/linux/ldflags-duplicates/check-ldflags.py new file mode 100755 index 0000000000..ef1029529d --- /dev/null +++ b/third_party/python/gyp/test/linux/ldflags-duplicates/check-ldflags.py @@ -0,0 +1,28 @@ +#!/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. +""" + +from __future__ import print_function + +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/third_party/python/gyp/test/linux/ldflags-duplicates/lib1.c b/third_party/python/gyp/test/linux/ldflags-duplicates/lib1.c new file mode 100644 index 0000000000..a1322e7395 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/linux/ldflags-duplicates/lib2.c b/third_party/python/gyp/test/linux/ldflags-duplicates/lib2.c new file mode 100644 index 0000000000..8e7a082820 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/linux/ldflags-duplicates/main.c b/third_party/python/gyp/test/linux/ldflags-duplicates/main.c new file mode 100644 index 0000000000..b3039ace96 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/linux/ldflags-duplicates/test.gyp b/third_party/python/gyp/test/linux/ldflags-duplicates/test.gyp new file mode 100644 index 0000000000..c36835b18f --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/linux/ldflags-from-environment/main.c b/third_party/python/gyp/test/linux/ldflags-from-environment/main.c new file mode 100644 index 0000000000..1b8742a107 --- /dev/null +++ b/third_party/python/gyp/test/linux/ldflags-from-environment/main.c @@ -0,0 +1,7 @@ +// Copyright (c) 2017 Google 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/third_party/python/gyp/test/linux/ldflags-from-environment/test.gyp b/third_party/python/gyp/test/linux/ldflags-from-environment/test.gyp new file mode 100644 index 0000000000..7ed1d07ed5 --- /dev/null +++ b/third_party/python/gyp/test/linux/ldflags-from-environment/test.gyp @@ -0,0 +1,23 @@ +# Copyright (c) 2017 Google Inc. All rights 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', + 'type': 'executable', + 'sources': [ + 'main.c', + ], + }, + { + 'target_name': 'ldflags_host', + 'toolsets': ['host'], + 'type': 'executable', + 'sources': [ + 'main.c', + ], + }, + ], +} diff --git a/third_party/python/gyp/test/linux/target-rpath/file.c b/third_party/python/gyp/test/linux/target-rpath/file.c new file mode 100644 index 0000000000..56757a701b --- /dev/null +++ b/third_party/python/gyp/test/linux/target-rpath/file.c @@ -0,0 +1 @@ +void f() {} diff --git a/third_party/python/gyp/test/linux/target-rpath/main.c b/third_party/python/gyp/test/linux/target-rpath/main.c new file mode 100644 index 0000000000..237c8ce181 --- /dev/null +++ b/third_party/python/gyp/test/linux/target-rpath/main.c @@ -0,0 +1 @@ +int main() {} diff --git a/third_party/python/gyp/test/linux/target-rpath/test.gyp b/third_party/python/gyp/test/linux/target-rpath/test.gyp new file mode 100644 index 0000000000..b546106986 --- /dev/null +++ b/third_party/python/gyp/test/linux/target-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/third_party/python/gyp/test/mac/action-envvars/action/action.gyp b/third_party/python/gyp/test/mac/action-envvars/action/action.gyp new file mode 100644 index 0000000000..d9d65745ca --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/action-envvars/action/action.sh b/third_party/python/gyp/test/mac/action-envvars/action/action.sh new file mode 100755 index 0000000000..48d5f6bf86 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/app-bundle/TestApp/English.lproj/InfoPlist-error.strings b/third_party/python/gyp/test/mac/app-bundle/TestApp/English.lproj/InfoPlist-error.strings new file mode 100644 index 0000000000..452e7fabf9 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/app-bundle/TestApp/English.lproj/InfoPlist.strings b/third_party/python/gyp/test/mac/app-bundle/TestApp/English.lproj/InfoPlist.strings new file mode 100644 index 0000000000..35bd33a96e --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/app-bundle/TestApp/English.lproj/MainMenu.xib b/third_party/python/gyp/test/mac/app-bundle/TestApp/English.lproj/MainMenu.xib new file mode 100644 index 0000000000..4524596787 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/app-bundle/TestApp/English.lproj/utf-16be.strings b/third_party/python/gyp/test/mac/app-bundle/TestApp/English.lproj/utf-16be.strings Binary files differnew file mode 100644 index 0000000000..580783735f --- /dev/null +++ b/third_party/python/gyp/test/mac/app-bundle/TestApp/English.lproj/utf-16be.strings diff --git a/third_party/python/gyp/test/mac/app-bundle/TestApp/English.lproj/utf-16le.strings b/third_party/python/gyp/test/mac/app-bundle/TestApp/English.lproj/utf-16le.strings Binary files differnew file mode 100644 index 0000000000..eeb383784c --- /dev/null +++ b/third_party/python/gyp/test/mac/app-bundle/TestApp/English.lproj/utf-16le.strings diff --git a/third_party/python/gyp/test/mac/app-bundle/TestApp/Images.xcassets/AppIcon.appiconset/Contents.json b/third_party/python/gyp/test/mac/app-bundle/TestApp/Images.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000000..2db2b1c7c6 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/app-bundle/TestApp/Images.xcassets/image.imageset/Contents.json b/third_party/python/gyp/test/mac/app-bundle/TestApp/Images.xcassets/image.imageset/Contents.json new file mode 100644 index 0000000000..0a87b6edc6 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/app-bundle/TestApp/Images.xcassets/image.imageset/super_sylvain.png b/third_party/python/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/third_party/python/gyp/test/mac/app-bundle/TestApp/Images.xcassets/image.imageset/super_sylvain.png diff --git a/third_party/python/gyp/test/mac/app-bundle/TestApp/Images.xcassets/image.imageset/super_sylvain@2x.png b/third_party/python/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/third_party/python/gyp/test/mac/app-bundle/TestApp/Images.xcassets/image.imageset/super_sylvain@2x.png diff --git a/third_party/python/gyp/test/mac/app-bundle/TestApp/Images.xcassets/image.imageset/super_sylvain@3x.png b/third_party/python/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/third_party/python/gyp/test/mac/app-bundle/TestApp/Images.xcassets/image.imageset/super_sylvain@3x.png diff --git a/third_party/python/gyp/test/mac/app-bundle/TestApp/TestApp-Info.plist b/third_party/python/gyp/test/mac/app-bundle/TestApp/TestApp-Info.plist new file mode 100644 index 0000000000..e005852f9f --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/app-bundle/TestApp/TestAppAppDelegate.h b/third_party/python/gyp/test/mac/app-bundle/TestApp/TestAppAppDelegate.h new file mode 100644 index 0000000000..518645eae9 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/app-bundle/TestApp/TestAppAppDelegate.m b/third_party/python/gyp/test/mac/app-bundle/TestApp/TestAppAppDelegate.m new file mode 100644 index 0000000000..9aafa42000 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/app-bundle/TestApp/main.m b/third_party/python/gyp/test/mac/app-bundle/TestApp/main.m new file mode 100644 index 0000000000..df6a12d065 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/app-bundle/empty.c b/third_party/python/gyp/test/mac/app-bundle/empty.c new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/third_party/python/gyp/test/mac/app-bundle/empty.c diff --git a/third_party/python/gyp/test/mac/app-bundle/test-assets-catalog.gyp b/third_party/python/gyp/test/mac/app-bundle/test-assets-catalog.gyp new file mode 100644 index 0000000000..25f94a12d0 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/app-bundle/test-error.gyp b/third_party/python/gyp/test/mac/app-bundle/test-error.gyp new file mode 100644 index 0000000000..370772cc31 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/app-bundle/test.gyp b/third_party/python/gyp/test/mac/app-bundle/test.gyp new file mode 100644 index 0000000000..21973c3623 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/archs/empty_main.cc b/third_party/python/gyp/test/mac/archs/empty_main.cc new file mode 100644 index 0000000000..237c8ce181 --- /dev/null +++ b/third_party/python/gyp/test/mac/archs/empty_main.cc @@ -0,0 +1 @@ +int main() {} diff --git a/third_party/python/gyp/test/mac/archs/file.mm b/third_party/python/gyp/test/mac/archs/file.mm new file mode 100644 index 0000000000..d0b39d1f6d --- /dev/null +++ b/third_party/python/gyp/test/mac/archs/file.mm @@ -0,0 +1 @@ +MyInt f() { return 0; } diff --git a/third_party/python/gyp/test/mac/archs/file_a.cc b/third_party/python/gyp/test/mac/archs/file_a.cc new file mode 100644 index 0000000000..7307873c83 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/archs/file_a.h b/third_party/python/gyp/test/mac/archs/file_a.h new file mode 100644 index 0000000000..7439d13182 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/archs/file_b.cc b/third_party/python/gyp/test/mac/archs/file_b.cc new file mode 100644 index 0000000000..72d59cbfb4 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/archs/file_b.h b/third_party/python/gyp/test/mac/archs/file_b.h new file mode 100644 index 0000000000..eb272ece55 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/archs/file_c.cc b/third_party/python/gyp/test/mac/archs/file_c.cc new file mode 100644 index 0000000000..ca39f7a671 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/archs/file_d.cc b/third_party/python/gyp/test/mac/archs/file_d.cc new file mode 100644 index 0000000000..c40911cdca --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/archs/header.h b/third_party/python/gyp/test/mac/archs/header.h new file mode 100644 index 0000000000..0716e500c5 --- /dev/null +++ b/third_party/python/gyp/test/mac/archs/header.h @@ -0,0 +1 @@ +typedef int MyInt; diff --git a/third_party/python/gyp/test/mac/archs/my_file.cc b/third_party/python/gyp/test/mac/archs/my_file.cc new file mode 100644 index 0000000000..94216a74df --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/archs/my_main_file.cc b/third_party/python/gyp/test/mac/archs/my_main_file.cc new file mode 100644 index 0000000000..f1fa06f276 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/archs/test-archs-multiarch.gyp b/third_party/python/gyp/test/mac/archs/test-archs-multiarch.gyp new file mode 100644 index 0000000000..567e8a6653 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/archs/test-archs-x86_64.gyp b/third_party/python/gyp/test/mac/archs/test-archs-x86_64.gyp new file mode 100644 index 0000000000..d11a896273 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/archs/test-dependencies.gyp b/third_party/python/gyp/test/mac/archs/test-dependencies.gyp new file mode 100644 index 0000000000..0431f5f2f4 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/archs/test-no-archs.gyp b/third_party/python/gyp/test/mac/archs/test-no-archs.gyp new file mode 100644 index 0000000000..8f3b6b47cc --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/archs/test-valid-archs.gyp b/third_party/python/gyp/test/mac/archs/test-valid-archs.gyp new file mode 100644 index 0000000000..c90ec1fe9b --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/bundle-resources/change.sh b/third_party/python/gyp/test/mac/bundle-resources/change.sh new file mode 100755 index 0000000000..6d0fe6c7c2 --- /dev/null +++ b/third_party/python/gyp/test/mac/bundle-resources/change.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +tr a-z A-Z < "${1}" > "${2}" diff --git a/third_party/python/gyp/test/mac/bundle-resources/executable-file.sh b/third_party/python/gyp/test/mac/bundle-resources/executable-file.sh new file mode 100755 index 0000000000..796953a1a2 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/bundle-resources/secret.txt b/third_party/python/gyp/test/mac/bundle-resources/secret.txt new file mode 100644 index 0000000000..8baef1b4ab --- /dev/null +++ b/third_party/python/gyp/test/mac/bundle-resources/secret.txt @@ -0,0 +1 @@ +abc diff --git a/third_party/python/gyp/test/mac/bundle-resources/test.gyp b/third_party/python/gyp/test/mac/bundle-resources/test.gyp new file mode 100644 index 0000000000..af034ce3f4 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/cflags/ccfile.cc b/third_party/python/gyp/test/mac/cflags/ccfile.cc new file mode 100644 index 0000000000..1a54d18eec --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/cflags/ccfile_withcflags.cc b/third_party/python/gyp/test/mac/cflags/ccfile_withcflags.cc new file mode 100644 index 0000000000..de078a0641 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/cflags/cfile.c b/third_party/python/gyp/test/mac/cflags/cfile.c new file mode 100644 index 0000000000..0af9d0af5d --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/cflags/cppfile.cpp b/third_party/python/gyp/test/mac/cflags/cppfile.cpp new file mode 100644 index 0000000000..1a54d18eec --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/cflags/cppfile_withcflags.cpp b/third_party/python/gyp/test/mac/cflags/cppfile_withcflags.cpp new file mode 100644 index 0000000000..de078a0641 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/cflags/cxxfile.cxx b/third_party/python/gyp/test/mac/cflags/cxxfile.cxx new file mode 100644 index 0000000000..1a54d18eec --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/cflags/cxxfile_withcflags.cxx b/third_party/python/gyp/test/mac/cflags/cxxfile_withcflags.cxx new file mode 100644 index 0000000000..de078a0641 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/cflags/mfile.m b/third_party/python/gyp/test/mac/cflags/mfile.m new file mode 100644 index 0000000000..0af9d0af5d --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/cflags/mmfile.mm b/third_party/python/gyp/test/mac/cflags/mmfile.mm new file mode 100644 index 0000000000..1a54d18eec --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/cflags/mmfile_withcflags.mm b/third_party/python/gyp/test/mac/cflags/mmfile_withcflags.mm new file mode 100644 index 0000000000..de078a0641 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/cflags/test.gyp b/third_party/python/gyp/test/mac/cflags/test.gyp new file mode 100644 index 0000000000..d330a548f6 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/clang-cxx-language-standard/c++11.cc b/third_party/python/gyp/test/mac/clang-cxx-language-standard/c++11.cc new file mode 100644 index 0000000000..756dc1c7e6 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/clang-cxx-language-standard/c++98.cc b/third_party/python/gyp/test/mac/clang-cxx-language-standard/c++98.cc new file mode 100644 index 0000000000..a6a00c70f4 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/clang-cxx-language-standard/clang-cxx-language-standard.gyp b/third_party/python/gyp/test/mac/clang-cxx-language-standard/clang-cxx-language-standard.gyp new file mode 100644 index 0000000000..eb60bbd0e8 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/clang-cxx-library/clang-cxx-library.gyp b/third_party/python/gyp/test/mac/clang-cxx-library/clang-cxx-library.gyp new file mode 100644 index 0000000000..67006e50a0 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/clang-cxx-library/libc++.cc b/third_party/python/gyp/test/mac/clang-cxx-library/libc++.cc new file mode 100644 index 0000000000..b8d6e6b3e2 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/clang-cxx-library/libstdc++.cc b/third_party/python/gyp/test/mac/clang-cxx-library/libstdc++.cc new file mode 100644 index 0000000000..474dbf350d --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/copies-with-xcode-envvars/copies-with-xcode-envvars.gyp b/third_party/python/gyp/test/mac/copies-with-xcode-envvars/copies-with-xcode-envvars.gyp new file mode 100644 index 0000000000..c1b1241fb7 --- /dev/null +++ b/third_party/python/gyp/test/mac/copies-with-xcode-envvars/copies-with-xcode-envvars.gyp @@ -0,0 +1,87 @@ +# Copyright (c) 2016 Mark Callow. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. +# +# For testing use of the UI settings & environment variables +# available in Xcode's PBXCopyFilesBuildPhase. +{ +'targets': [ + { + 'target_name': 'copies-with-xcode-envvars', + 'type': 'executable', + 'mac_bundle': 1, + 'sources': [ 'empty.c' ], + 'conditions': [ + ['OS == "ios" or OS == "mac"', { + 'copies': [{ + 'destination': '$(BUILT_PRODUCTS_DIR)', + 'files': [ + 'file0', + ], + }, { + 'destination': '$(BUILT_PRODUCTS_DIR)/$(WRAPPER_NAME)', + 'files': [ + 'file1', + ], + }, { + 'destination': '<(PRODUCT_DIR)/$(EXECUTABLE_FOLDER_PATH)', + 'files': [ + 'file2', + ], + }, { + 'destination': '<(PRODUCT_DIR)/$(UNLOCALIZED_RESOURCES_FOLDER_PATH)', + 'files': [ + 'file3', + ], + }, { + 'destination': '<(PRODUCT_DIR)/$(UNLOCALIZED_RESOURCES_FOLDER_PATH)/testimages', + 'files': [ + 'file4', + ], + }, { + 'destination': '$(BUILT_PRODUCTS_DIR)/$(JAVA_FOLDER_PATH)', + 'files': [ + 'file5', + ], + }, { + 'destination': '<(PRODUCT_DIR)/$(FRAMEWORKS_FOLDER_PATH)', + 'files': [ + 'file6', + ], + }, { + # NOTE: This is not an Xcode macro name but + # xcodeproj_file.py recognizes it and sends + # the output to the same place as + # $(FRAMEWORKS_FOLDER_PATH). xcode_emulation.py + # sets its value to an absolute path. + 'destination': '$(BUILT_FRAMEWORKS_DIR)', + 'files': [ + 'file7', + ], + }, { + 'destination': '<(PRODUCT_DIR)/$(SHARED_FRAMEWORKS_FOLDER_PATH)', + 'files': [ + 'file8', + ], + }, { + 'destination': '<(PRODUCT_DIR)/$(SHARED_SUPPORT_FOLDER_PATH)', + 'files': [ + 'file9', + ], + }, { + 'destination': '<(PRODUCT_DIR)/$(PLUGINS_FOLDER_PATH)', + 'files': [ + 'file10', + ], + }, { + 'destination': '<(PRODUCT_DIR)/$(XPCSERVICES_FOLDER_PATH)', + 'files': [ + 'file11', + ], + }], # copies + }], # OS == "ios" or OS == "mac" + ], # conditions + }], # targets +} + +# vim:ai:ts=4:sts=4:sw=2:expandtab:textwidth=70 diff --git a/third_party/python/gyp/test/mac/copies-with-xcode-envvars/empty.c b/third_party/python/gyp/test/mac/copies-with-xcode-envvars/empty.c new file mode 100644 index 0000000000..237c8ce181 --- /dev/null +++ b/third_party/python/gyp/test/mac/copies-with-xcode-envvars/empty.c @@ -0,0 +1 @@ +int main() {} diff --git a/third_party/python/gyp/test/mac/copies-with-xcode-envvars/file0 b/third_party/python/gyp/test/mac/copies-with-xcode-envvars/file0 new file mode 100644 index 0000000000..117889361f --- /dev/null +++ b/third_party/python/gyp/test/mac/copies-with-xcode-envvars/file0 @@ -0,0 +1 @@ +file0 contents diff --git a/third_party/python/gyp/test/mac/copies-with-xcode-envvars/file1 b/third_party/python/gyp/test/mac/copies-with-xcode-envvars/file1 new file mode 100644 index 0000000000..84d55c5759 --- /dev/null +++ b/third_party/python/gyp/test/mac/copies-with-xcode-envvars/file1 @@ -0,0 +1 @@ +file1 contents diff --git a/third_party/python/gyp/test/mac/copies-with-xcode-envvars/file10 b/third_party/python/gyp/test/mac/copies-with-xcode-envvars/file10 new file mode 100644 index 0000000000..372e992ef9 --- /dev/null +++ b/third_party/python/gyp/test/mac/copies-with-xcode-envvars/file10 @@ -0,0 +1 @@ +file10 contents diff --git a/third_party/python/gyp/test/mac/copies-with-xcode-envvars/file11 b/third_party/python/gyp/test/mac/copies-with-xcode-envvars/file11 new file mode 100644 index 0000000000..923e760e1f --- /dev/null +++ b/third_party/python/gyp/test/mac/copies-with-xcode-envvars/file11 @@ -0,0 +1 @@ +file11 contents diff --git a/third_party/python/gyp/test/mac/copies-with-xcode-envvars/file2 b/third_party/python/gyp/test/mac/copies-with-xcode-envvars/file2 new file mode 100644 index 0000000000..af1b8ae35d --- /dev/null +++ b/third_party/python/gyp/test/mac/copies-with-xcode-envvars/file2 @@ -0,0 +1 @@ +file2 contents diff --git a/third_party/python/gyp/test/mac/copies-with-xcode-envvars/file3 b/third_party/python/gyp/test/mac/copies-with-xcode-envvars/file3 new file mode 100644 index 0000000000..43f16f3522 --- /dev/null +++ b/third_party/python/gyp/test/mac/copies-with-xcode-envvars/file3 @@ -0,0 +1 @@ +file3 contents diff --git a/third_party/python/gyp/test/mac/copies-with-xcode-envvars/file4 b/third_party/python/gyp/test/mac/copies-with-xcode-envvars/file4 new file mode 100644 index 0000000000..5f7270a084 --- /dev/null +++ b/third_party/python/gyp/test/mac/copies-with-xcode-envvars/file4 @@ -0,0 +1 @@ +file4 contents diff --git a/third_party/python/gyp/test/mac/copies-with-xcode-envvars/file5 b/third_party/python/gyp/test/mac/copies-with-xcode-envvars/file5 new file mode 100644 index 0000000000..41f47186bd --- /dev/null +++ b/third_party/python/gyp/test/mac/copies-with-xcode-envvars/file5 @@ -0,0 +1 @@ +file5 contents diff --git a/third_party/python/gyp/test/mac/copies-with-xcode-envvars/file6 b/third_party/python/gyp/test/mac/copies-with-xcode-envvars/file6 new file mode 100644 index 0000000000..f5d5757348 --- /dev/null +++ b/third_party/python/gyp/test/mac/copies-with-xcode-envvars/file6 @@ -0,0 +1 @@ +file6 contents diff --git a/third_party/python/gyp/test/mac/copies-with-xcode-envvars/file7 b/third_party/python/gyp/test/mac/copies-with-xcode-envvars/file7 new file mode 100644 index 0000000000..90dbe6e9e1 --- /dev/null +++ b/third_party/python/gyp/test/mac/copies-with-xcode-envvars/file7 @@ -0,0 +1 @@ +file7 contents diff --git a/third_party/python/gyp/test/mac/copies-with-xcode-envvars/file8 b/third_party/python/gyp/test/mac/copies-with-xcode-envvars/file8 new file mode 100644 index 0000000000..9eb613fabb --- /dev/null +++ b/third_party/python/gyp/test/mac/copies-with-xcode-envvars/file8 @@ -0,0 +1 @@ +file8 contents diff --git a/third_party/python/gyp/test/mac/copies-with-xcode-envvars/file9 b/third_party/python/gyp/test/mac/copies-with-xcode-envvars/file9 new file mode 100644 index 0000000000..e37ac72ada --- /dev/null +++ b/third_party/python/gyp/test/mac/copies-with-xcode-envvars/file9 @@ -0,0 +1 @@ +file9 contents diff --git a/third_party/python/gyp/test/mac/copy-dylib/empty.c b/third_party/python/gyp/test/mac/copy-dylib/empty.c new file mode 100644 index 0000000000..237c8ce181 --- /dev/null +++ b/third_party/python/gyp/test/mac/copy-dylib/empty.c @@ -0,0 +1 @@ +int main() {} diff --git a/third_party/python/gyp/test/mac/copy-dylib/test.gyp b/third_party/python/gyp/test/mac/copy-dylib/test.gyp new file mode 100644 index 0000000000..4210c51463 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/debuginfo/file.c b/third_party/python/gyp/test/mac/debuginfo/file.c new file mode 100644 index 0000000000..9cddaf1b0b --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/debuginfo/test.gyp b/third_party/python/gyp/test/mac/debuginfo/test.gyp new file mode 100644 index 0000000000..3faf6b5c76 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/depend-on-bundle/English.lproj/InfoPlist.strings b/third_party/python/gyp/test/mac/depend-on-bundle/English.lproj/InfoPlist.strings new file mode 100644 index 0000000000..b92732c79e --- /dev/null +++ b/third_party/python/gyp/test/mac/depend-on-bundle/English.lproj/InfoPlist.strings @@ -0,0 +1 @@ +/* Localized versions of Info.plist keys */ diff --git a/third_party/python/gyp/test/mac/depend-on-bundle/Info.plist b/third_party/python/gyp/test/mac/depend-on-bundle/Info.plist new file mode 100644 index 0000000000..5e05a5190c --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/depend-on-bundle/bundle.c b/third_party/python/gyp/test/mac/depend-on-bundle/bundle.c new file mode 100644 index 0000000000..d64ff8ca23 --- /dev/null +++ b/third_party/python/gyp/test/mac/depend-on-bundle/bundle.c @@ -0,0 +1 @@ +int f() { return 42; } diff --git a/third_party/python/gyp/test/mac/depend-on-bundle/executable.c b/third_party/python/gyp/test/mac/depend-on-bundle/executable.c new file mode 100644 index 0000000000..931bce637e --- /dev/null +++ b/third_party/python/gyp/test/mac/depend-on-bundle/executable.c @@ -0,0 +1,4 @@ +int f(); +int main() { + return f(); +} diff --git a/third_party/python/gyp/test/mac/depend-on-bundle/test.gyp b/third_party/python/gyp/test/mac/depend-on-bundle/test.gyp new file mode 100644 index 0000000000..e00b105415 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/deployment-target/check-version-min.c b/third_party/python/gyp/test/mac/deployment-target/check-version-min.c new file mode 100644 index 0000000000..761c529085 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/deployment-target/deployment-target.gyp b/third_party/python/gyp/test/mac/deployment-target/deployment-target.gyp new file mode 100644 index 0000000000..47e0565c0c --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/framework-dirs/calculate.c b/third_party/python/gyp/test/mac/framework-dirs/calculate.c new file mode 100644 index 0000000000..7dc9d2d8b4 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/framework-dirs/framework-dirs.gyp b/third_party/python/gyp/test/mac/framework-dirs/framework-dirs.gyp new file mode 100644 index 0000000000..bf1cbde4de --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/framework-headers/myframework.h b/third_party/python/gyp/test/mac/framework-headers/myframework.h new file mode 100644 index 0000000000..961fc701bc --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/framework-headers/myframework.m b/third_party/python/gyp/test/mac/framework-headers/myframework.m new file mode 100644 index 0000000000..13d53a37ab --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/framework-headers/test.gyp b/third_party/python/gyp/test/mac/framework-headers/test.gyp new file mode 100644 index 0000000000..70ed00715c --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/framework/TestFramework/English.lproj/InfoPlist.strings b/third_party/python/gyp/test/mac/framework/TestFramework/English.lproj/InfoPlist.strings new file mode 100644 index 0000000000..88f65cf6ea --- /dev/null +++ b/third_party/python/gyp/test/mac/framework/TestFramework/English.lproj/InfoPlist.strings @@ -0,0 +1,2 @@ +/* Localized versions of Info.plist keys */ + diff --git a/third_party/python/gyp/test/mac/framework/TestFramework/Info.plist b/third_party/python/gyp/test/mac/framework/TestFramework/Info.plist new file mode 100644 index 0000000000..a791b3ee48 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/framework/TestFramework/ObjCVector.h b/third_party/python/gyp/test/mac/framework/TestFramework/ObjCVector.h new file mode 100644 index 0000000000..c2450960cd --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/framework/TestFramework/ObjCVector.mm b/third_party/python/gyp/test/mac/framework/TestFramework/ObjCVector.mm new file mode 100644 index 0000000000..cbf431f28d --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/framework/TestFramework/ObjCVectorInternal.h b/third_party/python/gyp/test/mac/framework/TestFramework/ObjCVectorInternal.h new file mode 100644 index 0000000000..fb6c98258b --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/framework/TestFramework/TestFramework_Prefix.pch b/third_party/python/gyp/test/mac/framework/TestFramework/TestFramework_Prefix.pch new file mode 100644 index 0000000000..394f41d957 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/framework/empty.c b/third_party/python/gyp/test/mac/framework/empty.c new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/third_party/python/gyp/test/mac/framework/empty.c diff --git a/third_party/python/gyp/test/mac/framework/framework.gyp b/third_party/python/gyp/test/mac/framework/framework.gyp new file mode 100644 index 0000000000..52b4f37be9 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/global-settings/src/dir1/dir1.gyp b/third_party/python/gyp/test/mac/global-settings/src/dir1/dir1.gyp new file mode 100644 index 0000000000..153e34ddd6 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/global-settings/src/dir2/dir2.gyp b/third_party/python/gyp/test/mac/global-settings/src/dir2/dir2.gyp new file mode 100644 index 0000000000..cda46c839b --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/global-settings/src/dir2/file.txt b/third_party/python/gyp/test/mac/global-settings/src/dir2/file.txt new file mode 100644 index 0000000000..58da2d8e9a --- /dev/null +++ b/third_party/python/gyp/test/mac/global-settings/src/dir2/file.txt @@ -0,0 +1 @@ +File. diff --git a/third_party/python/gyp/test/mac/gyptest-action-envvars.py b/third_party/python/gyp/test/mac/gyptest-action-envvars.py new file mode 100644 index 0000000000..c84eeaa465 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/gyptest-app-assets-catalog.py b/third_party/python/gyp/test/mac/gyptest-app-assets-catalog.py new file mode 100755 index 0000000000..7b1c0f67de --- /dev/null +++ b/third_party/python/gyp/test/mac/gyptest-app-assets-catalog.py @@ -0,0 +1,125 @@ +#!/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. +""" + +from __future__ import print_function + +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('Expected "%s", got "%s"' % (expected, actual), file=sys.stderr) + 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/third_party/python/gyp/test/mac/gyptest-app-error.py b/third_party/python/gyp/test/mac/gyptest-app-error.py new file mode 100755 index 0000000000..df0781d455 --- /dev/null +++ b/third_party/python/gyp/test/mac/gyptest-app-error.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. + +""" +Verifies that invalid strings files cause the build to fail. +""" + +from __future__ import print_function + +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/third_party/python/gyp/test/mac/gyptest-app.py b/third_party/python/gyp/test/mac/gyptest-app.py new file mode 100755 index 0000000000..16c9640373 --- /dev/null +++ b/third_party/python/gyp/test/mac/gyptest-app.py @@ -0,0 +1,122 @@ +#!/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. +""" + +from __future__ import print_function + +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('Expected "%s", got "%s"' % (expected, actual), file=sys.stderr) + 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/third_party/python/gyp/test/mac/gyptest-archs.py b/third_party/python/gyp/test/mac/gyptest-archs.py new file mode 100644 index 0000000000..c56f20c4d6 --- /dev/null +++ b/third_party/python/gyp/test/mac/gyptest-archs.py @@ -0,0 +1,96 @@ +#!/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]).decode('utf-8') + 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/third_party/python/gyp/test/mac/gyptest-bundle-resources.py b/third_party/python/gyp/test/mac/gyptest-bundle-resources.py new file mode 100644 index 0000000000..275cdbaa54 --- /dev/null +++ b/third_party/python/gyp/test/mac/gyptest-bundle-resources.py @@ -0,0 +1,64 @@ +#!/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. +""" + +from __future__ import print_function + +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/third_party/python/gyp/test/mac/gyptest-cflags.py b/third_party/python/gyp/test/mac/gyptest-cflags.py new file mode 100644 index 0000000000..17afd15665 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/gyptest-clang-cxx-language-standard.py b/third_party/python/gyp/test/mac/gyptest-clang-cxx-language-standard.py new file mode 100644 index 0000000000..75c6c74c97 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/gyptest-clang-cxx-library.py b/third_party/python/gyp/test/mac/gyptest-clang-cxx-library.py new file mode 100644 index 0000000000..177d6376ff --- /dev/null +++ b/third_party/python/gyp/test/mac/gyptest-clang-cxx-library.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. + +""" +Verifies that CLANG_CXX_LIBRARY works. +""" + +import TestGyp +import TestMac + +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']) + + if test.format == 'make': + # This is failing because of a deprecation warning for libstdc++. + test.skip_test() # bug=533 + + 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/third_party/python/gyp/test/mac/gyptest-copies-with-xcode-envvars.py b/third_party/python/gyp/test/mac/gyptest-copies-with-xcode-envvars.py new file mode 100644 index 0000000000..80b0ecfa28 --- /dev/null +++ b/third_party/python/gyp/test/mac/gyptest-copies-with-xcode-envvars.py @@ -0,0 +1,65 @@ +#!/usr/bin/env python + +# Copyright (c) 2016 Mark Callow. 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 are copied to the correct destinations when those +destinations are specified using environment variables available in +Xcode's PBXCopyFilesBuildPhase. +""" + +import TestGyp + +import os +import stat +import sys + + +test = TestGyp.TestGyp(formats=['make', 'ninja', 'xcode']) + +if sys.platform == 'darwin': + test.run_gyp('copies-with-xcode-envvars.gyp', + chdir='copies-with-xcode-envvars') + + test.build('copies-with-xcode-envvars.gyp', chdir='copies-with-xcode-envvars') + + wrapper_name = 'copies-with-xcode-envvars.app/' + contents_path = wrapper_name + 'Contents/' + out_path = test.built_file_path('file0', chdir='copies-with-xcode-envvars') + test.must_contain(out_path, 'file0 contents\n') + out_path = test.built_file_path(wrapper_name + 'file1', + chdir='copies-with-xcode-envvars') + test.must_contain(out_path, 'file1 contents\n') + out_path = test.built_file_path(contents_path + 'MacOS/file2', + chdir='copies-with-xcode-envvars') + test.must_contain(out_path, 'file2 contents\n') + out_path = test.built_file_path(contents_path + 'Resources/file3', + chdir='copies-with-xcode-envvars') + test.must_contain(out_path, 'file3 contents\n') + out_path = test.built_file_path(contents_path + 'Resources/testimages/file4', + chdir='copies-with-xcode-envvars') + test.must_contain(out_path, 'file4 contents\n') + out_path = test.built_file_path(contents_path + 'Resources/Java/file5', + chdir='copies-with-xcode-envvars') + test.must_contain(out_path, 'file5 contents\n') + out_path = test.built_file_path(contents_path + 'Frameworks/file6', + chdir='copies-with-xcode-envvars') + test.must_contain(out_path, 'file6 contents\n') + out_path = test.built_file_path(contents_path + 'Frameworks/file7', + chdir='copies-with-xcode-envvars') + test.must_contain(out_path, 'file7 contents\n') + out_path = test.built_file_path(contents_path + 'SharedFrameworks/file8', + chdir='copies-with-xcode-envvars') + test.must_contain(out_path, 'file8 contents\n') + out_path = test.built_file_path(contents_path + 'SharedSupport/file9', + chdir='copies-with-xcode-envvars') + test.must_contain(out_path, 'file9 contents\n') + out_path = test.built_file_path(contents_path + 'PlugIns/file10', + chdir='copies-with-xcode-envvars') + test.must_contain(out_path, 'file10 contents\n') + out_path = test.built_file_path(contents_path + 'XPCServices/file11', + chdir='copies-with-xcode-envvars') + test.must_contain(out_path, 'file11 contents\n') + test.pass_test() diff --git a/third_party/python/gyp/test/mac/gyptest-copies.py b/third_party/python/gyp/test/mac/gyptest-copies.py new file mode 100755 index 0000000000..838c62dc37 --- /dev/null +++ b/third_party/python/gyp/test/mac/gyptest-copies.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. + +""" +Verifies that 'copies' with app bundles are handled correctly. +""" + +from __future__ import print_function + +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/third_party/python/gyp/test/mac/gyptest-copy-dylib.py b/third_party/python/gyp/test/mac/gyptest-copy-dylib.py new file mode 100644 index 0000000000..253623d1c6 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/gyptest-debuginfo.py b/third_party/python/gyp/test/mac/gyptest-debuginfo.py new file mode 100755 index 0000000000..a0e9438e2a --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/gyptest-depend-on-bundle.py b/third_party/python/gyp/test/mac/gyptest-depend-on-bundle.py new file mode 100644 index 0000000000..b8b06d4cc0 --- /dev/null +++ b/third_party/python/gyp/test/mac/gyptest-depend-on-bundle.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 that a dependency on a bundle causes the whole bundle to be built. +""" + +from __future__ import print_function + +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/third_party/python/gyp/test/mac/gyptest-deployment-target.py b/third_party/python/gyp/test/mac/gyptest-deployment-target.py new file mode 100644 index 0000000000..c7eabde6fe --- /dev/null +++ b/third_party/python/gyp/test/mac/gyptest-deployment-target.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. + +""" +Verifies that MACOSX_DEPLOYMENT_TARGET works. +""" + +import TestGyp + +import sys + +if sys.platform == 'darwin': + test = TestGyp.TestGyp(formats=['make', 'ninja', 'xcode']) + + if test.format == 'make': + # This is failing because of a deprecation warning for libstdc++. + test.skip_test() # bug=533 + + 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/third_party/python/gyp/test/mac/gyptest-framework-dirs.py b/third_party/python/gyp/test/mac/gyptest-framework-dirs.py new file mode 100644 index 0000000000..a1ae54c57f --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/gyptest-framework-headers.py b/third_party/python/gyp/test/mac/gyptest-framework-headers.py new file mode 100644 index 0000000000..aa13a742cd --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/gyptest-framework.py b/third_party/python/gyp/test/mac/gyptest-framework.py new file mode 100755 index 0000000000..faf05cf313 --- /dev/null +++ b/third_party/python/gyp/test/mac/gyptest-framework.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. + +""" +Verifies that app bundles are built correctly. +""" + +from __future__ import print_function + +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/third_party/python/gyp/test/mac/gyptest-global-settings.py b/third_party/python/gyp/test/mac/gyptest-global-settings.py new file mode 100644 index 0000000000..f4ed16630e --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/gyptest-identical-name.py b/third_party/python/gyp/test/mac/gyptest-identical-name.py new file mode 100644 index 0000000000..0d358df921 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/gyptest-infoplist-process.py b/third_party/python/gyp/test/mac/gyptest-infoplist-process.py new file mode 100755 index 0000000000..24260e1c34 --- /dev/null +++ b/third_party/python/gyp/test/mac/gyptest-infoplist-process.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 the Info.plist preprocessor functionality. +""" + +from __future__ import print_function + +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/third_party/python/gyp/test/mac/gyptest-installname.py b/third_party/python/gyp/test/mac/gyptest-installname.py new file mode 100644 index 0000000000..17831aeaf4 --- /dev/null +++ b/third_party/python/gyp/test/mac/gyptest-installname.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. + +""" +Verifies that LD_DYLIB_INSTALL_NAME and DYLIB_INSTALL_NAME_BASE are handled +correctly. +""" + +from __future__ import print_function + +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/third_party/python/gyp/test/mac/gyptest-kext.py b/third_party/python/gyp/test/mac/gyptest-kext.py new file mode 100755 index 0000000000..56790bdb65 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/gyptest-ldflags-passed-to-libtool.py b/third_party/python/gyp/test/mac/gyptest-ldflags-passed-to-libtool.py new file mode 100644 index 0000000000..e24e305d9f --- /dev/null +++ b/third_party/python/gyp/test/mac/gyptest-ldflags-passed-to-libtool.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 OTHER_LDFLAGS is passed to libtool. +""" + +from __future__ import print_function + +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/third_party/python/gyp/test/mac/gyptest-ldflags.py b/third_party/python/gyp/test/mac/gyptest-ldflags.py new file mode 100644 index 0000000000..af44b8c5a0 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/gyptest-libraries.py b/third_party/python/gyp/test/mac/gyptest-libraries.py new file mode 100755 index 0000000000..5ea4faf6ea --- /dev/null +++ b/third_party/python/gyp/test/mac/gyptest-libraries.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 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.skip_test() # bug=535 + + test.run_gyp('subdir/test.gyp', chdir='libraries') + + test.build('subdir/test.gyp', test.ALL, chdir='libraries') + + test.pass_test() diff --git a/third_party/python/gyp/test/mac/gyptest-libtool-zero.py b/third_party/python/gyp/test/mac/gyptest-libtool-zero.py new file mode 100644 index 0000000000..ae5b7e635b --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/gyptest-loadable-module-bundle-product-extension.py b/third_party/python/gyp/test/mac/gyptest-loadable-module-bundle-product-extension.py new file mode 100644 index 0000000000..7a60ca2d17 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/gyptest-loadable-module.py b/third_party/python/gyp/test/mac/gyptest-loadable-module.py new file mode 100755 index 0000000000..77dde1d6cd --- /dev/null +++ b/third_party/python/gyp/test/mac/gyptest-loadable-module.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. + +""" +Tests that a loadable_module target is built correctly. +""" + +from __future__ import print_function + +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/third_party/python/gyp/test/mac/gyptest-lto.py b/third_party/python/gyp/test/mac/gyptest-lto.py new file mode 100644 index 0000000000..d37068f336 --- /dev/null +++ b/third_party/python/gyp/test/mac/gyptest-lto.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. + +""" +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]).decode('utf-8') + objtype = 'unknown' + if ': Mach-O ' in o: + objtype = 'mach-o' + elif ': LLVM bitcode' 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/third_party/python/gyp/test/mac/gyptest-missing-cfbundlesignature.py b/third_party/python/gyp/test/mac/gyptest-missing-cfbundlesignature.py new file mode 100644 index 0000000000..be66492467 --- /dev/null +++ b/third_party/python/gyp/test/mac/gyptest-missing-cfbundlesignature.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 that an Info.plist with CFBundleSignature works. +""" + +from __future__ import print_function + +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/third_party/python/gyp/test/mac/gyptest-non-strs-flattened-to-env.py b/third_party/python/gyp/test/mac/gyptest-non-strs-flattened-to-env.py new file mode 100644 index 0000000000..cb42a939d4 --- /dev/null +++ b/third_party/python/gyp/test/mac/gyptest-non-strs-flattened-to-env.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 list xcode_settings are flattened before being exported to the +environment. +""" + +from __future__ import print_function + +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/third_party/python/gyp/test/mac/gyptest-objc-arc.py b/third_party/python/gyp/test/mac/gyptest-objc-arc.py new file mode 100755 index 0000000000..b3192a19dd --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/gyptest-objc-gc.py b/third_party/python/gyp/test/mac/gyptest-objc-gc.py new file mode 100644 index 0000000000..0cec458983 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/gyptest-postbuild-copy-bundle.py b/third_party/python/gyp/test/mac/gyptest-postbuild-copy-bundle.py new file mode 100644 index 0000000000..1f04d1cb36 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/gyptest-postbuild-defaults.py b/third_party/python/gyp/test/mac/gyptest-postbuild-defaults.py new file mode 100644 index 0000000000..0f7d25bd89 --- /dev/null +++ b/third_party/python/gyp/test/mac/gyptest-postbuild-defaults.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 that a postbuild invoking |defaults| works. +""" + +from __future__ import print_function + +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/third_party/python/gyp/test/mac/gyptest-postbuild-fail.py b/third_party/python/gyp/test/mac/gyptest-postbuild-fail.py new file mode 100755 index 0000000000..1a229df695 --- /dev/null +++ b/third_party/python/gyp/test/mac/gyptest-postbuild-fail.py @@ -0,0 +1,71 @@ +#!/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. +""" + +from __future__ import print_function + +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, _ = job.communicate() + out = out.decode('utf-8') + 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/third_party/python/gyp/test/mac/gyptest-postbuild-multiple-configurations.py b/third_party/python/gyp/test/mac/gyptest-postbuild-multiple-configurations.py new file mode 100644 index 0000000000..84694f36cc --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/gyptest-postbuild-static-library.py b/third_party/python/gyp/test/mac/gyptest-postbuild-static-library.py new file mode 100644 index 0000000000..8f9a6ebcb0 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/gyptest-postbuild.py b/third_party/python/gyp/test/mac/gyptest-postbuild.py new file mode 100755 index 0000000000..684e7b8426 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/gyptest-prefixheader.py b/third_party/python/gyp/test/mac/gyptest-prefixheader.py new file mode 100755 index 0000000000..0cf85f9422 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/gyptest-rebuild.py b/third_party/python/gyp/test/mac/gyptest-rebuild.py new file mode 100755 index 0000000000..c7d8cad02d --- /dev/null +++ b/third_party/python/gyp/test/mac/gyptest-rebuild.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. + +""" +Verifies that app bundles are rebuilt correctly. +""" + +from __future__ import print_function + +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/third_party/python/gyp/test/mac/gyptest-rpath.py b/third_party/python/gyp/test/mac/gyptest-rpath.py new file mode 100644 index 0000000000..a82e2fd562 --- /dev/null +++ b/third_party/python/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].decode('utf-8') + 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/third_party/python/gyp/test/mac/gyptest-sdkroot.py b/third_party/python/gyp/test/mac/gyptest-sdkroot.py new file mode 100644 index 0000000000..f8edbaa583 --- /dev/null +++ b/third_party/python/gyp/test/mac/gyptest-sdkroot.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 setting SDKROOT works. +""" + +from __future__ import print_function + +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/third_party/python/gyp/test/mac/gyptest-sourceless-module.py b/third_party/python/gyp/test/mac/gyptest-sourceless-module.py new file mode 100644 index 0000000000..f2801c20aa --- /dev/null +++ b/third_party/python/gyp/test/mac/gyptest-sourceless-module.py @@ -0,0 +1,77 @@ +#!/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. +""" + +from __future__ import print_function + +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/third_party/python/gyp/test/mac/gyptest-strip-default.py b/third_party/python/gyp/test/mac/gyptest-strip-default.py new file mode 100644 index 0000000000..b851782fd5 --- /dev/null +++ b/third_party/python/gyp/test/mac/gyptest-strip-default.py @@ -0,0 +1,97 @@ +#!/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. +""" + +from __future__ import print_function + +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].decode('utf-8') + + # 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/third_party/python/gyp/test/mac/gyptest-strip.py b/third_party/python/gyp/test/mac/gyptest-strip.py new file mode 100755 index 0000000000..d4694834ac --- /dev/null +++ b/third_party/python/gyp/test/mac/gyptest-strip.py @@ -0,0 +1,66 @@ +#!/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. +""" + +from __future__ import print_function + +import TestGyp +import TestMac + +import re +import subprocess +import sys +import time + +print("This test is currently disabled: https://crbug.com/483696.") +sys.exit(0) + +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/third_party/python/gyp/test/mac/gyptest-swift-library.py b/third_party/python/gyp/test/mac/gyptest-swift-library.py new file mode 100644 index 0000000000..d3433753fd --- /dev/null +++ b/third_party/python/gyp/test/mac/gyptest-swift-library.py @@ -0,0 +1,67 @@ +#!/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. +""" + +from __future__ import print_function + +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/third_party/python/gyp/test/mac/gyptest-type-envvars.py b/third_party/python/gyp/test/mac/gyptest-type-envvars.py new file mode 100755 index 0000000000..a5203c5f1e --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/gyptest-unicode-settings.py b/third_party/python/gyp/test/mac/gyptest-unicode-settings.py new file mode 100644 index 0000000000..a71b3bd9a3 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/gyptest-xcode-env-order.py b/third_party/python/gyp/test/mac/gyptest-xcode-env-order.py new file mode 100755 index 0000000000..bda19988b2 --- /dev/null +++ b/third_party/python/gyp/test/mac/gyptest-xcode-env-order.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. + +""" +Verifies that dependent Xcode settings are processed correctly. +""" + +from __future__ import print_function + +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/third_party/python/gyp/test/mac/gyptest-xcode-gcc-clang.py b/third_party/python/gyp/test/mac/gyptest-xcode-gcc-clang.py new file mode 100644 index 0000000000..981c3fc564 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/gyptest-xcode-gcc.py b/third_party/python/gyp/test/mac/gyptest-xcode-gcc.py new file mode 100644 index 0000000000..a1d201ae03 --- /dev/null +++ b/third_party/python/gyp/test/mac/gyptest-xcode-gcc.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 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) + stdout = stdout.decode('utf-8') + 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']) + + if test.format == 'xcode-ninja': + test.skip_test() + + 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/third_party/python/gyp/test/mac/gyptest-xcode-support-actions.py b/third_party/python/gyp/test/mac/gyptest-xcode-support-actions.py new file mode 100755 index 0000000000..ecc1402972 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/gyptest-xctest.py b/third_party/python/gyp/test/mac/gyptest-xctest.py new file mode 100644 index 0000000000..fb478bb31c --- /dev/null +++ b/third_party/python/gyp/test/mac/gyptest-xctest.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 xctest targets are correctly configured. +""" + +import TestGyp + +import sys + +if sys.platform == 'darwin': + test = TestGyp.TestGyp(formats=['xcode']) + + # This test appears to be flaky. + test.skip_test() # bug=531 + + # 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/third_party/python/gyp/test/mac/gyptest-xcuitest.py b/third_party/python/gyp/test/mac/gyptest-xcuitest.py new file mode 100755 index 0000000000..410de297d0 --- /dev/null +++ b/third_party/python/gyp/test/mac/gyptest-xcuitest.py @@ -0,0 +1,39 @@ +#!/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 xcuitest 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.decode('utf-8').splitlines() + # Convert the version string from 'Xcode 5.0' to ['5','0']. + xcode_version = xcode_version.split()[-1].split('.') + if xcode_version < ['7']: + test.pass_test() + + CHDIR = 'xcuitest' + test.run_gyp('test.gyp', chdir=CHDIR) + test.build('test.gyp', chdir=CHDIR, arguments=[ + '-target', 'tests', + '-sdk', 'iphonesimulator', + ]) + + test.pass_test() diff --git a/third_party/python/gyp/test/mac/identical-name/proxy/proxy.cc b/third_party/python/gyp/test/mac/identical-name/proxy/proxy.cc new file mode 100644 index 0000000000..8e1782da63 --- /dev/null +++ b/third_party/python/gyp/test/mac/identical-name/proxy/proxy.cc @@ -0,0 +1,2 @@ +// Empty file + diff --git a/third_party/python/gyp/test/mac/identical-name/proxy/proxy.gyp b/third_party/python/gyp/test/mac/identical-name/proxy/proxy.gyp new file mode 100644 index 0000000000..38f44af1b5 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/identical-name/proxy/testlib/testlib.cc b/third_party/python/gyp/test/mac/identical-name/proxy/testlib/testlib.cc new file mode 100644 index 0000000000..8e1782da63 --- /dev/null +++ b/third_party/python/gyp/test/mac/identical-name/proxy/testlib/testlib.cc @@ -0,0 +1,2 @@ +// Empty file + diff --git a/third_party/python/gyp/test/mac/identical-name/proxy/testlib/testlib.gyp b/third_party/python/gyp/test/mac/identical-name/proxy/testlib/testlib.gyp new file mode 100644 index 0000000000..ed1c62e982 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/identical-name/test-should-fail.gyp b/third_party/python/gyp/test/mac/identical-name/test-should-fail.gyp new file mode 100644 index 0000000000..72bfc7af0f --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/identical-name/test.gyp b/third_party/python/gyp/test/mac/identical-name/test.gyp new file mode 100644 index 0000000000..717220e866 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/identical-name/test.gypi b/third_party/python/gyp/test/mac/identical-name/test.gypi new file mode 100644 index 0000000000..61b7c2badf --- /dev/null +++ b/third_party/python/gyp/test/mac/identical-name/test.gypi @@ -0,0 +1,7 @@ +{ + 'target_defaults': { + 'xcode_settings': { + 'SYMROOT': '<(DEPTH)/$SRCROOT/', + }, + }, +} diff --git a/third_party/python/gyp/test/mac/identical-name/testlib/main.cc b/third_party/python/gyp/test/mac/identical-name/testlib/main.cc new file mode 100644 index 0000000000..5c2fa9bb6a --- /dev/null +++ b/third_party/python/gyp/test/mac/identical-name/testlib/main.cc @@ -0,0 +1,3 @@ +int main(int argc, char **argv) { + return 0; +} diff --git a/third_party/python/gyp/test/mac/identical-name/testlib/testlib.gyp b/third_party/python/gyp/test/mac/identical-name/testlib/testlib.gyp new file mode 100644 index 0000000000..aa8b851004 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/identical-name/testlib/void.cc b/third_party/python/gyp/test/mac/identical-name/testlib/void.cc new file mode 100644 index 0000000000..8e1782da63 --- /dev/null +++ b/third_party/python/gyp/test/mac/identical-name/testlib/void.cc @@ -0,0 +1,2 @@ +// Empty file + diff --git a/third_party/python/gyp/test/mac/infoplist-process/Info.plist b/third_party/python/gyp/test/mac/infoplist-process/Info.plist new file mode 100644 index 0000000000..cb65721f43 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/infoplist-process/main.c b/third_party/python/gyp/test/mac/infoplist-process/main.c new file mode 100644 index 0000000000..1bf4b2a11a --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/infoplist-process/test1.gyp b/third_party/python/gyp/test/mac/infoplist-process/test1.gyp new file mode 100644 index 0000000000..bc625a968b --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/infoplist-process/test2.gyp b/third_party/python/gyp/test/mac/infoplist-process/test2.gyp new file mode 100644 index 0000000000..ecfbc9f64c --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/infoplist-process/test3.gyp b/third_party/python/gyp/test/mac/infoplist-process/test3.gyp new file mode 100644 index 0000000000..be8fe75a53 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/installname/Info.plist b/third_party/python/gyp/test/mac/installname/Info.plist new file mode 100644 index 0000000000..5e05a5190c --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/installname/file.c b/third_party/python/gyp/test/mac/installname/file.c new file mode 100644 index 0000000000..a39fce095f --- /dev/null +++ b/third_party/python/gyp/test/mac/installname/file.c @@ -0,0 +1 @@ +int f() { return 0; } diff --git a/third_party/python/gyp/test/mac/installname/main.c b/third_party/python/gyp/test/mac/installname/main.c new file mode 100644 index 0000000000..237c8ce181 --- /dev/null +++ b/third_party/python/gyp/test/mac/installname/main.c @@ -0,0 +1 @@ +int main() {} diff --git a/third_party/python/gyp/test/mac/installname/test.gyp b/third_party/python/gyp/test/mac/installname/test.gyp new file mode 100644 index 0000000000..60c867ff12 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/kext/GypKext/GypKext-Info.plist b/third_party/python/gyp/test/mac/kext/GypKext/GypKext-Info.plist new file mode 100644 index 0000000000..84226099c1 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/kext/GypKext/GypKext.c b/third_party/python/gyp/test/mac/kext/GypKext/GypKext.c new file mode 100644 index 0000000000..9b611b0dc5 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/kext/kext.gyp b/third_party/python/gyp/test/mac/kext/kext.gyp new file mode 100644 index 0000000000..5b93087543 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/ldflags-libtool/file.c b/third_party/python/gyp/test/mac/ldflags-libtool/file.c new file mode 100644 index 0000000000..56757a701b --- /dev/null +++ b/third_party/python/gyp/test/mac/ldflags-libtool/file.c @@ -0,0 +1 @@ +void f() {} diff --git a/third_party/python/gyp/test/mac/ldflags-libtool/test.gyp b/third_party/python/gyp/test/mac/ldflags-libtool/test.gyp new file mode 100644 index 0000000000..4e7aa07106 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/ldflags/subdirectory/Info.plist b/third_party/python/gyp/test/mac/ldflags/subdirectory/Info.plist new file mode 100644 index 0000000000..5f5e9abfbb --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/ldflags/subdirectory/file.c b/third_party/python/gyp/test/mac/ldflags/subdirectory/file.c new file mode 100644 index 0000000000..90c45543bf --- /dev/null +++ b/third_party/python/gyp/test/mac/ldflags/subdirectory/file.c @@ -0,0 +1,2 @@ +void f() {} +void g() {} diff --git a/third_party/python/gyp/test/mac/ldflags/subdirectory/symbol_list.def b/third_party/python/gyp/test/mac/ldflags/subdirectory/symbol_list.def new file mode 100644 index 0000000000..0ab7543b1f --- /dev/null +++ b/third_party/python/gyp/test/mac/ldflags/subdirectory/symbol_list.def @@ -0,0 +1 @@ +_f diff --git a/third_party/python/gyp/test/mac/ldflags/subdirectory/test.gyp b/third_party/python/gyp/test/mac/ldflags/subdirectory/test.gyp new file mode 100644 index 0000000000..db00c7465c --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/libraries/subdir/README.txt b/third_party/python/gyp/test/mac/libraries/subdir/README.txt new file mode 100644 index 0000000000..4031ded85f --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/libraries/subdir/hello.cc b/third_party/python/gyp/test/mac/libraries/subdir/hello.cc new file mode 100644 index 0000000000..a43554c8ca --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/libraries/subdir/mylib.c b/third_party/python/gyp/test/mac/libraries/subdir/mylib.c new file mode 100644 index 0000000000..e771991e83 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/libraries/subdir/test.gyp b/third_party/python/gyp/test/mac/libraries/subdir/test.gyp new file mode 100644 index 0000000000..59fef51017 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/libtool-zero/mylib.c b/third_party/python/gyp/test/mac/libtool-zero/mylib.c new file mode 100644 index 0000000000..b26d61bd6b --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/libtool-zero/test.gyp b/third_party/python/gyp/test/mac/libtool-zero/test.gyp new file mode 100644 index 0000000000..0d6ee5535e --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/loadable-module-bundle-product-extension/src.cc b/third_party/python/gyp/test/mac/loadable-module-bundle-product-extension/src.cc new file mode 100644 index 0000000000..3d878e9697 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/loadable-module-bundle-product-extension/test.gyp b/third_party/python/gyp/test/mac/loadable-module-bundle-product-extension/test.gyp new file mode 100644 index 0000000000..684a2c02aa --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/loadable-module/Info.plist b/third_party/python/gyp/test/mac/loadable-module/Info.plist new file mode 100644 index 0000000000..f6607aebd9 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/loadable-module/module.c b/third_party/python/gyp/test/mac/loadable-module/module.c new file mode 100644 index 0000000000..9584538347 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/loadable-module/test.gyp b/third_party/python/gyp/test/mac/loadable-module/test.gyp new file mode 100644 index 0000000000..3c8a5309d2 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/lto/asmfile.S b/third_party/python/gyp/test/mac/lto/asmfile.S new file mode 100644 index 0000000000..ea23759a39 --- /dev/null +++ b/third_party/python/gyp/test/mac/lto/asmfile.S @@ -0,0 +1,2 @@ +.globl _asfun +ret diff --git a/third_party/python/gyp/test/mac/lto/ccfile.cc b/third_party/python/gyp/test/mac/lto/ccfile.cc new file mode 100644 index 0000000000..2503afd7b1 --- /dev/null +++ b/third_party/python/gyp/test/mac/lto/ccfile.cc @@ -0,0 +1 @@ +void ccfun() {} diff --git a/third_party/python/gyp/test/mac/lto/cfile.c b/third_party/python/gyp/test/mac/lto/cfile.c new file mode 100644 index 0000000000..d02ef4b8d6 --- /dev/null +++ b/third_party/python/gyp/test/mac/lto/cfile.c @@ -0,0 +1 @@ +void cfun() {} diff --git a/third_party/python/gyp/test/mac/lto/mfile.m b/third_party/python/gyp/test/mac/lto/mfile.m new file mode 100644 index 0000000000..85b7d93afe --- /dev/null +++ b/third_party/python/gyp/test/mac/lto/mfile.m @@ -0,0 +1 @@ +void mfun() {} diff --git a/third_party/python/gyp/test/mac/lto/mmfile.mm b/third_party/python/gyp/test/mac/lto/mmfile.mm new file mode 100644 index 0000000000..beaa3595f8 --- /dev/null +++ b/third_party/python/gyp/test/mac/lto/mmfile.mm @@ -0,0 +1 @@ +void mmfun() {} diff --git a/third_party/python/gyp/test/mac/lto/test.gyp b/third_party/python/gyp/test/mac/lto/test.gyp new file mode 100644 index 0000000000..0a8e85183d --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/missing-cfbundlesignature/Info.plist b/third_party/python/gyp/test/mac/missing-cfbundlesignature/Info.plist new file mode 100644 index 0000000000..0c31674884 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/missing-cfbundlesignature/Other-Info.plist b/third_party/python/gyp/test/mac/missing-cfbundlesignature/Other-Info.plist new file mode 100644 index 0000000000..47095281c8 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/missing-cfbundlesignature/Third-Info.plist b/third_party/python/gyp/test/mac/missing-cfbundlesignature/Third-Info.plist new file mode 100644 index 0000000000..5b61fe2664 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/missing-cfbundlesignature/file.c b/third_party/python/gyp/test/mac/missing-cfbundlesignature/file.c new file mode 100644 index 0000000000..237c8ce181 --- /dev/null +++ b/third_party/python/gyp/test/mac/missing-cfbundlesignature/file.c @@ -0,0 +1 @@ +int main() {} diff --git a/third_party/python/gyp/test/mac/missing-cfbundlesignature/test.gyp b/third_party/python/gyp/test/mac/missing-cfbundlesignature/test.gyp new file mode 100644 index 0000000000..b50cc2791a --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/non-strs-flattened-to-env/Info.plist b/third_party/python/gyp/test/mac/non-strs-flattened-to-env/Info.plist new file mode 100644 index 0000000000..11fc4b660d --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/non-strs-flattened-to-env/main.c b/third_party/python/gyp/test/mac/non-strs-flattened-to-env/main.c new file mode 100644 index 0000000000..1711567ef5 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/non-strs-flattened-to-env/test.gyp b/third_party/python/gyp/test/mac/non-strs-flattened-to-env/test.gyp new file mode 100644 index 0000000000..aaf821c925 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/objc-arc/c-file.c b/third_party/python/gyp/test/mac/objc-arc/c-file.c new file mode 100644 index 0000000000..653613206e --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/objc-arc/cc-file.cc b/third_party/python/gyp/test/mac/objc-arc/cc-file.cc new file mode 100644 index 0000000000..95e14ea3e0 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/objc-arc/m-file-no-arc.m b/third_party/python/gyp/test/mac/objc-arc/m-file-no-arc.m new file mode 100644 index 0000000000..8ffaabfaae --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/objc-arc/m-file.m b/third_party/python/gyp/test/mac/objc-arc/m-file.m new file mode 100644 index 0000000000..9689b1f8e5 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/objc-arc/mm-file-no-arc.mm b/third_party/python/gyp/test/mac/objc-arc/mm-file-no-arc.mm new file mode 100644 index 0000000000..0dac539494 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/objc-arc/mm-file.mm b/third_party/python/gyp/test/mac/objc-arc/mm-file.mm new file mode 100644 index 0000000000..9467e96563 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/objc-arc/test.gyp b/third_party/python/gyp/test/mac/objc-arc/test.gyp new file mode 100644 index 0000000000..59cf0e29ce --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/objc-gc/c-file.c b/third_party/python/gyp/test/mac/objc-gc/c-file.c new file mode 100644 index 0000000000..2855a00eaa --- /dev/null +++ b/third_party/python/gyp/test/mac/objc-gc/c-file.c @@ -0,0 +1 @@ +void c_fun() {} diff --git a/third_party/python/gyp/test/mac/objc-gc/cc-file.cc b/third_party/python/gyp/test/mac/objc-gc/cc-file.cc new file mode 100644 index 0000000000..71e47a0126 --- /dev/null +++ b/third_party/python/gyp/test/mac/objc-gc/cc-file.cc @@ -0,0 +1 @@ +void cc_fun() {} diff --git a/third_party/python/gyp/test/mac/objc-gc/main.m b/third_party/python/gyp/test/mac/objc-gc/main.m new file mode 100644 index 0000000000..1a87f8e70f --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/objc-gc/needs-gc-mm.mm b/third_party/python/gyp/test/mac/objc-gc/needs-gc-mm.mm new file mode 100644 index 0000000000..fc3fee9f34 --- /dev/null +++ b/third_party/python/gyp/test/mac/objc-gc/needs-gc-mm.mm @@ -0,0 +1 @@ +void objcpp_fun() { } diff --git a/third_party/python/gyp/test/mac/objc-gc/needs-gc.m b/third_party/python/gyp/test/mac/objc-gc/needs-gc.m new file mode 100644 index 0000000000..ca77976b1d --- /dev/null +++ b/third_party/python/gyp/test/mac/objc-gc/needs-gc.m @@ -0,0 +1 @@ +void objc_fun() { } diff --git a/third_party/python/gyp/test/mac/objc-gc/test.gyp b/third_party/python/gyp/test/mac/objc-gc/test.gyp new file mode 100644 index 0000000000..4d827c1b39 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/postbuild-copy-bundle/Framework-Info.plist b/third_party/python/gyp/test/mac/postbuild-copy-bundle/Framework-Info.plist new file mode 100644 index 0000000000..ec36829c08 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/postbuild-copy-bundle/TestApp-Info.plist b/third_party/python/gyp/test/mac/postbuild-copy-bundle/TestApp-Info.plist new file mode 100644 index 0000000000..98fd515200 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/postbuild-copy-bundle/copied.txt b/third_party/python/gyp/test/mac/postbuild-copy-bundle/copied.txt new file mode 100644 index 0000000000..178413886a --- /dev/null +++ b/third_party/python/gyp/test/mac/postbuild-copy-bundle/copied.txt @@ -0,0 +1 @@ +old copied file diff --git a/third_party/python/gyp/test/mac/postbuild-copy-bundle/empty.c b/third_party/python/gyp/test/mac/postbuild-copy-bundle/empty.c new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/third_party/python/gyp/test/mac/postbuild-copy-bundle/empty.c diff --git a/third_party/python/gyp/test/mac/postbuild-copy-bundle/main.c b/third_party/python/gyp/test/mac/postbuild-copy-bundle/main.c new file mode 100644 index 0000000000..21c1963526 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/postbuild-copy-bundle/postbuild-copy-framework.sh b/third_party/python/gyp/test/mac/postbuild-copy-bundle/postbuild-copy-framework.sh new file mode 100755 index 0000000000..930fec6612 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/postbuild-copy-bundle/resource_file.sb b/third_party/python/gyp/test/mac/postbuild-copy-bundle/resource_file.sb new file mode 100644 index 0000000000..42057fa235 --- /dev/null +++ b/third_party/python/gyp/test/mac/postbuild-copy-bundle/resource_file.sb @@ -0,0 +1 @@ +This is included in the framework bundle. diff --git a/third_party/python/gyp/test/mac/postbuild-copy-bundle/test.gyp b/third_party/python/gyp/test/mac/postbuild-copy-bundle/test.gyp new file mode 100644 index 0000000000..a03e6432f2 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/postbuild-defaults/Info.plist b/third_party/python/gyp/test/mac/postbuild-defaults/Info.plist new file mode 100644 index 0000000000..d3f54d76cd --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/postbuild-defaults/main.c b/third_party/python/gyp/test/mac/postbuild-defaults/main.c new file mode 100644 index 0000000000..1711567ef5 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/postbuild-defaults/postbuild-defaults.sh b/third_party/python/gyp/test/mac/postbuild-defaults/postbuild-defaults.sh new file mode 100755 index 0000000000..56af2a8329 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/postbuild-defaults/test.gyp b/third_party/python/gyp/test/mac/postbuild-defaults/test.gyp new file mode 100644 index 0000000000..be0a075efc --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/postbuild-fail/file.c b/third_party/python/gyp/test/mac/postbuild-fail/file.c new file mode 100644 index 0000000000..91695b10c6 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/postbuild-fail/postbuild-fail.sh b/third_party/python/gyp/test/mac/postbuild-fail/postbuild-fail.sh new file mode 100755 index 0000000000..dc1a60d987 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/postbuild-fail/test.gyp b/third_party/python/gyp/test/mac/postbuild-fail/test.gyp new file mode 100644 index 0000000000..e63283db03 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/postbuild-fail/touch-dynamic.sh b/third_party/python/gyp/test/mac/postbuild-fail/touch-dynamic.sh new file mode 100755 index 0000000000..a388a64102 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/postbuild-fail/touch-static.sh b/third_party/python/gyp/test/mac/postbuild-fail/touch-static.sh new file mode 100755 index 0000000000..97ecaa6868 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/postbuild-multiple-configurations/main.c b/third_party/python/gyp/test/mac/postbuild-multiple-configurations/main.c new file mode 100644 index 0000000000..21c1963526 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/postbuild-multiple-configurations/postbuild-touch-file.sh b/third_party/python/gyp/test/mac/postbuild-multiple-configurations/postbuild-touch-file.sh new file mode 100755 index 0000000000..b6170cf7a7 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/postbuild-multiple-configurations/test.gyp b/third_party/python/gyp/test/mac/postbuild-multiple-configurations/test.gyp new file mode 100644 index 0000000000..c350b20d68 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/postbuild-static-library/empty.c b/third_party/python/gyp/test/mac/postbuild-static-library/empty.c new file mode 100644 index 0000000000..9554336c0c --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/postbuild-static-library/postbuild-touch-file.sh b/third_party/python/gyp/test/mac/postbuild-static-library/postbuild-touch-file.sh new file mode 100755 index 0000000000..37de4de4f6 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/postbuild-static-library/test.gyp b/third_party/python/gyp/test/mac/postbuild-static-library/test.gyp new file mode 100644 index 0000000000..9ef55a0afa --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/postbuilds/copy.sh b/third_party/python/gyp/test/mac/postbuilds/copy.sh new file mode 100755 index 0000000000..ecad0381db --- /dev/null +++ b/third_party/python/gyp/test/mac/postbuilds/copy.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +cp "$@" diff --git a/third_party/python/gyp/test/mac/postbuilds/file.c b/third_party/python/gyp/test/mac/postbuilds/file.c new file mode 100644 index 0000000000..653e71ff7e --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/postbuilds/file_g.c b/third_party/python/gyp/test/mac/postbuilds/file_g.c new file mode 100644 index 0000000000..0f7849d208 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/postbuilds/file_h.c b/third_party/python/gyp/test/mac/postbuilds/file_h.c new file mode 100644 index 0000000000..521d1f4d56 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/postbuilds/script/shared_library_postbuild.sh b/third_party/python/gyp/test/mac/postbuilds/script/shared_library_postbuild.sh new file mode 100755 index 0000000000..c623c8bf21 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/postbuilds/script/static_library_postbuild.sh b/third_party/python/gyp/test/mac/postbuilds/script/static_library_postbuild.sh new file mode 100755 index 0000000000..2bf09b34e1 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/postbuilds/subdirectory/copied_file.txt b/third_party/python/gyp/test/mac/postbuilds/subdirectory/copied_file.txt new file mode 100644 index 0000000000..a634f85b6c --- /dev/null +++ b/third_party/python/gyp/test/mac/postbuilds/subdirectory/copied_file.txt @@ -0,0 +1 @@ +This file should be copied to the products dir. diff --git a/third_party/python/gyp/test/mac/postbuilds/subdirectory/nested_target.gyp b/third_party/python/gyp/test/mac/postbuilds/subdirectory/nested_target.gyp new file mode 100644 index 0000000000..6d4f2395e3 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/postbuilds/test.gyp b/third_party/python/gyp/test/mac/postbuilds/test.gyp new file mode 100644 index 0000000000..7c0b523f86 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/prefixheader/file.c b/third_party/python/gyp/test/mac/prefixheader/file.c new file mode 100644 index 0000000000..d0b39d1f6d --- /dev/null +++ b/third_party/python/gyp/test/mac/prefixheader/file.c @@ -0,0 +1 @@ +MyInt f() { return 0; } diff --git a/third_party/python/gyp/test/mac/prefixheader/file.cc b/third_party/python/gyp/test/mac/prefixheader/file.cc new file mode 100644 index 0000000000..d0b39d1f6d --- /dev/null +++ b/third_party/python/gyp/test/mac/prefixheader/file.cc @@ -0,0 +1 @@ +MyInt f() { return 0; } diff --git a/third_party/python/gyp/test/mac/prefixheader/file.m b/third_party/python/gyp/test/mac/prefixheader/file.m new file mode 100644 index 0000000000..d0b39d1f6d --- /dev/null +++ b/third_party/python/gyp/test/mac/prefixheader/file.m @@ -0,0 +1 @@ +MyInt f() { return 0; } diff --git a/third_party/python/gyp/test/mac/prefixheader/file.mm b/third_party/python/gyp/test/mac/prefixheader/file.mm new file mode 100644 index 0000000000..d0b39d1f6d --- /dev/null +++ b/third_party/python/gyp/test/mac/prefixheader/file.mm @@ -0,0 +1 @@ +MyInt f() { return 0; } diff --git a/third_party/python/gyp/test/mac/prefixheader/header.h b/third_party/python/gyp/test/mac/prefixheader/header.h new file mode 100644 index 0000000000..0716e500c5 --- /dev/null +++ b/third_party/python/gyp/test/mac/prefixheader/header.h @@ -0,0 +1 @@ +typedef int MyInt; diff --git a/third_party/python/gyp/test/mac/prefixheader/test.gyp b/third_party/python/gyp/test/mac/prefixheader/test.gyp new file mode 100644 index 0000000000..7e6b1af807 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/rebuild/TestApp-Info.plist b/third_party/python/gyp/test/mac/rebuild/TestApp-Info.plist new file mode 100644 index 0000000000..98fd515200 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/rebuild/delay-touch.sh b/third_party/python/gyp/test/mac/rebuild/delay-touch.sh new file mode 100755 index 0000000000..7caf105b6e --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/rebuild/empty.c b/third_party/python/gyp/test/mac/rebuild/empty.c new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/third_party/python/gyp/test/mac/rebuild/empty.c diff --git a/third_party/python/gyp/test/mac/rebuild/main.c b/third_party/python/gyp/test/mac/rebuild/main.c new file mode 100644 index 0000000000..237c8ce181 --- /dev/null +++ b/third_party/python/gyp/test/mac/rebuild/main.c @@ -0,0 +1 @@ +int main() {} diff --git a/third_party/python/gyp/test/mac/rebuild/test.gyp b/third_party/python/gyp/test/mac/rebuild/test.gyp new file mode 100644 index 0000000000..15b4e4ef2f --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/rpath/file.c b/third_party/python/gyp/test/mac/rpath/file.c new file mode 100644 index 0000000000..56757a701b --- /dev/null +++ b/third_party/python/gyp/test/mac/rpath/file.c @@ -0,0 +1 @@ +void f() {} diff --git a/third_party/python/gyp/test/mac/rpath/main.c b/third_party/python/gyp/test/mac/rpath/main.c new file mode 100644 index 0000000000..237c8ce181 --- /dev/null +++ b/third_party/python/gyp/test/mac/rpath/main.c @@ -0,0 +1 @@ +int main() {} diff --git a/third_party/python/gyp/test/mac/rpath/test.gyp b/third_party/python/gyp/test/mac/rpath/test.gyp new file mode 100644 index 0000000000..7255cb7cd2 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/sdkroot/file.cc b/third_party/python/gyp/test/mac/sdkroot/file.cc new file mode 100644 index 0000000000..13ae971040 --- /dev/null +++ b/third_party/python/gyp/test/mac/sdkroot/file.cc @@ -0,0 +1,5 @@ +#include <map> +using std::map; + +int main() { +} diff --git a/third_party/python/gyp/test/mac/sdkroot/test.gyp b/third_party/python/gyp/test/mac/sdkroot/test.gyp new file mode 100644 index 0000000000..2fc11a0280 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/sdkroot/test_shorthand.sh b/third_party/python/gyp/test/mac/sdkroot/test_shorthand.sh new file mode 100755 index 0000000000..ac4ac229ae --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/sourceless-module/empty.c b/third_party/python/gyp/test/mac/sourceless-module/empty.c new file mode 100644 index 0000000000..237c8ce181 --- /dev/null +++ b/third_party/python/gyp/test/mac/sourceless-module/empty.c @@ -0,0 +1 @@ +int main() {} diff --git a/third_party/python/gyp/test/mac/sourceless-module/empty.txt b/third_party/python/gyp/test/mac/sourceless-module/empty.txt new file mode 100644 index 0000000000..139597f9cb --- /dev/null +++ b/third_party/python/gyp/test/mac/sourceless-module/empty.txt @@ -0,0 +1,2 @@ + + diff --git a/third_party/python/gyp/test/mac/sourceless-module/fun.c b/third_party/python/gyp/test/mac/sourceless-module/fun.c new file mode 100644 index 0000000000..d64ff8ca23 --- /dev/null +++ b/third_party/python/gyp/test/mac/sourceless-module/fun.c @@ -0,0 +1 @@ +int f() { return 42; } diff --git a/third_party/python/gyp/test/mac/sourceless-module/test.gyp b/third_party/python/gyp/test/mac/sourceless-module/test.gyp new file mode 100644 index 0000000000..cbbe63df02 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/strip/file.c b/third_party/python/gyp/test/mac/strip/file.c new file mode 100644 index 0000000000..a4c504de71 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/strip/main.c b/third_party/python/gyp/test/mac/strip/main.c new file mode 100644 index 0000000000..b2291a6b09 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/strip/strip.saves b/third_party/python/gyp/test/mac/strip/strip.saves new file mode 100644 index 0000000000..b60ca62857 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/strip/subdirectory/nested_file.c b/third_party/python/gyp/test/mac/strip/subdirectory/nested_file.c new file mode 100644 index 0000000000..50daa6c13b --- /dev/null +++ b/third_party/python/gyp/test/mac/strip/subdirectory/nested_file.c @@ -0,0 +1 @@ +void nested_f() {} diff --git a/third_party/python/gyp/test/mac/strip/subdirectory/nested_strip.saves b/third_party/python/gyp/test/mac/strip/subdirectory/nested_strip.saves new file mode 100644 index 0000000000..d434c0ef45 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/strip/subdirectory/subdirectory.gyp b/third_party/python/gyp/test/mac/strip/subdirectory/subdirectory.gyp new file mode 100644 index 0000000000..5d0d190914 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/strip/subdirectory/test_reading_save_file_from_postbuild.sh b/third_party/python/gyp/test/mac/strip/subdirectory/test_reading_save_file_from_postbuild.sh new file mode 100755 index 0000000000..976943680e --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/strip/test-defaults.gyp b/third_party/python/gyp/test/mac/strip/test-defaults.gyp new file mode 100644 index 0000000000..e688b955a7 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/strip/test.gyp b/third_party/python/gyp/test/mac/strip/test.gyp new file mode 100644 index 0000000000..2558aa91bb --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/swift-library/Info.plist b/third_party/python/gyp/test/mac/swift-library/Info.plist new file mode 100644 index 0000000000..804990ca5e --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/swift-library/file.swift b/third_party/python/gyp/test/mac/swift-library/file.swift new file mode 100644 index 0000000000..88db7da5c6 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/swift-library/test.gyp b/third_party/python/gyp/test/mac/swift-library/test.gyp new file mode 100644 index 0000000000..373a677cbd --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/type_envvars/file.c b/third_party/python/gyp/test/mac/type_envvars/file.c new file mode 100644 index 0000000000..9cddaf1b0b --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/type_envvars/test.gyp b/third_party/python/gyp/test/mac/type_envvars/test.gyp new file mode 100644 index 0000000000..465670056b --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/type_envvars/test_bundle_executable.sh b/third_party/python/gyp/test/mac/type_envvars/test_bundle_executable.sh new file mode 100755 index 0000000000..9a08c8f0cc --- /dev/null +++ b/third_party/python/gyp/test/mac/type_envvars/test_bundle_executable.sh @@ -0,0 +1,30 @@ +#!/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" + +test "${CONTENTS_FOLDER_PATH}" = "My App.app/Contents" +test "${EXECUTABLE_FOLDER_PATH}" = "My App.app/Contents/MacOS" +test "${UNLOCALIZED_RESOURCES_FOLDER_PATH}" = "My App.app/Contents/Resources" +test "${JAVA_FOLDER_PATH}" = "My App.app/Contents/Resources/Java" +test "${FRAMEWORKS_FOLDER_PATH}" = "My App.app/Contents/Frameworks" +test "${SHARED_FRAMEWORKS_FOLDER_PATH}" = "My App.app/Contents/SharedFrameworks" +test "${SHARED_SUPPORT_FOLDER_PATH}" = "My App.app/Contents/SharedSupport" +test "${PLUGINS_FOLDER_PATH}" = "My App.app/Contents/PlugIns" +test "${XPCSERVICES_FOLDER_PATH}" = "My App.app/Contents/XPCServices" + +[[ ! $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/third_party/python/gyp/test/mac/type_envvars/test_bundle_loadable_module.sh b/third_party/python/gyp/test/mac/type_envvars/test_bundle_loadable_module.sh new file mode 100755 index 0000000000..b5c7638293 --- /dev/null +++ b/third_party/python/gyp/test/mac/type_envvars/test_bundle_loadable_module.sh @@ -0,0 +1,35 @@ +#!/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 + +test $CONTENTS_FOLDER_PATH = bundle_loadable_module.bundle/Contents +test $EXECUTABLE_FOLDER_PATH = bundle_loadable_module.bundle/Contents/MacOS +test $UNLOCALIZED_RESOURCES_FOLDER_PATH = \ + bundle_loadable_module.bundle/Contents/Resources +test $JAVA_FOLDER_PATH = bundle_loadable_module.bundle/Contents/Resources/Java +test $FRAMEWORKS_FOLDER_PATH = bundle_loadable_module.bundle/Contents/Frameworks +test $SHARED_FRAMEWORKS_FOLDER_PATH = \ + bundle_loadable_module.bundle/Contents/SharedFrameworks +test $SHARED_SUPPORT_FOLDER_PATH = \ + bundle_loadable_module.bundle/Contents/SharedSupport +test $PLUGINS_FOLDER_PATH = bundle_loadable_module.bundle/Contents/PlugIns +test $XPCSERVICES_FOLDER_PATH = \ + bundle_loadable_module.bundle/Contents/XPCServices + +[[ ! $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/third_party/python/gyp/test/mac/type_envvars/test_bundle_shared_library.sh b/third_party/python/gyp/test/mac/type_envvars/test_bundle_shared_library.sh new file mode 100755 index 0000000000..9c2dc0626f --- /dev/null +++ b/third_party/python/gyp/test/mac/type_envvars/test_bundle_shared_library.sh @@ -0,0 +1,38 @@ +#!/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 $CONTENTS_FOLDER_PATH = bundle_shared_library.framework/Versions/A +test $EXECUTABLE_FOLDER_PATH = bundle_shared_library.framework/Versions/A +test $UNLOCALIZED_RESOURCES_FOLDER_PATH = \ + bundle_shared_library.framework/Versions/A/Resources +test $JAVA_FOLDER_PATH = \ + bundle_shared_library.framework/Versions/A/Resources/Java +test $FRAMEWORKS_FOLDER_PATH = \ + bundle_shared_library.framework/Versions/A/Frameworks +test $SHARED_FRAMEWORKS_FOLDER_PATH = \ + bundle_shared_library.framework/Versions/A/SharedFrameworks +test $SHARED_SUPPORT_FOLDER_PATH = \ + bundle_shared_library.framework/Versions/A/Resources +test $PLUGINS_FOLDER_PATH = bundle_shared_library.framework/Versions/A/PlugIns +test $XPCSERVICES_FOLDER_PATH = \ + bundle_shared_library.framework/Versions/A/XPCServices + +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/third_party/python/gyp/test/mac/type_envvars/test_check_sdkroot.sh b/third_party/python/gyp/test/mac/type_envvars/test_check_sdkroot.sh new file mode 100755 index 0000000000..1297dbeff1 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/type_envvars/test_nonbundle_executable.sh b/third_party/python/gyp/test/mac/type_envvars/test_nonbundle_executable.sh new file mode 100755 index 0000000000..9fbbd95b8d --- /dev/null +++ b/third_party/python/gyp/test/mac/type_envvars/test_nonbundle_executable.sh @@ -0,0 +1,33 @@ +#!/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-_} ]] + +[[ ! $CONTENTS_FOLDER_PATH && ${CONTENTS_FOLDER_PATH-_} ]] +[[ ! $EXECUTABLE_FOLDER_PATH && ${EXECUTABLE_FOLDER_PATH-_} ]] +[[ ! $UNLOCALIZED_RESOURCES_FOLDER_PATH \ + && ${UNLOCALIZED_RESOURCES_FOLDER_PATH-_} ]] +[[ ! $JAVA_FOLDER_PATH && ${JAVA_FOLDER_PATH-_} ]] +[[ ! $FRAMEWORKS_FOLDER_PATH && ${FRAMEWORKS_FOLDER_PATH-_} ]] +[[ ! $SHARED_FRAMEWORKS_FOLDER_PATH && ${SHARED_FRAMEWORKS_FOLDER_PATH-_} ]] +[[ ! $SHARED_SUPPORT_FOLDER_PATH && ${SHARED_SUPPORT_FOLDER_PATH-_} ]] +[[ ! $PLUGINS_FOLDER_PATH && ${PLUGINS_FOLDER_PATH-_} ]] +[[ ! $XPCSERVICES_FOLDER_PATH && ${XPCSERVICES_FOLDER_PATH-_} ]] + +[[ ! $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/third_party/python/gyp/test/mac/type_envvars/test_nonbundle_loadable_module.sh b/third_party/python/gyp/test/mac/type_envvars/test_nonbundle_loadable_module.sh new file mode 100755 index 0000000000..b4c3ba976e --- /dev/null +++ b/third_party/python/gyp/test/mac/type_envvars/test_nonbundle_loadable_module.sh @@ -0,0 +1,31 @@ +#!/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-_} ]] + +[[ ! $CONTENTS_FOLDER_PATH && ${CONTENTS_FOLDER_PATH-_} ]] +[[ ! $EXECUTABLE_FOLDER_PATH && ${EXECUTABLE_FOLDER_PATH-_} ]] +[[ ! $UNLOCALIZED_RESOURCES_FOLDER_PATH \ + && ${UNLOCALIZED_RESOURCES_FOLDER_PATH-_} ]] +[[ ! $JAVA_FOLDER_PATH && ${JAVA_FOLDER_PATH-_} ]] +[[ ! $FRAMEWORKS_FOLDER_PATH && ${FRAMEWORKS_FOLDER_PATH-_} ]] +[[ ! $SHARED_FRAMEWORKS_FOLDER_PATH && ${SHARED_FRAMEWORKS_FOLDER_PATH-_} ]] +[[ ! $SHARED_SUPPORT_FOLDER_PATH && ${SHARED_SUPPORT_FOLDER_PATH-_} ]] +[[ ! $PLUGINS_FOLDER_PATH && ${PLUGINS_FOLDER_PATH-_} ]] +[[ ! $XPCSERVICES_FOLDER_PATH && ${XPCSERVICES_FOLDER_PATH-_} ]] + +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/third_party/python/gyp/test/mac/type_envvars/test_nonbundle_none.sh b/third_party/python/gyp/test/mac/type_envvars/test_nonbundle_none.sh new file mode 100755 index 0000000000..e2dc7fd9cd --- /dev/null +++ b/third_party/python/gyp/test/mac/type_envvars/test_nonbundle_none.sh @@ -0,0 +1,32 @@ +#!/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-_} ]] + +[[ ! $CONTENTS_FOLDER_PATH && ${CONTENTS_FOLDER_PATH-_} ]] +[[ ! $EXECUTABLE_FOLDER_PATH && ${EXECUTABLE_FOLDER_PATH-_} ]] +[[ ! $UNLOCALIZED_RESOURCES_FOLDER_PATH \ + && ${UNLOCALIZED_RESOURCES_FOLDER_PATH-_} ]] +[[ ! $JAVA_FOLDER_PATH && ${JAVA_FOLDER_PATH-_} ]] +[[ ! $FRAMEWORKS_FOLDER_PATH && ${FRAMEWORKS_FOLDER_PATH-_} ]] +[[ ! $SHARED_FRAMEWORKS_FOLDER_PATH && ${SHARED_FRAMEWORKS_FOLDER_PATH-_} ]] +[[ ! $SHARED_SUPPORT_FOLDER_PATH && ${SHARED_SUPPORT_FOLDER_PATH-_} ]] +[[ ! $PLUGINS_FOLDER_PATH && ${PLUGINS_FOLDER_PATH-_} ]] +[[ ! $XPCSERVICES_FOLDER_PATH && ${XPCSERVICES_FOLDER_PATH-_} ]] + +[[ ! $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/third_party/python/gyp/test/mac/type_envvars/test_nonbundle_shared_library.sh b/third_party/python/gyp/test/mac/type_envvars/test_nonbundle_shared_library.sh new file mode 100755 index 0000000000..ba63ec1a48 --- /dev/null +++ b/third_party/python/gyp/test/mac/type_envvars/test_nonbundle_shared_library.sh @@ -0,0 +1,31 @@ +#!/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-_} ]] + +[[ ! $CONTENTS_FOLDER_PATH && ${CONTENTS_FOLDER_PATH-_} ]] +[[ ! $EXECUTABLE_FOLDER_PATH && ${EXECUTABLE_FOLDER_PATH-_} ]] +[[ ! $UNLOCALIZED_RESOURCES_FOLDER_PATH && \ + ${UNLOCALIZED_RESOURCES_FOLDER_PATH-_} ]] +[[ ! $JAVA_FOLDER_PATH && ${JAVA_FOLDER_PATH-_} ]] +[[ ! $FRAMEWORKS_FOLDER_PATH && ${FRAMEWORKS_FOLDER_PATH-_} ]] +[[ ! $SHARED_FRAMEWORKS_FOLDER_PATH && ${SHARED_FRAMEWORKS_FOLDER_PATH-_} ]] +[[ ! $SHARED_SUPPORT_FOLDER_PATH && ${SHARED_SUPPORT_FOLDER_PATH-_} ]] +[[ ! $PLUGINS_FOLDER_PATH && ${PLUGINS_FOLDER_PATH-_} ]] +[[ ! $XPCSERVICES_FOLDER_PATH && ${XPCSERVICES_FOLDER_PATH-_} ]] + +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/third_party/python/gyp/test/mac/type_envvars/test_nonbundle_static_library.sh b/third_party/python/gyp/test/mac/type_envvars/test_nonbundle_static_library.sh new file mode 100755 index 0000000000..63aac57b0b --- /dev/null +++ b/third_party/python/gyp/test/mac/type_envvars/test_nonbundle_static_library.sh @@ -0,0 +1,31 @@ +#!/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-_} ]] + +[[ ! $CONTENTS_FOLDER_PATH && ${CONTENTS_FOLDER_PATH-_} ]] +[[ ! $EXECUTABLE_FOLDER_PATH && ${EXECUTABLE_FOLDER_PATH-_} ]] +[[ ! $UNLOCALIZED_RESOURCES_FOLDER_PATH && \ + ${UNLOCALIZED_RESOURCES_FOLDER_PATH-_} ]] +[[ ! $JAVA_FOLDER_PATH && ${JAVA_FOLDER_PATH-_} ]] +[[ ! $FRAMEWORKS_FOLDER_PATH && ${FRAMEWORKS_FOLDER_PATH-_} ]] +[[ ! $SHARED_FRAMEWORKS_FOLDER_PATH && ${SHARED_FRAMEWORKS_FOLDER_PATH-_} ]] +[[ ! $SHARED_SUPPORT_FOLDER_PATH && ${SHARED_SUPPORT_FOLDER_PATH-_} ]] +[[ ! $PLUGINS_FOLDER_PATH && ${PLUGINS_FOLDER_PATH-_} ]] +[[ ! $XPCSERVICES_FOLDER_PATH && ${XPCSERVICES_FOLDER_PATH-_} ]] + +[[ ! $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/third_party/python/gyp/test/mac/unicode-settings/file.cc b/third_party/python/gyp/test/mac/unicode-settings/file.cc new file mode 100644 index 0000000000..b2f997621b --- /dev/null +++ b/third_party/python/gyp/test/mac/unicode-settings/file.cc @@ -0,0 +1,2 @@ +int main() { +} diff --git a/third_party/python/gyp/test/mac/unicode-settings/test.gyp b/third_party/python/gyp/test/mac/unicode-settings/test.gyp new file mode 100644 index 0000000000..b331ae453f --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/unicode-settings/test_bundle_display_name.sh b/third_party/python/gyp/test/mac/unicode-settings/test_bundle_display_name.sh new file mode 100755 index 0000000000..95dd6267a3 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/xcode-env-order/Info.plist b/third_party/python/gyp/test/mac/xcode-env-order/Info.plist new file mode 100644 index 0000000000..e11f21e52d --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/xcode-env-order/file.ext1 b/third_party/python/gyp/test/mac/xcode-env-order/file.ext1 new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/third_party/python/gyp/test/mac/xcode-env-order/file.ext1 diff --git a/third_party/python/gyp/test/mac/xcode-env-order/file.ext2 b/third_party/python/gyp/test/mac/xcode-env-order/file.ext2 new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/third_party/python/gyp/test/mac/xcode-env-order/file.ext2 diff --git a/third_party/python/gyp/test/mac/xcode-env-order/file.ext3 b/third_party/python/gyp/test/mac/xcode-env-order/file.ext3 new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/third_party/python/gyp/test/mac/xcode-env-order/file.ext3 diff --git a/third_party/python/gyp/test/mac/xcode-env-order/main.c b/third_party/python/gyp/test/mac/xcode-env-order/main.c new file mode 100644 index 0000000000..1bf4b2a11a --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/xcode-env-order/test.gyp b/third_party/python/gyp/test/mac/xcode-env-order/test.gyp new file mode 100644 index 0000000000..8f975f7d6b --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/xcode-gcc/aliasing.cc b/third_party/python/gyp/test/mac/xcode-gcc/aliasing.cc new file mode 100644 index 0000000000..16a41efb15 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/xcode-gcc/test-clang.gyp b/third_party/python/gyp/test/mac/xcode-gcc/test-clang.gyp new file mode 100644 index 0000000000..9f4a98ae73 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/xcode-gcc/test.gyp b/third_party/python/gyp/test/mac/xcode-gcc/test.gyp new file mode 100644 index 0000000000..1ca8b215d8 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/xcode-gcc/valid_c.c b/third_party/python/gyp/test/mac/xcode-gcc/valid_c.c new file mode 100644 index 0000000000..2b10ac3ed7 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/xcode-gcc/valid_cc.cc b/third_party/python/gyp/test/mac/xcode-gcc/valid_cc.cc new file mode 100644 index 0000000000..31cddc3c9c --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/xcode-gcc/valid_m.m b/third_party/python/gyp/test/mac/xcode-gcc/valid_m.m new file mode 100644 index 0000000000..95bddb2723 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/xcode-gcc/valid_mm.mm b/third_party/python/gyp/test/mac/xcode-gcc/valid_mm.mm new file mode 100644 index 0000000000..a7db7e3ad6 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/xcode-gcc/warn_about_invalid_offsetof_macro.cc b/third_party/python/gyp/test/mac/xcode-gcc/warn_about_invalid_offsetof_macro.cc new file mode 100644 index 0000000000..4a4612be0d --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/xcode-gcc/warn_about_missing_newline.c b/third_party/python/gyp/test/mac/xcode-gcc/warn_about_missing_newline.c new file mode 100644 index 0000000000..6faf0895db --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/xcode-support-actions/source.c b/third_party/python/gyp/test/mac/xcode-support-actions/source.c new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/third_party/python/gyp/test/mac/xcode-support-actions/source.c diff --git a/third_party/python/gyp/test/mac/xcode-support-actions/test.gyp b/third_party/python/gyp/test/mac/xcode-support-actions/test.gyp new file mode 100644 index 0000000000..ad81b8c456 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/xctest/MyClass.h b/third_party/python/gyp/test/mac/xctest/MyClass.h new file mode 100644 index 0000000000..dde13aa33d --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/xctest/MyClass.m b/third_party/python/gyp/test/mac/xctest/MyClass.m new file mode 100644 index 0000000000..df11471b07 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/xctest/TestCase.m b/third_party/python/gyp/test/mac/xctest/TestCase.m new file mode 100644 index 0000000000..36846a1fda --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/xctest/resource.txt b/third_party/python/gyp/test/mac/xctest/resource.txt new file mode 100644 index 0000000000..257cc5642c --- /dev/null +++ b/third_party/python/gyp/test/mac/xctest/resource.txt @@ -0,0 +1 @@ +foo diff --git a/third_party/python/gyp/test/mac/xctest/test.gyp b/third_party/python/gyp/test/mac/xctest/test.gyp new file mode 100644 index 0000000000..ac25656b35 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/mac/xctest/test.xcodeproj/xcshareddata/xcschemes/classes.xcscheme b/third_party/python/gyp/test/mac/xctest/test.xcodeproj/xcshareddata/xcschemes/classes.xcscheme new file mode 100644 index 0000000000..6bd1bb9696 --- /dev/null +++ b/third_party/python/gyp/test/mac/xctest/test.xcodeproj/xcshareddata/xcschemes/classes.xcscheme @@ -0,0 +1,69 @@ +<?xml version="1.0" encoding="UTF-8"?> +<Scheme + LastUpgradeVersion = "0500" + version = "1.3"> + <BuildAction + parallelizeBuildables = "YES" + buildImplicitDependencies = "YES"> + <BuildActionEntries> + <BuildActionEntry + buildForTesting = "YES" + buildForRunning = "YES" + buildForProfiling = "YES" + buildForArchiving = "YES" + buildForAnalyzing = "YES"> + <BuildableReference + BuildableIdentifier = "primary" + BlueprintIdentifier = "D3B79173B4570A3C70A902FF" + BuildableName = "libclasses.a" + BlueprintName = "classes" + ReferencedContainer = "container:test.xcodeproj"> + </BuildableReference> + </BuildActionEntry> + </BuildActionEntries> + </BuildAction> + <TestAction + selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" + selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" + shouldUseLaunchSchemeArgsEnv = "YES" + buildConfiguration = "Default"> + <Testables> + <TestableReference + skipped = "NO"> + <BuildableReference + BuildableIdentifier = "primary" + BlueprintIdentifier = "2ACDAB234B9E5D65CACBCF9C" + BuildableName = "tests.xctest" + BlueprintName = "tests" + ReferencedContainer = "container:test.xcodeproj"> + </BuildableReference> + </TestableReference> + </Testables> + </TestAction> + <LaunchAction + selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" + selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" + launchStyle = "0" + useCustomWorkingDirectory = "NO" + buildConfiguration = "Default" + ignoresPersistentStateOnLaunch = "NO" + debugDocumentVersioning = "YES" + allowLocationSimulation = "YES"> + <AdditionalOptions> + </AdditionalOptions> + </LaunchAction> + <ProfileAction + shouldUseLaunchSchemeArgsEnv = "YES" + savedToolIdentifier = "" + useCustomWorkingDirectory = "NO" + buildConfiguration = "Default" + debugDocumentVersioning = "YES"> + </ProfileAction> + <AnalyzeAction + buildConfiguration = "Default"> + </AnalyzeAction> + <ArchiveAction + buildConfiguration = "Default" + revealArchiveInOrganizer = "YES"> + </ArchiveAction> +</Scheme> diff --git a/third_party/python/gyp/test/mac/xcuitest/Info.plist b/third_party/python/gyp/test/mac/xcuitest/Info.plist new file mode 100644 index 0000000000..ae8852b836 --- /dev/null +++ b/third_party/python/gyp/test/mac/xcuitest/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>BNDL</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/third_party/python/gyp/test/mac/xcuitest/MyAppDelegate.h b/third_party/python/gyp/test/mac/xcuitest/MyAppDelegate.h new file mode 100644 index 0000000000..445be2cb42 --- /dev/null +++ b/third_party/python/gyp/test/mac/xcuitest/MyAppDelegate.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 <UIKit/UIKit.h> + +@interface MyAppDelegate : NSObject<UIApplicationDelegate> +@end diff --git a/third_party/python/gyp/test/mac/xcuitest/MyAppDelegate.m b/third_party/python/gyp/test/mac/xcuitest/MyAppDelegate.m new file mode 100644 index 0000000000..6ad60fa9d4 --- /dev/null +++ b/third_party/python/gyp/test/mac/xcuitest/MyAppDelegate.m @@ -0,0 +1,19 @@ +// 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 "MyAppDelegate.h" + + +@implementation MyAppDelegate +@synthesize window; + +- (BOOL)application:(UIApplication *)application + didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { + self.window = [[UIWindow alloc] init]; + self.window.rootViewController = [[UIViewController alloc] init]; + [self.window makeKeyAndVisible]; + return YES; +} + +@end diff --git a/third_party/python/gyp/test/mac/xcuitest/TestCase.m b/third_party/python/gyp/test/mac/xcuitest/TestCase.m new file mode 100644 index 0000000000..1f32b7af74 --- /dev/null +++ b/third_party/python/gyp/test/mac/xcuitest/TestCase.m @@ -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. + +#import <XCTest/XCTest.h> + +@interface TestCase : XCTestCase +@end + +@implementation TestCase +- (void)testFoo { + XCUIApplication *foo = [[XCUIApplication alloc] init]; + XCTAssertNotNil(foo, @"expected non-nil object"); +} +@end diff --git a/third_party/python/gyp/test/mac/xcuitest/main.m b/third_party/python/gyp/test/mac/xcuitest/main.m new file mode 100644 index 0000000000..e7cb62e639 --- /dev/null +++ b/third_party/python/gyp/test/mac/xcuitest/main.m @@ -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. + +#import <UIKit/UIKit.h> + +#import "MyAppDelegate.h" + +int main(int argc, char * argv[]) { + @autoreleasepool { + UIApplicationMain(argc, argv, + nil, NSStringFromClass([MyAppDelegate class])); + } + return 1; +} diff --git a/third_party/python/gyp/test/mac/xcuitest/resource.txt b/third_party/python/gyp/test/mac/xcuitest/resource.txt new file mode 100644 index 0000000000..257cc5642c --- /dev/null +++ b/third_party/python/gyp/test/mac/xcuitest/resource.txt @@ -0,0 +1 @@ +foo diff --git a/third_party/python/gyp/test/mac/xcuitest/test.gyp b/third_party/python/gyp/test/mac/xcuitest/test.gyp new file mode 100644 index 0000000000..80cdf9032d --- /dev/null +++ b/third_party/python/gyp/test/mac/xcuitest/test.gyp @@ -0,0 +1,69 @@ +# 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': { + 'xcode_settings': { + 'SDKROOT': 'iphoneos', + 'FRAMEWORK_SEARCH_PATHS': [ + '$(inherited)', + '$(DEVELOPER_FRAMEWORKS_DIR)', + ], + 'OTHER_LDFLAGS': [ + '$(inherited)', + '-ObjC', + ], + 'GCC_PREFIX_HEADER': '', + 'CLANG_ENABLE_OBJC_ARC': 'YES', + 'INFOPLIST_FILE': 'Info.plist', + }, + }, + 'targets': [ + { + 'target_name': 'testApp', + 'type': 'executable', + 'mac_bundle': 1, + 'sources': [ + 'MyAppDelegate.h', + 'MyAppDelegate.m', + 'main.m', + ], + 'link_settings': { + 'libraries': [ + '$(SDKROOT)/System/Library/Frameworks/Foundation.framework', + '$(SDKROOT)/System/Library/Frameworks/UIKit.framework', + ], + }, + }, + { + 'target_name': 'tests', + 'type': 'loadable_module', + 'mac_bundle': 1, + 'mac_xcuitest_bundle': 1, + 'sources': [ + 'TestCase.m', + ], + 'dependencies': [ + 'testApp', + ], + 'mac_bundle_resources': [ + 'resource.txt', + ], + 'variables': { + # This must *not* be set for xctest ui tests. + 'xctest_host': '', + }, + 'link_settings': { + 'libraries': [ + '$(SDKROOT)/System/Library/Frameworks/XCTest.framework', + ] + }, + 'xcode_settings': { + 'WRAPPER_EXTENSION': 'xctest', + 'TEST_TARGET_NAME': 'testApp', + }, + }, + ], +} + diff --git a/third_party/python/gyp/test/make/dependencies.gyp b/third_party/python/gyp/test/make/dependencies.gyp new file mode 100644 index 0000000000..e2bee24fce --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/make/gyptest-dependencies.py b/third_party/python/gyp/test/make/gyptest-dependencies.py new file mode 100755 index 0000000000..d215f76782 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/make/gyptest-noload.py b/third_party/python/gyp/test/make/gyptest-noload.py new file mode 100755 index 0000000000..1f5103315c --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/make/main.cc b/third_party/python/gyp/test/make/main.cc new file mode 100644 index 0000000000..3b9a705c24 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/make/main.h b/third_party/python/gyp/test/make/main.h new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/third_party/python/gyp/test/make/main.h diff --git a/third_party/python/gyp/test/make/noload/all.gyp b/third_party/python/gyp/test/make/noload/all.gyp new file mode 100644 index 0000000000..1617a9e97c --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/make/noload/lib/shared.c b/third_party/python/gyp/test/make/noload/lib/shared.c new file mode 100644 index 0000000000..51776c5acf --- /dev/null +++ b/third_party/python/gyp/test/make/noload/lib/shared.c @@ -0,0 +1,3 @@ +#include "shared.h" + +const char kSharedStr[] = "shared.c"; diff --git a/third_party/python/gyp/test/make/noload/lib/shared.gyp b/third_party/python/gyp/test/make/noload/lib/shared.gyp new file mode 100644 index 0000000000..8a8841b3a0 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/make/noload/lib/shared.h b/third_party/python/gyp/test/make/noload/lib/shared.h new file mode 100644 index 0000000000..a21da7538b --- /dev/null +++ b/third_party/python/gyp/test/make/noload/lib/shared.h @@ -0,0 +1 @@ +extern const char kSharedStr[]; diff --git a/third_party/python/gyp/test/make/noload/main.c b/third_party/python/gyp/test/make/noload/main.c new file mode 100644 index 0000000000..26ec1889ad --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/make_global_settings/ar/gyptest-make_global_settings_ar.py b/third_party/python/gyp/test/make_global_settings/ar/gyptest-make_global_settings_ar.py new file mode 100644 index 0000000000..aabc5618d5 --- /dev/null +++ b/third_party/python/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.startswith('linux') or sys.platform == '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/third_party/python/gyp/test/make_global_settings/ar/make_global_settings_ar.gyp b/third_party/python/gyp/test/make_global_settings/ar/make_global_settings_ar.gyp new file mode 100644 index 0000000000..3430d82a51 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/make_global_settings/basics/gyptest-make_global_settings.py b/third_party/python/gyp/test/make_global_settings/basics/gyptest-make_global_settings.py new file mode 100644 index 0000000000..8f48875967 --- /dev/null +++ b/third_party/python/gyp/test/make_global_settings/basics/gyptest-make_global_settings.py @@ -0,0 +1,51 @@ +#!/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. +""" + +from __future__ import print_function + +import os +import sys +import TestGyp + +print("This test is currently disabled: https://crbug.com/483696.") +sys.exit(0) + +test_format = ['ninja'] +if sys.platform.startswith('linux') or sys.platform == '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.startswith('linux'): + 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/third_party/python/gyp/test/make_global_settings/basics/make_global_settings.gyp b/third_party/python/gyp/test/make_global_settings/basics/make_global_settings.gyp new file mode 100644 index 0000000000..47dbc8570f --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/make_global_settings/env-wrapper/gyptest-wrapper.py b/third_party/python/gyp/test/make_global_settings/env-wrapper/gyptest-wrapper.py new file mode 100644 index 0000000000..409799e315 --- /dev/null +++ b/third_party/python/gyp/test/make_global_settings/env-wrapper/gyptest-wrapper.py @@ -0,0 +1,51 @@ +#!/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. +""" + +from __future__ import print_function + +import os +import sys +import TestGyp + +print("This test is currently disabled: https://crbug.com/483696.") +sys.exit(0) + +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/third_party/python/gyp/test/make_global_settings/env-wrapper/wrapper.gyp b/third_party/python/gyp/test/make_global_settings/env-wrapper/wrapper.gyp new file mode 100644 index 0000000000..1698d71dd4 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/make_global_settings/full-toolchain/bar.cc b/third_party/python/gyp/test/make_global_settings/full-toolchain/bar.cc new file mode 100644 index 0000000000..afb422ba1a --- /dev/null +++ b/third_party/python/gyp/test/make_global_settings/full-toolchain/bar.cc @@ -0,0 +1 @@ +#error Not a real source file diff --git a/third_party/python/gyp/test/make_global_settings/full-toolchain/foo.c b/third_party/python/gyp/test/make_global_settings/full-toolchain/foo.c new file mode 100644 index 0000000000..afb422ba1a --- /dev/null +++ b/third_party/python/gyp/test/make_global_settings/full-toolchain/foo.c @@ -0,0 +1 @@ +#error Not a real source file diff --git a/third_party/python/gyp/test/make_global_settings/full-toolchain/gyptest-make_global_settings.py b/third_party/python/gyp/test/make_global_settings/full-toolchain/gyptest-make_global_settings.py new file mode 100644 index 0000000000..542fd631c2 --- /dev/null +++ b/third_party/python/gyp/test/make_global_settings/full-toolchain/gyptest-make_global_settings.py @@ -0,0 +1,53 @@ +#!/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. +""" + +from __future__ import print_function + +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) + +print("This test is currently disabled: https://crbug.com/483696.") +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/third_party/python/gyp/test/make_global_settings/full-toolchain/make_global_settings.gyp b/third_party/python/gyp/test/make_global_settings/full-toolchain/make_global_settings.gyp new file mode 100644 index 0000000000..2c3266322d --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/make_global_settings/full-toolchain/my_nm.py b/third_party/python/gyp/test/make_global_settings/full-toolchain/my_nm.py new file mode 100755 index 0000000000..2c4e678110 --- /dev/null +++ b/third_party/python/gyp/test/make_global_settings/full-toolchain/my_nm.py @@ -0,0 +1,9 @@ +#!/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. +from __future__ import print_function +import sys +print(sys.argv) +with open('RAN_MY_NM', 'w') as f: + f.write('RAN_MY_NM') diff --git a/third_party/python/gyp/test/make_global_settings/full-toolchain/my_readelf.py b/third_party/python/gyp/test/make_global_settings/full-toolchain/my_readelf.py new file mode 100755 index 0000000000..626665435e --- /dev/null +++ b/third_party/python/gyp/test/make_global_settings/full-toolchain/my_readelf.py @@ -0,0 +1,9 @@ +#!/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. +from __future__ import print_function +import sys +print(sys.argv) +with open('RAN_MY_READELF', 'w') as f: + f.write('RAN_MY_READELF') diff --git a/third_party/python/gyp/test/make_global_settings/ld/gyptest-make_global_settings_ld.py b/third_party/python/gyp/test/make_global_settings/ld/gyptest-make_global_settings_ld.py new file mode 100644 index 0000000000..e5f50fbb5b --- /dev/null +++ b/third_party/python/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.startswith('linux') or sys.platform == '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/third_party/python/gyp/test/make_global_settings/ld/make_global_settings_ld.gyp b/third_party/python/gyp/test/make_global_settings/ld/make_global_settings_ld.gyp new file mode 100644 index 0000000000..6837c77326 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/make_global_settings/wrapper/gyptest-wrapper.py b/third_party/python/gyp/test/make_global_settings/wrapper/gyptest-wrapper.py new file mode 100644 index 0000000000..7ef4314b3e --- /dev/null +++ b/third_party/python/gyp/test/make_global_settings/wrapper/gyptest-wrapper.py @@ -0,0 +1,52 @@ +#!/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. +""" + +from __future__ import print_function + +import os +import sys +import TestGyp + +print("This test is currently disabled: https://crbug.com/483696.") +sys.exit(0) + +test_format = ['ninja'] +if sys.platform.startswith('linux') or sys.platform == '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/third_party/python/gyp/test/make_global_settings/wrapper/wrapper.gyp b/third_party/python/gyp/test/make_global_settings/wrapper/wrapper.gyp new file mode 100644 index 0000000000..3d4cd04b16 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/many-actions/file0 b/third_party/python/gyp/test/many-actions/file0 new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/third_party/python/gyp/test/many-actions/file0 diff --git a/third_party/python/gyp/test/many-actions/file1 b/third_party/python/gyp/test/many-actions/file1 new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/third_party/python/gyp/test/many-actions/file1 diff --git a/third_party/python/gyp/test/many-actions/file2 b/third_party/python/gyp/test/many-actions/file2 new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/third_party/python/gyp/test/many-actions/file2 diff --git a/third_party/python/gyp/test/many-actions/file3 b/third_party/python/gyp/test/many-actions/file3 new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/third_party/python/gyp/test/many-actions/file3 diff --git a/third_party/python/gyp/test/many-actions/file4 b/third_party/python/gyp/test/many-actions/file4 new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/third_party/python/gyp/test/many-actions/file4 diff --git a/third_party/python/gyp/test/many-actions/gyptest-many-actions-unsorted.py b/third_party/python/gyp/test/many-actions/gyptest-many-actions-unsorted.py new file mode 100644 index 0000000000..6927d1c7a7 --- /dev/null +++ b/third_party/python/gyp/test/many-actions/gyptest-many-actions-unsorted.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 lots of actions in the same target don't cause exceeding command +line length. +""" + +from __future__ import print_function + +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/third_party/python/gyp/test/many-actions/gyptest-many-actions.py b/third_party/python/gyp/test/many-actions/gyptest-many-actions.py new file mode 100644 index 0000000000..4a525d32d6 --- /dev/null +++ b/third_party/python/gyp/test/many-actions/gyptest-many-actions.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. + +""" +Make sure lots of actions in the same target don't cause exceeding command +line length. +""" + +from __future__ import print_function + +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/third_party/python/gyp/test/many-actions/many-actions-unsorted.gyp b/third_party/python/gyp/test/many-actions/many-actions-unsorted.gyp new file mode 100644 index 0000000000..eec79fe8d8 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/many-actions/many-actions.gyp b/third_party/python/gyp/test/many-actions/many-actions.gyp new file mode 100644 index 0000000000..38545d2d88 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/module/gyptest-default.py b/third_party/python/gyp/test/module/gyptest-default.py new file mode 100755 index 0000000000..7fecf3ca4d --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/module/src/lib1.c b/third_party/python/gyp/test/module/src/lib1.c new file mode 100644 index 0000000000..8de0e94bee --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/module/src/lib2.c b/third_party/python/gyp/test/module/src/lib2.c new file mode 100644 index 0000000000..266396dc91 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/module/src/module.gyp b/third_party/python/gyp/test/module/src/module.gyp new file mode 100644 index 0000000000..2bc398bb3b --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/module/src/program.c b/third_party/python/gyp/test/module/src/program.c new file mode 100644 index 0000000000..7cc3dd3466 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/msvs/buildevents/buildevents.gyp b/third_party/python/gyp/test/msvs/buildevents/buildevents.gyp new file mode 100644 index 0000000000..e0304dd5c6 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/msvs/buildevents/gyptest-msbuild-supports-prepostbuild.py b/third_party/python/gyp/test/msvs/buildevents/gyptest-msbuild-supports-prepostbuild.py new file mode 100755 index 0000000000..208f434560 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/msvs/buildevents/gyptest-ninja-warnings.py b/third_party/python/gyp/test/msvs/buildevents/gyptest-ninja-warnings.py new file mode 100755 index 0000000000..be4ec9921a --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/msvs/buildevents/main.cc b/third_party/python/gyp/test/msvs/buildevents/main.cc new file mode 100644 index 0000000000..03c0285a6c --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/msvs/config_attrs/gyptest-config_attrs.py b/third_party/python/gyp/test/msvs/config_attrs/gyptest-config_attrs.py new file mode 100644 index 0000000000..29a8022bd4 --- /dev/null +++ b/third_party/python/gyp/test/msvs/config_attrs/gyptest-config_attrs.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. + +""" +Verifies that msvs_configuration_attributes and +msbuild_configuration_attributes are applied by using +them to set the OutputDirectory. +""" + +from __future__ import print_function + +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/third_party/python/gyp/test/msvs/config_attrs/hello.c b/third_party/python/gyp/test/msvs/config_attrs/hello.c new file mode 100644 index 0000000000..faadc75e2c --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/msvs/config_attrs/hello.gyp b/third_party/python/gyp/test/msvs/config_attrs/hello.gyp new file mode 100644 index 0000000000..810a80edd8 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/msvs/express/base/base.gyp b/third_party/python/gyp/test/msvs/express/base/base.gyp new file mode 100644 index 0000000000..b7c9fc6d81 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/msvs/express/express.gyp b/third_party/python/gyp/test/msvs/express/express.gyp new file mode 100644 index 0000000000..917abe2cc0 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/msvs/express/gyptest-express.py b/third_party/python/gyp/test/msvs/express/gyptest-express.py new file mode 100755 index 0000000000..54c06f664a --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/msvs/external_builder/external.gyp b/third_party/python/gyp/test/msvs/external_builder/external.gyp new file mode 100644 index 0000000000..abe5b5889c --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/msvs/external_builder/external_builder.py b/third_party/python/gyp/test/msvs/external_builder/external_builder.py new file mode 100644 index 0000000000..ddfc1e5e33 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/msvs/external_builder/gyptest-all.py b/third_party/python/gyp/test/msvs/external_builder/gyptest-all.py new file mode 100644 index 0000000000..72faa7ab7f --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/msvs/external_builder/hello.cpp b/third_party/python/gyp/test/msvs/external_builder/hello.cpp new file mode 100644 index 0000000000..bc0c0265b5 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/msvs/external_builder/hello.z b/third_party/python/gyp/test/msvs/external_builder/hello.z new file mode 100644 index 0000000000..aa478827b5 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/msvs/external_builder/msbuild_action.py b/third_party/python/gyp/test/msvs/external_builder/msbuild_action.py new file mode 100644 index 0000000000..632d786922 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/msvs/external_builder/msbuild_rule.py b/third_party/python/gyp/test/msvs/external_builder/msbuild_rule.py new file mode 100644 index 0000000000..0d6e315775 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/msvs/filters/filters.gyp b/third_party/python/gyp/test/msvs/filters/filters.gyp new file mode 100644 index 0000000000..a4106dc8eb --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/msvs/filters/gyptest-filters-2008.py b/third_party/python/gyp/test/msvs/filters/gyptest-filters-2008.py new file mode 100644 index 0000000000..41ca085823 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/msvs/filters/gyptest-filters-2010.py b/third_party/python/gyp/test/msvs/filters/gyptest-filters-2010.py new file mode 100644 index 0000000000..d8131d5d7b --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/msvs/list_excluded/gyptest-all.py b/third_party/python/gyp/test/msvs/list_excluded/gyptest-all.py new file mode 100644 index 0000000000..5a370f6b47 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/msvs/list_excluded/hello.cpp b/third_party/python/gyp/test/msvs/list_excluded/hello.cpp new file mode 100644 index 0000000000..bc0c0265b5 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/msvs/list_excluded/hello_exclude.gyp b/third_party/python/gyp/test/msvs/list_excluded/hello_exclude.gyp new file mode 100644 index 0000000000..aa160f2367 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/msvs/list_excluded/hello_mac.cpp b/third_party/python/gyp/test/msvs/list_excluded/hello_mac.cpp new file mode 100644 index 0000000000..b9f6242c4b --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/msvs/missing_sources/gyptest-missing.py b/third_party/python/gyp/test/msvs/missing_sources/gyptest-missing.py new file mode 100644 index 0000000000..62a99ef0f1 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/msvs/missing_sources/hello_missing.gyp b/third_party/python/gyp/test/msvs/missing_sources/hello_missing.gyp new file mode 100644 index 0000000000..c08926bbff --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/msvs/multiple_actions_error_handling/action_fail.py b/third_party/python/gyp/test/msvs/multiple_actions_error_handling/action_fail.py new file mode 100644 index 0000000000..286fc4e132 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/msvs/multiple_actions_error_handling/action_succeed.py b/third_party/python/gyp/test/msvs/multiple_actions_error_handling/action_succeed.py new file mode 100644 index 0000000000..3554373197 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/msvs/multiple_actions_error_handling/actions.gyp b/third_party/python/gyp/test/msvs/multiple_actions_error_handling/actions.gyp new file mode 100644 index 0000000000..ab99e929e2 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/msvs/multiple_actions_error_handling/gyptest.py b/third_party/python/gyp/test/msvs/multiple_actions_error_handling/gyptest.py new file mode 100644 index 0000000000..3aa6b8fdb2 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/msvs/props/AppName.props b/third_party/python/gyp/test/msvs/props/AppName.props new file mode 100644 index 0000000000..b688f663d5 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/msvs/props/AppName.vsprops b/third_party/python/gyp/test/msvs/props/AppName.vsprops new file mode 100644 index 0000000000..84b9af3800 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/msvs/props/gyptest-props.py b/third_party/python/gyp/test/msvs/props/gyptest-props.py new file mode 100644 index 0000000000..abd4df2241 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/msvs/props/hello.c b/third_party/python/gyp/test/msvs/props/hello.c new file mode 100644 index 0000000000..faadc75e2c --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/msvs/props/hello.gyp b/third_party/python/gyp/test/msvs/props/hello.gyp new file mode 100644 index 0000000000..5a58317fa7 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/msvs/rules_stdout_stderr/dummy.bar b/third_party/python/gyp/test/msvs/rules_stdout_stderr/dummy.bar new file mode 100644 index 0000000000..25178696d2 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/msvs/rules_stdout_stderr/dummy.foo b/third_party/python/gyp/test/msvs/rules_stdout_stderr/dummy.foo new file mode 100644 index 0000000000..6a7990bb98 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/msvs/rules_stdout_stderr/gyptest-rules-stdout-stderr.py b/third_party/python/gyp/test/msvs/rules_stdout_stderr/gyptest-rules-stdout-stderr.py new file mode 100644 index 0000000000..804505a23d --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/msvs/rules_stdout_stderr/rule_stderr.py b/third_party/python/gyp/test/msvs/rules_stdout_stderr/rule_stderr.py new file mode 100644 index 0000000000..2081513ec8 --- /dev/null +++ b/third_party/python/gyp/test/msvs/rules_stdout_stderr/rule_stderr.py @@ -0,0 +1,8 @@ +#!/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. + +from __future__ import print_function +import sys +print("This will go to stderr", file=sys.stderr) diff --git a/third_party/python/gyp/test/msvs/rules_stdout_stderr/rule_stdout.py b/third_party/python/gyp/test/msvs/rules_stdout_stderr/rule_stdout.py new file mode 100644 index 0000000000..4c073ebc45 --- /dev/null +++ b/third_party/python/gyp/test/msvs/rules_stdout_stderr/rule_stdout.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. + +from __future__ import print_function +print("This will go to stdout") diff --git a/third_party/python/gyp/test/msvs/rules_stdout_stderr/rules-stdout-stderr.gyp b/third_party/python/gyp/test/msvs/rules_stdout_stderr/rules-stdout-stderr.gyp new file mode 100644 index 0000000000..ce93643f8e --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/msvs/shared_output/common.gypi b/third_party/python/gyp/test/msvs/shared_output/common.gypi new file mode 100644 index 0000000000..c6fa341d68 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/msvs/shared_output/gyptest-shared_output.py b/third_party/python/gyp/test/msvs/shared_output/gyptest-shared_output.py new file mode 100644 index 0000000000..270b280e6b --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/msvs/shared_output/hello.c b/third_party/python/gyp/test/msvs/shared_output/hello.c new file mode 100644 index 0000000000..698e4fd36c --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/msvs/shared_output/hello.gyp b/third_party/python/gyp/test/msvs/shared_output/hello.gyp new file mode 100644 index 0000000000..f80e5cfca1 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/msvs/shared_output/there/there.c b/third_party/python/gyp/test/msvs/shared_output/there/there.c new file mode 100644 index 0000000000..698e4fd36c --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/msvs/shared_output/there/there.gyp b/third_party/python/gyp/test/msvs/shared_output/there/there.gyp new file mode 100644 index 0000000000..56feff326c --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/msvs/uldi2010/gyptest-all.py b/third_party/python/gyp/test/msvs/uldi2010/gyptest-all.py new file mode 100644 index 0000000000..cc248fbd63 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/msvs/uldi2010/hello.c b/third_party/python/gyp/test/msvs/uldi2010/hello.c new file mode 100644 index 0000000000..06e6a02905 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/msvs/uldi2010/hello.gyp b/third_party/python/gyp/test/msvs/uldi2010/hello.gyp new file mode 100644 index 0000000000..a2bf2badb1 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/msvs/uldi2010/hello2.c b/third_party/python/gyp/test/msvs/uldi2010/hello2.c new file mode 100644 index 0000000000..e2f23238d1 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/multiple-targets/gyptest-all.py b/third_party/python/gyp/test/multiple-targets/gyptest-all.py new file mode 100755 index 0000000000..3ef50090d1 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/multiple-targets/gyptest-default.py b/third_party/python/gyp/test/multiple-targets/gyptest-default.py new file mode 100755 index 0000000000..db15d794c3 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/multiple-targets/src/common.c b/third_party/python/gyp/test/multiple-targets/src/common.c new file mode 100644 index 0000000000..f1df7c1431 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/multiple-targets/src/multiple.gyp b/third_party/python/gyp/test/multiple-targets/src/multiple.gyp new file mode 100644 index 0000000000..3db4ea30cd --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/multiple-targets/src/prog1.c b/third_party/python/gyp/test/multiple-targets/src/prog1.c new file mode 100644 index 0000000000..fbf8d4cd7c --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/multiple-targets/src/prog2.c b/third_party/python/gyp/test/multiple-targets/src/prog2.c new file mode 100644 index 0000000000..a94b5c155e --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/ninja/action-rule-hash/gyptest-action-rule-hash.py b/third_party/python/gyp/test/ninja/action-rule-hash/gyptest-action-rule-hash.py new file mode 100644 index 0000000000..7147fd2fc3 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/ninja/action-rule-hash/subdir/action-rule-hash.gyp b/third_party/python/gyp/test/ninja/action-rule-hash/subdir/action-rule-hash.gyp new file mode 100644 index 0000000000..0e88a3019f --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/ninja/action-rule-hash/subdir/emit.py b/third_party/python/gyp/test/ninja/action-rule-hash/subdir/emit.py new file mode 100644 index 0000000000..6b17125574 --- /dev/null +++ b/third_party/python/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], 'w') +f.write('int main() {\n') +f.write(' return 0;\n') +f.write('}\n') +f.close() diff --git a/third_party/python/gyp/test/ninja/action_dependencies/gyptest-action-dependencies.py b/third_party/python/gyp/test/ninja/action_dependencies/gyptest-action-dependencies.py new file mode 100755 index 0000000000..89813bab17 --- /dev/null +++ b/third_party/python/gyp/test/ninja/action_dependencies/gyptest-action-dependencies.py @@ -0,0 +1,64 @@ +#!/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. +""" + +from __future__ import print_function + +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/third_party/python/gyp/test/ninja/action_dependencies/src/a.c b/third_party/python/gyp/test/ninja/action_dependencies/src/a.c new file mode 100644 index 0000000000..4d7af9b26c --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/ninja/action_dependencies/src/a.h b/third_party/python/gyp/test/ninja/action_dependencies/src/a.h new file mode 100644 index 0000000000..335db56739 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/ninja/action_dependencies/src/action_dependencies.gyp b/third_party/python/gyp/test/ninja/action_dependencies/src/action_dependencies.gyp new file mode 100644 index 0000000000..5baa7a7d47 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/ninja/action_dependencies/src/b.c b/third_party/python/gyp/test/ninja/action_dependencies/src/b.c new file mode 100644 index 0000000000..824464695a --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/ninja/action_dependencies/src/b.h b/third_party/python/gyp/test/ninja/action_dependencies/src/b.h new file mode 100644 index 0000000000..91362cd899 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/ninja/action_dependencies/src/c.c b/third_party/python/gyp/test/ninja/action_dependencies/src/c.c new file mode 100644 index 0000000000..b412087ec8 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/ninja/action_dependencies/src/c.h b/third_party/python/gyp/test/ninja/action_dependencies/src/c.h new file mode 100644 index 0000000000..c81a45bbe7 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/ninja/action_dependencies/src/emit.py b/third_party/python/gyp/test/ninja/action_dependencies/src/emit.py new file mode 100755 index 0000000000..8ed12f7393 --- /dev/null +++ b/third_party/python/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], 'w') +f.write('/* Hello World */\n') +f.close() diff --git a/third_party/python/gyp/test/ninja/chained-dependency/chained-dependency.gyp b/third_party/python/gyp/test/ninja/chained-dependency/chained-dependency.gyp new file mode 100644 index 0000000000..3fe68ae85a --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/ninja/chained-dependency/chained.c b/third_party/python/gyp/test/ninja/chained-dependency/chained.c new file mode 100644 index 0000000000..c1ff1a7b12 --- /dev/null +++ b/third_party/python/gyp/test/ninja/chained-dependency/chained.c @@ -0,0 +1,5 @@ +#include "generated/header.h" + +int main(void) { + return 0; +} diff --git a/third_party/python/gyp/test/ninja/chained-dependency/gyptest-chained-dependency.py b/third_party/python/gyp/test/ninja/chained-dependency/gyptest-chained-dependency.py new file mode 100755 index 0000000000..d8763f1d3d --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/ninja/empty-and-non-empty-duplicate-name/gyptest-empty-and-non-empty-duplicate-name.py b/third_party/python/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/third_party/python/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/third_party/python/gyp/test/ninja/empty-and-non-empty-duplicate-name/subdir/included.gyp b/third_party/python/gyp/test/ninja/empty-and-non-empty-duplicate-name/subdir/included.gyp new file mode 100644 index 0000000000..1b9fc42f3f --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/ninja/empty-and-non-empty-duplicate-name/test.gyp b/third_party/python/gyp/test/ninja/empty-and-non-empty-duplicate-name/test.gyp new file mode 100644 index 0000000000..9aa6287c7c --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/ninja/normalize-paths-win/gyptest-normalize-paths.py b/third_party/python/gyp/test/ninja/normalize-paths-win/gyptest-normalize-paths.py new file mode 100644 index 0000000000..f56dbe5921 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/ninja/normalize-paths-win/hello.cc b/third_party/python/gyp/test/ninja/normalize-paths-win/hello.cc new file mode 100644 index 0000000000..1711567ef5 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/ninja/normalize-paths-win/normalize-paths.gyp b/third_party/python/gyp/test/ninja/normalize-paths-win/normalize-paths.gyp new file mode 100644 index 0000000000..544d06456d --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/ninja/s-needs-no-depfiles/empty.s b/third_party/python/gyp/test/ninja/s-needs-no-depfiles/empty.s new file mode 100644 index 0000000000..218d8921e5 --- /dev/null +++ b/third_party/python/gyp/test/ninja/s-needs-no-depfiles/empty.s @@ -0,0 +1 @@ +# This file intentionally left blank. diff --git a/third_party/python/gyp/test/ninja/s-needs-no-depfiles/gyptest-s-needs-no-depfiles.py b/third_party/python/gyp/test/ninja/s-needs-no-depfiles/gyptest-s-needs-no-depfiles.py new file mode 100755 index 0000000000..77a3245d46 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/ninja/s-needs-no-depfiles/s-needs-no-depfiles.gyp b/third_party/python/gyp/test/ninja/s-needs-no-depfiles/s-needs-no-depfiles.gyp new file mode 100644 index 0000000000..bd66b1a70a --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/ninja/solibs_avoid_relinking/gyptest-solibs-avoid-relinking.py b/third_party/python/gyp/test/ninja/solibs_avoid_relinking/gyptest-solibs-avoid-relinking.py new file mode 100755 index 0000000000..fd4470ac23 --- /dev/null +++ b/third_party/python/gyp/test/ninja/solibs_avoid_relinking/gyptest-solibs-avoid-relinking.py @@ -0,0 +1,48 @@ +#!/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. +""" + +from __future__ import print_function + +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/third_party/python/gyp/test/ninja/solibs_avoid_relinking/main.cc b/third_party/python/gyp/test/ninja/solibs_avoid_relinking/main.cc new file mode 100644 index 0000000000..2cd74d3c77 --- /dev/null +++ b/third_party/python/gyp/test/ninja/solibs_avoid_relinking/main.cc @@ -0,0 +1,5 @@ +extern int foo(); + +int main() { + return foo(); +} diff --git a/third_party/python/gyp/test/ninja/solibs_avoid_relinking/solib.cc b/third_party/python/gyp/test/ninja/solibs_avoid_relinking/solib.cc new file mode 100644 index 0000000000..0856cd4e00 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/ninja/solibs_avoid_relinking/solibs_avoid_relinking.gyp b/third_party/python/gyp/test/ninja/solibs_avoid_relinking/solibs_avoid_relinking.gyp new file mode 100644 index 0000000000..e816351d68 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/ninja/use-console/foo.bar b/third_party/python/gyp/test/ninja/use-console/foo.bar new file mode 100644 index 0000000000..07c476a866 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/ninja/use-console/gyptest-use-console.py b/third_party/python/gyp/test/ninja/use-console/gyptest-use-console.py new file mode 100644 index 0000000000..f76fcd9829 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/ninja/use-console/use-console.gyp b/third_party/python/gyp/test/ninja/use-console/use-console.gyp new file mode 100644 index 0000000000..84e63184c6 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/ninja/use-custom-environment-files/gyptest-use-custom-environment-files.py b/third_party/python/gyp/test/ninja/use-custom-environment-files/gyptest-use-custom-environment-files.py new file mode 100644 index 0000000000..0c44b1d1c9 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/ninja/use-custom-environment-files/use-custom-environment-files.cc b/third_party/python/gyp/test/ninja/use-custom-environment-files/use-custom-environment-files.cc new file mode 100644 index 0000000000..1711567ef5 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/ninja/use-custom-environment-files/use-custom-environment-files.gyp b/third_party/python/gyp/test/ninja/use-custom-environment-files/use-custom-environment-files.gyp new file mode 100644 index 0000000000..dbc95a9439 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/no-cpp/gyptest-no-cpp.py b/third_party/python/gyp/test/no-cpp/gyptest-no-cpp.py new file mode 100644 index 0000000000..a5d64512af --- /dev/null +++ b/third_party/python/gyp/test/no-cpp/gyptest-no-cpp.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. + +""" +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 + not (sys.platform == 'darwin' and test.format == '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].decode('utf-8') + assert not proc.returncode + return 'libstdc++' in output or 'libc++' in output + + if LinksLibStdCpp('no_cpp'): + test.fail_test() + + # Make, ninja, and CMake pick the compiler driver based on transitive + # checks. Xcode doesn't. + build_error_code = { + 'xcode': 65, # EX_DATAERR, see `man sysexits` + 'make': 0, + 'ninja': 0, + 'cmake': 0, + 'xcode-ninja': 0, + }[test.format] + + test.build('test.gyp', 'no_cpp_dep_on_cc_lib', chdir=CHDIR, + status=build_error_code) + + test.pass_test() diff --git a/third_party/python/gyp/test/no-cpp/src/call-f-main.c b/third_party/python/gyp/test/no-cpp/src/call-f-main.c new file mode 100644 index 0000000000..8b95c5910e --- /dev/null +++ b/third_party/python/gyp/test/no-cpp/src/call-f-main.c @@ -0,0 +1,2 @@ +void* f(); +int main() { f(); } diff --git a/third_party/python/gyp/test/no-cpp/src/empty-main.c b/third_party/python/gyp/test/no-cpp/src/empty-main.c new file mode 100644 index 0000000000..237c8ce181 --- /dev/null +++ b/third_party/python/gyp/test/no-cpp/src/empty-main.c @@ -0,0 +1 @@ +int main() {} diff --git a/third_party/python/gyp/test/no-cpp/src/f.cc b/third_party/python/gyp/test/no-cpp/src/f.cc new file mode 100644 index 0000000000..02f50f21a0 --- /dev/null +++ b/third_party/python/gyp/test/no-cpp/src/f.cc @@ -0,0 +1,3 @@ +extern "C" { void* f(); } + +void* f() { return new int; } diff --git a/third_party/python/gyp/test/no-cpp/src/test.gyp b/third_party/python/gyp/test/no-cpp/src/test.gyp new file mode 100644 index 0000000000..417015ec80 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/no-output/gyptest-no-output.py b/third_party/python/gyp/test/no-output/gyptest-no-output.py new file mode 100755 index 0000000000..bf9a0b5aaa --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/no-output/src/nooutput.gyp b/third_party/python/gyp/test/no-output/src/nooutput.gyp new file mode 100644 index 0000000000..c40124efc1 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/product/gyptest-product.py b/third_party/python/gyp/test/product/gyptest-product.py new file mode 100755 index 0000000000..53eb5c376b --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/product/hello.c b/third_party/python/gyp/test/product/hello.c new file mode 100644 index 0000000000..41fdff0e38 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/product/product.gyp b/third_party/python/gyp/test/product/product.gyp new file mode 100644 index 0000000000..c25eaaacb5 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/prune_targets/gyptest-prune-targets.py b/third_party/python/gyp/test/prune_targets/gyptest-prune-targets.py new file mode 100644 index 0000000000..b2c90f717e --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/prune_targets/lib1.cc b/third_party/python/gyp/test/prune_targets/lib1.cc new file mode 100644 index 0000000000..692b7de6d8 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/prune_targets/lib2.cc b/third_party/python/gyp/test/prune_targets/lib2.cc new file mode 100644 index 0000000000..aed394afcf --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/prune_targets/lib3.cc b/third_party/python/gyp/test/prune_targets/lib3.cc new file mode 100644 index 0000000000..af0f717b02 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/prune_targets/lib_indirect.cc b/third_party/python/gyp/test/prune_targets/lib_indirect.cc new file mode 100644 index 0000000000..92d9ea40db --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/prune_targets/program.cc b/third_party/python/gyp/test/prune_targets/program.cc new file mode 100644 index 0000000000..c9ac070ecd --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/prune_targets/test1.gyp b/third_party/python/gyp/test/prune_targets/test1.gyp new file mode 100644 index 0000000000..b65ec19fa4 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/prune_targets/test2.gyp b/third_party/python/gyp/test/prune_targets/test2.gyp new file mode 100644 index 0000000000..16f0fd3290 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/relative/foo/a/a.cc b/third_party/python/gyp/test/relative/foo/a/a.cc new file mode 100644 index 0000000000..7d1c953448 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/relative/foo/a/a.gyp b/third_party/python/gyp/test/relative/foo/a/a.gyp new file mode 100644 index 0000000000..66316ac681 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/relative/foo/a/c/c.cc b/third_party/python/gyp/test/relative/foo/a/c/c.cc new file mode 100644 index 0000000000..9d22471684 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/relative/foo/a/c/c.gyp b/third_party/python/gyp/test/relative/foo/a/c/c.gyp new file mode 100644 index 0000000000..c1f087db99 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/relative/foo/b/b.cc b/third_party/python/gyp/test/relative/foo/b/b.cc new file mode 100644 index 0000000000..011d59cebb --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/relative/foo/b/b.gyp b/third_party/python/gyp/test/relative/foo/b/b.gyp new file mode 100644 index 0000000000..0ebe4533d3 --- /dev/null +++ b/third_party/python/gyp/test/relative/foo/b/b.gyp @@ -0,0 +1,9 @@ +{ + 'targets': [ + { + 'target_name': 'b', + 'type': 'static_library', + 'sources': ['b.cc'], + }, + ], +} diff --git a/third_party/python/gyp/test/relative/gyptest-default.py b/third_party/python/gyp/test/relative/gyptest-default.py new file mode 100755 index 0000000000..685cdfd75e --- /dev/null +++ b/third_party/python/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().decode('utf-8', 'ignore') +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/third_party/python/gyp/test/rename/filecase/file.c b/third_party/python/gyp/test/rename/filecase/file.c new file mode 100644 index 0000000000..76e8197013 --- /dev/null +++ b/third_party/python/gyp/test/rename/filecase/file.c @@ -0,0 +1 @@ +int main() { return 0; } diff --git a/third_party/python/gyp/test/rename/filecase/test-casesensitive.gyp b/third_party/python/gyp/test/rename/filecase/test-casesensitive.gyp new file mode 100644 index 0000000000..48eaa6eb67 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/rename/filecase/test.gyp b/third_party/python/gyp/test/rename/filecase/test.gyp new file mode 100644 index 0000000000..eaee9337b6 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/rename/gyptest-filecase.py b/third_party/python/gyp/test/rename/gyptest-filecase.py new file mode 100644 index 0000000000..daed5180d3 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/restat/gyptest-restat.py b/third_party/python/gyp/test/restat/gyptest-restat.py new file mode 100644 index 0000000000..87379044dd --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/restat/src/create_intermediate.py b/third_party/python/gyp/test/restat/src/create_intermediate.py new file mode 100644 index 0000000000..a4d7450371 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/restat/src/restat.gyp b/third_party/python/gyp/test/restat/src/restat.gyp new file mode 100644 index 0000000000..ff020e0ce6 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/restat/src/touch.py b/third_party/python/gyp/test/restat/src/touch.py new file mode 100644 index 0000000000..7cd781a90c --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/rules-dirname/gyptest-dirname.py b/third_party/python/gyp/test/rules-dirname/gyptest-dirname.py new file mode 100755 index 0000000000..da5429cbad --- /dev/null +++ b/third_party/python/gyp/test/rules-dirname/gyptest-dirname.py @@ -0,0 +1,57 @@ +#!/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'. +""" + +from __future__ import print_function + +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/third_party/python/gyp/test/rules-dirname/src/actions.gyp b/third_party/python/gyp/test/rules-dirname/src/actions.gyp new file mode 100644 index 0000000000..c5693c6c9e --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/rules-dirname/src/copy-file.py b/third_party/python/gyp/test/rules-dirname/src/copy-file.py new file mode 100755 index 0000000000..271a72b6b1 --- /dev/null +++ b/third_party/python/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], 'w').write(contents) + +sys.exit(0) diff --git a/third_party/python/gyp/test/rules-dirname/src/subdir/a/b/c.gencc b/third_party/python/gyp/test/rules-dirname/src/subdir/a/b/c.gencc new file mode 100644 index 0000000000..29cb5f79ad --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/rules-dirname/src/subdir/a/b/c.printvars b/third_party/python/gyp/test/rules-dirname/src/subdir/a/b/c.printvars new file mode 100644 index 0000000000..cc4561dc41 --- /dev/null +++ b/third_party/python/gyp/test/rules-dirname/src/subdir/a/b/c.printvars @@ -0,0 +1 @@ +# Empty file for testing build rules diff --git a/third_party/python/gyp/test/rules-dirname/src/subdir/foo/bar/baz.gencc b/third_party/python/gyp/test/rules-dirname/src/subdir/foo/bar/baz.gencc new file mode 100644 index 0000000000..90b4ce9243 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/rules-dirname/src/subdir/foo/bar/baz.printvars b/third_party/python/gyp/test/rules-dirname/src/subdir/foo/bar/baz.printvars new file mode 100644 index 0000000000..cc4561dc41 --- /dev/null +++ b/third_party/python/gyp/test/rules-dirname/src/subdir/foo/bar/baz.printvars @@ -0,0 +1 @@ +# Empty file for testing build rules diff --git a/third_party/python/gyp/test/rules-dirname/src/subdir/input-rule-dirname.gyp b/third_party/python/gyp/test/rules-dirname/src/subdir/input-rule-dirname.gyp new file mode 100644 index 0000000000..da749a2231 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/rules-dirname/src/subdir/main.cc b/third_party/python/gyp/test/rules-dirname/src/subdir/main.cc new file mode 100644 index 0000000000..3bb8e01395 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/rules-dirname/src/subdir/nodir.gencc b/third_party/python/gyp/test/rules-dirname/src/subdir/nodir.gencc new file mode 100644 index 0000000000..720f589bc2 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/rules-dirname/src/subdir/printvars.py b/third_party/python/gyp/test/rules-dirname/src/subdir/printvars.py new file mode 100755 index 0000000000..ef3d92e8cf --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/rules-rebuild/gyptest-all.py b/third_party/python/gyp/test/rules-rebuild/gyptest-all.py new file mode 100755 index 0000000000..aaaa2a6e6f --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/rules-rebuild/gyptest-default.py b/third_party/python/gyp/test/rules-rebuild/gyptest-default.py new file mode 100755 index 0000000000..ac3f0209aa --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/rules-rebuild/src/main.c b/third_party/python/gyp/test/rules-rebuild/src/main.c new file mode 100644 index 0000000000..bd8fbb20ea --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/rules-rebuild/src/make-sources.py b/third_party/python/gyp/test/rules-rebuild/src/make-sources.py new file mode 100755 index 0000000000..dd9e52856e --- /dev/null +++ b/third_party/python/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, 'w').write(contents) + +write_file(c_file, open(in_file, 'r').read()) + +write_file(h_file, '#define NAME "%s"\n' % in_file) + +sys.exit(0) diff --git a/third_party/python/gyp/test/rules-rebuild/src/prog1.in b/third_party/python/gyp/test/rules-rebuild/src/prog1.in new file mode 100644 index 0000000000..191b00ef1e --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/rules-rebuild/src/prog2.in b/third_party/python/gyp/test/rules-rebuild/src/prog2.in new file mode 100644 index 0000000000..7bfac5104c --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/rules-rebuild/src/same_target.gyp b/third_party/python/gyp/test/rules-rebuild/src/same_target.gyp new file mode 100644 index 0000000000..22ba56056d --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/rules-use-built-dependencies/gyptest-use-built-dependencies.py b/third_party/python/gyp/test/rules-use-built-dependencies/gyptest-use-built-dependencies.py new file mode 100755 index 0000000000..a57c36d5b0 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/rules-use-built-dependencies/src/main.cc b/third_party/python/gyp/test/rules-use-built-dependencies/src/main.cc new file mode 100644 index 0000000000..937d284599 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/rules-use-built-dependencies/src/use-built-dependencies-rule.gyp b/third_party/python/gyp/test/rules-use-built-dependencies/src/use-built-dependencies-rule.gyp new file mode 100644 index 0000000000..92bfeda392 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/rules-variables/gyptest-rules-variables.py b/third_party/python/gyp/test/rules-variables/gyptest-rules-variables.py new file mode 100755 index 0000000000..16afc22ef9 --- /dev/null +++ b/third_party/python/gyp/test/rules-variables/gyptest-rules-variables.py @@ -0,0 +1,35 @@ +#!/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. +""" + +from __future__ import print_function + +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/third_party/python/gyp/test/rules-variables/src/input_ext.c b/third_party/python/gyp/test/rules-variables/src/input_ext.c new file mode 100644 index 0000000000..f41e73ef8a --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/rules-variables/src/input_name/test.c b/third_party/python/gyp/test/rules-variables/src/input_name/test.c new file mode 100644 index 0000000000..e28b74d115 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/rules-variables/src/input_path/subdir/test.c b/third_party/python/gyp/test/rules-variables/src/input_path/subdir/test.c new file mode 100644 index 0000000000..403dbbda4c --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/rules-variables/src/subdir/input_dirname.c b/third_party/python/gyp/test/rules-variables/src/subdir/input_dirname.c new file mode 100644 index 0000000000..40cecd87d9 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/rules-variables/src/subdir/test.c b/third_party/python/gyp/test/rules-variables/src/subdir/test.c new file mode 100644 index 0000000000..6c0280b8ad --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/rules-variables/src/test.input_root.c b/third_party/python/gyp/test/rules-variables/src/test.input_root.c new file mode 100644 index 0000000000..33a7740a5c --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/rules-variables/src/variables.gyp b/third_party/python/gyp/test/rules-variables/src/variables.gyp new file mode 100644 index 0000000000..6debba12e3 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/rules/gyptest-all.py b/third_party/python/gyp/test/rules/gyptest-all.py new file mode 100755 index 0000000000..0520c2f6a0 --- /dev/null +++ b/third_party/python/gyp/test/rules/gyptest-all.py @@ -0,0 +1,84 @@ +#!/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'. +""" + +from __future__ import print_function + +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/third_party/python/gyp/test/rules/gyptest-default.py b/third_party/python/gyp/test/rules/gyptest-default.py new file mode 100755 index 0000000000..5d01094197 --- /dev/null +++ b/third_party/python/gyp/test/rules/gyptest-default.py @@ -0,0 +1,70 @@ +#!/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'. +""" + +from __future__ import print_function + +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/third_party/python/gyp/test/rules/gyptest-input-root.py b/third_party/python/gyp/test/rules/gyptest-input-root.py new file mode 100755 index 0000000000..92bade6d48 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/rules/gyptest-special-variables.py b/third_party/python/gyp/test/rules/gyptest-special-variables.py new file mode 100644 index 0000000000..05ea7cee16 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/rules/src/actions.gyp b/third_party/python/gyp/test/rules/src/actions.gyp new file mode 100644 index 0000000000..84376a7193 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/rules/src/an_asm.S b/third_party/python/gyp/test/rules/src/an_asm.S new file mode 100644 index 0000000000..eeb1345550 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/rules/src/as.bat b/third_party/python/gyp/test/rules/src/as.bat new file mode 100644 index 0000000000..903c31a726 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/rules/src/copy-file.py b/third_party/python/gyp/test/rules/src/copy-file.py new file mode 100755 index 0000000000..7bdfbfd4bd --- /dev/null +++ b/third_party/python/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], 'w').write(contents) + +sys.exit(0) diff --git a/third_party/python/gyp/test/rules/src/external/external.gyp b/third_party/python/gyp/test/rules/src/external/external.gyp new file mode 100644 index 0000000000..b28174f57c --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/rules/src/external/file1.in b/third_party/python/gyp/test/rules/src/external/file1.in new file mode 100644 index 0000000000..86ac3ad389 --- /dev/null +++ b/third_party/python/gyp/test/rules/src/external/file1.in @@ -0,0 +1 @@ +Hello from file1.in diff --git a/third_party/python/gyp/test/rules/src/external/file2.in b/third_party/python/gyp/test/rules/src/external/file2.in new file mode 100644 index 0000000000..bf83d8ecec --- /dev/null +++ b/third_party/python/gyp/test/rules/src/external/file2.in @@ -0,0 +1 @@ +Hello from file2.in diff --git a/third_party/python/gyp/test/rules/src/input-root.gyp b/third_party/python/gyp/test/rules/src/input-root.gyp new file mode 100644 index 0000000000..b6600e767c --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/rules/src/noaction/file1.in b/third_party/python/gyp/test/rules/src/noaction/file1.in new file mode 100644 index 0000000000..86ac3ad389 --- /dev/null +++ b/third_party/python/gyp/test/rules/src/noaction/file1.in @@ -0,0 +1 @@ +Hello from file1.in diff --git a/third_party/python/gyp/test/rules/src/noaction/no_action_with_rules_fails.gyp b/third_party/python/gyp/test/rules/src/noaction/no_action_with_rules_fails.gyp new file mode 100644 index 0000000000..9b6a65629f --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/rules/src/rule.py b/third_party/python/gyp/test/rules/src/rule.py new file mode 100755 index 0000000000..8a1f36dedb --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/rules/src/somefile.ext b/third_party/python/gyp/test/rules/src/somefile.ext new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/third_party/python/gyp/test/rules/src/somefile.ext diff --git a/third_party/python/gyp/test/rules/src/special-variables.gyp b/third_party/python/gyp/test/rules/src/special-variables.gyp new file mode 100644 index 0000000000..d1443af5ba --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/rules/src/subdir1/executable.gyp b/third_party/python/gyp/test/rules/src/subdir1/executable.gyp new file mode 100644 index 0000000000..c34cce5a92 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/rules/src/subdir1/function1.in b/third_party/python/gyp/test/rules/src/subdir1/function1.in new file mode 100644 index 0000000000..60ff28949b --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/rules/src/subdir1/function2.in b/third_party/python/gyp/test/rules/src/subdir1/function2.in new file mode 100644 index 0000000000..0fcfc03fdb --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/rules/src/subdir1/program.c b/third_party/python/gyp/test/rules/src/subdir1/program.c new file mode 100644 index 0000000000..6b11ff9f67 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/rules/src/subdir2/both_rule_and_action_input.gyp b/third_party/python/gyp/test/rules/src/subdir2/both_rule_and_action_input.gyp new file mode 100644 index 0000000000..e5e6f3ec2b --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/rules/src/subdir2/file1.in b/third_party/python/gyp/test/rules/src/subdir2/file1.in new file mode 100644 index 0000000000..86ac3ad389 --- /dev/null +++ b/third_party/python/gyp/test/rules/src/subdir2/file1.in @@ -0,0 +1 @@ +Hello from file1.in diff --git a/third_party/python/gyp/test/rules/src/subdir2/file2.in b/third_party/python/gyp/test/rules/src/subdir2/file2.in new file mode 100644 index 0000000000..bf83d8ecec --- /dev/null +++ b/third_party/python/gyp/test/rules/src/subdir2/file2.in @@ -0,0 +1 @@ +Hello from file2.in diff --git a/third_party/python/gyp/test/rules/src/subdir2/never_used.gyp b/third_party/python/gyp/test/rules/src/subdir2/never_used.gyp new file mode 100644 index 0000000000..17f6f55371 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/rules/src/subdir2/no_action.gyp b/third_party/python/gyp/test/rules/src/subdir2/no_action.gyp new file mode 100644 index 0000000000..ffa1cefe18 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/rules/src/subdir2/no_inputs.gyp b/third_party/python/gyp/test/rules/src/subdir2/no_inputs.gyp new file mode 100644 index 0000000000..e61a1a3ff6 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/rules/src/subdir2/none.gyp b/third_party/python/gyp/test/rules/src/subdir2/none.gyp new file mode 100644 index 0000000000..38bcdabdf6 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/rules/src/subdir2/program.c b/third_party/python/gyp/test/rules/src/subdir2/program.c new file mode 100644 index 0000000000..e5db175148 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/rules/src/subdir3/executable2.gyp b/third_party/python/gyp/test/rules/src/subdir3/executable2.gyp new file mode 100644 index 0000000000..a2a528fc7b --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/rules/src/subdir3/function3.in b/third_party/python/gyp/test/rules/src/subdir3/function3.in new file mode 100644 index 0000000000..99f46ab05e --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/rules/src/subdir3/program.c b/third_party/python/gyp/test/rules/src/subdir3/program.c new file mode 100644 index 0000000000..c38eead50e --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/rules/src/subdir4/asm-function.assem b/third_party/python/gyp/test/rules/src/subdir4/asm-function.assem new file mode 100644 index 0000000000..ed47cade95 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/rules/src/subdir4/build-asm.gyp b/third_party/python/gyp/test/rules/src/subdir4/build-asm.gyp new file mode 100644 index 0000000000..fe0fe93787 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/rules/src/subdir4/program.c b/third_party/python/gyp/test/rules/src/subdir4/program.c new file mode 100644 index 0000000000..ad647f4eb9 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/same-gyp-name/gyptest-all.py b/third_party/python/gyp/test/same-gyp-name/gyptest-all.py new file mode 100755 index 0000000000..cda1a72d4d --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/same-gyp-name/gyptest-default.py b/third_party/python/gyp/test/same-gyp-name/gyptest-default.py new file mode 100755 index 0000000000..5e4bba0012 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/same-gyp-name/gyptest-library.py b/third_party/python/gyp/test/same-gyp-name/gyptest-library.py new file mode 100644 index 0000000000..957a4a52d6 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/same-gyp-name/library/one/sub.gyp b/third_party/python/gyp/test/same-gyp-name/library/one/sub.gyp new file mode 100644 index 0000000000..1bed941e54 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/same-gyp-name/library/test.gyp b/third_party/python/gyp/test/same-gyp-name/library/test.gyp new file mode 100644 index 0000000000..552a77ed7e --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/same-gyp-name/library/two/sub.gyp b/third_party/python/gyp/test/same-gyp-name/library/two/sub.gyp new file mode 100644 index 0000000000..934c98a496 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/same-gyp-name/src/all.gyp b/third_party/python/gyp/test/same-gyp-name/src/all.gyp new file mode 100644 index 0000000000..229f02ea84 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/same-gyp-name/src/subdir1/executable.gyp b/third_party/python/gyp/test/same-gyp-name/src/subdir1/executable.gyp new file mode 100644 index 0000000000..82483b4c69 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/same-gyp-name/src/subdir1/main1.cc b/third_party/python/gyp/test/same-gyp-name/src/subdir1/main1.cc new file mode 100644 index 0000000000..3645558324 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/same-gyp-name/src/subdir2/executable.gyp b/third_party/python/gyp/test/same-gyp-name/src/subdir2/executable.gyp new file mode 100644 index 0000000000..e3537013eb --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/same-gyp-name/src/subdir2/main2.cc b/third_party/python/gyp/test/same-gyp-name/src/subdir2/main2.cc new file mode 100644 index 0000000000..0c724dee35 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/same-rule-output-file-name/gyptest-all.py b/third_party/python/gyp/test/same-rule-output-file-name/gyptest-all.py new file mode 100644 index 0000000000..964e6b7721 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/same-rule-output-file-name/src/subdir1/subdir1.gyp b/third_party/python/gyp/test/same-rule-output-file-name/src/subdir1/subdir1.gyp new file mode 100644 index 0000000000..bff381a5a5 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/same-rule-output-file-name/src/subdir2/subdir2.gyp b/third_party/python/gyp/test/same-rule-output-file-name/src/subdir2/subdir2.gyp new file mode 100644 index 0000000000..12a35600a3 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/same-rule-output-file-name/src/subdirs.gyp b/third_party/python/gyp/test/same-rule-output-file-name/src/subdirs.gyp new file mode 100644 index 0000000000..25259a38f4 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/same-rule-output-file-name/src/touch.py b/third_party/python/gyp/test/same-rule-output-file-name/src/touch.py new file mode 100644 index 0000000000..2291e9cc56 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/same-source-file-name/gyptest-all.py b/third_party/python/gyp/test/same-source-file-name/gyptest-all.py new file mode 100755 index 0000000000..4c215027c2 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/same-source-file-name/gyptest-default.py b/third_party/python/gyp/test/same-source-file-name/gyptest-default.py new file mode 100755 index 0000000000..98757c2697 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/same-source-file-name/gyptest-pass-executable.py b/third_party/python/gyp/test/same-source-file-name/gyptest-pass-executable.py new file mode 100755 index 0000000000..1a3dcda23d --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/same-source-file-name/gyptest-pass-shared.py b/third_party/python/gyp/test/same-source-file-name/gyptest-pass-shared.py new file mode 100755 index 0000000000..a498f1a846 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/same-source-file-name/gyptest-static.py b/third_party/python/gyp/test/same-source-file-name/gyptest-static.py new file mode 100755 index 0000000000..7fa2772040 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/same-source-file-name/src/all.gyp b/third_party/python/gyp/test/same-source-file-name/src/all.gyp new file mode 100644 index 0000000000..4fe052c668 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/same-source-file-name/src/double-executable.gyp b/third_party/python/gyp/test/same-source-file-name/src/double-executable.gyp new file mode 100644 index 0000000000..477bd87e0d --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/same-source-file-name/src/double-shared.gyp b/third_party/python/gyp/test/same-source-file-name/src/double-shared.gyp new file mode 100644 index 0000000000..438b50f3f1 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/same-source-file-name/src/double-static.gyp b/third_party/python/gyp/test/same-source-file-name/src/double-static.gyp new file mode 100644 index 0000000000..e49c0e1251 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/same-source-file-name/src/func.c b/third_party/python/gyp/test/same-source-file-name/src/func.c new file mode 100644 index 0000000000..e069c692a6 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/same-source-file-name/src/prog1.c b/third_party/python/gyp/test/same-source-file-name/src/prog1.c new file mode 100644 index 0000000000..604e2b9c98 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/same-source-file-name/src/prog2.c b/third_party/python/gyp/test/same-source-file-name/src/prog2.c new file mode 100644 index 0000000000..466ee35003 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/same-source-file-name/src/prog3.c b/third_party/python/gyp/test/same-source-file-name/src/prog3.c new file mode 100644 index 0000000000..34d495ce08 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/same-source-file-name/src/subdir1/func.c b/third_party/python/gyp/test/same-source-file-name/src/subdir1/func.c new file mode 100644 index 0000000000..b73450d105 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/same-source-file-name/src/subdir2/func.c b/third_party/python/gyp/test/same-source-file-name/src/subdir2/func.c new file mode 100644 index 0000000000..0248b5720e --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/same-target-name-different-directory/gyptest-all.py b/third_party/python/gyp/test/same-target-name-different-directory/gyptest-all.py new file mode 100644 index 0000000000..755691b576 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/same-target-name-different-directory/src/subdir1/subdir1.gyp b/third_party/python/gyp/test/same-target-name-different-directory/src/subdir1/subdir1.gyp new file mode 100644 index 0000000000..d4ec2e679a --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/same-target-name-different-directory/src/subdir2/subdir2.gyp b/third_party/python/gyp/test/same-target-name-different-directory/src/subdir2/subdir2.gyp new file mode 100644 index 0000000000..9006d450b2 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/same-target-name-different-directory/src/subdirs.gyp b/third_party/python/gyp/test/same-target-name-different-directory/src/subdirs.gyp new file mode 100644 index 0000000000..65413e73b2 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/same-target-name-different-directory/src/touch.py b/third_party/python/gyp/test/same-target-name-different-directory/src/touch.py new file mode 100644 index 0000000000..2291e9cc56 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/same-target-name/gyptest-same-target-name.py b/third_party/python/gyp/test/same-target-name/gyptest-same-target-name.py new file mode 100755 index 0000000000..bfe5540f31 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/same-target-name/src/all.gyp b/third_party/python/gyp/test/same-target-name/src/all.gyp new file mode 100644 index 0000000000..ac16976da6 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/same-target-name/src/executable1.gyp b/third_party/python/gyp/test/same-target-name/src/executable1.gyp new file mode 100644 index 0000000000..3c492c1b37 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/same-target-name/src/executable2.gyp b/third_party/python/gyp/test/same-target-name/src/executable2.gyp new file mode 100644 index 0000000000..41e84a61c6 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/sanitize-rule-names/blah.S b/third_party/python/gyp/test/sanitize-rule-names/blah.S new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/third_party/python/gyp/test/sanitize-rule-names/blah.S diff --git a/third_party/python/gyp/test/sanitize-rule-names/gyptest-sanitize-rule-names.py b/third_party/python/gyp/test/sanitize-rule-names/gyptest-sanitize-rule-names.py new file mode 100644 index 0000000000..968a0ce5ce --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/sanitize-rule-names/hello.cc b/third_party/python/gyp/test/sanitize-rule-names/hello.cc new file mode 100644 index 0000000000..1711567ef5 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/sanitize-rule-names/sanitize-rule-names.gyp b/third_party/python/gyp/test/sanitize-rule-names/sanitize-rule-names.gyp new file mode 100644 index 0000000000..184253e966 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/sanitize-rule-names/script.py b/third_party/python/gyp/test/sanitize-rule-names/script.py new file mode 100644 index 0000000000..ae2efa1df4 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/self-dependency/common.gypi b/third_party/python/gyp/test/self-dependency/common.gypi new file mode 100644 index 0000000000..aae221a5dd --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/self-dependency/dep.gyp b/third_party/python/gyp/test/self-dependency/dep.gyp new file mode 100644 index 0000000000..2b6c9dda85 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/self-dependency/gyptest-self-dependency.py b/third_party/python/gyp/test/self-dependency/gyptest-self-dependency.py new file mode 100755 index 0000000000..82fab271c5 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/self-dependency/self_dependency.gyp b/third_party/python/gyp/test/self-dependency/self_dependency.gyp new file mode 100644 index 0000000000..0ca76c669b --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/sibling/gyptest-all.py b/third_party/python/gyp/test/sibling/gyptest-all.py new file mode 100755 index 0000000000..318e1a3d84 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/sibling/gyptest-relocate.py b/third_party/python/gyp/test/sibling/gyptest-relocate.py new file mode 100755 index 0000000000..05fa9d96fe --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/sibling/src/build/all.gyp b/third_party/python/gyp/test/sibling/src/build/all.gyp new file mode 100644 index 0000000000..79c80c9363 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/sibling/src/prog1/prog1.c b/third_party/python/gyp/test/sibling/src/prog1/prog1.c new file mode 100644 index 0000000000..218e99401c --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/sibling/src/prog1/prog1.gyp b/third_party/python/gyp/test/sibling/src/prog1/prog1.gyp new file mode 100644 index 0000000000..4532e4be10 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/sibling/src/prog2/prog2.c b/third_party/python/gyp/test/sibling/src/prog2/prog2.c new file mode 100644 index 0000000000..12a31883b9 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/sibling/src/prog2/prog2.gyp b/third_party/python/gyp/test/sibling/src/prog2/prog2.gyp new file mode 100644 index 0000000000..4cf7f6eb2f --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/small/gyptest-small.py b/third_party/python/gyp/test/small/gyptest-small.py new file mode 100755 index 0000000000..e6cb25f3a7 --- /dev/null +++ b/third_party/python/gyp/test/small/gyptest-small.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. + +""" +Runs small tests. +""" + +import imp +import os +import platform +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/third_party/python/gyp/test/standalone-static-library/gyptest-standalone-static-library.py b/third_party/python/gyp/test/standalone-static-library/gyptest-standalone-static-library.py new file mode 100644 index 0000000000..50535abfc7 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/standalone-static-library/invalid.gyp b/third_party/python/gyp/test/standalone-static-library/invalid.gyp new file mode 100644 index 0000000000..54b32117e0 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/standalone-static-library/mylib.c b/third_party/python/gyp/test/standalone-static-library/mylib.c new file mode 100644 index 0000000000..108be618c2 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/standalone-static-library/mylib.gyp b/third_party/python/gyp/test/standalone-static-library/mylib.gyp new file mode 100644 index 0000000000..2d191de319 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/standalone-static-library/prog.c b/third_party/python/gyp/test/standalone-static-library/prog.c new file mode 100644 index 0000000000..8af5c90844 --- /dev/null +++ b/third_party/python/gyp/test/standalone-static-library/prog.c @@ -0,0 +1,7 @@ +extern void print(void); + +int main(void) +{ + print(); + return 0; +} diff --git a/third_party/python/gyp/test/standalone/gyptest-standalone.py b/third_party/python/gyp/test/standalone/gyptest-standalone.py new file mode 100644 index 0000000000..0581d53879 --- /dev/null +++ b/third_party/python/gyp/test/standalone/gyptest-standalone.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 a project hierarchy created with the --generator-output= +option can be built even when it's relocated to a different path. +""" + +from __future__ import print_function + +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, 'rb').read().decode('utf-8', 'ignore') + if 'standalone.gyp' in contents: + print('gyp file referenced in generated output: %s' % file) + test.fail_test() + + +test.pass_test() diff --git a/third_party/python/gyp/test/standalone/standalone.gyp b/third_party/python/gyp/test/standalone/standalone.gyp new file mode 100644 index 0000000000..b2a6785430 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/subdirectory/gyptest-SYMROOT-all.py b/third_party/python/gyp/test/subdirectory/gyptest-SYMROOT-all.py new file mode 100755 index 0000000000..9dfb8b05d4 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/subdirectory/gyptest-SYMROOT-default.py b/third_party/python/gyp/test/subdirectory/gyptest-SYMROOT-default.py new file mode 100755 index 0000000000..8796650905 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/subdirectory/gyptest-subdir-all.py b/third_party/python/gyp/test/subdirectory/gyptest-subdir-all.py new file mode 100755 index 0000000000..d5c458454e --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/subdirectory/gyptest-subdir-default.py b/third_party/python/gyp/test/subdirectory/gyptest-subdir-default.py new file mode 100755 index 0000000000..2cb6659beb --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/subdirectory/gyptest-subdir2-deep.py b/third_party/python/gyp/test/subdirectory/gyptest-subdir2-deep.py new file mode 100755 index 0000000000..48548982f8 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/subdirectory/gyptest-top-all.py b/third_party/python/gyp/test/subdirectory/gyptest-top-all.py new file mode 100755 index 0000000000..b3c25b1f8d --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/subdirectory/gyptest-top-default.py b/third_party/python/gyp/test/subdirectory/gyptest-top-default.py new file mode 100755 index 0000000000..2448dd98ea --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/subdirectory/src/prog1.c b/third_party/python/gyp/test/subdirectory/src/prog1.c new file mode 100644 index 0000000000..218e99401c --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/subdirectory/src/prog1.gyp b/third_party/python/gyp/test/subdirectory/src/prog1.gyp new file mode 100644 index 0000000000..2aa66ce7d7 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/subdirectory/src/subdir/prog2.c b/third_party/python/gyp/test/subdirectory/src/subdir/prog2.c new file mode 100644 index 0000000000..12a31883b9 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/subdirectory/src/subdir/prog2.gyp b/third_party/python/gyp/test/subdirectory/src/subdir/prog2.gyp new file mode 100644 index 0000000000..c6cd35f7f8 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/subdirectory/src/subdir/subdir2/prog3.c b/third_party/python/gyp/test/subdirectory/src/subdir/subdir2/prog3.c new file mode 100644 index 0000000000..a326dc61b6 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/subdirectory/src/subdir/subdir2/prog3.gyp b/third_party/python/gyp/test/subdirectory/src/subdir/subdir2/prog3.gyp new file mode 100644 index 0000000000..b49fb59113 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/subdirectory/src/symroot.gypi b/third_party/python/gyp/test/subdirectory/src/symroot.gypi new file mode 100644 index 0000000000..519916427c --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/symlinks/gyptest-symlinks.py b/third_party/python/gyp/test/symlinks/gyptest-symlinks.py new file mode 100755 index 0000000000..278818a992 --- /dev/null +++ b/third_party/python/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(mode='w+') as gyp_file: + with tempfile.NamedTemporaryFile(mode='w+') 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/third_party/python/gyp/test/symlinks/hello.c b/third_party/python/gyp/test/symlinks/hello.c new file mode 100644 index 0000000000..c63204b948 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/symlinks/hello.gyp b/third_party/python/gyp/test/symlinks/hello.gyp new file mode 100644 index 0000000000..81d9f18e09 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/target/gyptest-target.py b/third_party/python/gyp/test/target/gyptest-target.py new file mode 100644 index 0000000000..4338db739c --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/target/hello.c b/third_party/python/gyp/test/target/hello.c new file mode 100644 index 0000000000..3d535d3ec6 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/target/target.gyp b/third_party/python/gyp/test/target/target.gyp new file mode 100644 index 0000000000..c87e30f533 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/toolsets/gyptest-toolsets.py b/third_party/python/gyp/test/toolsets/gyptest-toolsets.py new file mode 100755 index 0000000000..f80fce70a2 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/toolsets/main.cc b/third_party/python/gyp/test/toolsets/main.cc new file mode 100644 index 0000000000..bc47da9978 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/toolsets/toolsets.cc b/third_party/python/gyp/test/toolsets/toolsets.cc new file mode 100644 index 0000000000..a45fa029cb --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/toolsets/toolsets.gyp b/third_party/python/gyp/test/toolsets/toolsets.gyp new file mode 100644 index 0000000000..3bc3a784ea --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/toolsets/toolsets_shared.cc b/third_party/python/gyp/test/toolsets/toolsets_shared.cc new file mode 100644 index 0000000000..794af2c0bd --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/toplevel-dir/gyptest-toplevel-dir.py b/third_party/python/gyp/test/toplevel-dir/gyptest-toplevel-dir.py new file mode 100755 index 0000000000..9e69512dd3 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/toplevel-dir/src/sub1/main.gyp b/third_party/python/gyp/test/toplevel-dir/src/sub1/main.gyp new file mode 100644 index 0000000000..33219010e4 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/toplevel-dir/src/sub1/prog1.c b/third_party/python/gyp/test/toplevel-dir/src/sub1/prog1.c new file mode 100644 index 0000000000..218e99401c --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/toplevel-dir/src/sub2/prog2.c b/third_party/python/gyp/test/toplevel-dir/src/sub2/prog2.c new file mode 100644 index 0000000000..12a31883b9 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/toplevel-dir/src/sub2/prog2.gyp b/third_party/python/gyp/test/toplevel-dir/src/sub2/prog2.gyp new file mode 100644 index 0000000000..5934548369 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/variables/commands/commands-repeated.gyp b/third_party/python/gyp/test/variables/commands/commands-repeated.gyp new file mode 100644 index 0000000000..1f52e75936 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/variables/commands/commands-repeated.gyp.stdout b/third_party/python/gyp/test/variables/commands/commands-repeated.gyp.stdout new file mode 100644 index 0000000000..00bba88e4f --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/variables/commands/commands-repeated.gypd.golden b/third_party/python/gyp/test/variables/commands/commands-repeated.gypd.golden new file mode 100644 index 0000000000..fa4c53716f --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/variables/commands/commands.gyp b/third_party/python/gyp/test/variables/commands/commands.gyp new file mode 100644 index 0000000000..7d460b1810 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/variables/commands/commands.gyp.ignore-env.stdout b/third_party/python/gyp/test/variables/commands/commands.gyp.ignore-env.stdout new file mode 100644 index 0000000000..1b721d805b --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/variables/commands/commands.gyp.stdout b/third_party/python/gyp/test/variables/commands/commands.gyp.stdout new file mode 100644 index 0000000000..1b721d805b --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/variables/commands/commands.gypd.golden b/third_party/python/gyp/test/variables/commands/commands.gypd.golden new file mode 100644 index 0000000000..13abba26c4 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/variables/commands/commands.gypi b/third_party/python/gyp/test/variables/commands/commands.gypi new file mode 100644 index 0000000000..839cb30b7e --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/variables/commands/gyptest-commands-ignore-env.py b/third_party/python/gyp/test/variables/commands/gyptest-commands-ignore-env.py new file mode 100755 index 0000000000..5470d5ce36 --- /dev/null +++ b/third_party/python/gyp/test/variables/commands/gyptest-commands-ignore-env.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. + +""" +Test that environment variables are ignored when --ignore-environment is +specified. +""" + +from __future__ import print_function +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/third_party/python/gyp/test/variables/commands/gyptest-commands-repeated-multidir.py b/third_party/python/gyp/test/variables/commands/gyptest-commands-repeated-multidir.py new file mode 100755 index 0000000000..21e0487565 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/variables/commands/gyptest-commands-repeated.py b/third_party/python/gyp/test/variables/commands/gyptest-commands-repeated.py new file mode 100755 index 0000000000..fcf98ee02a --- /dev/null +++ b/third_party/python/gyp/test/variables/commands/gyptest-commands-repeated.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. + +""" +Test variable expansion of '<!()' syntax commands where they are evaluated +more then once.. +""" + +from __future__ import print_function + +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/third_party/python/gyp/test/variables/commands/gyptest-commands.py b/third_party/python/gyp/test/variables/commands/gyptest-commands.py new file mode 100755 index 0000000000..3251120ff4 --- /dev/null +++ b/third_party/python/gyp/test/variables/commands/gyptest-commands.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. + +""" +Test variable expansion of '<!()' syntax commands. +""" + +from __future__ import print_function +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/third_party/python/gyp/test/variables/commands/repeated_multidir/dir_1/test_1.gyp b/third_party/python/gyp/test/variables/commands/repeated_multidir/dir_1/test_1.gyp new file mode 100644 index 0000000000..328fc306cd --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/variables/commands/repeated_multidir/dir_2/test_2.gyp b/third_party/python/gyp/test/variables/commands/repeated_multidir/dir_2/test_2.gyp new file mode 100644 index 0000000000..18e0c62c93 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/variables/commands/repeated_multidir/main.gyp b/third_party/python/gyp/test/variables/commands/repeated_multidir/main.gyp new file mode 100644 index 0000000000..5beeeb7244 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/variables/commands/repeated_multidir/print_cwd_basename.py b/third_party/python/gyp/test/variables/commands/repeated_multidir/print_cwd_basename.py new file mode 100755 index 0000000000..9b206bb3d4 --- /dev/null +++ b/third_party/python/gyp/test/variables/commands/repeated_multidir/print_cwd_basename.py @@ -0,0 +1,11 @@ +#!/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. + +from __future__ import print_function +import os +import os.path + +print(os.path.basename(os.getcwd())) diff --git a/third_party/python/gyp/test/variables/commands/repeated_multidir/repeated_command_common.gypi b/third_party/python/gyp/test/variables/commands/repeated_multidir/repeated_command_common.gypi new file mode 100644 index 0000000000..74366771aa --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/variables/commands/test.py b/third_party/python/gyp/test/variables/commands/test.py new file mode 100644 index 0000000000..eb64f95383 --- /dev/null +++ b/third_party/python/gyp/test/variables/commands/test.py @@ -0,0 +1,7 @@ +# Copyright (c) 2017 Google 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 __future__ import print_function + +print("sample\\path\\foo.cpp") diff --git a/third_party/python/gyp/test/variables/commands/update_golden b/third_party/python/gyp/test/variables/commands/update_golden new file mode 100755 index 0000000000..4fcf1eb961 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/variables/empty/empty.gyp b/third_party/python/gyp/test/variables/empty/empty.gyp new file mode 100644 index 0000000000..207be06fe7 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/variables/empty/empty.gypi b/third_party/python/gyp/test/variables/empty/empty.gypi new file mode 100644 index 0000000000..e95031fca5 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/variables/empty/gyptest-empty.py b/third_party/python/gyp/test/variables/empty/gyptest-empty.py new file mode 100755 index 0000000000..4cbe166fdc --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/variables/filelist/filelist.gyp.stdout b/third_party/python/gyp/test/variables/filelist/filelist.gyp.stdout new file mode 100644 index 0000000000..595a19c684 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/variables/filelist/filelist.gypd.golden b/third_party/python/gyp/test/variables/filelist/filelist.gypd.golden new file mode 100644 index 0000000000..09d9116047 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/variables/filelist/gyptest-filelist-golden.py b/third_party/python/gyp/test/variables/filelist/gyptest-filelist-golden.py new file mode 100644 index 0000000000..3ddc6698f8 --- /dev/null +++ b/third_party/python/gyp/test/variables/filelist/gyptest-filelist-golden.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. + +""" +Test variable expansion of '<|(list.txt ...)' syntax commands. +""" + +from __future__ import print_function + +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/third_party/python/gyp/test/variables/filelist/gyptest-filelist.py b/third_party/python/gyp/test/variables/filelist/gyptest-filelist.py new file mode 100755 index 0000000000..b12084c21c --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/variables/filelist/src/dummy.py b/third_party/python/gyp/test/variables/filelist/src/dummy.py new file mode 100644 index 0000000000..e41fc9f8e4 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/variables/filelist/src/filelist.gyp b/third_party/python/gyp/test/variables/filelist/src/filelist.gyp new file mode 100644 index 0000000000..df48eb3e4a --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/variables/filelist/src/filelist2.gyp b/third_party/python/gyp/test/variables/filelist/src/filelist2.gyp new file mode 100644 index 0000000000..ec215dbb76 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/variables/filelist/update_golden b/third_party/python/gyp/test/variables/filelist/update_golden new file mode 100755 index 0000000000..b4d489a342 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/variables/latelate/gyptest-latelate.py b/third_party/python/gyp/test/variables/latelate/gyptest-latelate.py new file mode 100755 index 0000000000..2d77dfec5e --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/variables/latelate/src/latelate.gyp b/third_party/python/gyp/test/variables/latelate/src/latelate.gyp new file mode 100644 index 0000000000..312f3765b6 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/variables/latelate/src/program.cc b/third_party/python/gyp/test/variables/latelate/src/program.cc new file mode 100644 index 0000000000..97c98ae5b9 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/variables/variable-in-path/C1/hello.cc b/third_party/python/gyp/test/variables/variable-in-path/C1/hello.cc new file mode 100644 index 0000000000..1711567ef5 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/variables/variable-in-path/gyptest-variable-in-path.py b/third_party/python/gyp/test/variables/variable-in-path/gyptest-variable-in-path.py new file mode 100644 index 0000000000..b73a279da7 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/variables/variable-in-path/variable-in-path.gyp b/third_party/python/gyp/test/variables/variable-in-path/variable-in-path.gyp new file mode 100644 index 0000000000..908d21eb66 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/asm-files/asm-files.gyp b/third_party/python/gyp/test/win/asm-files/asm-files.gyp new file mode 100644 index 0000000000..b1f132ceea --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/asm-files/b.s b/third_party/python/gyp/test/win/asm-files/b.s new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/third_party/python/gyp/test/win/asm-files/b.s diff --git a/third_party/python/gyp/test/win/asm-files/c.S b/third_party/python/gyp/test/win/asm-files/c.S new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/third_party/python/gyp/test/win/asm-files/c.S diff --git a/third_party/python/gyp/test/win/asm-files/hello.cc b/third_party/python/gyp/test/win/asm-files/hello.cc new file mode 100644 index 0000000000..1711567ef5 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/batch-file-action/batch-file-action.gyp b/third_party/python/gyp/test/win/batch-file-action/batch-file-action.gyp new file mode 100644 index 0000000000..e4db9af9d3 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/batch-file-action/infile b/third_party/python/gyp/test/win/batch-file-action/infile new file mode 100644 index 0000000000..3f9177e45e --- /dev/null +++ b/third_party/python/gyp/test/win/batch-file-action/infile @@ -0,0 +1 @@ +input diff --git a/third_party/python/gyp/test/win/batch-file-action/somecmd.bat b/third_party/python/gyp/test/win/batch-file-action/somecmd.bat new file mode 100644 index 0000000000..d487753743 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/command-quote/a.S b/third_party/python/gyp/test/win/command-quote/a.S new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/third_party/python/gyp/test/win/command-quote/a.S diff --git a/third_party/python/gyp/test/win/command-quote/bat with spaces.bat b/third_party/python/gyp/test/win/command-quote/bat with spaces.bat new file mode 100644 index 0000000000..dc3508f9a9 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/command-quote/command-quote.gyp b/third_party/python/gyp/test/win/command-quote/command-quote.gyp new file mode 100644 index 0000000000..faf724674f --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/command-quote/go.bat b/third_party/python/gyp/test/win/command-quote/go.bat new file mode 100644 index 0000000000..dc3508f9a9 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/command-quote/subdir/and/another/in-subdir.gyp b/third_party/python/gyp/test/win/command-quote/subdir/and/another/in-subdir.gyp new file mode 100644 index 0000000000..3dff4c40b9 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/compiler-flags/additional-include-dirs.cc b/third_party/python/gyp/test/win/compiler-flags/additional-include-dirs.cc new file mode 100644 index 0000000000..f1e11dd12d --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/compiler-flags/additional-include-dirs.gyp b/third_party/python/gyp/test/win/compiler-flags/additional-include-dirs.gyp new file mode 100644 index 0000000000..42c7e849f6 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/compiler-flags/additional-options.cc b/third_party/python/gyp/test/win/compiler-flags/additional-options.cc new file mode 100644 index 0000000000..c79572bafa --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/compiler-flags/additional-options.gyp b/third_party/python/gyp/test/win/compiler-flags/additional-options.gyp new file mode 100644 index 0000000000..6a365a2062 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/compiler-flags/analysis.gyp b/third_party/python/gyp/test/win/compiler-flags/analysis.gyp new file mode 100644 index 0000000000..97e942258f --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/compiler-flags/buffer-security-check.gyp b/third_party/python/gyp/test/win/compiler-flags/buffer-security-check.gyp new file mode 100644 index 0000000000..cc5a12b953 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/compiler-flags/buffer-security.cc b/third_party/python/gyp/test/win/compiler-flags/buffer-security.cc new file mode 100644 index 0000000000..e8a48a2a67 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/compiler-flags/calling-convention-cdecl.def b/third_party/python/gyp/test/win/compiler-flags/calling-convention-cdecl.def new file mode 100644 index 0000000000..dc1dba055a --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/compiler-flags/calling-convention-fastcall.def b/third_party/python/gyp/test/win/compiler-flags/calling-convention-fastcall.def new file mode 100644 index 0000000000..2c61afe208 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/compiler-flags/calling-convention-stdcall.def b/third_party/python/gyp/test/win/compiler-flags/calling-convention-stdcall.def new file mode 100644 index 0000000000..6c7e05e9ea --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/compiler-flags/calling-convention-vectorcall.def b/third_party/python/gyp/test/win/compiler-flags/calling-convention-vectorcall.def new file mode 100644 index 0000000000..4ef119c3e3 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/compiler-flags/calling-convention.cc b/third_party/python/gyp/test/win/compiler-flags/calling-convention.cc new file mode 100644 index 0000000000..0d78a0cc05 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/compiler-flags/calling-convention.gyp b/third_party/python/gyp/test/win/compiler-flags/calling-convention.gyp new file mode 100644 index 0000000000..5069c552bc --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/compiler-flags/character-set-mbcs.cc b/third_party/python/gyp/test/win/compiler-flags/character-set-mbcs.cc new file mode 100644 index 0000000000..3286304730 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/compiler-flags/character-set-unicode.cc b/third_party/python/gyp/test/win/compiler-flags/character-set-unicode.cc new file mode 100644 index 0000000000..32e69724a5 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/compiler-flags/character-set.gyp b/third_party/python/gyp/test/win/compiler-flags/character-set.gyp new file mode 100644 index 0000000000..3dc45557d9 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/compiler-flags/compile-as-managed.cc b/third_party/python/gyp/test/win/compiler-flags/compile-as-managed.cc new file mode 100644 index 0000000000..a29c71ee1d --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/compiler-flags/compile-as-managed.gyp b/third_party/python/gyp/test/win/compiler-flags/compile-as-managed.gyp new file mode 100644 index 0000000000..3bacbbc135 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/compiler-flags/compile-as-winrt.cc b/third_party/python/gyp/test/win/compiler-flags/compile-as-winrt.cc new file mode 100644 index 0000000000..da9954f8fb --- /dev/null +++ b/third_party/python/gyp/test/win/compiler-flags/compile-as-winrt.cc @@ -0,0 +1,12 @@ +// Copyright (c) 2016 Google 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 namespace Platform; + +int main() { + wchar_t msg[] = L"Test"; + String^ str1 = ref new String(msg); + auto str2 = String::Concat(str1, " Concat"); + return 0; +} diff --git a/third_party/python/gyp/test/win/compiler-flags/compile-as-winrt.gyp b/third_party/python/gyp/test/win/compiler-flags/compile-as-winrt.gyp new file mode 100644 index 0000000000..8978e5059d --- /dev/null +++ b/third_party/python/gyp/test/win/compiler-flags/compile-as-winrt.gyp @@ -0,0 +1,20 @@ +# Copyright (c) 2016 Google Inc. All rights 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-winrt', + 'type': 'executable', + 'msvs_windows_sdk_version': 'v10.0', + 'msvs_settings': { + 'VCCLCompilerTool': { + 'AdditionalUsingDirectories': ['$(VCInstallDir)vcpackages;$(WindowsSdkDir)UnionMetadata;%(AdditionalUsingDirectories)'], + 'CompileAsWinRT': 'true' + } + }, + 'sources': ['compile-as-winrt.cc'] + } + ] +} diff --git a/third_party/python/gyp/test/win/compiler-flags/debug-format.gyp b/third_party/python/gyp/test/win/compiler-flags/debug-format.gyp new file mode 100644 index 0000000000..daaed23ff1 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/compiler-flags/default-char-is-unsigned.cc b/third_party/python/gyp/test/win/compiler-flags/default-char-is-unsigned.cc new file mode 100644 index 0000000000..beeca2aa15 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/compiler-flags/default-char-is-unsigned.gyp b/third_party/python/gyp/test/win/compiler-flags/default-char-is-unsigned.gyp new file mode 100644 index 0000000000..941e5810dd --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/compiler-flags/disable-specific-warnings.cc b/third_party/python/gyp/test/win/compiler-flags/disable-specific-warnings.cc new file mode 100644 index 0000000000..d312f5f481 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/compiler-flags/disable-specific-warnings.gyp b/third_party/python/gyp/test/win/compiler-flags/disable-specific-warnings.gyp new file mode 100644 index 0000000000..d81d694c62 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/compiler-flags/enable-enhanced-instruction-set.cc b/third_party/python/gyp/test/win/compiler-flags/enable-enhanced-instruction-set.cc new file mode 100644 index 0000000000..432ef54eda --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/compiler-flags/enable-enhanced-instruction-set.gyp b/third_party/python/gyp/test/win/compiler-flags/enable-enhanced-instruction-set.gyp new file mode 100644 index 0000000000..9c49edc7ff --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/compiler-flags/exception-handling-on.cc b/third_party/python/gyp/test/win/compiler-flags/exception-handling-on.cc new file mode 100644 index 0000000000..5d9a3af77d --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/compiler-flags/exception-handling.gyp b/third_party/python/gyp/test/win/compiler-flags/exception-handling.gyp new file mode 100644 index 0000000000..c266768dda --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/compiler-flags/floating-point-model-fast.cc b/third_party/python/gyp/test/win/compiler-flags/floating-point-model-fast.cc new file mode 100644 index 0000000000..9d22152f5e --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/compiler-flags/floating-point-model-precise.cc b/third_party/python/gyp/test/win/compiler-flags/floating-point-model-precise.cc new file mode 100644 index 0000000000..1191a74ed1 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/compiler-flags/floating-point-model-strict.cc b/third_party/python/gyp/test/win/compiler-flags/floating-point-model-strict.cc new file mode 100644 index 0000000000..1ffde36e0c --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/compiler-flags/floating-point-model.gyp b/third_party/python/gyp/test/win/compiler-flags/floating-point-model.gyp new file mode 100644 index 0000000000..857b275a8f --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/compiler-flags/force-include-files-with-precompiled.cc b/third_party/python/gyp/test/win/compiler-flags/force-include-files-with-precompiled.cc new file mode 100644 index 0000000000..85cb0f32a6 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/compiler-flags/force-include-files.cc b/third_party/python/gyp/test/win/compiler-flags/force-include-files.cc new file mode 100644 index 0000000000..4a93de55d4 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/compiler-flags/force-include-files.gyp b/third_party/python/gyp/test/win/compiler-flags/force-include-files.gyp new file mode 100644 index 0000000000..2031546cc5 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/compiler-flags/function-level-linking.cc b/third_party/python/gyp/test/win/compiler-flags/function-level-linking.cc new file mode 100644 index 0000000000..4952272817 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/compiler-flags/function-level-linking.gyp b/third_party/python/gyp/test/win/compiler-flags/function-level-linking.gyp new file mode 100644 index 0000000000..5858586a24 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/compiler-flags/hello.cc b/third_party/python/gyp/test/win/compiler-flags/hello.cc new file mode 100644 index 0000000000..1711567ef5 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/compiler-flags/optimizations.gyp b/third_party/python/gyp/test/win/compiler-flags/optimizations.gyp new file mode 100644 index 0000000000..e63096f0f7 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/compiler-flags/pdbname-override.gyp b/third_party/python/gyp/test/win/compiler-flags/pdbname-override.gyp new file mode 100644 index 0000000000..dad20e01fd --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/compiler-flags/pdbname.cc b/third_party/python/gyp/test/win/compiler-flags/pdbname.cc new file mode 100644 index 0000000000..0fe05d5afb --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/compiler-flags/pdbname.gyp b/third_party/python/gyp/test/win/compiler-flags/pdbname.gyp new file mode 100644 index 0000000000..8fcf754727 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/compiler-flags/precomp.cc b/third_party/python/gyp/test/win/compiler-flags/precomp.cc new file mode 100644 index 0000000000..d16bac890f --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/compiler-flags/rtti-on.cc b/third_party/python/gyp/test/win/compiler-flags/rtti-on.cc new file mode 100644 index 0000000000..2d3ad03ae4 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/compiler-flags/rtti.gyp b/third_party/python/gyp/test/win/compiler-flags/rtti.gyp new file mode 100644 index 0000000000..704cd58f5a --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/compiler-flags/runtime-checks.cc b/third_party/python/gyp/test/win/compiler-flags/runtime-checks.cc new file mode 100644 index 0000000000..fdb811da87 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/compiler-flags/runtime-checks.gyp b/third_party/python/gyp/test/win/compiler-flags/runtime-checks.gyp new file mode 100644 index 0000000000..8ea3092057 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/compiler-flags/runtime-library-md.cc b/third_party/python/gyp/test/win/compiler-flags/runtime-library-md.cc new file mode 100644 index 0000000000..87c83021d4 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/compiler-flags/runtime-library-mdd.cc b/third_party/python/gyp/test/win/compiler-flags/runtime-library-mdd.cc new file mode 100644 index 0000000000..9f175e493e --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/compiler-flags/runtime-library-mt.cc b/third_party/python/gyp/test/win/compiler-flags/runtime-library-mt.cc new file mode 100644 index 0000000000..27e62b63db --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/compiler-flags/runtime-library-mtd.cc b/third_party/python/gyp/test/win/compiler-flags/runtime-library-mtd.cc new file mode 100644 index 0000000000..a9921db9e2 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/compiler-flags/runtime-library.gyp b/third_party/python/gyp/test/win/compiler-flags/runtime-library.gyp new file mode 100644 index 0000000000..04afc391c7 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/compiler-flags/subdir/header.h b/third_party/python/gyp/test/win/compiler-flags/subdir/header.h new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/third_party/python/gyp/test/win/compiler-flags/subdir/header.h diff --git a/third_party/python/gyp/test/win/compiler-flags/treat-wchar-t-as-built-in-type.gyp b/third_party/python/gyp/test/win/compiler-flags/treat-wchar-t-as-built-in-type.gyp new file mode 100644 index 0000000000..456fe047d0 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/compiler-flags/treat-wchar-t-as-built-in-type1.cc b/third_party/python/gyp/test/win/compiler-flags/treat-wchar-t-as-built-in-type1.cc new file mode 100644 index 0000000000..fc1ed0b7ea --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/compiler-flags/treat-wchar-t-as-built-in-type2.cc b/third_party/python/gyp/test/win/compiler-flags/treat-wchar-t-as-built-in-type2.cc new file mode 100644 index 0000000000..28ab94f742 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/compiler-flags/uninit.cc b/third_party/python/gyp/test/win/compiler-flags/uninit.cc new file mode 100644 index 0000000000..a9d5f5d483 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/compiler-flags/warning-as-error.cc b/third_party/python/gyp/test/win/compiler-flags/warning-as-error.cc new file mode 100644 index 0000000000..fd2130aca5 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/compiler-flags/warning-as-error.gyp b/third_party/python/gyp/test/win/compiler-flags/warning-as-error.gyp new file mode 100644 index 0000000000..d71f261141 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/compiler-flags/warning-level.gyp b/third_party/python/gyp/test/win/compiler-flags/warning-level.gyp new file mode 100644 index 0000000000..2297aa7cac --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/compiler-flags/warning-level1.cc b/third_party/python/gyp/test/win/compiler-flags/warning-level1.cc new file mode 100644 index 0000000000..119578d694 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/compiler-flags/warning-level2.cc b/third_party/python/gyp/test/win/compiler-flags/warning-level2.cc new file mode 100644 index 0000000000..9a26703180 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/compiler-flags/warning-level3.cc b/third_party/python/gyp/test/win/compiler-flags/warning-level3.cc new file mode 100644 index 0000000000..e0a9f3cdd9 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/compiler-flags/warning-level4.cc b/third_party/python/gyp/test/win/compiler-flags/warning-level4.cc new file mode 100644 index 0000000000..48a4fb7018 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/enable-winrt/dllmain.cc b/third_party/python/gyp/test/win/enable-winrt/dllmain.cc new file mode 100644 index 0000000000..dedd83c3f6 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/enable-winrt/enable-winrt.gyp b/third_party/python/gyp/test/win/enable-winrt/enable-winrt.gyp new file mode 100644 index 0000000000..69f70189db --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/generator-output-different-drive/gyptest-generator-output-different-drive.py b/third_party/python/gyp/test/win/generator-output-different-drive/gyptest-generator-output-different-drive.py new file mode 100644 index 0000000000..96a30ec5b9 --- /dev/null +++ b/third_party/python/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.ascii_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/third_party/python/gyp/test/win/generator-output-different-drive/prog.c b/third_party/python/gyp/test/win/generator-output-different-drive/prog.c new file mode 100644 index 0000000000..7937f5d07a --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/generator-output-different-drive/prog.gyp b/third_party/python/gyp/test/win/generator-output-different-drive/prog.gyp new file mode 100644 index 0000000000..92f53e5da5 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/gyptest-asm-files.py b/third_party/python/gyp/test/win/gyptest-asm-files.py new file mode 100644 index 0000000000..007b52eb26 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/gyptest-cl-additional-include-dirs.py b/third_party/python/gyp/test/win/gyptest-cl-additional-include-dirs.py new file mode 100644 index 0000000000..1fabfa9752 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/gyptest-cl-additional-options.py b/third_party/python/gyp/test/win/gyptest-cl-additional-options.py new file mode 100644 index 0000000000..e9aea10dc9 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/gyptest-cl-analysis.py b/third_party/python/gyp/test/win/gyptest-cl-analysis.py new file mode 100644 index 0000000000..7b3b9897f5 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/gyptest-cl-buffer-security-check.py b/third_party/python/gyp/test/win/gyptest-cl-buffer-security-check.py new file mode 100644 index 0000000000..e22869c3d3 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/gyptest-cl-calling-convention.py b/third_party/python/gyp/test/win/gyptest-cl-calling-convention.py new file mode 100644 index 0000000000..b5fdc47744 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/gyptest-cl-character-set.py b/third_party/python/gyp/test/win/gyptest-cl-character-set.py new file mode 100644 index 0000000000..7fabb6722a --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/gyptest-cl-compile-as-managed.py b/third_party/python/gyp/test/win/gyptest-cl-compile-as-managed.py new file mode 100644 index 0000000000..0d7b420485 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/gyptest-cl-compile-as-winrt.py b/third_party/python/gyp/test/win/gyptest-cl-compile-as-winrt.py new file mode 100644 index 0000000000..3e0168b678 --- /dev/null +++ b/third_party/python/gyp/test/win/gyptest-cl-compile-as-winrt.py @@ -0,0 +1,20 @@ +# Copyright (c) 2016 Google 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 + +import os +import sys + +if (sys.platform == 'win32' and + int(os.environ.get('GYP_MSVS_VERSION', 0)) >= 2015): + test = TestGyp.TestGyp(formats=['msvs']) + + CHDIR = 'compiler-flags' + + test.run_gyp('compile-as-winrt.gyp', chdir=CHDIR) + + test.build('compile-as-winrt.gyp', 'test-compile-as-winrt', chdir=CHDIR) + + test.pass_test()
\ No newline at end of file diff --git a/third_party/python/gyp/test/win/gyptest-cl-debug-format.py b/third_party/python/gyp/test/win/gyptest-cl-debug-format.py new file mode 100644 index 0000000000..6c68a619be --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/gyptest-cl-default-char-is-unsigned.py b/third_party/python/gyp/test/win/gyptest-cl-default-char-is-unsigned.py new file mode 100644 index 0000000000..d20f6742f5 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/gyptest-cl-disable-specific-warnings.py b/third_party/python/gyp/test/win/gyptest-cl-disable-specific-warnings.py new file mode 100644 index 0000000000..cb253aff62 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/gyptest-cl-enable-enhanced-instruction-set.py b/third_party/python/gyp/test/win/gyptest-cl-enable-enhanced-instruction-set.py new file mode 100644 index 0000000000..f34e671125 --- /dev/null +++ b/third_party/python/gyp/test/win/gyptest-cl-enable-enhanced-instruction-set.py @@ -0,0 +1,49 @@ +#!/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. +""" + +from __future__ import print_function + +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/third_party/python/gyp/test/win/gyptest-cl-exception-handling.py b/third_party/python/gyp/test/win/gyptest-cl-exception-handling.py new file mode 100644 index 0000000000..5738a54071 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/gyptest-cl-floating-point-model.py b/third_party/python/gyp/test/win/gyptest-cl-floating-point-model.py new file mode 100644 index 0000000000..86ff4785a0 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/gyptest-cl-force-include-files.py b/third_party/python/gyp/test/win/gyptest-cl-force-include-files.py new file mode 100644 index 0000000000..b73b8bd503 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/gyptest-cl-function-level-linking.py b/third_party/python/gyp/test/win/gyptest-cl-function-level-linking.py new file mode 100644 index 0000000000..6ad7b8c484 --- /dev/null +++ b/third_party/python/gyp/test/win/gyptest-cl-function-level-linking.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. + +""" +Make sure function-level linking setting is extracted properly. +""" + +from __future__ import print_function + +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/third_party/python/gyp/test/win/gyptest-cl-optimizations.py b/third_party/python/gyp/test/win/gyptest-cl-optimizations.py new file mode 100644 index 0000000000..31341f7dd7 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/gyptest-cl-pdbname-override.py b/third_party/python/gyp/test/win/gyptest-cl-pdbname-override.py new file mode 100644 index 0000000000..da9b49af16 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/gyptest-cl-pdbname.py b/third_party/python/gyp/test/win/gyptest-cl-pdbname.py new file mode 100644 index 0000000000..f09ac233cd --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/gyptest-cl-rtti.py b/third_party/python/gyp/test/win/gyptest-cl-rtti.py new file mode 100644 index 0000000000..d49a094379 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/gyptest-cl-runtime-checks.py b/third_party/python/gyp/test/win/gyptest-cl-runtime-checks.py new file mode 100644 index 0000000000..4fd529f892 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/gyptest-cl-runtime-library.py b/third_party/python/gyp/test/win/gyptest-cl-runtime-library.py new file mode 100644 index 0000000000..53c149297b --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/gyptest-cl-treat-wchar-t-as-built-in-type.py b/third_party/python/gyp/test/win/gyptest-cl-treat-wchar-t-as-built-in-type.py new file mode 100644 index 0000000000..ca35fb55a0 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/gyptest-cl-warning-as-error.py b/third_party/python/gyp/test/win/gyptest-cl-warning-as-error.py new file mode 100644 index 0000000000..d4ef1b362b --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/gyptest-cl-warning-level.py b/third_party/python/gyp/test/win/gyptest-cl-warning-level.py new file mode 100644 index 0000000000..62a5b39b6a --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/gyptest-command-quote.py b/third_party/python/gyp/test/win/gyptest-command-quote.py new file mode 100644 index 0000000000..656a69da53 --- /dev/null +++ b/third_party/python/gyp/test/win/gyptest-command-quote.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. + +""" + +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". +""" + +from __future__ import print_function + +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/third_party/python/gyp/test/win/gyptest-crosscompile-ar.py b/third_party/python/gyp/test/win/gyptest-crosscompile-ar.py new file mode 100644 index 0000000000..dc75d96a84 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/gyptest-lib-ltcg.py b/third_party/python/gyp/test/win/gyptest-lib-ltcg.py new file mode 100644 index 0000000000..d1d7bad840 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/gyptest-link-additional-deps.py b/third_party/python/gyp/test/win/gyptest-link-additional-deps.py new file mode 100644 index 0000000000..62c57366f9 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/gyptest-link-additional-options.py b/third_party/python/gyp/test/win/gyptest-link-additional-options.py new file mode 100644 index 0000000000..7e57ae4764 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/gyptest-link-aslr.py b/third_party/python/gyp/test/win/gyptest-link-aslr.py new file mode 100644 index 0000000000..e765017d3b --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/gyptest-link-base-address.py b/third_party/python/gyp/test/win/gyptest-link-base-address.py new file mode 100644 index 0000000000..d58527ad7e --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/gyptest-link-debug-info.py b/third_party/python/gyp/test/win/gyptest-link-debug-info.py new file mode 100644 index 0000000000..33e8ac48bf --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/gyptest-link-default-libs.py b/third_party/python/gyp/test/win/gyptest-link-default-libs.py new file mode 100644 index 0000000000..5edf467913 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/gyptest-link-deffile.py b/third_party/python/gyp/test/win/gyptest-link-deffile.py new file mode 100644 index 0000000000..94df874f85 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/gyptest-link-defrelink.py b/third_party/python/gyp/test/win/gyptest-link-defrelink.py new file mode 100644 index 0000000000..cb3f86bb0e --- /dev/null +++ b/third_party/python/gyp/test/win/gyptest-link-defrelink.py @@ -0,0 +1,56 @@ +#!/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. +""" + +from __future__ import print_function + +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/third_party/python/gyp/test/win/gyptest-link-delay-load-dlls.py b/third_party/python/gyp/test/win/gyptest-link-delay-load-dlls.py new file mode 100644 index 0000000000..3880247b4a --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/gyptest-link-embed-manifest.py b/third_party/python/gyp/test/win/gyptest-link-embed-manifest.py new file mode 100644 index 0000000000..0e2b628be1 --- /dev/null +++ b/third_party/python/gyp/test/win/gyptest-link-embed-manifest.py @@ -0,0 +1,100 @@ +#!/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).decode('utf-8', 'ignore') + 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/third_party/python/gyp/test/win/gyptest-link-enable-uac.py b/third_party/python/gyp/test/win/gyptest-link-enable-uac.py new file mode 100644 index 0000000000..0ddbde5fa5 --- /dev/null +++ b/third_party/python/gyp/test/win/gyptest-link-enable-uac.py @@ -0,0 +1,104 @@ +#!/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 + + def _has_key(node, key): + # 'in' doesn't work with the NamedNodeMap interface in Python2, + # but 'has_key' was removed from it in Python3, so we need to + # shim things :(. + if hasattr(node, 'has_key'): + return node.has_key(key) + return key in node + + test.fail_test(not ( + _has_key(execution_level, 'level') and + _has_key(execution_level, '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 ( + _has_key(execution_level, 'level') and + _has_key(execution_level, 'uiAccess') and + execution_level['level'].nodeValue == 'requireAdministrator' and + execution_level['uiAccess'].nodeValue == 'true')) + + test.pass_test() diff --git a/third_party/python/gyp/test/win/gyptest-link-enable-winrt-app-revision.py b/third_party/python/gyp/test/win/gyptest-link-enable-winrt-app-revision.py new file mode 100644 index 0000000000..45d86e1c69 --- /dev/null +++ b/third_party/python/gyp/test/win/gyptest-link-enable-winrt-app-revision.py @@ -0,0 +1,43 @@ +#!/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. +""" + +from __future__ import print_function + +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/third_party/python/gyp/test/win/gyptest-link-enable-winrt-target-platform-version.py b/third_party/python/gyp/test/win/gyptest-link-enable-winrt-target-platform-version.py new file mode 100644 index 0000000000..877cb68f8c --- /dev/null +++ b/third_party/python/gyp/test/win/gyptest-link-enable-winrt-target-platform-version.py @@ -0,0 +1,47 @@ +#!/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. +""" + +from __future__ import print_function + +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/third_party/python/gyp/test/win/gyptest-link-enable-winrt.py b/third_party/python/gyp/test/win/gyptest-link-enable-winrt.py new file mode 100644 index 0000000000..5e0493aade --- /dev/null +++ b/third_party/python/gyp/test/win/gyptest-link-enable-winrt.py @@ -0,0 +1,37 @@ +#!/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. +""" + +from __future__ import print_function + +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/third_party/python/gyp/test/win/gyptest-link-entrypointsymbol.py b/third_party/python/gyp/test/win/gyptest-link-entrypointsymbol.py new file mode 100644 index 0000000000..e88174a085 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/gyptest-link-fixed-base.py b/third_party/python/gyp/test/win/gyptest-link-fixed-base.py new file mode 100644 index 0000000000..725a87028a --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/gyptest-link-force-symbol-reference.py b/third_party/python/gyp/test/win/gyptest-link-force-symbol-reference.py new file mode 100644 index 0000000000..235e94f71b --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/gyptest-link-generate-manifest.py b/third_party/python/gyp/test/win/gyptest-link-generate-manifest.py new file mode 100644 index 0000000000..77c9228ee5 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/gyptest-link-incremental.py b/third_party/python/gyp/test/win/gyptest-link-incremental.py new file mode 100644 index 0000000000..e7184e162c --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/gyptest-link-large-address-aware.py b/third_party/python/gyp/test/win/gyptest-link-large-address-aware.py new file mode 100644 index 0000000000..ea433f2099 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/gyptest-link-large-pdb.py b/third_party/python/gyp/test/win/gyptest-link-large-pdb.py new file mode 100644 index 0000000000..1fb27b0ab7 --- /dev/null +++ b/third_party/python/gyp/test/win/gyptest-link-large-pdb.py @@ -0,0 +1,76 @@ +#!/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. +""" + +from __future__ import print_function + +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/third_party/python/gyp/test/win/gyptest-link-library-adjust.py b/third_party/python/gyp/test/win/gyptest-link-library-adjust.py new file mode 100644 index 0000000000..71d1c09360 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/gyptest-link-library-directories.py b/third_party/python/gyp/test/win/gyptest-link-library-directories.py new file mode 100644 index 0000000000..8308e14fcb --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/gyptest-link-ltcg.py b/third_party/python/gyp/test/win/gyptest-link-ltcg.py new file mode 100644 index 0000000000..5271e099d7 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/gyptest-link-mapfile.py b/third_party/python/gyp/test/win/gyptest-link-mapfile.py new file mode 100644 index 0000000000..00c1dea9e9 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/gyptest-link-nodefaultlib.py b/third_party/python/gyp/test/win/gyptest-link-nodefaultlib.py new file mode 100644 index 0000000000..f00760b882 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/gyptest-link-noimportlib.py b/third_party/python/gyp/test/win/gyptest-link-noimportlib.py new file mode 100644 index 0000000000..d12e0ad3ed --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/gyptest-link-nxcompat.py b/third_party/python/gyp/test/win/gyptest-link-nxcompat.py new file mode 100644 index 0000000000..660074397c --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/gyptest-link-opt-icf.py b/third_party/python/gyp/test/win/gyptest-link-opt-icf.py new file mode 100644 index 0000000000..3c48ef6eb9 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/gyptest-link-opt-ref.py b/third_party/python/gyp/test/win/gyptest-link-opt-ref.py new file mode 100644 index 0000000000..586b7afcd4 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/gyptest-link-ordering.py b/third_party/python/gyp/test/win/gyptest-link-ordering.py new file mode 100644 index 0000000000..ed8ee98c9e --- /dev/null +++ b/third_party/python/gyp/test/win/gyptest-link-ordering.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 the link order of object files is the same between msvs and ninja. +""" + +from __future__ import print_function + +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/third_party/python/gyp/test/win/gyptest-link-outputfile.py b/third_party/python/gyp/test/win/gyptest-link-outputfile.py new file mode 100644 index 0000000000..b98cdff0f0 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/gyptest-link-pdb-no-output.py b/third_party/python/gyp/test/win/gyptest-link-pdb-no-output.py new file mode 100644 index 0000000000..6da0aeae98 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/gyptest-link-pdb-output.py b/third_party/python/gyp/test/win/gyptest-link-pdb-output.py new file mode 100644 index 0000000000..27245f7ec8 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/gyptest-link-pdb.py b/third_party/python/gyp/test/win/gyptest-link-pdb.py new file mode 100644 index 0000000000..26d744d0b7 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/gyptest-link-pgo.py b/third_party/python/gyp/test/win/gyptest-link-pgo.py new file mode 100644 index 0000000000..d742047ac3 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/gyptest-link-profile.py b/third_party/python/gyp/test/win/gyptest-link-profile.py new file mode 100644 index 0000000000..4dbc9ae4ce --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/gyptest-link-restat-importlib.py b/third_party/python/gyp/test/win/gyptest-link-restat-importlib.py new file mode 100644 index 0000000000..d249e0a6bd --- /dev/null +++ b/third_party/python/gyp/test/win/gyptest-link-restat-importlib.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. + +""" +Make sure we don't cause unnecessary builds due to import libs appearing +to be out of date. +""" + +from __future__ import print_function + +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/third_party/python/gyp/test/win/gyptest-link-safeseh.py b/third_party/python/gyp/test/win/gyptest-link-safeseh.py new file mode 100644 index 0000000000..31a25673f4 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/gyptest-link-shard.py b/third_party/python/gyp/test/win/gyptest-link-shard.py new file mode 100644 index 0000000000..9af93284a7 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/gyptest-link-stacksize.py b/third_party/python/gyp/test/win/gyptest-link-stacksize.py new file mode 100644 index 0000000000..2e952d2c73 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/gyptest-link-subsystem.py b/third_party/python/gyp/test/win/gyptest-link-subsystem.py new file mode 100644 index 0000000000..a94ba36856 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/gyptest-link-target-machine.py b/third_party/python/gyp/test/win/gyptest-link-target-machine.py new file mode 100644 index 0000000000..5a15f3f4dc --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/gyptest-link-tsaware.py b/third_party/python/gyp/test/win/gyptest-link-tsaware.py new file mode 100644 index 0000000000..d34b3c24a5 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/gyptest-link-uldi-depending-on-module.py b/third_party/python/gyp/test/win/gyptest-link-uldi-depending-on-module.py new file mode 100644 index 0000000000..75c9503dc4 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/gyptest-link-uldi.py b/third_party/python/gyp/test/win/gyptest-link-uldi.py new file mode 100644 index 0000000000..62c5892c50 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/gyptest-link-unsupported-manifest.py b/third_party/python/gyp/test/win/gyptest-link-unsupported-manifest.py new file mode 100644 index 0000000000..8f7e12bc8c --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/gyptest-link-update-manifest.py b/third_party/python/gyp/test/win/gyptest-link-update-manifest.py new file mode 100644 index 0000000000..7bad1eca77 --- /dev/null +++ b/third_party/python/gyp/test/win/gyptest-link-update-manifest.py @@ -0,0 +1,104 @@ +#!/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).decode('utf-8', 'ignore') + 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), 'w') 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/third_party/python/gyp/test/win/gyptest-link-warnings-as-errors.py b/third_party/python/gyp/test/win/gyptest-link-warnings-as-errors.py new file mode 100644 index 0000000000..d6a64736fb --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/gyptest-long-command-line.py b/third_party/python/gyp/test/win/gyptest-long-command-line.py new file mode 100644 index 0000000000..8f8b7a3bbd --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/gyptest-macro-projectname.py b/third_party/python/gyp/test/win/gyptest-macro-projectname.py new file mode 100644 index 0000000000..e411cc04a4 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/gyptest-macro-targetext.py b/third_party/python/gyp/test/win/gyptest-macro-targetext.py new file mode 100644 index 0000000000..450710d631 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/gyptest-macro-targetfilename.py b/third_party/python/gyp/test/win/gyptest-macro-targetfilename.py new file mode 100644 index 0000000000..759e26c566 --- /dev/null +++ b/third_party/python/gyp/test/win/gyptest-macro-targetfilename.py @@ -0,0 +1,37 @@ +#!/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. +""" + +from __future__ import print_function + +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/third_party/python/gyp/test/win/gyptest-macro-targetname.py b/third_party/python/gyp/test/win/gyptest-macro-targetname.py new file mode 100644 index 0000000000..b1118019a3 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/gyptest-macro-targetpath.py b/third_party/python/gyp/test/win/gyptest-macro-targetpath.py new file mode 100644 index 0000000000..fe7eac1834 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/gyptest-macro-vcinstalldir.py b/third_party/python/gyp/test/win/gyptest-macro-vcinstalldir.py new file mode 100644 index 0000000000..37396e161a --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/gyptest-macros-containing-gyp.py b/third_party/python/gyp/test/win/gyptest-macros-containing-gyp.py new file mode 100644 index 0000000000..f6eaf63dbb --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/gyptest-macros-in-inputs-and-outputs.py b/third_party/python/gyp/test/win/gyptest-macros-in-inputs-and-outputs.py new file mode 100644 index 0000000000..3d6fa74e43 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/gyptest-midl-excluded.py b/third_party/python/gyp/test/win/gyptest-midl-excluded.py new file mode 100644 index 0000000000..70059ab64b --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/gyptest-midl-includedirs.py b/third_party/python/gyp/test/win/gyptest-midl-includedirs.py new file mode 100644 index 0000000000..05f6370409 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/gyptest-midl-rules.py b/third_party/python/gyp/test/win/gyptest-midl-rules.py new file mode 100644 index 0000000000..591a507320 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/gyptest-ml-safeseh.py b/third_party/python/gyp/test/win/gyptest-ml-safeseh.py new file mode 100644 index 0000000000..ec702b9df2 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/gyptest-quoting-commands.py b/third_party/python/gyp/test/win/gyptest-quoting-commands.py new file mode 100644 index 0000000000..b40f99f088 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/gyptest-rc-build.py b/third_party/python/gyp/test/win/gyptest-rc-build.py new file mode 100644 index 0000000000..4df33ab5d9 --- /dev/null +++ b/third_party/python/gyp/test/win/gyptest-rc-build.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. + +""" +Make sure we build and include .rc files. +""" + +from __future__ import print_function + +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/third_party/python/gyp/test/win/gyptest-sys.py b/third_party/python/gyp/test/win/gyptest-sys.py new file mode 100644 index 0000000000..aceb25428e --- /dev/null +++ b/third_party/python/gyp/test/win/gyptest-sys.py @@ -0,0 +1,27 @@ +#!/usr/bin/env python + +# Copyright (c) 2016 Google 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 Windows drivers are built correctly. +""" + +import TestGyp +import TestCmd + +import sys + +if sys.platform == 'win32': + test = TestGyp.TestGyp(formats=['msvs']) + + CHDIR = 'win-driver-target-type' + test.run_gyp('win-driver-target-type.gyp', chdir=CHDIR) + maybe_missing = r'[\s\S]+?(WindowsKernelModeDriver|Build succeeded.)[\s\S]+?' + test.build('win-driver-target-type.gyp', 'win_driver_target_type', + chdir=CHDIR, stdout=maybe_missing, + status=[0, 1], match=TestCmd.match_re_dotall) + + + test.pass_test() diff --git a/third_party/python/gyp/test/win/gyptest-system-include.py b/third_party/python/gyp/test/win/gyptest-system-include.py new file mode 100644 index 0000000000..9a47d98538 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/idl-excluded/bad.idl b/third_party/python/gyp/test/win/idl-excluded/bad.idl new file mode 100644 index 0000000000..38554e9635 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/idl-excluded/copy-file.py b/third_party/python/gyp/test/win/idl-excluded/copy-file.py new file mode 100644 index 0000000000..7bdfbfd4bd --- /dev/null +++ b/third_party/python/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], 'w').write(contents) + +sys.exit(0) diff --git a/third_party/python/gyp/test/win/idl-excluded/idl-excluded.gyp b/third_party/python/gyp/test/win/idl-excluded/idl-excluded.gyp new file mode 100644 index 0000000000..972b7dedac --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/idl-excluded/program.cc b/third_party/python/gyp/test/win/idl-excluded/program.cc new file mode 100644 index 0000000000..9dc3c94f34 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/idl-includedirs/hello.cc b/third_party/python/gyp/test/win/idl-includedirs/hello.cc new file mode 100644 index 0000000000..9dc3c94f34 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/idl-includedirs/idl-includedirs.gyp b/third_party/python/gyp/test/win/idl-includedirs/idl-includedirs.gyp new file mode 100644 index 0000000000..fcec063a98 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/idl-includedirs/subdir/bar.idl b/third_party/python/gyp/test/win/idl-includedirs/subdir/bar.idl new file mode 100644 index 0000000000..d4e6cbb3eb --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/idl-includedirs/subdir/foo.idl b/third_party/python/gyp/test/win/idl-includedirs/subdir/foo.idl new file mode 100644 index 0000000000..c8c65b9be6 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/idl-rules/Window.idl b/third_party/python/gyp/test/win/idl-rules/Window.idl new file mode 100644 index 0000000000..d8ea01bee3 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/idl-rules/basic-idl.gyp b/third_party/python/gyp/test/win/idl-rules/basic-idl.gyp new file mode 100644 index 0000000000..b74622adea --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/idl-rules/history_indexer.idl b/third_party/python/gyp/test/win/idl-rules/history_indexer.idl new file mode 100644 index 0000000000..e866ce6d90 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/idl-rules/history_indexer_user.cc b/third_party/python/gyp/test/win/idl-rules/history_indexer_user.cc new file mode 100644 index 0000000000..071a9ffef5 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/idl-rules/idl_compiler.py b/third_party/python/gyp/test/win/idl-rules/idl_compiler.py new file mode 100644 index 0000000000..a12b274d67 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/importlib/dll_no_exports.cc b/third_party/python/gyp/test/win/importlib/dll_no_exports.cc new file mode 100644 index 0000000000..96dd7970b7 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/importlib/has-exports.cc b/third_party/python/gyp/test/win/importlib/has-exports.cc new file mode 100644 index 0000000000..3f62d6c60d --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/importlib/hello.cc b/third_party/python/gyp/test/win/importlib/hello.cc new file mode 100644 index 0000000000..66ff68c113 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/importlib/importlib.gyp b/third_party/python/gyp/test/win/importlib/importlib.gyp new file mode 100644 index 0000000000..ab15b1893d --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/importlib/noimplib.gyp b/third_party/python/gyp/test/win/importlib/noimplib.gyp new file mode 100644 index 0000000000..0245058a99 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/large-pdb/dllmain.cc b/third_party/python/gyp/test/win/large-pdb/dllmain.cc new file mode 100644 index 0000000000..14875623e8 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/large-pdb/large-pdb.gyp b/third_party/python/gyp/test/win/large-pdb/large-pdb.gyp new file mode 100644 index 0000000000..2a241a5623 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/large-pdb/main.cc b/third_party/python/gyp/test/win/large-pdb/main.cc new file mode 100644 index 0000000000..c3da8e9219 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/lib-crosscompile/answer.cc b/third_party/python/gyp/test/win/lib-crosscompile/answer.cc new file mode 100644 index 0000000000..a6ffa16862 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/lib-crosscompile/answer.h b/third_party/python/gyp/test/win/lib-crosscompile/answer.h new file mode 100644 index 0000000000..82312d54b8 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/lib-crosscompile/use_host_ar.gyp b/third_party/python/gyp/test/win/lib-crosscompile/use_host_ar.gyp new file mode 100644 index 0000000000..4747bc6445 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/lib-flags/answer.cc b/third_party/python/gyp/test/win/lib-flags/answer.cc new file mode 100644 index 0000000000..a6ffa16862 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/lib-flags/answer.h b/third_party/python/gyp/test/win/lib-flags/answer.h new file mode 100644 index 0000000000..82312d54b8 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/lib-flags/ltcg.gyp b/third_party/python/gyp/test/win/lib-flags/ltcg.gyp new file mode 100644 index 0000000000..c183107730 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/linker-flags/a/x.cc b/third_party/python/gyp/test/win/linker-flags/a/x.cc new file mode 100644 index 0000000000..f5f763b095 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/linker-flags/a/z.cc b/third_party/python/gyp/test/win/linker-flags/a/z.cc new file mode 100644 index 0000000000..8a43501270 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/linker-flags/additional-deps.cc b/third_party/python/gyp/test/win/linker-flags/additional-deps.cc new file mode 100644 index 0000000000..7dfb589d26 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/linker-flags/additional-deps.gyp b/third_party/python/gyp/test/win/linker-flags/additional-deps.gyp new file mode 100644 index 0000000000..55afe64fb0 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/linker-flags/additional-options.gyp b/third_party/python/gyp/test/win/linker-flags/additional-options.gyp new file mode 100644 index 0000000000..cab3994cd1 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/linker-flags/aslr.gyp b/third_party/python/gyp/test/win/linker-flags/aslr.gyp new file mode 100644 index 0000000000..b3aefd50b7 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/linker-flags/b/y.cc b/third_party/python/gyp/test/win/linker-flags/b/y.cc new file mode 100644 index 0000000000..bd884119fc --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/linker-flags/base-address.gyp b/third_party/python/gyp/test/win/linker-flags/base-address.gyp new file mode 100644 index 0000000000..873ebfea3f --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/linker-flags/debug-info.gyp b/third_party/python/gyp/test/win/linker-flags/debug-info.gyp new file mode 100644 index 0000000000..d47d0ecced --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/linker-flags/deffile-multiple.gyp b/third_party/python/gyp/test/win/linker-flags/deffile-multiple.gyp new file mode 100644 index 0000000000..c74a9af20a --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/linker-flags/deffile.cc b/third_party/python/gyp/test/win/linker-flags/deffile.cc new file mode 100644 index 0000000000..fa203b34c8 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/linker-flags/deffile.def b/third_party/python/gyp/test/win/linker-flags/deffile.def new file mode 100644 index 0000000000..ba9d399bd6 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/linker-flags/deffile.gyp b/third_party/python/gyp/test/win/linker-flags/deffile.gyp new file mode 100644 index 0000000000..7b241d5e3a --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/linker-flags/delay-load-dlls.gyp b/third_party/python/gyp/test/win/linker-flags/delay-load-dlls.gyp new file mode 100644 index 0000000000..671cbaa802 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/linker-flags/delay-load.cc b/third_party/python/gyp/test/win/linker-flags/delay-load.cc new file mode 100644 index 0000000000..2be34aa876 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/linker-flags/embed-manifest.gyp b/third_party/python/gyp/test/win/linker-flags/embed-manifest.gyp new file mode 100644 index 0000000000..fefb2f56d8 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/linker-flags/enable-uac.gyp b/third_party/python/gyp/test/win/linker-flags/enable-uac.gyp new file mode 100644 index 0000000000..4e58c86ec8 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/linker-flags/entrypointsymbol.cc b/third_party/python/gyp/test/win/linker-flags/entrypointsymbol.cc new file mode 100644 index 0000000000..b567bc87b3 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/linker-flags/entrypointsymbol.gyp b/third_party/python/gyp/test/win/linker-flags/entrypointsymbol.gyp new file mode 100644 index 0000000000..7f2c14252d --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/linker-flags/extra.manifest b/third_party/python/gyp/test/win/linker-flags/extra.manifest new file mode 100644 index 0000000000..2e436dc251 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/linker-flags/extra2.manifest b/third_party/python/gyp/test/win/linker-flags/extra2.manifest new file mode 100644 index 0000000000..bfb570ca59 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/linker-flags/fixed-base.gyp b/third_party/python/gyp/test/win/linker-flags/fixed-base.gyp new file mode 100644 index 0000000000..cc2982eb27 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/linker-flags/force-symbol-reference.gyp b/third_party/python/gyp/test/win/linker-flags/force-symbol-reference.gyp new file mode 100644 index 0000000000..d6d02a6848 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/linker-flags/generate-manifest.gyp b/third_party/python/gyp/test/win/linker-flags/generate-manifest.gyp new file mode 100644 index 0000000000..34a68d1a48 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/linker-flags/hello.cc b/third_party/python/gyp/test/win/linker-flags/hello.cc new file mode 100644 index 0000000000..1711567ef5 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/linker-flags/incremental.gyp b/third_party/python/gyp/test/win/linker-flags/incremental.gyp new file mode 100644 index 0000000000..59f3103253 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/linker-flags/inline_test.cc b/third_party/python/gyp/test/win/linker-flags/inline_test.cc new file mode 100644 index 0000000000..a9f177e476 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/linker-flags/inline_test.h b/third_party/python/gyp/test/win/linker-flags/inline_test.h new file mode 100644 index 0000000000..117913c4f5 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/linker-flags/inline_test_main.cc b/third_party/python/gyp/test/win/linker-flags/inline_test_main.cc new file mode 100644 index 0000000000..23cafe8f94 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/linker-flags/large-address-aware.gyp b/third_party/python/gyp/test/win/linker-flags/large-address-aware.gyp new file mode 100644 index 0000000000..fa56d3789c --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/linker-flags/library-adjust.cc b/third_party/python/gyp/test/win/linker-flags/library-adjust.cc new file mode 100644 index 0000000000..7dfb589d26 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/linker-flags/library-adjust.gyp b/third_party/python/gyp/test/win/linker-flags/library-adjust.gyp new file mode 100644 index 0000000000..10e9996f5c --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/linker-flags/library-directories-define.cc b/third_party/python/gyp/test/win/linker-flags/library-directories-define.cc new file mode 100644 index 0000000000..211ef062c1 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/linker-flags/library-directories-reference.cc b/third_party/python/gyp/test/win/linker-flags/library-directories-reference.cc new file mode 100644 index 0000000000..335097839a --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/linker-flags/library-directories.gyp b/third_party/python/gyp/test/win/linker-flags/library-directories.gyp new file mode 100644 index 0000000000..25395d6c87 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/linker-flags/link-ordering.gyp b/third_party/python/gyp/test/win/linker-flags/link-ordering.gyp new file mode 100644 index 0000000000..66f44309d1 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/linker-flags/link-warning.cc b/third_party/python/gyp/test/win/linker-flags/link-warning.cc new file mode 100644 index 0000000000..4b34277ba3 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/linker-flags/ltcg.gyp b/third_party/python/gyp/test/win/linker-flags/ltcg.gyp new file mode 100644 index 0000000000..ddb0d9b4e2 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/linker-flags/main-crt.c b/third_party/python/gyp/test/win/linker-flags/main-crt.c new file mode 100644 index 0000000000..bdc80c54fd --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/linker-flags/manifest-in-comment.cc b/third_party/python/gyp/test/win/linker-flags/manifest-in-comment.cc new file mode 100644 index 0000000000..ae54ae5462 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/linker-flags/mapfile.cc b/third_party/python/gyp/test/win/linker-flags/mapfile.cc new file mode 100644 index 0000000000..cebccb264a --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/linker-flags/mapfile.gyp b/third_party/python/gyp/test/win/linker-flags/mapfile.gyp new file mode 100644 index 0000000000..14206fe28d --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/linker-flags/no-default-libs.cc b/third_party/python/gyp/test/win/linker-flags/no-default-libs.cc new file mode 100644 index 0000000000..e306846987 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/linker-flags/no-default-libs.gyp b/third_party/python/gyp/test/win/linker-flags/no-default-libs.gyp new file mode 100644 index 0000000000..77838ce8c4 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/linker-flags/nodefaultlib.cc b/third_party/python/gyp/test/win/linker-flags/nodefaultlib.cc new file mode 100644 index 0000000000..24b6eca438 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/linker-flags/nodefaultlib.gyp b/third_party/python/gyp/test/win/linker-flags/nodefaultlib.gyp new file mode 100644 index 0000000000..4fb452a18b --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/linker-flags/nxcompat.gyp b/third_party/python/gyp/test/win/linker-flags/nxcompat.gyp new file mode 100644 index 0000000000..fa4118cbd7 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/linker-flags/opt-icf.cc b/third_party/python/gyp/test/win/linker-flags/opt-icf.cc new file mode 100644 index 0000000000..1f12156b7f --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/linker-flags/opt-icf.gyp b/third_party/python/gyp/test/win/linker-flags/opt-icf.gyp new file mode 100644 index 0000000000..effe8021c3 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/linker-flags/opt-ref.cc b/third_party/python/gyp/test/win/linker-flags/opt-ref.cc new file mode 100644 index 0000000000..afaa328a5d --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/linker-flags/opt-ref.gyp b/third_party/python/gyp/test/win/linker-flags/opt-ref.gyp new file mode 100644 index 0000000000..69d0281a08 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/linker-flags/outputfile.gyp b/third_party/python/gyp/test/win/linker-flags/outputfile.gyp new file mode 100644 index 0000000000..1022ec2e20 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/linker-flags/pdb-output.gyp b/third_party/python/gyp/test/win/linker-flags/pdb-output.gyp new file mode 100644 index 0000000000..1a03c67cc0 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/linker-flags/pgo.gyp b/third_party/python/gyp/test/win/linker-flags/pgo.gyp new file mode 100644 index 0000000000..da32639973 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/linker-flags/profile.gyp b/third_party/python/gyp/test/win/linker-flags/profile.gyp new file mode 100644 index 0000000000..d60a700fbb --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/linker-flags/program-database.gyp b/third_party/python/gyp/test/win/linker-flags/program-database.gyp new file mode 100644 index 0000000000..6e60ac0dc9 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/linker-flags/safeseh.gyp b/third_party/python/gyp/test/win/linker-flags/safeseh.gyp new file mode 100644 index 0000000000..d4a62074b8 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/linker-flags/safeseh_hello.cc b/third_party/python/gyp/test/win/linker-flags/safeseh_hello.cc new file mode 100644 index 0000000000..6141300d2c --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/linker-flags/safeseh_zero.asm b/third_party/python/gyp/test/win/linker-flags/safeseh_zero.asm new file mode 100644 index 0000000000..62da0df4f3 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/linker-flags/safeseh_zero64.asm b/third_party/python/gyp/test/win/linker-flags/safeseh_zero64.asm new file mode 100644 index 0000000000..a4740c0dfb --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/linker-flags/stacksize.gyp b/third_party/python/gyp/test/win/linker-flags/stacksize.gyp new file mode 100644 index 0000000000..bba44ca4a7 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/linker-flags/subdir/library.gyp b/third_party/python/gyp/test/win/linker-flags/subdir/library.gyp new file mode 100644 index 0000000000..519577f0d7 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/linker-flags/subsystem-windows.cc b/third_party/python/gyp/test/win/linker-flags/subsystem-windows.cc new file mode 100644 index 0000000000..ac99da808e --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/linker-flags/subsystem.gyp b/third_party/python/gyp/test/win/linker-flags/subsystem.gyp new file mode 100644 index 0000000000..63f072a206 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/linker-flags/target-machine.gyp b/third_party/python/gyp/test/win/linker-flags/target-machine.gyp new file mode 100644 index 0000000000..30271926c9 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/linker-flags/tsaware.gyp b/third_party/python/gyp/test/win/linker-flags/tsaware.gyp new file mode 100644 index 0000000000..7ffc7426bb --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/linker-flags/unsupported-manifest.gyp b/third_party/python/gyp/test/win/linker-flags/unsupported-manifest.gyp new file mode 100644 index 0000000000..5549e7cb9b --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/linker-flags/update_pgd.py b/third_party/python/gyp/test/win/linker-flags/update_pgd.py new file mode 100644 index 0000000000..176e9e5472 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/linker-flags/warn-as-error.gyp b/third_party/python/gyp/test/win/linker-flags/warn-as-error.gyp new file mode 100644 index 0000000000..83c67e9df1 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/linker-flags/x.cc b/third_party/python/gyp/test/win/linker-flags/x.cc new file mode 100644 index 0000000000..f5f763b095 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/linker-flags/y.cc b/third_party/python/gyp/test/win/linker-flags/y.cc new file mode 100644 index 0000000000..bd884119fc --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/linker-flags/z.cc b/third_party/python/gyp/test/win/linker-flags/z.cc new file mode 100644 index 0000000000..8a43501270 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/long-command-line/function.cc b/third_party/python/gyp/test/win/long-command-line/function.cc new file mode 100644 index 0000000000..af44b2cabd --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/long-command-line/hello.cc b/third_party/python/gyp/test/win/long-command-line/hello.cc new file mode 100644 index 0000000000..1711567ef5 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/long-command-line/long-command-line.gyp b/third_party/python/gyp/test/win/long-command-line/long-command-line.gyp new file mode 100644 index 0000000000..964c94fa94 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/ml-safeseh/a.asm b/third_party/python/gyp/test/win/ml-safeseh/a.asm new file mode 100644 index 0000000000..62da0df4f3 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/ml-safeseh/hello.cc b/third_party/python/gyp/test/win/ml-safeseh/hello.cc new file mode 100644 index 0000000000..6141300d2c --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/ml-safeseh/ml-safeseh.gyp b/third_party/python/gyp/test/win/ml-safeseh/ml-safeseh.gyp new file mode 100644 index 0000000000..bf8618f865 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/precompiled/gyptest-all.py b/third_party/python/gyp/test/win/precompiled/gyptest-all.py new file mode 100644 index 0000000000..9fb5e62edf --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/precompiled/hello.c b/third_party/python/gyp/test/win/precompiled/hello.c new file mode 100644 index 0000000000..ffb47bf822 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/precompiled/hello.gyp b/third_party/python/gyp/test/win/precompiled/hello.gyp new file mode 100644 index 0000000000..5f82c53593 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/precompiled/hello2.c b/third_party/python/gyp/test/win/precompiled/hello2.c new file mode 100644 index 0000000000..d6d53111fb --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/precompiled/precomp.c b/third_party/python/gyp/test/win/precompiled/precomp.c new file mode 100644 index 0000000000..517c61a36b --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/rc-build/Resource.h b/third_party/python/gyp/test/win/rc-build/Resource.h new file mode 100644 index 0000000000..137acf39b5 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/rc-build/hello.cpp b/third_party/python/gyp/test/win/rc-build/hello.cpp new file mode 100644 index 0000000000..f552ca1591 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/rc-build/hello.gyp b/third_party/python/gyp/test/win/rc-build/hello.gyp new file mode 100644 index 0000000000..3a66357dd4 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/rc-build/hello.h b/third_party/python/gyp/test/win/rc-build/hello.h new file mode 100644 index 0000000000..e60f2eb7ed --- /dev/null +++ b/third_party/python/gyp/test/win/rc-build/hello.h @@ -0,0 +1,3 @@ +#pragma once
+
+#include "resource.h"
diff --git a/third_party/python/gyp/test/win/rc-build/hello.ico b/third_party/python/gyp/test/win/rc-build/hello.ico Binary files differnew file mode 100644 index 0000000000..d551aa3aaf --- /dev/null +++ b/third_party/python/gyp/test/win/rc-build/hello.ico diff --git a/third_party/python/gyp/test/win/rc-build/hello.rc b/third_party/python/gyp/test/win/rc-build/hello.rc new file mode 100644 index 0000000000..c9a7af6a07 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/rc-build/hello3.rc b/third_party/python/gyp/test/win/rc-build/hello3.rc new file mode 100644 index 0000000000..c74dede576 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/rc-build/small.ico b/third_party/python/gyp/test/win/rc-build/small.ico Binary files differnew file mode 100644 index 0000000000..d551aa3aaf --- /dev/null +++ b/third_party/python/gyp/test/win/rc-build/small.ico diff --git a/third_party/python/gyp/test/win/rc-build/subdir/hello2.rc b/third_party/python/gyp/test/win/rc-build/subdir/hello2.rc new file mode 100644 index 0000000000..4c8eab109e --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/rc-build/subdir/include.h b/third_party/python/gyp/test/win/rc-build/subdir/include.h new file mode 100644 index 0000000000..f15c48b422 --- /dev/null +++ b/third_party/python/gyp/test/win/rc-build/subdir/include.h @@ -0,0 +1 @@ +// Just exists to make sure it can be included.
diff --git a/third_party/python/gyp/test/win/rc-build/targetver.h b/third_party/python/gyp/test/win/rc-build/targetver.h new file mode 100644 index 0000000000..f583181dfd --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/shard/hello.cc b/third_party/python/gyp/test/win/shard/hello.cc new file mode 100644 index 0000000000..a9dce62453 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/shard/hello1.cc b/third_party/python/gyp/test/win/shard/hello1.cc new file mode 100644 index 0000000000..0eccf2861d --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/shard/hello2.cc b/third_party/python/gyp/test/win/shard/hello2.cc new file mode 100644 index 0000000000..23fcb546cb --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/shard/hello3.cc b/third_party/python/gyp/test/win/shard/hello3.cc new file mode 100644 index 0000000000..a72e2efb5a --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/shard/hello4.cc b/third_party/python/gyp/test/win/shard/hello4.cc new file mode 100644 index 0000000000..a94df19499 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/shard/shard.gyp b/third_party/python/gyp/test/win/shard/shard.gyp new file mode 100644 index 0000000000..eac45fcff7 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/shard/shard_ref.gyp b/third_party/python/gyp/test/win/shard/shard_ref.gyp new file mode 100644 index 0000000000..3ec8d76f99 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/system-include/bar/header.h b/third_party/python/gyp/test/win/system-include/bar/header.h new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/third_party/python/gyp/test/win/system-include/bar/header.h diff --git a/third_party/python/gyp/test/win/system-include/common/commonheader.h b/third_party/python/gyp/test/win/system-include/common/commonheader.h new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/third_party/python/gyp/test/win/system-include/common/commonheader.h diff --git a/third_party/python/gyp/test/win/system-include/foo/header.h b/third_party/python/gyp/test/win/system-include/foo/header.h new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/third_party/python/gyp/test/win/system-include/foo/header.h diff --git a/third_party/python/gyp/test/win/system-include/main.cc b/third_party/python/gyp/test/win/system-include/main.cc new file mode 100644 index 0000000000..b04ea8a530 --- /dev/null +++ b/third_party/python/gyp/test/win/system-include/main.cc @@ -0,0 +1,4 @@ +#include <commonheader.h> +#include <header.h> + +int main() {} diff --git a/third_party/python/gyp/test/win/system-include/test.gyp b/third_party/python/gyp/test/win/system-include/test.gyp new file mode 100644 index 0000000000..07f2636543 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/uldi/a.cc b/third_party/python/gyp/test/win/uldi/a.cc new file mode 100644 index 0000000000..0fe05d5afb --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/uldi/b.cc b/third_party/python/gyp/test/win/uldi/b.cc new file mode 100644 index 0000000000..0fe05d5afb --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/uldi/dll.cc b/third_party/python/gyp/test/win/uldi/dll.cc new file mode 100644 index 0000000000..93a6c19003 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/uldi/exe.cc b/third_party/python/gyp/test/win/uldi/exe.cc new file mode 100644 index 0000000000..b3039ace96 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/uldi/main.cc b/third_party/python/gyp/test/win/uldi/main.cc new file mode 100644 index 0000000000..81b46d863a --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/uldi/uldi-depending-on-module.gyp b/third_party/python/gyp/test/win/uldi/uldi-depending-on-module.gyp new file mode 100644 index 0000000000..3e34de8418 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/uldi/uldi.gyp b/third_party/python/gyp/test/win/uldi/uldi.gyp new file mode 100644 index 0000000000..c32f5e0956 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/vs-macros/as.py b/third_party/python/gyp/test/win/vs-macros/as.py new file mode 100644 index 0000000000..806c91d926 --- /dev/null +++ b/third_party/python/gyp/test/win/vs-macros/as.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. + +from __future__ import print_function + +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('options', options, file=f) +print('args', args, file=f) +f.close() diff --git a/third_party/python/gyp/test/win/vs-macros/containing-gyp.gyp b/third_party/python/gyp/test/win/vs-macros/containing-gyp.gyp new file mode 100644 index 0000000000..c07b639ff1 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/vs-macros/do_stuff.py b/third_party/python/gyp/test/win/vs-macros/do_stuff.py new file mode 100644 index 0000000000..4669d3139b --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/vs-macros/hello.cc b/third_party/python/gyp/test/win/vs-macros/hello.cc new file mode 100644 index 0000000000..1711567ef5 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/vs-macros/input-output-macros.gyp b/third_party/python/gyp/test/win/vs-macros/input-output-macros.gyp new file mode 100644 index 0000000000..b4520f8cb8 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/vs-macros/input.S b/third_party/python/gyp/test/win/vs-macros/input.S new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/third_party/python/gyp/test/win/vs-macros/input.S diff --git a/third_party/python/gyp/test/win/vs-macros/projectname.gyp b/third_party/python/gyp/test/win/vs-macros/projectname.gyp new file mode 100644 index 0000000000..625a177643 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/vs-macros/stuff.blah b/third_party/python/gyp/test/win/vs-macros/stuff.blah new file mode 100644 index 0000000000..d438b4a787 --- /dev/null +++ b/third_party/python/gyp/test/win/vs-macros/stuff.blah @@ -0,0 +1 @@ +Random data file. diff --git a/third_party/python/gyp/test/win/vs-macros/targetext.gyp b/third_party/python/gyp/test/win/vs-macros/targetext.gyp new file mode 100644 index 0000000000..11f580e4a6 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/vs-macros/targetfilename.gyp b/third_party/python/gyp/test/win/vs-macros/targetfilename.gyp new file mode 100644 index 0000000000..8287320278 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/vs-macros/targetname.gyp b/third_party/python/gyp/test/win/vs-macros/targetname.gyp new file mode 100644 index 0000000000..a53d3c0aa3 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/vs-macros/targetpath.gyp b/third_party/python/gyp/test/win/vs-macros/targetpath.gyp new file mode 100644 index 0000000000..a8699ffb25 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/vs-macros/test_exists.py b/third_party/python/gyp/test/win/vs-macros/test_exists.py new file mode 100644 index 0000000000..297b1b7d9f --- /dev/null +++ b/third_party/python/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 Exception() +open(sys.argv[2], 'w').close() diff --git a/third_party/python/gyp/test/win/vs-macros/vcinstalldir.gyp b/third_party/python/gyp/test/win/vs-macros/vcinstalldir.gyp new file mode 100644 index 0000000000..3763a4eb18 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/win-driver-target-type/win-driver-target-type.c b/third_party/python/gyp/test/win/win-driver-target-type/win-driver-target-type.c new file mode 100644 index 0000000000..a6bee029ab --- /dev/null +++ b/third_party/python/gyp/test/win/win-driver-target-type/win-driver-target-type.c @@ -0,0 +1,10 @@ +// Copyright (c) 2016 Google 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 "win-driver-target-type.h" + +NTSTATUS DriverEntry(_In_ struct _DRIVER_OBJECT *DriverObject, + _In_ PUNICODE_STRING RegistryPath) { + return STATUS_SUCCESS; +} diff --git a/third_party/python/gyp/test/win/win-driver-target-type/win-driver-target-type.gyp b/third_party/python/gyp/test/win/win-driver-target-type/win-driver-target-type.gyp new file mode 100644 index 0000000000..5da9cc9bd8 --- /dev/null +++ b/third_party/python/gyp/test/win/win-driver-target-type/win-driver-target-type.gyp @@ -0,0 +1,32 @@ +# Copyright (c) 2016 Google Inc. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +{ + 'targets': [ + { + 'target_name': 'win_driver_target_type', + 'type': 'windows_driver', + 'msvs_target_version': 'Windows7', + 'sources': [ + 'win-driver-target-type.c', + 'win-driver-target-type.h', + 'win-driver-target-type.rc', + ], + 'msvs_settings': { + 'VCLinkerTool': { + 'AdditionalDependencies': [ + 'wdmsec.lib', + 'ntoskrnl.lib', + 'hal.lib', + 'wmilib.lib', + 'bufferoverflowfastfailk.lib', + ], + }, + 'VCCLCompilerTool': { + 'WarnAsError': 'false', + }, + }, + }, + ] +} diff --git a/third_party/python/gyp/test/win/win-driver-target-type/win-driver-target-type.h b/third_party/python/gyp/test/win/win-driver-target-type/win-driver-target-type.h new file mode 100644 index 0000000000..5bbffd2373 --- /dev/null +++ b/third_party/python/gyp/test/win/win-driver-target-type/win-driver-target-type.h @@ -0,0 +1,13 @@ +// Copyright (c) 2016 Google Inc. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE + +#ifndef _WIN_DRIVER_TARGET_TYPE_H_ +#define _WIN_DRIVER_TARGET_TYPE_H_ + +#include <ntifs.h> +#include <ntdddisk.h> + +DRIVER_INITIALIZE DriverEntry; + +#endif diff --git a/third_party/python/gyp/test/win/win-driver-target-type/win-driver-target-type.rc b/third_party/python/gyp/test/win/win-driver-target-type/win-driver-target-type.rc new file mode 100644 index 0000000000..7a037ef736 --- /dev/null +++ b/third_party/python/gyp/test/win/win-driver-target-type/win-driver-target-type.rc @@ -0,0 +1,14 @@ +// Copyright (c) 2016 Google 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 <ntverp.h> + +#define VER_FILETYPE VFT_DRV +#define VER_FILESUBTYPE VFT2_DRV_SYSTEM +#define VER_FILEDESCRIPTION_STR "Windows Driver GYP target type" +#define VER_INTERNALNAME_STR "win-driver-target-type.sys" +#define VER_ORIGINALFILENAME_STR "win-driver-target-type.sys" + +#include "common.ver" diff --git a/third_party/python/gyp/test/win/win-tool/copies_readonly_files.gyp b/third_party/python/gyp/test/win/win-tool/copies_readonly_files.gyp new file mode 100644 index 0000000000..3cd7e69f1a --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/win-tool/gyptest-win-tool-handles-readonly-files.py b/third_party/python/gyp/test/win/win-tool/gyptest-win-tool-handles-readonly-files.py new file mode 100644 index 0000000000..951b952775 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/winrt-app-type-revision/dllmain.cc b/third_party/python/gyp/test/win/winrt-app-type-revision/dllmain.cc new file mode 100644 index 0000000000..dedd83c3f6 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/winrt-app-type-revision/winrt-app-type-revison.gyp b/third_party/python/gyp/test/win/winrt-app-type-revision/winrt-app-type-revison.gyp new file mode 100644 index 0000000000..5f37b5a2ab --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/winrt-target-platform-version/dllmain.cc b/third_party/python/gyp/test/win/winrt-target-platform-version/dllmain.cc new file mode 100644 index 0000000000..d71460c924 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/win/winrt-target-platform-version/winrt-target-platform-version.gyp b/third_party/python/gyp/test/win/winrt-target-platform-version/winrt-target-platform-version.gyp new file mode 100644 index 0000000000..dbcfac6962 --- /dev/null +++ b/third_party/python/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/third_party/python/gyp/test/xcode-ninja/list_excluded/gyptest-all.py b/third_party/python/gyp/test/xcode-ninja/list_excluded/gyptest-all.py new file mode 100644 index 0000000000..2d6378a7a2 --- /dev/null +++ b/third_party/python/gyp/test/xcode-ninja/list_excluded/gyptest-all.py @@ -0,0 +1,49 @@ +#!/usr/bin/env python + +# Copyright (c) 2016 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. + +""" +Verifies that excluded files are listed in sources_for_indexing.xcodeproj by +default, and that the generator flag xcode_ninja_list_excluded_files can be +used to override the default behavior. +""" + +import os +import TestGyp + + +test = TestGyp.TestGyp() + +if test.format != 'xcode-ninja': + test.skip_test() + + +# With the generator flag not set. +test.run_gyp('hello_exclude.gyp') +test.must_contain( + 'sources_for_indexing.xcodeproj/project.pbxproj', 'hello_excluded.cpp') + + +# With the generator flag set to 0. +try: + os.environ['GYP_GENERATOR_FLAGS'] = 'xcode_ninja_list_excluded_files=0' + test.run_gyp('hello_exclude.gyp') +finally: + del os.environ['GYP_GENERATOR_FLAGS'] +test.must_not_contain( + 'sources_for_indexing.xcodeproj/project.pbxproj', 'hello_excluded.cpp') + + +# With the generator flag explicitly set to 1. +try: + os.environ['GYP_GENERATOR_FLAGS'] = 'xcode_ninja_list_excluded_files=1' + test.run_gyp('hello_exclude.gyp') +finally: + del os.environ['GYP_GENERATOR_FLAGS'] +test.must_contain( + 'sources_for_indexing.xcodeproj/project.pbxproj', 'hello_excluded.cpp') + + +test.pass_test() diff --git a/third_party/python/gyp/test/xcode-ninja/list_excluded/hello.cpp b/third_party/python/gyp/test/xcode-ninja/list_excluded/hello.cpp new file mode 100644 index 0000000000..cd409dabf9 --- /dev/null +++ b/third_party/python/gyp/test/xcode-ninja/list_excluded/hello.cpp @@ -0,0 +1,7 @@ +// Copyright (c) 2016 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. + +int main() { + return 0; +} diff --git a/third_party/python/gyp/test/xcode-ninja/list_excluded/hello_exclude.gyp b/third_party/python/gyp/test/xcode-ninja/list_excluded/hello_exclude.gyp new file mode 100644 index 0000000000..f5f0e8eafd --- /dev/null +++ b/third_party/python/gyp/test/xcode-ninja/list_excluded/hello_exclude.gyp @@ -0,0 +1,19 @@ +# Copyright (c) 2016 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': 'hello', + 'type': 'executable', + 'sources': [ + 'hello.cpp', + 'hello_excluded.cpp', + ], + 'sources!': [ + 'hello_excluded.cpp', + ], + }, + ], +} diff --git a/third_party/python/gyp/test/xcode-ninja/list_excluded/hello_excluded.cpp b/third_party/python/gyp/test/xcode-ninja/list_excluded/hello_excluded.cpp new file mode 100644 index 0000000000..2115529542 --- /dev/null +++ b/third_party/python/gyp/test/xcode-ninja/list_excluded/hello_excluded.cpp @@ -0,0 +1,7 @@ +// Copyright (c) 2016 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. + +int main() { + return 42; +} |