#!/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:]))