Home | History | Annotate | Download | only in compiler-override
      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 """
      6 Verifies that the user can override the compiler and linker using
      7 CC/CXX/NM/READELF environment variables.
      8 """
      9 
     10 import TestGyp
     11 import os
     12 import copy
     13 import sys
     14 
     15 here = os.path.dirname(os.path.abspath(__file__))
     16 
     17 if 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.
     23 for key in ['CC', 'CXX', 'LINK', 'CC_host', 'CXX_host', 'LINK_host',
     24             'NM_target', 'READELF_target']:
     25   if key in os.environ:
     26     del os.environ[key]
     27 
     28 
     29 def CheckCompiler(test, gypfile, check_for, run_gyp):
     30   if run_gyp:
     31     test.run_gyp(gypfile)
     32   test.build(gypfile)
     33 
     34   test.must_contain_all_lines(test.stdout(), check_for)
     35 
     36 
     37 test = TestGyp.TestGyp(formats=['ninja'])
     38 # Must set the test format to something with a flavor (the part after the '-')
     39 # in order to test the desired behavior. Since we want to run a non-host
     40 # toolchain, we have to set the flavor to something that the ninja generator
     41 # doesn't know about, so it doesn't default to the host-specific tools (e.g.,
     42 # 'otool' on mac to generate the .TOC).
     43 #
     44 # Note that we can't just pass format=['ninja-some_toolchain'] to the
     45 # constructor above, because then this test wouldn't be recognized as a ninja
     46 # format test.
     47 test.formats = ['ninja-some_flavor']
     48 
     49 
     50 def TestTargetOverideSharedLib():
     51   # The std output from nm and readelf is redirected to files, so we can't
     52   # expect their output to appear. Instead, check for the files they create to
     53   # see if they actually ran.
     54   expected = ['my_cc.py', 'my_cxx.py', 'FOO']
     55 
     56   # Check that CC, CXX, NM, READELF, set target compiler
     57   env = {'CC': 'python %s/my_cc.py FOO' % here,
     58          'CXX': 'python %s/my_cxx.py FOO' % here,
     59          'NM': 'python %s/my_nm.py' % here,
     60          'READELF': 'python %s/my_readelf.py' % here}
     61 
     62   with TestGyp.LocalEnv(env):
     63     CheckCompiler(test, 'compiler-shared-lib.gyp', expected, True)
     64     test.must_contain(test.built_file_path('RAN_MY_NM'), 'RAN_MY_NM')
     65     test.must_contain(test.built_file_path('RAN_MY_READELF'), 'RAN_MY_READELF')
     66     test.unlink(test.built_file_path('RAN_MY_NM'))
     67     test.unlink(test.built_file_path('RAN_MY_READELF'))
     68 
     69   # Run the same tests once the eviron has been restored.  The generated
     70   # projects should have embedded all the settings in the project files so the
     71   # results should be the same.
     72   CheckCompiler(test, 'compiler-shared-lib.gyp', expected, False)
     73   test.must_contain(test.built_file_path('RAN_MY_NM'), 'RAN_MY_NM')
     74   test.must_contain(test.built_file_path('RAN_MY_READELF'), 'RAN_MY_READELF')
     75 
     76 
     77 TestTargetOverideSharedLib()
     78 test.pass_test()
     79