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