1#!/bin/bash 2# Copyright (c) 2023-2024 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} 33BUILD_OHOS_RELEASE=${BUILD_OHOS_RELEASE:-false} 34BUILD_OHOS_RELEASE_GN=${BUILD_OHOS_RELEASE_GN:-false} 35LLVM_COMPONENTS="cmake-exports;llvm-headers;LLVM" 36LLVM_COMPONENTS_PLUS_LINK="${LLVM_COMPONENTS};llvm-link" 37 38# OHOS SDK and compiler 39OHOS_SDK=${OHOS_SDK:-""} 40OHOS_PREBUILTS=${OHOS_PREBUILTS:-""} 41 42# Build tools 43CC=${CC:-"/usr/bin/clang-14"} 44CXX=${CXX:-"/usr/bin/clang++-14"} 45STRIP=${STRIP:-"/usr/bin/llvm-strip-14"} 46LLVM_TABLEGEN=${LLVM_TABLEGEN:-""} 47# Etc. 48NPROC=$(nproc) 49 50if [[ -z "${BUILD_DIR}" ]]; then 51 echo "Please, specify build directory with BUILD_DIR variable" 52 exit 1 53fi 54 55if [[ -z "${LLVM_SOURCES}" ]]; then 56 echo "Please, specify llvm sources directory with LLVM_SOURCES variable" 57 exit 1 58fi 59 60if [[ "x${BUILD_AARCH64_DEBUG}" == "xtrue" || "x${BUILD_AARCH64_RELEASE}" == "xtrue" || "x${BUILD_OHOS_RELEASE_GN}" == "xtrue" || "x${BUILD_OHOS_RELEASE}" == "xtrue" ]]; then 61 if [[ -n "${LLVM_TABLEGEN}" && ! -f "${LLVM_TABLEGEN}" ]]; then 62 echo "Provided LLVM_TABLEGEN '${LLVM_TABLEGEN}' does not exist" 63 exit 1 64 fi 65 66 if [[ -z "${LLVM_TABLEGEN}" ]]; then 67 qemu=$(which update-binfmts &> /dev/null && \ 68 (update-binfmts --display || true) | grep -q "qemu-aarch64" && \ 69 echo "true" || echo "false") 70 71 if [[ "x${qemu}" == "xfalse" && "x${BUILD_X86_DEBUG}" == "xfalse" && \ 72 "x${BUILD_X86_RELEASE}" == "xfalse" ]]; then 73 echo "Cannot launch AArch64 builds without host llvm-tblgen." 74 echo "Please do something from listed below:" 75 echo "1) set LLVM_TABLEGEN variable to installed llvm-tblgen" 76 echo "2) install qemu-binfmt to transparently run AArch64 binaries" 77 echo "3) request one of X86 build using BUILD_X86_DEBUG or BUILD_X86_RELEASE." 78 echo " llvm-tblgen will be used from build directory automatically." 79 exit 1 80 fi 81 fi 82fi 83 84if [[ -z "${OHOS_SDK}" && "x${BUILD_OHOS_RELEASE}" == "xtrue" ]]; then 85 echo "OHOS_SDK variable must be provided for OHOS build" 86 exit 1 87fi 88 89if [[ -z "${OHOS_SDK}" && "x${BUILD_OHOS_RELEASE_GN}" == "xtrue" ]]; then 90 echo "OHOS_SDK variable must be provided for OHOS GN build" 91 exit 1 92fi 93 94if [[ -z "${OHOS_PREBUILTS}" && "x${BUILD_OHOS_RELEASE_GN}" == "xtrue" ]]; then 95 echo "OHOS_PREBUILTS variable must be provided for OHOS GN build" 96 exit 1 97fi 98 99DEBUG_OPT_FLAG="" 100if [[ "x${OPTIMIZE_DEBUG}" == "xtrue" ]]; then 101 DEBUG_OPT_FLAG="-O2" 102fi 103 104function install() { 105 local install_dir="$1" 106 local strip="$2" 107 local archive="$3" 108 if [[ "x${strip}" == "xtrue" ]]; then 109 ninja install-distribution-stripped 110 else 111 ninja install-distribution 112 fi 113 if [[ "x${archive}" == "xtrue" ]]; then 114 tar cJf "${install_dir}.tar.xz" -C "${install_dir}" . 115 du -h "${install_dir}.tar.xz" 116 fi 117} 118 119AUTO_LLVM_TABLEGEN="" 120if [[ "x${BUILD_X86_DEBUG}" == "xtrue" ]]; then 121 TARGET="x86_64${BUILD_SUFFIX}" 122 INSTALL_DIR_NAME="llvm-${VERSION}-debug-${TARGET}" 123 INSTALL_PREFIX="${INSTALL_DIR}/${INSTALL_DIR_NAME}" 124 BUILD_PREFIX="${BUILD_DIR}/${INSTALL_DIR_NAME}" 125 mkdir -p "${BUILD_PREFIX}" 126 cd "${BUILD_PREFIX}" 127 cmake -G Ninja \ 128 -DCMAKE_INSTALL_PREFIX="${INSTALL_PREFIX}" \ 129 -DPACKAGE_VERSION="${PACKAGE_VERSION}" \ 130 -DCMAKE_BUILD_TYPE=Debug \ 131 \ 132 -DCMAKE_C_FLAGS="${DEBUG_OPT_FLAG}" -DCMAKE_CXX_FLAGS="${DEBUG_OPT_FLAG}" \ 133 \ 134 -DCMAKE_C_COMPILER="${CC}" \ 135 -DCMAKE_CXX_COMPILER="${CXX}" \ 136 -DCMAKE_STRIP="${STRIP}" \ 137 \ 138 -DLLVM_ENABLE_FFI=OFF \ 139 -DLLVM_ENABLE_TERMINFO=OFF \ 140 \ 141 -DLLVM_INCLUDE_BENCHMARKS=OFF \ 142 -DLLVM_INCLUDE_EXAMPLES=OFF \ 143 -DLLVM_INCLUDE_TESTS=OFF \ 144 \ 145 -DLLVM_BUILD_TOOLS=ON \ 146 -DLLVM_DISTRIBUTION_COMPONENTS="${LLVM_COMPONENTS_PLUS_LINK}" \ 147 -DLLVM_BUILD_LLVM_DYLIB=ON \ 148 -DLLVM_ENABLE_ZLIB=OFF \ 149 -DLLVM_TARGETS_TO_BUILD="X86;AArch64" \ 150 -DLLVM_PARALLEL_COMPILE_JOBS="${NPROC}" \ 151 -DLLVM_PARALLEL_LINK_JOBS=1 \ 152 "${LLVM_SOURCES}" 153 154 ninja distribution 155 if [[ -n "${INSTALL_DIR}" ]]; then 156 install "${INSTALL_PREFIX}" "${DO_STRIPPING}" "${DO_TARS}" 157 fi 158 159 AUTO_LLVM_TABLEGEN="${BUILD_PREFIX}/bin/llvm-tblgen" 160 if [[ ! -f "${AUTO_LLVM_TABLEGEN}" ]]; then 161 echo "${AUTO_LLVM_TABLEGEN} must be present. Something went wrong..." 162 fi 163fi 164 165if [[ "x${BUILD_X86_RELEASE}" == "xtrue" ]]; then 166 TARGET="x86_64${BUILD_SUFFIX}" 167 INSTALL_DIR_NAME="llvm-${VERSION}-release-${TARGET}" 168 INSTALL_PREFIX="${INSTALL_DIR}/${INSTALL_DIR_NAME}" 169 BUILD_PREFIX="${BUILD_DIR}/${INSTALL_DIR_NAME}" 170 mkdir -p "${BUILD_PREFIX}" 171 cd "${BUILD_PREFIX}" 172 cmake -G Ninja \ 173 -DCMAKE_INSTALL_PREFIX="${INSTALL_PREFIX}" \ 174 -DPACKAGE_VERSION="${PACKAGE_VERSION}" \ 175 -DCMAKE_BUILD_TYPE=Release \ 176 \ 177 -DCMAKE_C_COMPILER="${CC}" \ 178 -DCMAKE_CXX_COMPILER="${CXX}" \ 179 -DCMAKE_STRIP="${STRIP}" \ 180 \ 181 -DLLVM_ENABLE_FFI=OFF \ 182 -DLLVM_ENABLE_TERMINFO=OFF \ 183 \ 184 -DLLVM_INCLUDE_BENCHMARKS=OFF \ 185 -DLLVM_INCLUDE_EXAMPLES=OFF \ 186 -DLLVM_INCLUDE_TESTS=OFF \ 187 \ 188 -DLLVM_BUILD_TOOLS=ON \ 189 -DLLVM_DISTRIBUTION_COMPONENTS="${LLVM_COMPONENTS_PLUS_LINK}" \ 190 -DLLVM_BUILD_LLVM_DYLIB=ON \ 191 -DLLVM_ENABLE_ZLIB=OFF \ 192 -DLLVM_TARGETS_TO_BUILD="X86;AArch64" \ 193 -DLLVM_PARALLEL_COMPILE_JOBS="${NPROC}" \ 194 -DLLVM_PARALLEL_LINK_JOBS=1 \ 195 "${LLVM_SOURCES}" 196 197 ninja distribution 198 if [[ -n "${INSTALL_DIR}" ]]; then 199 install "${INSTALL_PREFIX}" "${DO_STRIPPING}" "${DO_TARS}" 200 fi 201 202 AUTO_LLVM_TABLEGEN="${BUILD_PREFIX}/bin/llvm-tblgen" 203 if [[ ! -f "${AUTO_LLVM_TABLEGEN}" ]]; then 204 echo "${AUTO_LLVM_TABLEGEN} must be present. Something went wrong..." 205 fi 206fi 207 208LLVM_TABLEGEN=${LLVM_TABLEGEN:-${AUTO_LLVM_TABLEGEN}} 209LLVM_TABLEGEN=${LLVM_TABLEGEN:+-DLLVM_TABLEGEN=${LLVM_TABLEGEN}} 210 211if [[ "x${BUILD_AARCH64_DEBUG}" == "xtrue" ]]; then 212 TARGET="aarch64${BUILD_SUFFIX}" 213 INSTALL_DIR_NAME="llvm-${VERSION}-debug-${TARGET}" 214 INSTALL_PREFIX="${INSTALL_DIR}/${INSTALL_DIR_NAME}" 215 BUILD_PREFIX="${BUILD_DIR}/${INSTALL_DIR_NAME}" 216 mkdir -p "${BUILD_PREFIX}" 217 cd "${BUILD_PREFIX}" 218 cmake -G Ninja \ 219 -DCMAKE_INSTALL_PREFIX="${INSTALL_PREFIX}" \ 220 -DPACKAGE_VERSION="${PACKAGE_VERSION}" \ 221 -DCMAKE_BUILD_TYPE=Debug \ 222 \ 223 -DCMAKE_CROSSCOMPILING=ON \ 224 -DLLVM_TARGET_ARCH=AArch64 \ 225 -DLLVM_DEFAULT_TARGET_TRIPLE=aarch64-linux-gnu \ 226 -DCMAKE_C_FLAGS="--target=aarch64-linux-gnu -I/usr/aarch64-linux-gnu/include/ ${DEBUG_OPT_FLAG}" \ 227 -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}" \ 228 \ 229 -DCMAKE_C_COMPILER="${CC}" \ 230 -DCMAKE_CXX_COMPILER="${CXX}" \ 231 -DCMAKE_STRIP="${STRIP}" \ 232 \ 233 -DLLVM_ENABLE_FFI=OFF \ 234 -DLLVM_ENABLE_TERMINFO=OFF \ 235 \ 236 -DLLVM_INCLUDE_BENCHMARKS=OFF \ 237 -DLLVM_INCLUDE_EXAMPLES=OFF \ 238 -DLLVM_INCLUDE_TESTS=OFF \ 239 \ 240 -DLLVM_BUILD_TOOLS=ON \ 241 -DLLVM_DISTRIBUTION_COMPONENTS="${LLVM_COMPONENTS_PLUS_LINK}" \ 242 -DLLVM_BUILD_LLVM_DYLIB=ON \ 243 -DLLVM_ENABLE_ZLIB=OFF \ 244 -DLLVM_TARGETS_TO_BUILD=AArch64 \ 245 -DLLVM_PARALLEL_COMPILE_JOBS="${NPROC}" \ 246 -DLLVM_PARALLEL_LINK_JOBS=1 \ 247 "${LLVM_TABLEGEN}" \ 248 "${LLVM_SOURCES}" 249 250 ninja distribution 251 if [[ -n "${INSTALL_DIR}" ]]; then 252 install "${INSTALL_PREFIX}" "${DO_STRIPPING}" "${DO_TARS}" 253 fi 254fi 255 256if [[ "x${BUILD_AARCH64_RELEASE}" == "xtrue" ]]; then 257 TARGET="aarch64${BUILD_SUFFIX}" 258 INSTALL_DIR_NAME="llvm-${VERSION}-release-${TARGET}" 259 INSTALL_PREFIX="${INSTALL_DIR}/${INSTALL_DIR_NAME}" 260 BUILD_PREFIX="${BUILD_DIR}/${INSTALL_DIR_NAME}" 261 mkdir -p "${BUILD_PREFIX}" 262 cd "${BUILD_PREFIX}" 263 cmake -G Ninja \ 264 -DCMAKE_INSTALL_PREFIX="${INSTALL_PREFIX}" \ 265 -DPACKAGE_VERSION="${PACKAGE_VERSION}" \ 266 -DCMAKE_BUILD_TYPE=Release \ 267 \ 268 -DCMAKE_CROSSCOMPILING=ON \ 269 -DLLVM_TARGET_ARCH=AArch64 \ 270 -DLLVM_DEFAULT_TARGET_TRIPLE=aarch64-linux-gnu \ 271 -DCMAKE_C_FLAGS="--target=aarch64-linux-gnu -I/usr/aarch64-linux-gnu/include/" \ 272 -DCMAKE_CXX_FLAGS="--target=aarch64-linux-gnu -I/usr/aarch64-linux-gnu/include/c++/8/aarch64-linux-gnu -I/usr/aarch64-linux-gnu/include/" \ 273 \ 274 -DCMAKE_C_COMPILER="${CC}" \ 275 -DCMAKE_CXX_COMPILER="${CXX}" \ 276 -DCMAKE_STRIP="${STRIP}" \ 277 \ 278 -DLLVM_ENABLE_FFI=OFF \ 279 -DLLVM_ENABLE_TERMINFO=OFF \ 280 \ 281 -DLLVM_INCLUDE_BENCHMARKS=OFF \ 282 -DLLVM_INCLUDE_EXAMPLES=OFF \ 283 -DLLVM_INCLUDE_TESTS=OFF \ 284 \ 285 -DLLVM_BUILD_TOOLS=ON \ 286 -DLLVM_DISTRIBUTION_COMPONENTS="${LLVM_COMPONENTS_PLUS_LINK}" \ 287 -DLLVM_BUILD_LLVM_DYLIB=ON \ 288 -DLLVM_ENABLE_ZLIB=OFF \ 289 -DLLVM_TARGETS_TO_BUILD=AArch64 \ 290 -DLLVM_PARALLEL_COMPILE_JOBS="${NPROC}" \ 291 -DLLVM_PARALLEL_LINK_JOBS=1 \ 292 "${LLVM_TABLEGEN}" \ 293 "${LLVM_SOURCES}" 294 295 ninja distribution 296 if [[ -n "${INSTALL_DIR}" ]]; then 297 install "${INSTALL_PREFIX}" "${DO_STRIPPING}" "${DO_TARS}" 298 fi 299fi 300 301if [[ "x${BUILD_OHOS_RELEASE}" == "xtrue" ]]; then 302 TARGET="ohos${BUILD_SUFFIX}" 303 INSTALL_DIR_NAME="llvm-${VERSION}-release-${TARGET}" 304 INSTALL_PREFIX="${INSTALL_DIR}/${INSTALL_DIR_NAME}" 305 BUILD_PREFIX="${BUILD_DIR}/${INSTALL_DIR_NAME}" 306 mkdir -p "${BUILD_PREFIX}" 307 cd "${BUILD_PREFIX}" 308 "${OHOS_SDK}/build-tools/cmake/bin/cmake" -G Ninja \ 309 -DCMAKE_INSTALL_PREFIX="${INSTALL_PREFIX}" \ 310 -DPACKAGE_VERSION="${PACKAGE_VERSION}" \ 311 -DCMAKE_BUILD_TYPE=Release \ 312 -DCMAKE_TOOLCHAIN_FILE="${OHOS_SDK}/build/cmake/ohos.toolchain.cmake" \ 313 \ 314 -DOHOS_ALLOW_UNDEFINED_SYMBOLS=ON \ 315 \ 316 -DLLVM_DEFAULT_TARGET_TRIPLE=aarch64-linux-ohos \ 317 -DLLVM_TARGETS_TO_BUILD=AArch64 \ 318 \ 319 -DLLVM_ENABLE_FFI=OFF \ 320 -DLLVM_ENABLE_TERMINFO=OFF \ 321 \ 322 -DLLVM_INCLUDE_BENCHMARKS=OFF \ 323 -DLLVM_INCLUDE_EXAMPLES=OFF \ 324 -DLLVM_INCLUDE_TESTS=OFF \ 325 \ 326 -DLLVM_BUILD_TOOLS=ON \ 327 -DLLVM_DISTRIBUTION_COMPONENTS="${LLVM_COMPONENTS}" \ 328 -DLLVM_BUILD_LLVM_DYLIB=ON \ 329 -DLLVM_ENABLE_ZLIB=OFF \ 330 -DLLVM_PARALLEL_COMPILE_JOBS="${NPROC}" \ 331 -DLLVM_PARALLEL_LINK_JOBS=1 \ 332 "${LLVM_SOURCES}" 333 334 ninja distribution 335 if [[ -n "${INSTALL_DIR}" ]]; then 336 install "${INSTALL_PREFIX}" "${DO_STRIPPING}" "${DO_TARS}" 337 fi 338fi 339 340if [[ "x${BUILD_OHOS_RELEASE_GN}" == "xtrue" ]]; then 341 TARGET="ohos-gn${BUILD_SUFFIX}" 342 INSTALL_DIR_NAME="llvm-${VERSION}-release-${TARGET}" 343 INSTALL_PREFIX="${INSTALL_DIR}/${INSTALL_DIR_NAME}" 344 BUILD_PREFIX="${BUILD_DIR}/${INSTALL_DIR_NAME}" 345 mkdir -p "${BUILD_PREFIX}" 346 cd "${BUILD_PREFIX}" 347 "${OHOS_SDK}/build-tools/cmake/bin/cmake" -G Ninja \ 348 -DCMAKE_INSTALL_PREFIX="${INSTALL_PREFIX}" \ 349 -DPACKAGE_VERSION="${PACKAGE_VERSION}" \ 350 -DCMAKE_BUILD_TYPE=Release \ 351 \ 352 -DCMAKE_CROSSCOMPILING=ON \ 353 -DLLVM_TARGET_ARCH=AArch64 \ 354 -DCMAKE_SYSROOT="${OHOS_SDK}/sysroot" \ 355 -DLLVM_HOST_TRIPLE=aarch64-linux-ohos \ 356 -DLLVM_DEFAULT_TARGET_TRIPLE=aarch64-linux-ohos \ 357 -DCMAKE_C_FLAGS="-fstack-protector-strong --target=aarch64-linux-ohos -ffunction-sections -fdata-sections -v -funwind-tables -no-canonical-prefixes -D__MUSL__" \ 358 -DCMAKE_CXX_FLAGS="-fstack-protector-strong --target=aarch64-linux-ohos -ffunction-sections -fdata-sections -v -funwind-tables -no-canonical-prefixes -D__MUSL__ -stdlib=libc++" \ 359 -DCMAKE_SHARED_LINKER_FLAGS="-fuse-ld=lld -Wl,--gc-sections -Wl,--build-id=sha1 --rtlib=compiler-rt -stdlib=libc++ -Wl,-z,relro,-z,now -pie -lunwind -Wl,-rpath,'\$ORIGIN/../lib' -static-libstdc++" \ 360 \ 361 -DCMAKE_C_COMPILER="${OHOS_PREBUILTS}/clang/ohos/linux-x86_64/llvm/bin/clang" \ 362 -DCMAKE_CXX_COMPILER="${OHOS_PREBUILTS}/clang/ohos/linux-x86_64/llvm/bin/clang++" \ 363 -DCMAKE_STRIP="${STRIP}" \ 364 \ 365 -DLLVM_ENABLE_FFI=OFF \ 366 -DLLVM_ENABLE_TERMINFO=OFF \ 367 \ 368 -DLLVM_INCLUDE_BENCHMARKS=OFF \ 369 -DLLVM_INCLUDE_EXAMPLES=OFF \ 370 -DLLVM_INCLUDE_TESTS=OFF \ 371 \ 372 -DLLVM_BUILD_TOOLS=ON \ 373 -DLLVM_DISTRIBUTION_COMPONENTS="${LLVM_COMPONENTS}" \ 374 -DLLVM_BUILD_LLVM_DYLIB=ON \ 375 -DLLVM_ENABLE_ZLIB=OFF \ 376 -DLLVM_TARGETS_TO_BUILD=AArch64 \ 377 -DLLVM_PARALLEL_COMPILE_JOBS="${NPROC}" \ 378 -DLLVM_PARALLEL_LINK_JOBS=1 \ 379 "${LLVM_TABLEGEN}" \ 380 "${LLVM_SOURCES}" 381 382 ninja distribution 383 if [[ -n "${INSTALL_DIR}" ]]; then 384 install "${INSTALL_PREFIX}" "${DO_STRIPPING}" "${DO_TARS}" 385 fi 386fi 387