1#!/usr/bin/env bash 2 3set -exu 4 5# If CI vars are not set, assign an empty value, this prevents -u to fail 6: "${CI:=}" 7: "${CI_PROJECT_PATH:=}" 8 9# Early check for required env variables, relies on `set -u` 10: "$ANDROID_SDK_VERSION" 11: "$ANDROID_NDK" 12: "$ANDROID_LLVM_VERSION" 13: "$ANDROID_LLVM_ARTIFACT_NAME" 14: "$S3_JWT_FILE" 15: "$S3_HOST" 16: "$S3_ANDROID_BUCKET" 17 18# Check for CI if the auth file used later on is non-empty 19if [ -n "$CI" ] && [ ! -s "${S3_JWT_FILE}" ]; then 20 echo "Error: ${S3_JWT_FILE} is empty." 1>&2 21 exit 1 22fi 23 24if curl -s -o /dev/null -I -L -f --retry 4 --retry-delay 15 "https://${S3_HOST}/${S3_ANDROID_BUCKET}/${CI_PROJECT_PATH}/${ANDROID_LLVM_ARTIFACT_NAME}.tar.zst"; then 25 echo "Artifact ${ANDROID_LLVM_ARTIFACT_NAME}.tar.zst already exists, skip re-building." 26 27 # Download prebuilt LLVM libraries for Android when they have not changed, 28 # to save some time 29 curl -L --retry 4 -f --retry-all-errors --retry-delay 60 \ 30 -o "/${ANDROID_LLVM_ARTIFACT_NAME}.tar.zst" "https://${S3_HOST}/${S3_ANDROID_BUCKET}/${CI_PROJECT_PATH}/${ANDROID_LLVM_ARTIFACT_NAME}.tar.zst" 31 tar -C / --zstd -xf "/${ANDROID_LLVM_ARTIFACT_NAME}.tar.zst" 32 rm "/${ANDROID_LLVM_ARTIFACT_NAME}.tar.zst" 33 34 exit 35fi 36 37# Install some dependencies needed to build LLVM 38EPHEMERAL=( 39 ninja-build 40 unzip 41) 42 43apt-get update 44apt-get install -y --no-install-recommends --no-remove "${EPHEMERAL[@]}" 45 46ANDROID_NDK_ROOT="/${ANDROID_NDK}" 47if [ ! -d "$ANDROID_NDK_ROOT" ]; 48then 49 curl -L --retry 4 -f --retry-all-errors --retry-delay 60 \ 50 -o "${ANDROID_NDK}.zip" \ 51 "https://dl.google.com/android/repository/${ANDROID_NDK}-linux.zip" 52 unzip -d / "${ANDROID_NDK}.zip" "$ANDROID_NDK/source.properties" "$ANDROID_NDK/build/cmake/*" "$ANDROID_NDK/toolchains/llvm/*" 53 rm "${ANDROID_NDK}.zip" 54fi 55 56if [ ! -d "/llvm-project" ]; 57then 58 mkdir "/llvm-project" 59 pushd "/llvm-project" 60 git init 61 git remote add origin https://github.com/llvm/llvm-project.git 62 git fetch --depth 1 origin "$ANDROID_LLVM_VERSION" 63 git checkout FETCH_HEAD 64 popd 65fi 66 67pushd "/llvm-project" 68 69# Checkout again the intended version, just in case of a pre-existing full clone 70git checkout "$ANDROID_LLVM_VERSION" || true 71 72LLVM_INSTALL_PREFIX="/${ANDROID_LLVM_ARTIFACT_NAME}" 73 74rm -rf build/ 75cmake -GNinja -S llvm -B build/ \ 76 -DCMAKE_TOOLCHAIN_FILE="${ANDROID_NDK_ROOT}/build/cmake/android.toolchain.cmake" \ 77 -DANDROID_ABI=x86_64 \ 78 -DANDROID_PLATFORM="android-${ANDROID_SDK_VERSION}" \ 79 -DANDROID_NDK="${ANDROID_NDK_ROOT}" \ 80 -DCMAKE_ANDROID_ARCH_ABI=x86_64 \ 81 -DCMAKE_ANDROID_NDK="${ANDROID_NDK_ROOT}" \ 82 -DCMAKE_BUILD_TYPE=MinSizeRel \ 83 -DCMAKE_SYSTEM_NAME=Android \ 84 -DCMAKE_SYSTEM_VERSION="${ANDROID_SDK_VERSION}" \ 85 -DCMAKE_INSTALL_PREFIX="${LLVM_INSTALL_PREFIX}" \ 86 -DCMAKE_CXX_FLAGS="-march=x86-64 --target=x86_64-linux-android${ANDROID_SDK_VERSION} -fno-rtti" \ 87 -DLLVM_HOST_TRIPLE="x86_64-linux-android${ANDROID_SDK_VERSION}" \ 88 -DLLVM_TARGETS_TO_BUILD=X86 \ 89 -DLLVM_BUILD_LLVM_DYLIB=OFF \ 90 -DLLVM_BUILD_TESTS=OFF \ 91 -DLLVM_BUILD_EXAMPLES=OFF \ 92 -DLLVM_BUILD_DOCS=OFF \ 93 -DLLVM_BUILD_TOOLS=OFF \ 94 -DLLVM_ENABLE_RTTI=OFF \ 95 -DLLVM_BUILD_INSTRUMENTED_COVERAGE=OFF \ 96 -DLLVM_NATIVE_TOOL_DIR="${ANDROID_NDK_ROOT}/toolchains/llvm/prebuilt/linux-x86_64/bin" \ 97 -DLLVM_ENABLE_PIC=False \ 98 -DLLVM_OPTIMIZED_TABLEGEN=ON 99 100ninja "-j${FDO_CI_CONCURRENT:-4}" -C build/ install 101 102popd 103 104rm -rf /llvm-project 105 106tar --zstd -cf "${ANDROID_LLVM_ARTIFACT_NAME}.tar.zst" "$LLVM_INSTALL_PREFIX" 107 108# If run in CI upload the tar.zst archive to S3 to avoid rebuilding it if the 109# version does not change, and delete it. 110# The file is not deleted for non-CI because it can be useful in local runs. 111if [ -n "$CI" ]; then 112 ci-fairy s3cp --token-file "${S3_JWT_FILE}" "${ANDROID_LLVM_ARTIFACT_NAME}.tar.zst" "https://${S3_HOST}/${S3_ANDROID_BUCKET}/${CI_PROJECT_PATH}/${ANDROID_LLVM_ARTIFACT_NAME}.tar.zst" 113 rm "${ANDROID_LLVM_ARTIFACT_NAME}.tar.zst" 114fi 115 116rm -rf "$LLVM_INSTALL_PREFIX" 117 118apt-get purge -y "${EPHEMERAL[@]}" 119