1144e82c7443e514c716183992708a1e9b8467b93sgk@chromium.org#!/usr/bin/env python
2144e82c7443e514c716183992708a1e9b8467b93sgk@chromium.org
39be1d37a9a6561f135412db66806def9f82a29c1steveblock@chromium.org# Copyright (c) 2012 Google Inc. All rights reserved.
4df8224662e615bd36cf8bebae8e58c017201f998sgk@chromium.org# Use of this source code is governed by a BSD-style license that can be
5df8224662e615bd36cf8bebae8e58c017201f998sgk@chromium.org# found in the LICENSE file.
6df8224662e615bd36cf8bebae8e58c017201f998sgk@chromium.org
7144e82c7443e514c716183992708a1e9b8467b93sgk@chromium.org"""
8144e82c7443e514c716183992708a1e9b8467b93sgk@chromium.orgVerify the settings that cause a set of programs to be created in
9144e82c7443e514c716183992708a1e9b8467b93sgk@chromium.orga specific build directory, and that no intermediate built files
10144e82c7443e514c716183992708a1e9b8467b93sgk@chromium.orgget created outside of that build directory hierarchy even when
11144e82c7443e514c716183992708a1e9b8467b93sgk@chromium.orgreferred to with deeply-nested ../../.. paths.
12144e82c7443e514c716183992708a1e9b8467b93sgk@chromium.org"""
13144e82c7443e514c716183992708a1e9b8467b93sgk@chromium.org
14144e82c7443e514c716183992708a1e9b8467b93sgk@chromium.orgimport TestGyp
15144e82c7443e514c716183992708a1e9b8467b93sgk@chromium.org
1642fe9e34656acc5b5ab1e80a8ba557353e12d1f6mmoss@chromium.org# TODO(mmoss): Make only supports (theoretically) a single, global build
1742fe9e34656acc5b5ab1e80a8ba557353e12d1f6mmoss@chromium.org# directory (through GYP_GENERATOR_FLAGS 'output_dir'), rather than
1842fe9e34656acc5b5ab1e80a8ba557353e12d1f6mmoss@chromium.org# gyp-file-specific settings (e.g. the stuff in builddir.gypi) that the other
1942fe9e34656acc5b5ab1e80a8ba557353e12d1f6mmoss@chromium.org# generators support, so this doesn't work yet for make.
2042fe9e34656acc5b5ab1e80a8ba557353e12d1f6mmoss@chromium.org# TODO(mmoss) Make also has the issue that the top-level Makefile is written to
2142fe9e34656acc5b5ab1e80a8ba557353e12d1f6mmoss@chromium.org# the "--depth" location, which is one level above 'src', but then this test
2242fe9e34656acc5b5ab1e80a8ba557353e12d1f6mmoss@chromium.org# moves 'src' somewhere else, leaving the Makefile behind, so make can't find
2342fe9e34656acc5b5ab1e80a8ba557353e12d1f6mmoss@chromium.org# its sources. I'm not sure if make is wrong for writing outside the current
2442fe9e34656acc5b5ab1e80a8ba557353e12d1f6mmoss@chromium.org# directory, or if the test is wrong for assuming everything generated is under
2542fe9e34656acc5b5ab1e80a8ba557353e12d1f6mmoss@chromium.org# the current directory.
26d0176c0a2a9e558662905c328c3aa93fd25bbf12bungeman@chromium.org# Android, Ninja, and CMake do not support setting the build directory.
27d0176c0a2a9e558662905c328c3aa93fd25bbf12bungeman@chromium.orgtest = TestGyp.TestGyp(formats=['!make', '!ninja', '!android', '!cmake'])
28144e82c7443e514c716183992708a1e9b8467b93sgk@chromium.org
29144e82c7443e514c716183992708a1e9b8467b93sgk@chromium.orgtest.run_gyp('prog1.gyp', '--depth=..', chdir='src')
308197942c7a463ec426e8a6f3ad10ecfcb44025a3iannucci@chromium.orgif test.format == 'msvs':
318197942c7a463ec426e8a6f3ad10ecfcb44025a3iannucci@chromium.org  if test.uses_msbuild:
328197942c7a463ec426e8a6f3ad10ecfcb44025a3iannucci@chromium.org    test.must_contain('src/prog1.vcxproj',
338197942c7a463ec426e8a6f3ad10ecfcb44025a3iannucci@chromium.org      '<OutDir>..\\builddir\\Default\\</OutDir>')
348197942c7a463ec426e8a6f3ad10ecfcb44025a3iannucci@chromium.org  else:
358197942c7a463ec426e8a6f3ad10ecfcb44025a3iannucci@chromium.org    test.must_contain('src/prog1.vcproj',
36d3048f9eb2ac620ee316a5e3d773167e17dc2784iannucci@chromium.org      'OutputDirectory="..\\builddir\\Default\\"')
37144e82c7443e514c716183992708a1e9b8467b93sgk@chromium.org
38fa5b46b96b21ff75d8b6b3dacc4693b69c43654csgk@chromium.orgtest.relocate('src', 'relocate/src')
39144e82c7443e514c716183992708a1e9b8467b93sgk@chromium.org
40144e82c7443e514c716183992708a1e9b8467b93sgk@chromium.orgtest.subdir('relocate/builddir')
41144e82c7443e514c716183992708a1e9b8467b93sgk@chromium.org
42144e82c7443e514c716183992708a1e9b8467b93sgk@chromium.org# Make sure that all the built ../../etc. files only get put under builddir,
43144e82c7443e514c716183992708a1e9b8467b93sgk@chromium.org# by making all of relocate read-only and then making only builddir writable.
44144e82c7443e514c716183992708a1e9b8467b93sgk@chromium.orgtest.writable('relocate', False)
45144e82c7443e514c716183992708a1e9b8467b93sgk@chromium.orgtest.writable('relocate/builddir', True)
46144e82c7443e514c716183992708a1e9b8467b93sgk@chromium.org
47144e82c7443e514c716183992708a1e9b8467b93sgk@chromium.org# Suppress the test infrastructure's setting SYMROOT on the command line.
48040d50e7277c41a0b9641dc42c76be8605055637sgk@chromium.orgtest.build('prog1.gyp', test.ALL, SYMROOT=None, chdir='relocate/src')
49144e82c7443e514c716183992708a1e9b8467b93sgk@chromium.org
50144e82c7443e514c716183992708a1e9b8467b93sgk@chromium.orgexpect1 = """\
51144e82c7443e514c716183992708a1e9b8467b93sgk@chromium.orgHello from prog1.c
52144e82c7443e514c716183992708a1e9b8467b93sgk@chromium.orgHello from func1.c
53144e82c7443e514c716183992708a1e9b8467b93sgk@chromium.org"""
54144e82c7443e514c716183992708a1e9b8467b93sgk@chromium.org
55144e82c7443e514c716183992708a1e9b8467b93sgk@chromium.orgexpect2 = """\
56144e82c7443e514c716183992708a1e9b8467b93sgk@chromium.orgHello from subdir2/prog2.c
57144e82c7443e514c716183992708a1e9b8467b93sgk@chromium.orgHello from func2.c
58144e82c7443e514c716183992708a1e9b8467b93sgk@chromium.org"""
59144e82c7443e514c716183992708a1e9b8467b93sgk@chromium.org
60144e82c7443e514c716183992708a1e9b8467b93sgk@chromium.orgexpect3 = """\
61144e82c7443e514c716183992708a1e9b8467b93sgk@chromium.orgHello from subdir2/subdir3/prog3.c
62144e82c7443e514c716183992708a1e9b8467b93sgk@chromium.orgHello from func3.c
63144e82c7443e514c716183992708a1e9b8467b93sgk@chromium.org"""
64144e82c7443e514c716183992708a1e9b8467b93sgk@chromium.org
65144e82c7443e514c716183992708a1e9b8467b93sgk@chromium.orgexpect4 = """\
66144e82c7443e514c716183992708a1e9b8467b93sgk@chromium.orgHello from subdir2/subdir3/subdir4/prog4.c
67144e82c7443e514c716183992708a1e9b8467b93sgk@chromium.orgHello from func4.c
68144e82c7443e514c716183992708a1e9b8467b93sgk@chromium.org"""
69144e82c7443e514c716183992708a1e9b8467b93sgk@chromium.org
70144e82c7443e514c716183992708a1e9b8467b93sgk@chromium.orgexpect5 = """\
71144e82c7443e514c716183992708a1e9b8467b93sgk@chromium.orgHello from subdir2/subdir3/subdir4/subdir5/prog5.c
72144e82c7443e514c716183992708a1e9b8467b93sgk@chromium.orgHello from func5.c
73144e82c7443e514c716183992708a1e9b8467b93sgk@chromium.org"""
74144e82c7443e514c716183992708a1e9b8467b93sgk@chromium.org
75144e82c7443e514c716183992708a1e9b8467b93sgk@chromium.orgdef run_builddir(prog, expect):
76144e82c7443e514c716183992708a1e9b8467b93sgk@chromium.org  dir = 'relocate/builddir/Default/'
77144e82c7443e514c716183992708a1e9b8467b93sgk@chromium.org  test.run(program=test.workpath(dir + prog), stdout=expect)
78144e82c7443e514c716183992708a1e9b8467b93sgk@chromium.org
79144e82c7443e514c716183992708a1e9b8467b93sgk@chromium.orgrun_builddir('prog1', expect1)
80144e82c7443e514c716183992708a1e9b8467b93sgk@chromium.orgrun_builddir('prog2', expect2)
81144e82c7443e514c716183992708a1e9b8467b93sgk@chromium.orgrun_builddir('prog3', expect3)
82144e82c7443e514c716183992708a1e9b8467b93sgk@chromium.orgrun_builddir('prog4', expect4)
83144e82c7443e514c716183992708a1e9b8467b93sgk@chromium.orgrun_builddir('prog5', expect5)
84144e82c7443e514c716183992708a1e9b8467b93sgk@chromium.org
85144e82c7443e514c716183992708a1e9b8467b93sgk@chromium.orgtest.pass_test()
86