#!/usr/bin/env python

import os
import sys
import subprocess
import shutil

CMAKE            = '@CMAKE_COMMAND@'
CMAKE_BUILD_TYPE = '@CMAKE_BUILD_TYPE@'
TMPDIR           = '@TMPDIR@'
SRCDIR           = '@SRCDIR@'
GFLAGS_DIR       = '@gflags_BINARY_DIR@'

if __name__ == "__main__":
  if len(sys.argv) != 4:
    sys.stderr.write(' '.join(['usage:', sys.argv[0], '<test_name> <srcdir> <expect_fail:0|1>\n']))
    sys.exit(1)
  test_name   = sys.argv[1]
  srcdir      = sys.argv[2]
  expect_fail = (sys.argv[3].lower() in ['true', 'yes', 'on', '1'])
  bindir      = os.path.join(TMPDIR, test_name)
  if TMPDIR == '':
    sys.stderr.write('Temporary directory not set!\n')
    sys.exit(1)
  # create build directory
  if os.path.isdir(bindir): shutil.rmtree(bindir)
  os.makedirs(bindir)
  # configure the build tree
  if subprocess.call([CMAKE, '-DCMAKE_BUILD_TYPE:STRING='+CMAKE_BUILD_TYPE,
                             '-Dgflags_DIR:PATH='+GFLAGS_DIR,
                             '-DTEST_NAME:STRING='+test_name, srcdir], cwd=bindir) != 0:
    sys.stderr.write('Failed to configure the build tree!\n')
    sys.exit(1)
  # build the test project
  exit_code = subprocess.call([CMAKE, '--build', bindir, '--config', CMAKE_BUILD_TYPE], cwd=bindir)
  if expect_fail == True:
    if exit_code == 0:
      sys.stderr.write('Build expected to fail, but it succeeded!\n')
      sys.exit(1)
    else:
      sys.stderr.write('Build failed as expected\n')
      exit_code = 0
  sys.exit(exit_code)
