#!/usr/bin/env python2

# Copyright 2018 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

from __future__ import print_function

import os
import sys

# This script takes an existing host llvm compiler ebuild and
# creates another build that should be installable in a prefixed location.
# The script patches a few lines in the llvm ebuild to make that happen.
#
# Since the script is based on the current llvm ebuild patterns,
# it may need to be updated if those patterns change.
#
# This script should normally be invoked by the shell script
# create_llvm_extra.sh .

"""
Below is an example of the expected diff of the newly generated ebuild with
some explanation of the diffs.

diff -Nuar llvm-pre7.0_pre335547_p20180529.ebuild newly-created-file.ebuild
--- llvm-7.0_pre331547_p20180529-r8.ebuild
+++ newly-created-file.ebuild

@@ -60,9 +60,9 @@ EGIT_REPO_URIS=(
 fi

 LICENSE="UoI-NCSA"
-SLOT="0/${PV%%_*}"
+SLOT="${PV%%_p[[:digit:]]*}" # Creates a unique slot so that multiple copies
                                of the new build can be installed.

 KEYWORDS="-* amd64"

 # Change USE flags to match llvm ebuild installtion. To see the set of flags
 enabled in llvm compiler ebuild, run $ sudo emerge -pv llvm

-IUSE="debug +default-compiler-rt +default-libcxx doc libedit +libffi multitarget
+IUSE="debug +default-compiler-rt +default-libcxx doc libedit +libffi +multitarget
        ncurses ocaml python llvm-next llvm-tot test xml video_cards_radeon"

 COMMON_DEPEND="
@@ -145,6 +145,7 @@ pkg_pretend() {
 }

 pkg_setup() {
 # This Change is to install the files in $PREFIX.
+       export PREFIX="/usr/${PN}/${SLOT}"
        pkg_pretend
 }

@@ -272,13 +273,13 @@
        sed -e "/RUN/s/-warn-error A//" -i test/Bindings/OCaml/*ml  || die

        # Allow custom cmake build types (like 'Gentoo')
 # Convert use of PN to llvm in epatch commands.
-       epatch "${FILESDIR}"/cmake/${PN}-3.8-allow_custom_cmake_build_types.patch
+       epatch "${FILESDIR}"/cmake/llvm-3.8-allow_custom_cmake_build_types.patch

        # crbug/591436
        epatch "${FILESDIR}"/clang-executable-detection.patch

        # crbug/606391
-       epatch "${FILESDIR}"/${PN}-3.8-invocation.patch
+       epatch "${FILESDIR}"/llvm-3.8-invocation.patch

@@ -411,11 +412,14 @@ src_install() {
                /usr/include/llvm/Config/llvm-config.h
        )

+       MULTILIB_CHOST_TOOLS=() # No need to install any multilib tools/headers.
+       MULTILIB_WRAPPED_HEADERS=()
        multilib-minimal_src_install
 }

 multilib_src_install() {
        cmake-utils_src_install
+       return # No need to install any wrappers.

        local wrapper_script=clang_host_wrapper
        cat "${FILESDIR}/clang_host_wrapper.header" \
@@ -434,6 +438,7 @@ multilib_src_install() {
 }

 multilib_src_install_all() {
+       return # No need to install common multilib files.
        insinto /usr/share/vim/vimfiles
        doins -r utils/vim/*/.
        # some users may find it useful
"""

def process_line(line, text):
  # Process the line and append to the text we want to generate.
  # Check if line has any patterns that we want to handle.
  newline = line.strip()
  if newline.startswith('#'):
    # Do not process comment lines.
    text.append(line)
  elif line.startswith('SLOT='):
    # Change SLOT to "${PV%%_p[[:digit:]]*}"
    SLOT_STRING='SLOT="${PV%%_p[[:digit:]]*}"\n'
    text.append(SLOT_STRING)
  elif line.startswith('IUSE') and 'multitarget' in line:
    # Enable multitarget USE flag.
    newline = line.replace('multitarget', '+multitarget')
    text.append(newline)
  elif line.startswith('pkg_setup()'):
    # Setup PREFIX.
    text.append(line)
    text.append('\texport PREFIX="/usr/${PN}/${SLOT}"\n')
  elif line.startswith('multilib_src_install_all()'):
    text.append(line)
    # Do not install any common files.
    text.append('\treturn\n')
  elif 'epatch ' in line:
    # Convert any $PN or ${PN} in epatch files to llvm.
    newline = line.replace('$PN', 'llvm')
    newline = newline.replace('${PN}', 'llvm')
    text.append(newline)
  elif 'multilib-minimal_src_install' in line:
    # Disable MULTILIB_CHOST_TOOLS and MULTILIB_WRAPPED_HEADERS
    text.append('\tMULTILIB_CHOST_TOOLS=()\n')
    text.append('\tMULTILIB_WRAPPED_HEADERS=()\n')
    text.append(line)
  elif 'cmake-utils_src_install' in line:
    text.append(line)
    # Do not install any wrappers.
    text.append('\treturn\n')
  else:
    text.append(line)


def main():
  if len(sys.argv) != 3:
     filename = os.path.basename(__file__)
     print ('Usage: ', filename,' <input.ebuild> <output.ebuild>')
     return 1

  text = []
  with open(sys.argv[1], 'r') as infile:
    for line in infile:
      process_line(line, text)

  with open(sys.argv[2], 'w') as outfile:
    outfile.write("".join(text))

  return 0


if __name__== "__main__":
  sys.exit(main())
