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, Ninja, and CMake do not support setting the build directory. 27 test = TestGyp.TestGyp(formats=['!make', '!ninja', '!android', '!cmake']) 28 29 test.run_gyp('prog1.gyp', '--depth=..', chdir='src') 30 if test.format == 'msvs': 31 if test.uses_msbuild: 32 test.must_contain('src/prog1.vcxproj', 33 '<OutDir>..\\builddir\\Default\\</OutDir>') 34 else: 35 test.must_contain('src/prog1.vcproj', 36 'OutputDirectory="..\\builddir\\Default\\"') 37 38 test.relocate('src', 'relocate/src') 39 40 test.subdir('relocate/builddir') 41 42 # Make sure that all the built ../../etc. files only get put under builddir, 43 # by making all of relocate read-only and then making only builddir writable. 44 test.writable('relocate', False) 45 test.writable('relocate/builddir', True) 46 47 # Suppress the test infrastructure's setting SYMROOT on the command line. 48 test.build('prog1.gyp', SYMROOT=None, chdir='relocate/src') 49 50 expect1 = """\ 51 Hello from prog1.c 52 Hello from func1.c 53 """ 54 55 expect2 = """\ 56 Hello from subdir2/prog2.c 57 Hello from func2.c 58 """ 59 60 expect3 = """\ 61 Hello from subdir2/subdir3/prog3.c 62 Hello from func3.c 63 """ 64 65 expect4 = """\ 66 Hello from subdir2/subdir3/subdir4/prog4.c 67 Hello from func4.c 68 """ 69 70 expect5 = """\ 71 Hello from subdir2/subdir3/subdir4/subdir5/prog5.c 72 Hello from func5.c 73 """ 74 75 def run_builddir(prog, expect): 76 dir = 'relocate/builddir/Default/' 77 test.run(program=test.workpath(dir + prog), stdout=expect) 78 79 run_builddir('prog1', expect1) 80 run_builddir('prog2', expect2) 81 run_builddir('prog3', expect3) 82 run_builddir('prog4', expect4) 83 run_builddir('prog5', expect5) 84 85 test.pass_test() 86