Home | History | Annotate | Download | only in llvm_extra
      1 #!/usr/bin/env python2
      2 
      3 # Copyright 2018 The Chromium OS Authors. All rights reserved.
      4 # Use of this source code is governed by a BSD-style license that can be
      5 # found in the LICENSE file.
      6 
      7 from __future__ import print_function
      8 
      9 import os
     10 import sys
     11 
     12 # This script takes an existing host llvm compiler ebuild and
     13 # creates another build that should be installable in a prefixed location.
     14 # The script patches a few lines in the llvm ebuild to make that happen.
     15 #
     16 # Since the script is based on the current llvm ebuild patterns,
     17 # it may need to be updated if those patterns change.
     18 #
     19 # This script should normally be invoked by the shell script
     20 # create_llvm_extra.sh .
     21 
     22 """
     23 Below is an example of the expected diff of the newly generated ebuild with
     24 some explanation of the diffs.
     25 
     26 diff -Nuar llvm-pre7.0_pre335547_p20180529.ebuild newly-created-file.ebuild
     27 --- llvm-7.0_pre331547_p20180529-r8.ebuild
     28 +++ newly-created-file.ebuild
     29 
     30 @@ -60,9 +60,9 @@ EGIT_REPO_URIS=(
     31  fi
     32 
     33  LICENSE="UoI-NCSA"
     34 -SLOT="0/${PV%%_*}"
     35 +SLOT="${PV%%_p[[:digit:]]*}" # Creates a unique slot so that multiple copies
     36                                 of the new build can be installed.
     37 
     38  KEYWORDS="-* amd64"
     39 
     40  # Change USE flags to match llvm ebuild installtion. To see the set of flags
     41  enabled in llvm compiler ebuild, run $ sudo emerge -pv llvm
     42 
     43 -IUSE="debug +default-compiler-rt +default-libcxx doc libedit +libffi multitarget
     44 +IUSE="debug +default-compiler-rt +default-libcxx doc libedit +libffi +multitarget
     45         ncurses ocaml python llvm-next llvm-tot test xml video_cards_radeon"
     46 
     47  COMMON_DEPEND="
     48 @@ -145,6 +145,7 @@ pkg_pretend() {
     49  }
     50 
     51  pkg_setup() {
     52  # This Change is to install the files in $PREFIX.
     53 +       export PREFIX="/usr/${PN}/${SLOT}"
     54         pkg_pretend
     55  }
     56 
     57 @@ -272,13 +273,13 @@
     58         sed -e "/RUN/s/-warn-error A//" -i test/Bindings/OCaml/*ml  || die
     59 
     60         # Allow custom cmake build types (like 'Gentoo')
     61  # Convert use of PN to llvm in epatch commands.
     62 -       epatch "${FILESDIR}"/cmake/${PN}-3.8-allow_custom_cmake_build_types.patch
     63 +       epatch "${FILESDIR}"/cmake/llvm-3.8-allow_custom_cmake_build_types.patch
     64 
     65         # crbug/591436
     66         epatch "${FILESDIR}"/clang-executable-detection.patch
     67 
     68         # crbug/606391
     69 -       epatch "${FILESDIR}"/${PN}-3.8-invocation.patch
     70 +       epatch "${FILESDIR}"/llvm-3.8-invocation.patch
     71 
     72 @@ -411,11 +412,14 @@ src_install() {
     73                 /usr/include/llvm/Config/llvm-config.h
     74         )
     75 
     76 +       MULTILIB_CHOST_TOOLS=() # No need to install any multilib tools/headers.
     77 +       MULTILIB_WRAPPED_HEADERS=()
     78         multilib-minimal_src_install
     79  }
     80 
     81  multilib_src_install() {
     82         cmake-utils_src_install
     83 +       return # No need to install any wrappers.
     84 
     85         local wrapper_script=clang_host_wrapper
     86         cat "${FILESDIR}/clang_host_wrapper.header" \
     87 @@ -434,6 +438,7 @@ multilib_src_install() {
     88  }
     89 
     90  multilib_src_install_all() {
     91 +       return # No need to install common multilib files.
     92         insinto /usr/share/vim/vimfiles
     93         doins -r utils/vim/*/.
     94         # some users may find it useful
     95 """
     96 
     97 def process_line(line, text):
     98   # Process the line and append to the text we want to generate.
     99   # Check if line has any patterns that we want to handle.
    100   newline = line.strip()
    101   if newline.startswith('#'):
    102     # Do not process comment lines.
    103     text.append(line)
    104   elif line.startswith('SLOT='):
    105     # Change SLOT to "${PV%%_p[[:digit:]]*}"
    106     SLOT_STRING='SLOT="${PV%%_p[[:digit:]]*}"\n'
    107     text.append(SLOT_STRING)
    108   elif line.startswith('IUSE') and 'multitarget' in line:
    109     # Enable multitarget USE flag.
    110     newline = line.replace('multitarget', '+multitarget')
    111     text.append(newline)
    112   elif line.startswith('pkg_setup()'):
    113     # Setup PREFIX.
    114     text.append(line)
    115     text.append('\texport PREFIX="/usr/${PN}/${SLOT}"\n')
    116   elif line.startswith('multilib_src_install_all()'):
    117     text.append(line)
    118     # Do not install any common files.
    119     text.append('\treturn\n')
    120   elif 'epatch ' in line:
    121     # Convert any $PN or ${PN} in epatch files to llvm.
    122     newline = line.replace('$PN', 'llvm')
    123     newline = newline.replace('${PN}', 'llvm')
    124     text.append(newline)
    125   elif 'multilib-minimal_src_install' in line:
    126     # Disable MULTILIB_CHOST_TOOLS and MULTILIB_WRAPPED_HEADERS
    127     text.append('\tMULTILIB_CHOST_TOOLS=()\n')
    128     text.append('\tMULTILIB_WRAPPED_HEADERS=()\n')
    129     text.append(line)
    130   elif 'cmake-utils_src_install' in line:
    131     text.append(line)
    132     # Do not install any wrappers.
    133     text.append('\treturn\n')
    134   else:
    135     text.append(line)
    136 
    137 
    138 def main():
    139   if len(sys.argv) != 3:
    140      filename = os.path.basename(__file__)
    141      print ('Usage: ', filename,' <input.ebuild> <output.ebuild>')
    142      return 1
    143 
    144   text = []
    145   with open(sys.argv[1], 'r') as infile:
    146     for line in infile:
    147       process_line(line, text)
    148 
    149   with open(sys.argv[2], 'w') as outfile:
    150     outfile.write("".join(text))
    151 
    152   return 0
    153 
    154 
    155 if __name__== "__main__":
    156   sys.exit(main())
    157