| #!/bin/bash |
| |
| # 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. |
| |
| # This script takes an existing llvm ebuild file and generate a llvm-extra |
| # ebuild. The newly generated llvm-extra ebuild can be installed as a regular |
| # host package. |
| # The new ebuild should be generated in sys-devel/llvm-extra directory. |
| # The script also copies all the files from files/ directory. |
| # The generated llvm-extra ebuild is slotted so multiple instances of |
| # llvm-extra ebuilds can be installed at same time. |
| # The slot is derived based on the _pre<num> string in the llvm ebuild name. |
| # e.g. For llvm-7.0_pre331547_p20180529-r8.ebuild, the slot will be |
| # 7.0_pre331547. |
| # |
| # Usage: |
| # ./create_llvm_extra.sh /path/to/llvm-7.0_pre331547_p20180529-r8.ebuild |
| # |
| # To use the clang installed by llvm-extra, modify the CFLAGS and |
| # LDFLAGS of a pckage to pass the patch of the clang binary installed by |
| # the llvm-extra package. |
| # e.g. append-flags -Xclang-path=/usr/llvm-extra/version/clang |
| # append-ldflags -Xclang-path=/usr/llvm-extra/version/clang |
| # |
| |
| SCRIPT_DIR=$(realpath $(dirname "$0")) |
| |
| function check_cmd() { |
| if [[ "$#" -ne 1 ]]; then |
| echo "Exactly 1 argument expected" |
| echo "Usage $0 <path_to_llvm_ebuild>" |
| exit 1 |
| fi |
| if [[ ! -f "$1" ]]; then |
| echo "$1 is not a file" |
| exit 1; |
| fi |
| } |
| |
| function create_llvm_extra_ebuild() { |
| EBUILD_PREFIX=llvm-extra |
| EBUILD_DIR=$(dirname "$1") |
| EBUILD_FILE_NAME=$(basename "$1") |
| NEW_EBUILD_FILE_NAME="${EBUILD_FILE_NAME/llvm/$EBUILD_PREFIX}" |
| NEW_EBUILD_FILENAME_NO_EXT="${NEW_EBUILD_FILE_NAME%.*}" |
| NEW_EBUILD_DIR="${EBUILD_DIR}/../${EBUILD_PREFIX}" |
| NEW_EBUILD_PV="${NEW_EBUILD_FILENAME_NO_EXT#"$EBUILD_PREFIX-"}" |
| NEW_EBUILD_SLOT="${NEW_EBUILD_PV%%_p[[:digit:]]*}" |
| |
| mkdir -p "${NEW_EBUILD_DIR}" |
| if [[ -d "${EBUILD_DIR}/files" ]]; then |
| cp -rf "${EBUILD_DIR}/files" "${NEW_EBUILD_DIR}" |
| fi |
| |
| if [[ -f "${NEW_EBUILD_DIR}/${NEW_EBUILD_FILE_NAME}" ]]; then |
| echo "Removing existing ebuild file ${NEW_EBUILD_FILE_NAME}" |
| rm -f "${NEW_EBUILD_DIR}/${NEW_EBUILD_FILE_NAME}" |
| fi |
| # Generate the llvm-extra ebuild file. |
| "${SCRIPT_DIR}"/create_ebuild_file.py "$1" "${NEW_EBUILD_DIR}/${NEW_EBUILD_FILE_NAME}" |
| if [[ $? -ne 0 ]]; then |
| echo "Creation of ${NEW_EBUILD_DIR}/${NEW_EBUILD_FILE_NAME} failed" |
| exit 1 |
| fi |
| echo "***" |
| echo "***" |
| echo "${NEW_EBUILD_DIR}/${NEW_EBUILD_FILE_NAME} has been created." |
| |
| echo "***" |
| echo "Test if it builds by running \$ sudo emerge ${EBUILD_PREFIX}:${NEW_EBUILD_SLOT}" |
| echo "***" |
| echo "If it works, Go ahead and submit the newly generated ebuild"\ |
| "and any other files in ${NEW_EBUILD_DIR}." |
| echo "***" |
| echo "Don't forget to add sys-devel/${EBUILD_PREFIX}:${NEW_EBUILD_SLOT} to"\ |
| "the dependencies in virtual/target-chromium-os-sdk ebuild." |
| echo "***" |
| echo "***" |
| } |
| |
| |
| set -e |
| # Sanity checks. |
| check_cmd "${@}" |
| # Create llvm-extra ebuild. |
| create_llvm_extra_ebuild "${@}" |