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_NDK_VERSION" 11: "$ANDROID_SDK_VERSION" 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="android-ndk-${ANDROID_NDK_VERSION}" 47ANDROID_NDK_ROOT="/${ANDROID_NDK}" 48if [ ! -d "$ANDROID_NDK_ROOT" ]; 49then 50 curl -L --retry 4 -f --retry-all-errors --retry-delay 60 \ 51 -o "${ANDROID_NDK}.zip" \ 52 "https://dl.google.com/android/repository/${ANDROID_NDK}-linux.zip" 53 unzip -d / "${ANDROID_NDK}.zip" "$ANDROID_NDK/source.properties" "$ANDROID_NDK/build/cmake/*" "$ANDROID_NDK/toolchains/llvm/*" 54 rm "${ANDROID_NDK}.zip" 55fi 56 57if [ ! -d "/llvm-project" ]; 58then 59 mkdir "/llvm-project" 60 pushd "/llvm-project" 61 git init 62 git remote add origin https://github.com/llvm/llvm-project.git 63 git fetch --depth 1 origin "$ANDROID_LLVM_VERSION" 64 git checkout FETCH_HEAD 65 popd 66fi 67 68pushd "/llvm-project" 69 70# Checkout again the intended version, just in case of a pre-existing full clone 71git checkout "$ANDROID_LLVM_VERSION" || true 72 73LLVM_INSTALL_PREFIX="/${ANDROID_LLVM_ARTIFACT_NAME}" 74 75rm -rf build/ 76cmake -GNinja -S llvm -B build/ \ 77 -DCMAKE_TOOLCHAIN_FILE="${ANDROID_NDK_ROOT}/build/cmake/android.toolchain.cmake" \ 78 -DANDROID_ABI=x86_64 \ 79 -DANDROID_PLATFORM="android-${ANDROID_SDK_VERSION}" \ 80 -DANDROID_NDK="${ANDROID_NDK_ROOT}" \ 81 -DCMAKE_ANDROID_ARCH_ABI=x86_64 \ 82 -DCMAKE_ANDROID_NDK="${ANDROID_NDK_ROOT}" \ 83 -DCMAKE_BUILD_TYPE=MinSizeRel \ 84 -DCMAKE_SYSTEM_NAME=Android \ 85 -DCMAKE_SYSTEM_VERSION="${ANDROID_SDK_VERSION}" \ 86 -DCMAKE_INSTALL_PREFIX="${LLVM_INSTALL_PREFIX}" \ 87 -DCMAKE_CXX_FLAGS="-march=x86-64 --target=x86_64-linux-android${ANDROID_SDK_VERSION} -fno-rtti" \ 88 -DLLVM_HOST_TRIPLE="x86_64-linux-android${ANDROID_SDK_VERSION}" \ 89 -DLLVM_TARGETS_TO_BUILD=X86 \ 90 -DLLVM_BUILD_LLVM_DYLIB=OFF \ 91 -DLLVM_BUILD_TESTS=OFF \ 92 -DLLVM_BUILD_EXAMPLES=OFF \ 93 -DLLVM_BUILD_DOCS=OFF \ 94 -DLLVM_BUILD_TOOLS=OFF \ 95 -DLLVM_ENABLE_RTTI=OFF \ 96 -DLLVM_BUILD_INSTRUMENTED_COVERAGE=OFF \ 97 -DLLVM_NATIVE_TOOL_DIR="${ANDROID_NDK_ROOT}/toolchains/llvm/prebuilt/linux-x86_64/bin" \ 98 -DLLVM_ENABLE_PIC=False \ 99 -DLLVM_OPTIMIZED_TABLEGEN=ON 100 101ninja "-j${FDO_CI_CONCURRENT:-4}" -C build/ install 102 103popd 104 105rm -rf /llvm-project 106 107tar --zstd -cf "${ANDROID_LLVM_ARTIFACT_NAME}.tar.zst" "$LLVM_INSTALL_PREFIX" 108 109# If run in CI upload the tar.zst archive to S3 to avoid rebuilding it if the 110# version does not change, and delete it. 111# The file is not deleted for non-CI because it can be useful in local runs. 112if [ -n "$CI" ]; then 113 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" 114 rm "${ANDROID_LLVM_ARTIFACT_NAME}.tar.zst" 115fi 116 117rm -rf "$LLVM_INSTALL_PREFIX" 118 119apt-get purge -y "${EPHEMERAL[@]}" 120