From 17eabaf55c369715c371b2d2f2dfe2dfa6809bf0 Mon Sep 17 00:00:00 2001 From: Antonio Ospite Date: Mon, 26 Aug 2024 11:54:45 +0200 Subject: [PATCH] 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 Part-of: --- .gitlab-ci/build/gitlab-ci.yml | 8 ++-- .../container/build-android-x86_64-llvm.sh | 30 ++++++++----- .gitlab-ci/container/gitlab-ci.yml | 18 +++++--- .gitlab-ci/create-llvm-meson-wrap-file.sh | 42 +++++++++++++++++++ .gitlab-ci/image-tags.yml | 2 +- 5 files changed, 79 insertions(+), 21 deletions(-) create mode 100755 .gitlab-ci/create-llvm-meson-wrap-file.sh diff --git a/.gitlab-ci/build/gitlab-ci.yml b/.gitlab-ci/build/gitlab-ci.yml index c9579dfe628..801366ef839 100644 --- a/.gitlab-ci/build/gitlab-ci.yml +++ b/.gitlab-ci/build/gitlab-ci.yml @@ -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 diff --git a/.gitlab-ci/container/build-android-x86_64-llvm.sh b/.gitlab-ci/container/build-android-x86_64-llvm.sh index 4dc3b62e6a3..a7e015e3acc 100755 --- a/.gitlab-ci/container/build-android-x86_64-llvm.sh +++ b/.gitlab-ci/container/build-android-x86_64-llvm.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" diff --git a/.gitlab-ci/container/gitlab-ci.yml b/.gitlab-ci/container/gitlab-ci.yml index d6ef4a8ee0e..e85d75fd7a9 100644 --- a/.gitlab-ci/container/gitlab-ci.yml +++ b/.gitlab-ci/container/gitlab-ci.yml @@ -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: diff --git a/.gitlab-ci/create-llvm-meson-wrap-file.sh b/.gitlab-ci/create-llvm-meson-wrap-file.sh new file mode 100755 index 00000000000..f58687552cc --- /dev/null +++ b/.gitlab-ci/create-llvm-meson-wrap-file.sh @@ -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 diff --git a/.gitlab-ci/image-tags.yml b/.gitlab-ci/image-tags.yml index 6add10f5733..aaa53bc6d7a 100644 --- a/.gitlab-ci/image-tags.yml +++ b/.gitlab-ci/image-tags.yml @@ -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"