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