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"