ci/android: build llvmpipe driver for Android by forcing llvm fallback

In order to build the mesa llvmpipe driver for Android, llvm libraries
for Android are needed; force meson to use a fallback for llvm and
provide prebuilt libraries making them available to meson thanks to
a wrap file.

Enable other software drivers for the x86_64-linux-android build, but
also disable the amd and intel hardware drivers for now which don't
build correctly on Android.

Download the prebuilt LLVM libraries for Android in the container job
rather than in the build job, to avoid downloading some big artifacts
for every mesa version built for Android.

Reviewed-by: Eric Engestrom <None>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/30895>
This commit is contained in:
Antonio Ospite 2024-08-26 11:54:45 +02:00 committed by Marge Bot
parent a90d771724
commit 17eabaf55c
5 changed files with 79 additions and 21 deletions

View file

@ -414,10 +414,11 @@ debian-android:
-D egl=enabled -D egl=enabled
-D glvnd=disabled -D glvnd=disabled
-D platforms=android -D platforms=android
FORCE_FALLBACK_FOR: llvm
EXTRA_OPTION: > EXTRA_OPTION: >
-D android-stub=true -D android-stub=true
-D llvm=disabled
-D platform-sdk-version=33 -D platform-sdk-version=33
-D cpp_rtti=false
-D valgrind=disabled -D valgrind=disabled
-D android-libbacktrace=disabled -D android-libbacktrace=disabled
-D intel-clc=system -D intel-clc=system
@ -453,8 +454,9 @@ debian-android:
# drivers because they requires LLVM, which we don't have an Android build # drivers because they requires LLVM, which we don't have an Android build
# of. # of.
- export CROSS=x86_64-linux-android - export CROSS=x86_64-linux-android
- export GALLIUM_DRIVERS=iris,virgl - export GALLIUM_DRIVERS=iris,virgl,zink,softpipe,llvmpipe,swrast
- export VULKAN_DRIVERS=amd,intel - export VULKAN_DRIVERS=virtio,swrast
- .gitlab-ci/create-llvm-meson-wrap-file.sh
- *meson-build - *meson-build
- .gitlab-ci/prepare-artifacts.sh - .gitlab-ci/prepare-artifacts.sh

View file

@ -9,20 +9,28 @@ set -exu
# Early check for required env variables, relies on `set -u` # Early check for required env variables, relies on `set -u`
: "$ANDROID_SDK_VERSION" : "$ANDROID_SDK_VERSION"
: "$ANDROID_NDK" : "$ANDROID_NDK"
: "$LLVM_VERSION" : "$ANDROID_LLVM_VERSION"
: "$LLVM_ARTIFACT_NAME" : "$ANDROID_LLVM_ARTIFACT_NAME"
: "$S3_JWT_FILE" : "$S3_JWT_FILE"
: "$S3_HOST" : "$S3_HOST"
: "$S3_ANDROID_BUCKET" : "$S3_ANDROID_BUCKET"
# Check if the auth file used later on for CI is non-empty # Check for CI if the auth file used later on is non-empty
if [ -n "$CI" ] && [ ! -s "${S3_JWT_FILE}" ]; then if [ -n "$CI" ] && [ ! -s "${S3_JWT_FILE}" ]; then
echo "Error: ${S3_JWT_FILE} is empty." 1>&2 echo "Error: ${S3_JWT_FILE} is empty." 1>&2
exit 1 exit 1
fi fi
if curl -s -o /dev/null -I -L -f --retry 4 --retry-delay 15 "https://${S3_HOST}/${S3_ANDROID_BUCKET}/${CI_PROJECT_PATH}/${LLVM_ARTIFACT_NAME}.tar.zst"; then if 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
echo "Artifact ${LLVM_ARTIFACT_NAME}.tar.zst already exists, skip re-building." echo "Artifact ${ANDROID_LLVM_ARTIFACT_NAME}.tar.zst already exists, skip re-building."
# Download prebuilt LLVM libraries for Android when they have not changed,
# to save some time
curl -L --retry 4 -f --retry-all-errors --retry-delay 60 \
-o "/${ANDROID_LLVM_ARTIFACT_NAME}.tar.zst" "https://${S3_HOST}/${S3_ANDROID_BUCKET}/${CI_PROJECT_PATH}/${ANDROID_LLVM_ARTIFACT_NAME}.tar.zst"
tar -C / --zstd -xf "/${ANDROID_LLVM_ARTIFACT_NAME}.tar.zst"
rm "/${ANDROID_LLVM_ARTIFACT_NAME}.tar.zst"
exit exit
fi fi
@ -51,7 +59,7 @@ then
pushd "/llvm-project" pushd "/llvm-project"
git init git init
git remote add origin https://github.com/llvm/llvm-project.git git remote add origin https://github.com/llvm/llvm-project.git
git fetch --depth 1 origin "$LLVM_VERSION" git fetch --depth 1 origin "$ANDROID_LLVM_VERSION"
git checkout FETCH_HEAD git checkout FETCH_HEAD
popd popd
fi fi
@ -59,9 +67,9 @@ fi
pushd "/llvm-project" pushd "/llvm-project"
# Checkout again the intended version, just in case of a pre-existing full clone # Checkout again the intended version, just in case of a pre-existing full clone
git checkout "$LLVM_VERSION" || true git checkout "$ANDROID_LLVM_VERSION" || true
LLVM_INSTALL_PREFIX="/${LLVM_ARTIFACT_NAME}" LLVM_INSTALL_PREFIX="/${ANDROID_LLVM_ARTIFACT_NAME}"
rm -rf build/ rm -rf build/
cmake -GNinja -S llvm -B build/ \ cmake -GNinja -S llvm -B build/ \
@ -95,14 +103,14 @@ popd
rm -rf /llvm-project rm -rf /llvm-project
tar --zstd -cf "${LLVM_ARTIFACT_NAME}.tar.zst" "$LLVM_INSTALL_PREFIX" tar --zstd -cf "${ANDROID_LLVM_ARTIFACT_NAME}.tar.zst" "$LLVM_INSTALL_PREFIX"
# If run in CI upload the tar.zst archive to S3 to avoid rebuilding it if the # If run in CI upload the tar.zst archive to S3 to avoid rebuilding it if the
# version does not change, and delete it. # version does not change, and delete it.
# The file is not deleted for non-CI because it can be useful in local runs. # The file is not deleted for non-CI because it can be useful in local runs.
if [ -n "$CI" ]; then if [ -n "$CI" ]; then
ci-fairy s3cp --token-file "${S3_JWT_FILE}" "${LLVM_ARTIFACT_NAME}.tar.zst" "https://${S3_HOST}/${S3_ANDROID_BUCKET}/${CI_PROJECT_PATH}/${LLVM_ARTIFACT_NAME}.tar.zst" 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"
rm "${LLVM_ARTIFACT_NAME}.tar.zst" rm "${ANDROID_LLVM_ARTIFACT_NAME}.tar.zst"
fi fi
rm -rf "$LLVM_INSTALL_PREFIX" rm -rf "$LLVM_INSTALL_PREFIX"

View file

@ -154,18 +154,23 @@ debian/s390x_build:
- debian/s390x_build - debian/s390x_build
# Android NDK cross-build image # Android NDK cross-build image
.android-variables:
variables:
ANDROID_SDK_VERSION: 33
ANDROID_NDK: android-ndk-r25b
ANDROID_LLVM_VERSION: llvmorg-18.1.8
ANDROID_LLVM_ARTIFACT_NAME: android-x86_64-llvm-20241219
debian/android_build: debian/android_build:
extends: extends:
- .android-variables
- .use-debian/x86_64_build-base - .use-debian/x86_64_build-base
variables: variables:
MESA_IMAGE_TAG: &debian-android_build ${DEBIAN_BUILD_TAG} MESA_IMAGE_TAG: &debian-android_build ${DEBIAN_BUILD_TAG}
ANDROID_SDK_VERSION: 33
ANDROID_NDK: android-ndk-r25b
LLVM_VERSION: llvmorg-18.1.8
LLVM_ARTIFACT_NAME: android-x86_64-llvm-20241219
.use-debian/android_build: .use-debian/android_build:
extends: extends:
- .android-variables
- .set-image-base-tag - .set-image-base-tag
variables: variables:
MESA_BASE_TAG: *debian-x86_64_build-base MESA_BASE_TAG: *debian-x86_64_build-base
@ -248,10 +253,11 @@ debian/x86_64_test-vk:
# Debian based x86_64 test image for Android # Debian based x86_64 test image for Android
.debian/x86_64_test-android: .debian/x86_64_test-android:
extends: .use-debian/x86_64_test-base extends:
- .android-variables
- .use-debian/x86_64_test-base
variables: variables:
MESA_IMAGE_TAG: &debian-x86_64_test-android ${DEBIAN_TEST_ANDROID_TAG} MESA_IMAGE_TAG: &debian-x86_64_test-android ${DEBIAN_TEST_ANDROID_TAG}
ANDROID_NDK: android-ndk-r25b
.use-debian/x86_64_test-android: .use-debian/x86_64_test-android:
extends: extends:

View file

@ -0,0 +1,42 @@
#!/usr/bin/env bash
set -exu
# Early check for required env variables, relies on `set -u`
: "$ANDROID_LLVM_ARTIFACT_NAME"
# if DEST_DIR is not set, assing an empty value, this prevents -u to fail
: "${DEST_DIR:=}"
# TODO, check if meson can do the download and wrap file generation for us.
LLVM_INSTALL_PREFIX="${DEST_DIR}/${ANDROID_LLVM_ARTIFACT_NAME}"
if [ ! -d "$LLVM_INSTALL_PREFIX" ]; then
echo "Cannot find an LLVM build in $LLVM_INSTALL_PREFIX" 1>&2
exit 1
fi
mkdir -p subprojects/llvm
cat << EOF > subprojects/llvm/meson.build
project('llvm', ['cpp'])
cpp = meson.get_compiler('cpp')
_deps = []
_search = join_paths('$LLVM_INSTALL_PREFIX', 'lib')
foreach d: ['libLLVMAggressiveInstCombine', 'libLLVMAnalysis', 'libLLVMAsmParser', 'libLLVMAsmPrinter', 'libLLVMBinaryFormat', 'libLLVMBitReader', 'libLLVMBitstreamReader', 'libLLVMBitWriter', 'libLLVMCFGuard', 'libLLVMCFIVerify', 'libLLVMCodeGen', 'libLLVMCodeGenTypes', 'libLLVMCore', 'libLLVMCoroutines', 'libLLVMCoverage', 'libLLVMDebugInfoBTF', 'libLLVMDebugInfoCodeView', 'libLLVMDebuginfod', 'libLLVMDebugInfoDWARF', 'libLLVMDebugInfoGSYM', 'libLLVMDebugInfoLogicalView', 'libLLVMDebugInfoMSF', 'libLLVMDebugInfoPDB', 'libLLVMDemangle', 'libLLVMDiff', 'libLLVMDlltoolDriver', 'libLLVMDWARFLinker', 'libLLVMDWARFLinkerClassic', 'libLLVMDWARFLinkerParallel', 'libLLVMDWP', 'libLLVMExecutionEngine', 'libLLVMExegesis', 'libLLVMExegesisX86', 'libLLVMExtensions', 'libLLVMFileCheck', 'libLLVMFrontendDriver', 'libLLVMFrontendHLSL', 'libLLVMFrontendOffloading', 'libLLVMFrontendOpenACC', 'libLLVMFrontendOpenMP', 'libLLVMFuzzerCLI', 'libLLVMFuzzMutate', 'libLLVMGlobalISel', 'libLLVMHipStdPar', 'libLLVMInstCombine', 'libLLVMInstrumentation', 'libLLVMInterfaceStub', 'libLLVMInterpreter', 'libLLVMipo', 'libLLVMIRPrinter', 'libLLVMIRReader', 'libLLVMJITLink', 'libLLVMLibDriver', 'libLLVMLineEditor', 'libLLVMLinker', 'libLLVMLTO', 'libLLVMMC', 'libLLVMMCA', 'libLLVMMCDisassembler', 'libLLVMMCJIT', 'libLLVMMCParser', 'libLLVMMIRParser', 'libLLVMObjCARCOpts', 'libLLVMObjCopy', 'libLLVMObject', 'libLLVMObjectYAML', 'libLLVMOption', 'libLLVMOrcDebugging', 'libLLVMOrcJIT', 'libLLVMOrcShared', 'libLLVMOrcTargetProcess', 'libLLVMPasses', 'libLLVMProfileData', 'libLLVMRemarks', 'libLLVMRuntimeDyld', 'libLLVMScalarOpts', 'libLLVMSelectionDAG', 'libLLVMSupport', 'libLLVMSymbolize', 'libLLVMTableGen', 'libLLVMTableGenCommon', 'libLLVMTarget', 'libLLVMTargetParser', 'libLLVMTextAPI', 'libLLVMTextAPIBinaryReader', 'libLLVMTransformUtils', 'libLLVMVectorize', 'libLLVMWindowsDriver', 'libLLVMWindowsManifest', 'libLLVMX86AsmParser', 'libLLVMX86CodeGen', 'libLLVMX86Desc', 'libLLVMX86Disassembler', 'libLLVMX86Info', 'libLLVMX86TargetMCA', 'libLLVMXRay']
_deps += cpp.find_library(d, dirs : _search)
endforeach
dep_llvm = declare_dependency(
include_directories : include_directories('$LLVM_INSTALL_PREFIX/include'),
dependencies : _deps,
version : '$(sed -n -e 's/^#define LLVM_VERSION_STRING "\([^"]*\)".*/\1/p' "${LLVM_INSTALL_PREFIX}/include/llvm/Config/llvm-config.h" )',
)
has_rtti = false
irbuilder_h = files('$LLVM_INSTALL_PREFIX/include/llvm/IR/IRBuilder.h')
EOF

View file

@ -16,7 +16,7 @@ variables:
DEBIAN_BASE_TAG: "20241125-crosvm" DEBIAN_BASE_TAG: "20241125-crosvm"
DEBIAN_X86_64_BUILD_IMAGE_PATH: "debian/x86_64_build" DEBIAN_X86_64_BUILD_IMAGE_PATH: "debian/x86_64_build"
DEBIAN_BUILD_TAG: "20241219-rm-jwt_file" DEBIAN_BUILD_TAG: "20241220-android"
DEBIAN_X86_64_TEST_BASE_IMAGE: "debian/x86_64_test-base" DEBIAN_X86_64_TEST_BASE_IMAGE: "debian/x86_64_test-base"
DEBIAN_ARM64_TEST_BASE_IMAGE: "debian/arm64_test-base" DEBIAN_ARM64_TEST_BASE_IMAGE: "debian/arm64_test-base"