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