#!/usr/bin/python2.7

import os
import subprocess
import sys

ninja = sys.argv[1]

def call(cmd):
  subprocess.check_call(cmd, shell=True)

def append(path, line):
  with open(path, 'a') as f:
    print >>f, line

print "Hello from {platform} in {cwd}!".format(platform=sys.platform,
                                               cwd=os.getcwd())

if 'darwin' in sys.platform:
  # Get Xcode from CIPD using mac_toolchain tool.
  mac_toolchain = os.path.join(os.getcwd(), sys.argv[3])
  xcode_app_path = os.path.join(os.getcwd(), sys.argv[4])
  # See mapping of Xcode version to Xcode build version here:
  # https://chromium.googlesource.com/chromium/tools/build/+/master/scripts/slave/recipe_modules/ios/api.py#37
  XCODE_BUILD_VERSION = '11c29'
  call(('{mac_toolchain}/mac_toolchain install '
        '-kind mac '
        '-xcode-version {xcode_build_version} '
        '-output-dir {xcode_app_path}').format(
            mac_toolchain=mac_toolchain,
            xcode_build_version=XCODE_BUILD_VERSION,
            xcode_app_path=xcode_app_path))
  call('sudo xcode-select -switch {xcode_app_path}'.format(
      xcode_app_path=xcode_app_path))

  # Our Mac bot toolchains are too old for LSAN.
  append('skcms/build/clang.lsan', 'disabled = true')

  call('{ninja}/ninja -C skcms -k 0'.format(ninja=ninja))

elif 'linux' in sys.platform:
  # Point to clang in our clang_linux package.
  clang_linux = os.path.realpath(sys.argv[3])
  append('skcms/build/clang', 'cc  = {}/bin/clang  '.format(clang_linux))
  append('skcms/build/clang', 'cxx = {}/bin/clang++'.format(clang_linux))

  # Get an Emscripten environment all set up.
  call('git clone https://github.com/emscripten-core/emsdk.git')
  os.chdir('emsdk')
  call('./emsdk install 1.39.4')
  os.chdir('..')

  emscripten_sdk = os.path.realpath('emsdk')
  node = emscripten_sdk + '/node/12.9.1_64bit/bin/node'

  em_config = os.path.realpath(os.path.join('.', 'em_config'))
  with open(em_config, 'w') as f:
    print >>f, '''
LLVM_ROOT = '{}/upstream/bin'
BINARYEN_ROOT = '{}/upstream'
EMSCRIPTEN_ROOT = '{}/upstream/emscripten'
NODE_JS = '{}'
COMPILER_ENGINE = NODE_JS
JS_ENGINES = [NODE_JS]
  '''.format(emscripten_sdk, emscripten_sdk, emscripten_sdk, node)

  append('skcms/build/emscripten',
         'cc  = env EM_CONFIG={} {}/upstream/emscripten/emcc'.format(
           em_config, emscripten_sdk))
  append('skcms/build/emscripten',
         'cxx = env EM_CONFIG={} {}/upstream/emscripten/em++'.format(
           em_config, emscripten_sdk))
  append('skcms/build/emscripten',
         'node = {}'.format(node))

  call('{ninja}/ninja -C skcms -k 0'.format(ninja=ninja))

else:  # Windows
  win_toolchain = os.path.realpath(sys.argv[2])
  msvc = win_toolchain + '\\VC\\Tools\\MSVC\\14.24.28314\\'
  sdk  = win_toolchain + '\\win_sdk\\'

  os.environ['PATH'] = msvc + 'bin\\HostX64\\x64;' + os.environ['PATH']
  os.environ['INCLUDE'] = msvc + 'include;'
  os.environ['INCLUDE'] += sdk + 'Include\\10.0.17763.0\\shared;'
  os.environ['INCLUDE'] += sdk + 'Include\\10.0.17763.0\\ucrt;'
  os.environ['INCLUDE'] += sdk + 'Include\\10.0.17763.0\\um;'
  os.environ['LIB'] = msvc + 'lib\\x64;'
  os.environ['LIB'] += sdk + 'Lib\\10.0.17763.0\\um\\x64;'
  os.environ['LIB'] += sdk + 'Lib\\10.0.17763.0\\ucrt\\x64;'

  call('{ninja}\\ninja.exe -C skcms -f msvs.ninja -k 0'.format(ninja=ninja))
