mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-20 00:50:10 +01:00
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:
parent
a90d771724
commit
17eabaf55c
5 changed files with 79 additions and 21 deletions
|
|
@ -414,10 +414,11 @@ debian-android:
|
|||
-D egl=enabled
|
||||
-D glvnd=disabled
|
||||
-D platforms=android
|
||||
FORCE_FALLBACK_FOR: llvm
|
||||
EXTRA_OPTION: >
|
||||
-D android-stub=true
|
||||
-D llvm=disabled
|
||||
-D platform-sdk-version=33
|
||||
-D cpp_rtti=false
|
||||
-D valgrind=disabled
|
||||
-D android-libbacktrace=disabled
|
||||
-D intel-clc=system
|
||||
|
|
@ -453,8 +454,9 @@ debian-android:
|
|||
# drivers because they requires LLVM, which we don't have an Android build
|
||||
# of.
|
||||
- export CROSS=x86_64-linux-android
|
||||
- export GALLIUM_DRIVERS=iris,virgl
|
||||
- export VULKAN_DRIVERS=amd,intel
|
||||
- export GALLIUM_DRIVERS=iris,virgl,zink,softpipe,llvmpipe,swrast
|
||||
- export VULKAN_DRIVERS=virtio,swrast
|
||||
- .gitlab-ci/create-llvm-meson-wrap-file.sh
|
||||
- *meson-build
|
||||
- .gitlab-ci/prepare-artifacts.sh
|
||||
|
||||
|
|
|
|||
|
|
@ -9,20 +9,28 @@ set -exu
|
|||
# Early check for required env variables, relies on `set -u`
|
||||
: "$ANDROID_SDK_VERSION"
|
||||
: "$ANDROID_NDK"
|
||||
: "$LLVM_VERSION"
|
||||
: "$LLVM_ARTIFACT_NAME"
|
||||
: "$ANDROID_LLVM_VERSION"
|
||||
: "$ANDROID_LLVM_ARTIFACT_NAME"
|
||||
: "$S3_JWT_FILE"
|
||||
: "$S3_HOST"
|
||||
: "$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
|
||||
echo "Error: ${S3_JWT_FILE} is empty." 1>&2
|
||||
exit 1
|
||||
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
|
||||
echo "Artifact ${LLVM_ARTIFACT_NAME}.tar.zst already exists, skip re-building."
|
||||
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 ${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
|
||||
fi
|
||||
|
||||
|
|
@ -51,7 +59,7 @@ then
|
|||
pushd "/llvm-project"
|
||||
git init
|
||||
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
|
||||
popd
|
||||
fi
|
||||
|
|
@ -59,9 +67,9 @@ fi
|
|||
pushd "/llvm-project"
|
||||
|
||||
# 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/
|
||||
cmake -GNinja -S llvm -B build/ \
|
||||
|
|
@ -95,14 +103,14 @@ popd
|
|||
|
||||
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
|
||||
# version does not change, and delete it.
|
||||
# The file is not deleted for non-CI because it can be useful in local runs.
|
||||
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"
|
||||
rm "${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 "${ANDROID_LLVM_ARTIFACT_NAME}.tar.zst"
|
||||
fi
|
||||
|
||||
rm -rf "$LLVM_INSTALL_PREFIX"
|
||||
|
|
|
|||
|
|
@ -154,18 +154,23 @@ debian/s390x_build:
|
|||
- debian/s390x_build
|
||||
|
||||
# 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:
|
||||
extends:
|
||||
- .android-variables
|
||||
- .use-debian/x86_64_build-base
|
||||
variables:
|
||||
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:
|
||||
extends:
|
||||
- .android-variables
|
||||
- .set-image-base-tag
|
||||
variables:
|
||||
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/x86_64_test-android:
|
||||
extends: .use-debian/x86_64_test-base
|
||||
extends:
|
||||
- .android-variables
|
||||
- .use-debian/x86_64_test-base
|
||||
variables:
|
||||
MESA_IMAGE_TAG: &debian-x86_64_test-android ${DEBIAN_TEST_ANDROID_TAG}
|
||||
ANDROID_NDK: android-ndk-r25b
|
||||
|
||||
.use-debian/x86_64_test-android:
|
||||
extends:
|
||||
|
|
|
|||
42
.gitlab-ci/create-llvm-meson-wrap-file.sh
Executable file
42
.gitlab-ci/create-llvm-meson-wrap-file.sh
Executable 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
|
||||
|
|
@ -16,7 +16,7 @@ variables:
|
|||
DEBIAN_BASE_TAG: "20241125-crosvm"
|
||||
|
||||
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_ARM64_TEST_BASE_IMAGE: "debian/arm64_test-base"
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue