xref: /aosp_15_r20/external/toolchain-utils/llvm_extra/create_llvm_extra.sh (revision 760c253c1ed00ce9abd48f8546f08516e57485fe)
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