Home | History | Annotate | Download | only in no-cpp
      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 Checks that C-only targets aren't linked against libstdc++.
      9 """
     10 
     11 import TestGyp
     12 
     13 import re
     14 import subprocess
     15 import sys
     16 
     17 # set |match| to ignore build stderr output.
     18 test = TestGyp.TestGyp(match = lambda a, b: True)
     19 if sys.platform != 'win32' and test.format not in ('make', 'android'):
     20   # TODO: This doesn't pass with make.
     21   # TODO: Does a test like this make sense with Windows? Android?
     22 
     23   CHDIR = 'src'
     24   test.run_gyp('test.gyp', chdir=CHDIR)
     25   test.build('test.gyp', 'no_cpp', chdir=CHDIR)
     26 
     27   def LinksLibStdCpp(path):
     28     path = test.built_file_path(path, chdir=CHDIR)
     29     if sys.platform == 'darwin':
     30       proc = subprocess.Popen(['otool', '-L', path], stdout=subprocess.PIPE)
     31     else:
     32       proc = subprocess.Popen(['ldd', path], stdout=subprocess.PIPE)
     33     output = proc.communicate()[0]
     34     assert not proc.returncode
     35     return 'libstdc++' in output or 'libc++' in output
     36 
     37   if LinksLibStdCpp('no_cpp'):
     38     test.fail_test()
     39 
     40   build_error_code = {
     41     'xcode': [1, 65],  # 1 for xcode 3, 65 for xcode 4 (see `man sysexits`)
     42     'make': 2,
     43     'ninja': 1,
     44     'cmake': 0,  # CMake picks the compiler driver based on transitive checks.
     45   }[test.format]
     46 
     47   test.build('test.gyp', 'no_cpp_dep_on_cc_lib', chdir=CHDIR,
     48              status=build_error_code)
     49 
     50   test.pass_test()
     51