1 #!/usr/bin/env python 2 3 # Copyright (c) 2012 Google Inc. All rights reserved. 4 # Use of this source code is governed by a BSD-style license that can be 5 # found in the LICENSE file. 6 7 """ 8 Verify the settings that cause a set of programs to be created in 9 a specific build directory, and that no intermediate built files 10 get created outside of that build directory hierarchy even when 11 referred to with deeply-nested ../../.. paths. 12 """ 13 14 import TestGyp 15 16 # TODO(mmoss): Make only supports (theoretically) a single, global build 17 # directory (through GYP_GENERATOR_FLAGS 'output_dir'), rather than 18 # gyp-file-specific settings (e.g. the stuff in builddir.gypi) that the other 19 # generators support, so this doesn't work yet for make. 20 # TODO(mmoss) Make also has the issue that the top-level Makefile is written to 21 # the "--depth" location, which is one level above 'src', but then this test 22 # moves 'src' somewhere else, leaving the Makefile behind, so make can't find 23 # its sources. I'm not sure if make is wrong for writing outside the current 24 # directory, or if the test is wrong for assuming everything generated is under 25 # the current directory. 26 # Android does not support setting the build directory. 27 # Ninja does not support relocation. 28 test = TestGyp.TestGyp(formats=['!make', '!ninja', '!android']) 29 30 test.run_gyp('prog1.gyp', '--depth=..', chdir='src') 31 if test.format == 'msvs': 32 if test.uses_msbuild: 33 test.must_contain('src/prog1.vcxproj', 34 '<OutDir>..\\builddir\\Default\\</OutDir>') 35 else: 36 test.must_contain('src/prog1.vcproj', 37 'OutputDirectory="..\\builddir\\Default\\"') 38 39 test.relocate('src', 'relocate/src') 40 41 test.subdir('relocate/builddir') 42 43 # Make sure that all the built ../../etc. files only get put under builddir, 44 # by making all of relocate read-only and then making only builddir writable. 45 test.writable('relocate', False) 46 test.writable('relocate/builddir', True) 47 48 # Suppress the test infrastructure's setting SYMROOT on the command line. 49 test.build('prog1.gyp', test.ALL, SYMROOT=None, chdir='relocate/src') 50 51 expect1 = """\ 52 Hello from prog1.c 53 Hello from func1.c 54 """ 55 56 expect2 = """\ 57 Hello from subdir2/prog2.c 58 Hello from func2.c 59 """ 60 61 expect3 = """\ 62 Hello from subdir2/subdir3/prog3.c 63 Hello from func3.c 64 """ 65 66 expect4 = """\ 67 Hello from subdir2/subdir3/subdir4/prog4.c 68 Hello from func4.c 69 """ 70 71 expect5 = """\ 72 Hello from subdir2/subdir3/subdir4/subdir5/prog5.c 73 Hello from func5.c 74 """ 75 76 def run_builddir(prog, expect): 77 dir = 'relocate/builddir/Default/' 78 test.run(program=test.workpath(dir + prog), stdout=expect) 79 80 run_builddir('prog1', expect1) 81 run_builddir('prog2', expect2) 82 run_builddir('prog3', expect3) 83 run_builddir('prog4', expect4) 84 run_builddir('prog5', expect5) 85 86 test.pass_test() 87