Home | History | Annotate | Download | only in llvm_extra
      1 #!/bin/bash
      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 # This script takes an existing llvm ebuild file and generate a llvm-extra
      8 # ebuild. The newly generated llvm-extra ebuild can be installed as a regular
      9 # host package.
     10 # The new ebuild should be generated in sys-devel/llvm-extra directory.
     11 # The script also copies all the files from files/ directory.
     12 # The generated llvm-extra ebuild is slotted so multiple instances of
     13 # llvm-extra ebuilds can be installed at same time.
     14 # The slot is derived based on the _pre<num> string in the llvm ebuild name.
     15 # e.g. For llvm-7.0_pre331547_p20180529-r8.ebuild, the slot will be
     16 # 7.0_pre331547.
     17 #
     18 # Usage:
     19 #  ./create_llvm_extra.sh /path/to/llvm-7.0_pre331547_p20180529-r8.ebuild
     20 #
     21 # To use the clang installed by llvm-extra, modify the CFLAGS and
     22 # LDFLAGS of a pckage to pass the patch of the clang binary installed by
     23 # the llvm-extra package.
     24 # e.g. append-flags -Xclang-path=/usr/llvm-extra/version/clang
     25 #      append-ldflags -Xclang-path=/usr/llvm-extra/version/clang
     26 #
     27 
     28 SCRIPT_DIR=$(realpath $(dirname "$0"))
     29 
     30 function check_cmd() {
     31 	if [[ "$#" -ne 1 ]]; then
     32 		echo "Exactly 1 argument expected"
     33 		echo "Usage $0 <path_to_llvm_ebuild>"
     34 		exit 1
     35 	fi
     36 	if [[ ! -f "$1" ]]; then
     37 		echo "$1 is not a file"
     38 		exit 1;
     39 	fi
     40 }
     41 
     42 function create_llvm_extra_ebuild() {
     43 	EBUILD_PREFIX=llvm-extra
     44 	EBUILD_DIR=$(dirname "$1")
     45 	EBUILD_FILE_NAME=$(basename "$1")
     46 	NEW_EBUILD_FILE_NAME="${EBUILD_FILE_NAME/llvm/$EBUILD_PREFIX}"
     47 	NEW_EBUILD_FILENAME_NO_EXT="${NEW_EBUILD_FILE_NAME%.*}"
     48 	NEW_EBUILD_DIR="${EBUILD_DIR}/../${EBUILD_PREFIX}"
     49 	NEW_EBUILD_PV="${NEW_EBUILD_FILENAME_NO_EXT#"$EBUILD_PREFIX-"}"
     50 	NEW_EBUILD_SLOT="${NEW_EBUILD_PV%%_p[[:digit:]]*}"
     51 
     52 	mkdir -p "${NEW_EBUILD_DIR}"
     53 	if [[ -d "${EBUILD_DIR}/files" ]]; then
     54 		cp -rf "${EBUILD_DIR}/files" "${NEW_EBUILD_DIR}"
     55 	fi
     56 
     57 	if [[ -f "${NEW_EBUILD_DIR}/${NEW_EBUILD_FILE_NAME}" ]]; then
     58 		echo "Removing existing ebuild file ${NEW_EBUILD_FILE_NAME}"
     59 		rm -f "${NEW_EBUILD_DIR}/${NEW_EBUILD_FILE_NAME}"
     60 	fi
     61 	# Generate the llvm-extra ebuild file.
     62 	"${SCRIPT_DIR}"/create_ebuild_file.py "$1" "${NEW_EBUILD_DIR}/${NEW_EBUILD_FILE_NAME}"
     63 	if [[ $? -ne 0 ]]; then
     64 		echo "Creation of ${NEW_EBUILD_DIR}/${NEW_EBUILD_FILE_NAME} failed"
     65 		exit 1
     66 	fi
     67 	echo "***"
     68 	echo "***"
     69 	echo "${NEW_EBUILD_DIR}/${NEW_EBUILD_FILE_NAME} has been created."
     70 
     71 	echo "***"
     72 	echo "Test if it builds by running \$ sudo emerge ${EBUILD_PREFIX}:${NEW_EBUILD_SLOT}"
     73 	echo "***"
     74 	echo "If it works, Go ahead and submit the newly generated ebuild"\
     75 	     "and any other files in ${NEW_EBUILD_DIR}."
     76 	echo "***"
     77 	echo "Don't forget to add sys-devel/${EBUILD_PREFIX}:${NEW_EBUILD_SLOT} to"\
     78 	     "the dependencies in virtual/target-chromium-os-sdk ebuild."
     79 	echo "***"
     80 	echo "***"
     81 }
     82 
     83 
     84 set -e
     85 # Sanity checks.
     86 check_cmd "${@}"
     87 # Create llvm-extra ebuild.
     88 create_llvm_extra_ebuild "${@}"
     89