66 lines
1.7 KiB
Python
66 lines
1.7 KiB
Python
|
#!/usr/bin/env python
|
||
|
# Copyright (c) 2013 The Chromium Authors. All rights reserved.
|
||
|
# Use of this source code is governed by a BSD-style license that can be
|
||
|
# found in the LICENSE file.
|
||
|
|
||
|
"""
|
||
|
Tries to compile given code, produces different output depending on success.
|
||
|
|
||
|
This is similar to checks done by ./configure scripts.
|
||
|
"""
|
||
|
|
||
|
|
||
|
import optparse
|
||
|
import os
|
||
|
import shutil
|
||
|
import subprocess
|
||
|
import sys
|
||
|
import tempfile
|
||
|
|
||
|
|
||
|
def DoMain(argv):
|
||
|
parser = optparse.OptionParser()
|
||
|
parser.add_option('--code')
|
||
|
parser.add_option('--run-linker', action='store_true')
|
||
|
parser.add_option('--on-success', default='')
|
||
|
parser.add_option('--on-failure', default='')
|
||
|
|
||
|
options, args = parser.parse_args(argv)
|
||
|
|
||
|
if not options.code:
|
||
|
parser.error('Missing required --code switch.')
|
||
|
|
||
|
# The environment variable might expand to a string with spaces,
|
||
|
# e.g. "ccache g++". Convert it to a list suitable for argv.
|
||
|
cxx = os.environ.get('CXX', 'g++').split()
|
||
|
|
||
|
tmpdir = tempfile.mkdtemp()
|
||
|
try:
|
||
|
cxx_path = os.path.join(tmpdir, 'test.cc')
|
||
|
with open(cxx_path, 'w') as f:
|
||
|
f.write(options.code.decode('string-escape'))
|
||
|
|
||
|
o_path = os.path.join(tmpdir, 'test.o')
|
||
|
|
||
|
cxx_cmdline = cxx + [cxx_path, '-o', o_path]
|
||
|
if not options.run_linker:
|
||
|
cxx_cmdline.append('-c')
|
||
|
# Pass remaining arguments to the compiler.
|
||
|
cxx_cmdline += args
|
||
|
cxx_popen = subprocess.Popen(cxx_cmdline,
|
||
|
stdout=subprocess.PIPE,
|
||
|
stderr=subprocess.PIPE)
|
||
|
cxx_stdout, cxx_stderr = cxx_popen.communicate()
|
||
|
if cxx_popen.returncode == 0:
|
||
|
print options.on_success
|
||
|
else:
|
||
|
print options.on_failure
|
||
|
finally:
|
||
|
shutil.rmtree(tmpdir)
|
||
|
|
||
|
return 0
|
||
|
|
||
|
|
||
|
if __name__ == '__main__':
|
||
|
sys.exit(DoMain(sys.argv[1:]))
|