1#!/bin/bash 2# Copyright (c) 2023 Huawei Device Co., Ltd. 3# Licensed under the Apache License, Version 2.0 (the "License"); 4# you may not use this file except in compliance with the License. 5# You may obtain a copy of the License at 6# 7# http://www.apache.org/licenses/LICENSE-2.0 8# 9# Unless required by applicable law or agreed to in writing, software 10# distributed under the License is distributed on an "AS IS" BASIS, 11# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12# See the License for the specific language governing permissions and 13# limitations under the License. 14 15set -euo pipefail 16 17# Required variables 18BUILD_DIR=${BUILD_DIR:-""} 19LLVM_SOURCES=${LLVM_SOURCES:-""} 20# Optional variables 21INSTALL_DIR=${INSTALL_DIR:-""} # empty -- do not install 22VERSION=${VERSION:-"main"} # Specifies build and install directory names: 23PACKAGE_VERSION=${PACKAGE_VERSION:-${VERSION}} 24BUILD_SUFFIX=${BUILD_SUFFIX:-""} # llvm-<VERSION>-{debug,release}-{aarch64,x86}<BUILD_SUFFIX> 25OPTIMIZE_DEBUG=${OPTIMIZE_DEBUG:-true} # Compile debug versions with -O2 26DO_STRIPPING=${DO_STRIPPING:-true} # checked only if install 27DO_TARS=${DO_TARS:-true} # checked only if install 28# Select a target to build 29BUILD_X86_DEBUG=${BUILD_X86_DEBUG:-false} 30BUILD_X86_RELEASE=${BUILD_X86_RELEASE:-false} 31BUILD_AARCH64_DEBUG=${BUILD_AARCH64_DEBUG:-false} 32BUILD_AARCH64_RELEASE=${BUILD_AARCH64_RELEASE:-false} 33LLVM_COMPONENTS="cmake-exports;llvm-headers;LLVM" 34LLVM_COMPONENTS_PLUS_LINK="${LLVM_COMPONENTS};llvm-link" 35 36# Build tools 37CC=${CC:-"/usr/bin/clang-14"} 38CXX=${CXX:-"/usr/bin/clang++-14"} 39STRIP=${STRIP:-"/usr/bin/llvm-strip-14"} 40LLVM_TABLEGEN=${LLVM_TABLEGEN:-""} 41# Etc. 42NPROC=$(nproc) 43 44if [[ -z "${BUILD_DIR}" ]]; then 45 echo "Please, specify build directory with BUILD_DIR variable" 46 exit 1 47fi 48 49if [[ -z "${LLVM_SOURCES}" ]]; then 50 echo "Please, specify llvm sources directory with LLVM_SOURCES variable" 51 exit 1 52fi 53 54if [[ "x${BUILD_AARCH64_DEBUG}" == "xtrue" || "x${BUILD_AARCH64_RELEASE}" == "xtrue" ]]; then 55 if [[ -n "${LLVM_TABLEGEN}" && ! -f "${LLVM_TABLEGEN}" ]]; then 56 echo "Provided LLVM_TABLEGEN '${LLVM_TABLEGEN}' does not exist" 57 exit 1 58 fi 59 60 if [[ -z "${LLVM_TABLEGEN}" ]]; then 61 qemu=$(which update-binfmts &> /dev/null && \ 62 (update-binfmts --display || true) | grep -q "qemu-aarch64" && \ 63 echo "true" || echo "false") 64 65 if [[ "x${qemu}" == "xfalse" && "x${BUILD_X86_DEBUG}" == "xfalse" && \ 66 "x${BUILD_X86_RELEASE}" == "xfalse" ]]; then 67 echo "Cannot launch AArch64 builds without host llvm-tblgen." 68 echo "Please do something from listed below:" 69 echo "1) set LLVM_TABLEGEN variable to installed llvm-tblgen" 70 echo "2) install qemu-binfmt to transparently run AArch64 binaries" 71 echo "3) request one of X86 build using BUILD_X86_DEBUG or BUILD_X86_RELEASE." 72 echo " llvm-tblgen will be used from build directory automatically." 73 exit 1 74 fi 75 fi 76fi 77 78DEBUG_OPT_FLAG="" 79if [[ "x${OPTIMIZE_DEBUG}" == "xtrue" ]]; then 80 DEBUG_OPT_FLAG="-O2" 81fi 82 83function install() { 84 local install_dir="$1" 85 local strip="$2" 86 local archive="$3" 87 if [[ "x${strip}" == "xtrue" ]]; then 88 ninja install-distribution-stripped 89 else 90 ninja install-distribution 91 fi 92 if [[ "x${archive}" == "xtrue" ]]; then 93 tar cJf "${install_dir}.tar.xz" -C "${install_dir}" . 94 du -h "${install_dir}.tar.xz" 95 fi 96} 97 98AUTO_LLVM_TABLEGEN="" 99if [[ "x${BUILD_X86_DEBUG}" == "xtrue" ]]; then 100 TARGET="x86_64${BUILD_SUFFIX}" 101 INSTALL_DIR_NAME="llvm-${VERSION}-debug-${TARGET}" 102 INSTALL_PREFIX="${INSTALL_DIR}/${INSTALL_DIR_NAME}" 103 BUILD_PREFIX="${BUILD_DIR}/${INSTALL_DIR_NAME}" 104 mkdir -p "${BUILD_PREFIX}" 105 cd "${BUILD_PREFIX}" 106 cmake -G Ninja \ 107 -DCMAKE_INSTALL_PREFIX="${INSTALL_PREFIX}" \ 108 -DPACKAGE_VERSION="${PACKAGE_VERSION}" \ 109 -DCMAKE_BUILD_TYPE=Debug \ 110 \ 111 -DCMAKE_C_FLAGS="${DEBUG_OPT_FLAG}" -DCMAKE_CXX_FLAGS="${DEBUG_OPT_FLAG}" \ 112 \ 113 -DCMAKE_C_COMPILER="${CC}" \ 114 -DCMAKE_CXX_COMPILER="${CXX}" \ 115 -DCMAKE_STRIP="${STRIP}" \ 116 \ 117 -DLLVM_ENABLE_FFI=OFF \ 118 -DLLVM_ENABLE_TERMINFO=OFF \ 119 \ 120 -DLLVM_INCLUDE_BENCHMARKS=OFF \ 121 -DLLVM_INCLUDE_EXAMPLES=OFF \ 122 -DLLVM_INCLUDE_TESTS=OFF \ 123 \ 124 -DLLVM_BUILD_TOOLS=ON \ 125 -DLLVM_DISTRIBUTION_COMPONENTS="${LLVM_COMPONENTS_PLUS_LINK}" \ 126 -DLLVM_BUILD_LLVM_DYLIB=ON \ 127 -DLLVM_ENABLE_ZLIB=OFF \ 128 -DLLVM_TARGETS_TO_BUILD="X86;AArch64" \ 129 -DLLVM_PARALLEL_COMPILE_JOBS="${NPROC}" \ 130 -DLLVM_PARALLEL_LINK_JOBS=1 \ 131 "${LLVM_SOURCES}" 132 133 ninja distribution 134 if [[ -n "${INSTALL_DIR}" ]]; then 135 install "${INSTALL_PREFIX}" "${DO_STRIPPING}" "${DO_TARS}" 136 fi 137 138 AUTO_LLVM_TABLEGEN="${BUILD_PREFIX}/bin/llvm-tblgen" 139 if [[ ! -f "${AUTO_LLVM_TABLEGEN}" ]]; then 140 echo "${AUTO_LLVM_TABLEGEN} must be present. Something went wrong..." 141 fi 142fi 143 144if [[ "x${BUILD_X86_RELEASE}" == "xtrue" ]]; then 145 TARGET="x86_64${BUILD_SUFFIX}" 146 INSTALL_DIR_NAME="llvm-${VERSION}-release-${TARGET}" 147 INSTALL_PREFIX="${INSTALL_DIR}/${INSTALL_DIR_NAME}" 148 BUILD_PREFIX="${BUILD_DIR}/${INSTALL_DIR_NAME}" 149 mkdir -p "${BUILD_PREFIX}" 150 cd "${BUILD_PREFIX}" 151 cmake -G Ninja \ 152 -DCMAKE_INSTALL_PREFIX="${INSTALL_PREFIX}" \ 153 -DPACKAGE_VERSION="${PACKAGE_VERSION}" \ 154 -DCMAKE_BUILD_TYPE=Release \ 155 \ 156 -DCMAKE_C_COMPILER="${CC}" \ 157 -DCMAKE_CXX_COMPILER="${CXX}" \ 158 -DCMAKE_STRIP="${STRIP}" \ 159 \ 160 -DLLVM_ENABLE_FFI=OFF \ 161 -DLLVM_ENABLE_TERMINFO=OFF \ 162 \ 163 -DLLVM_INCLUDE_BENCHMARKS=OFF \ 164 -DLLVM_INCLUDE_EXAMPLES=OFF \ 165 -DLLVM_INCLUDE_TESTS=OFF \ 166 \ 167 -DLLVM_BUILD_TOOLS=ON \ 168 -DLLVM_DISTRIBUTION_COMPONENTS="${LLVM_COMPONENTS_PLUS_LINK}" \ 169 -DLLVM_BUILD_LLVM_DYLIB=ON \ 170 -DLLVM_ENABLE_ZLIB=OFF \ 171 -DLLVM_TARGETS_TO_BUILD="X86;AArch64" \ 172 -DLLVM_PARALLEL_COMPILE_JOBS="${NPROC}" \ 173 -DLLVM_PARALLEL_LINK_JOBS=1 \ 174 "${LLVM_SOURCES}" 175 176 ninja distribution 177 if [[ -n "${INSTALL_DIR}" ]]; then 178 install "${INSTALL_PREFIX}" "${DO_STRIPPING}" "${DO_TARS}" 179 fi 180 181 AUTO_LLVM_TABLEGEN="${BUILD_PREFIX}/bin/llvm-tblgen" 182 if [[ ! -f "${AUTO_LLVM_TABLEGEN}" ]]; then 183 echo "${AUTO_LLVM_TABLEGEN} must be present. Something went wrong..." 184 fi 185fi 186 187LLVM_TABLEGEN=${LLVM_TABLEGEN:-${AUTO_LLVM_TABLEGEN}} 188LLVM_TABLEGEN=${LLVM_TABLEGEN:+-DLLVM_TABLEGEN=${LLVM_TABLEGEN}} 189 190if [[ "x${BUILD_AARCH64_DEBUG}" == "xtrue" ]]; then 191 TARGET="aarch64${BUILD_SUFFIX}" 192 INSTALL_DIR_NAME="llvm-${VERSION}-debug-${TARGET}" 193 INSTALL_PREFIX="${INSTALL_DIR}/${INSTALL_DIR_NAME}" 194 BUILD_PREFIX="${BUILD_DIR}/${INSTALL_DIR_NAME}" 195 mkdir -p "${BUILD_PREFIX}" 196 cd "${BUILD_PREFIX}" 197 cmake -G Ninja \ 198 -DCMAKE_INSTALL_PREFIX="${INSTALL_PREFIX}" \ 199 -DPACKAGE_VERSION="${PACKAGE_VERSION}" \ 200 -DCMAKE_BUILD_TYPE=Debug \ 201 \ 202 -DCMAKE_CROSSCOMPILING=True \ 203 -DLLVM_TARGET_ARCH=AArch64 \ 204 -DLLVM_DEFAULT_TARGET_TRIPLE=aarch64-linux-gnu \ 205 -DCMAKE_C_FLAGS="--target=aarch64-linux-gnu -I/usr/aarch64-linux-gnu/include/ ${DEBUG_OPT_FLAG}" \ 206 -DCMAKE_CXX_FLAGS="--target=aarch64-linux-gnu -I/usr/aarch64-linux-gnu/include/c++/8/aarch64-linux-gnu -I/usr/aarch64-linux-gnu/include/ ${DEBUG_OPT_FLAG}" \ 207 \ 208 -DCMAKE_C_COMPILER="${CC}" \ 209 -DCMAKE_CXX_COMPILER="${CXX}" \ 210 -DCMAKE_STRIP="${STRIP}" \ 211 \ 212 -DLLVM_ENABLE_FFI=OFF \ 213 -DLLVM_ENABLE_TERMINFO=OFF \ 214 \ 215 -DLLVM_INCLUDE_BENCHMARKS=OFF \ 216 -DLLVM_INCLUDE_EXAMPLES=OFF \ 217 -DLLVM_INCLUDE_TESTS=OFF \ 218 \ 219 -DLLVM_BUILD_TOOLS=ON \ 220 -DLLVM_DISTRIBUTION_COMPONENTS="${LLVM_COMPONENTS_PLUS_LINK}" \ 221 -DLLVM_BUILD_LLVM_DYLIB=ON \ 222 -DLLVM_ENABLE_ZLIB=OFF \ 223 -DLLVM_TARGETS_TO_BUILD=AArch64 \ 224 -DLLVM_PARALLEL_COMPILE_JOBS="${NPROC}" \ 225 -DLLVM_PARALLEL_LINK_JOBS=1 \ 226 "${LLVM_TABLEGEN}" \ 227 "${LLVM_SOURCES}" 228 229 ninja distribution 230 if [[ -n "${INSTALL_DIR}" ]]; then 231 install "${INSTALL_PREFIX}" "${DO_STRIPPING}" "${DO_TARS}" 232 fi 233fi 234 235if [[ "x${BUILD_AARCH64_RELEASE}" == "xtrue" ]]; then 236 TARGET="aarch64${BUILD_SUFFIX}" 237 INSTALL_DIR_NAME="llvm-${VERSION}-release-${TARGET}" 238 INSTALL_PREFIX="${INSTALL_DIR}/${INSTALL_DIR_NAME}" 239 BUILD_PREFIX="${BUILD_DIR}/${INSTALL_DIR_NAME}" 240 mkdir -p "${BUILD_PREFIX}" 241 cd "${BUILD_PREFIX}" 242 cmake -G Ninja \ 243 -DCMAKE_INSTALL_PREFIX="${INSTALL_PREFIX}" \ 244 -DPACKAGE_VERSION="${PACKAGE_VERSION}" \ 245 -DCMAKE_BUILD_TYPE=Release \ 246 \ 247 -DCMAKE_CROSSCOMPILING=True \ 248 -DLLVM_TARGET_ARCH=AArch64 \ 249 -DLLVM_DEFAULT_TARGET_TRIPLE=aarch64-linux-gnu \ 250 -DCMAKE_C_FLAGS="--target=aarch64-linux-gnu -I/usr/aarch64-linux-gnu/include/" \ 251 -DCMAKE_CXX_FLAGS="--target=aarch64-linux-gnu -I/usr/aarch64-linux-gnu/include/c++/8/aarch64-linux-gnu -I/usr/aarch64-linux-gnu/include/" \ 252 \ 253 -DCMAKE_C_COMPILER="${CC}" \ 254 -DCMAKE_CXX_COMPILER="${CXX}" \ 255 -DCMAKE_STRIP="${STRIP}" \ 256 \ 257 -DLLVM_ENABLE_FFI=OFF \ 258 -DLLVM_ENABLE_TERMINFO=OFF \ 259 \ 260 -DLLVM_INCLUDE_BENCHMARKS=OFF \ 261 -DLLVM_INCLUDE_EXAMPLES=OFF \ 262 -DLLVM_INCLUDE_TESTS=OFF \ 263 \ 264 -DLLVM_BUILD_TOOLS=ON \ 265 -DLLVM_DISTRIBUTION_COMPONENTS="${LLVM_COMPONENTS_PLUS_LINK}" \ 266 -DLLVM_BUILD_LLVM_DYLIB=ON \ 267 -DLLVM_ENABLE_ZLIB=OFF \ 268 -DLLVM_TARGETS_TO_BUILD=AArch64 \ 269 -DLLVM_PARALLEL_COMPILE_JOBS="${NPROC}" \ 270 -DLLVM_PARALLEL_LINK_JOBS=1 \ 271 "${LLVM_TABLEGEN}" \ 272 "${LLVM_SOURCES}" 273 274 ninja distribution 275 if [[ -n "${INSTALL_DIR}" ]]; then 276 install "${INSTALL_PREFIX}" "${DO_STRIPPING}" "${DO_TARS}" 277 fi 278fi 279