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"""
8Checks that C-only targets aren't linked against libstdc++.
9"""
10
11import TestGyp
12
13import re
14import subprocess
15import sys
16
17# set |match| to ignore build stderr output.
18test = TestGyp.TestGyp(match = lambda a, b: True)
19if 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