1#!/usr/bin/env python 2# Copyright (c) 2012 Google Inc. All rights reserved. 3# Use of this source code is governed by a BSD-style license that can be 4# found in the LICENSE file. 5""" 6Verifies that the user can override the compiler and linker using CC/CXX/LD 7environment variables. 8""" 9 10import TestGyp 11import os 12import copy 13import sys 14 15here = os.path.dirname(os.path.abspath(__file__)) 16 17if sys.platform == 'win32': 18 # cross compiling not supported by ninja on windows 19 # and make not supported on windows at all. 20 sys.exit(0) 21 22# Clear any existing compiler related env vars. 23for key in ['CC', 'CXX', 'LINK', 'CC_host', 'CXX_host', 'LINK_host']: 24 if key in os.environ: 25 del os.environ[key] 26 27 28def CheckCompiler(test, gypfile, check_for, run_gyp): 29 if run_gyp: 30 test.run_gyp(gypfile) 31 test.build(gypfile) 32 33 test.must_contain_all_lines(test.stdout(), check_for) 34 35 36test = TestGyp.TestGyp(formats=['ninja', 'make']) 37 38def TestTargetOveride(): 39 expected = ['my_cc.py', 'my_cxx.py', 'FOO' ] 40 41 # ninja just uses $CC / $CXX as linker. 42 if test.format not in ['ninja', 'xcode-ninja']: 43 expected.append('FOO_LINK') 44 45 # Check that CC, CXX and LD set target compiler 46 oldenv = os.environ.copy() 47 try: 48 os.environ['CC'] = 'python %s/my_cc.py FOO' % here 49 os.environ['CXX'] = 'python %s/my_cxx.py FOO' % here 50 os.environ['LINK'] = 'python %s/my_ld.py FOO_LINK' % here 51 52 CheckCompiler(test, 'compiler-exe.gyp', expected, True) 53 finally: 54 os.environ.clear() 55 os.environ.update(oldenv) 56 57 # Run the same tests once the eviron has been restored. The 58 # generated should have embedded all the settings in the 59 # project files so the results should be the same. 60 CheckCompiler(test, 'compiler-exe.gyp', expected, False) 61 62 63def TestTargetOverideCompilerOnly(): 64 # Same test again but with that CC, CXX and not LD 65 oldenv = os.environ.copy() 66 try: 67 os.environ['CC'] = 'python %s/my_cc.py FOO' % here 68 os.environ['CXX'] = 'python %s/my_cxx.py FOO' % here 69 70 CheckCompiler(test, 'compiler-exe.gyp', 71 ['my_cc.py', 'my_cxx.py', 'FOO'], 72 True) 73 finally: 74 os.environ.clear() 75 os.environ.update(oldenv) 76 77 # Run the same tests once the eviron has been restored. The 78 # generated should have embedded all the settings in the 79 # project files so the results should be the same. 80 CheckCompiler(test, 'compiler-exe.gyp', 81 ['my_cc.py', 'my_cxx.py', 'FOO'], 82 False) 83 84 85def TestHostOveride(): 86 expected = ['my_cc.py', 'my_cxx.py', 'HOST' ] 87 if test.format != 'ninja': # ninja just uses $CC / $CXX as linker. 88 expected.append('HOST_LINK') 89 90 # Check that CC_host sets host compilee 91 oldenv = os.environ.copy() 92 try: 93 os.environ['CC_host'] = 'python %s/my_cc.py HOST' % here 94 os.environ['CXX_host'] = 'python %s/my_cxx.py HOST' % here 95 os.environ['LINK_host'] = 'python %s/my_ld.py HOST_LINK' % here 96 CheckCompiler(test, 'compiler-host.gyp', expected, True) 97 finally: 98 os.environ.clear() 99 os.environ.update(oldenv) 100 101 # Run the same tests once the eviron has been restored. The 102 # generated should have embedded all the settings in the 103 # project files so the results should be the same. 104 CheckCompiler(test, 'compiler-host.gyp', expected, False) 105 106 107TestTargetOveride() 108TestTargetOverideCompilerOnly() 109 110test.pass_test() 111