• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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