#!/usr/bin/env bash # shellcheck disable=SC1091 # The relative paths in this file only become valid at runtime. # shellcheck disable=SC2034 # Variables are used in scripts called from here # shellcheck disable=SC2086 # we want word splitting # shellcheck disable=SC2016 # non-expanded variables are intentional # When changing this file, you need to bump the following # .gitlab-ci/image-tags.yml tags: # KERNEL_ROOTFS_TAG set -e . .gitlab-ci/setup-test-env.sh set -o xtrace export DEBIAN_FRONTEND=noninteractive export LLVM_VERSION="${LLVM_VERSION:=15}" export FIRMWARE_FILES="${FIRMWARE_FILES}" check_minio() { S3_PATH="${S3_HOST}/${S3_KERNEL_BUCKET}/$1/${DISTRIBUTION_TAG}/${DEBIAN_ARCH}" if curl -L --retry 4 -f --retry-delay 60 -s -X HEAD \ "https://${S3_PATH}/done"; then echo "Remote files are up-to-date, skip rebuilding them." exit fi } check_minio "${FDO_UPSTREAM_REPO}" check_minio "${CI_PROJECT_PATH}" . .gitlab-ci/container/container_pre_build.sh # Install rust, which we'll be using for deqp-runner. It will be cleaned up at the end. . .gitlab-ci/container/build-rust.sh if [[ "$DEBIAN_ARCH" = "arm64" ]]; then BUILD_CL="ON" BUILD_VK="ON" GCC_ARCH="aarch64-linux-gnu" KERNEL_ARCH="arm64" DEFCONFIG="arch/arm64/configs/defconfig" DEVICE_TREES="rk3399-gru-kevin.dtb" DEVICE_TREES+=" meson-g12b-a311d-khadas-vim3.dtb" DEVICE_TREES+=" meson-gxl-s805x-libretech-ac.dtb" DEVICE_TREES+=" meson-gxm-khadas-vim2.dtb" DEVICE_TREES+=" sun50i-h6-pine-h64.dtb" DEVICE_TREES+=" imx8mq-nitrogen.dtb" DEVICE_TREES+=" mt8192-asurada-spherion-r0.dtb" DEVICE_TREES+=" mt8183-kukui-jacuzzi-juniper-sku16.dtb" DEVICE_TREES+=" tegra210-p3450-0000.dtb" DEVICE_TREES+=" apq8016-sbc-usb-host.dtb" DEVICE_TREES+=" apq8096-db820c.dtb" DEVICE_TREES+=" sc7180-trogdor-lazor-limozeen-nots-r5.dtb" DEVICE_TREES+=" sc7180-trogdor-kingoftown.dtb" DEVICE_TREES+=" sm8350-hdk.dtb" KERNEL_IMAGE_NAME="Image" elif [[ "$DEBIAN_ARCH" = "armhf" ]]; then BUILD_CL="OFF" BUILD_VK="OFF" GCC_ARCH="arm-linux-gnueabihf" KERNEL_ARCH="arm" DEFCONFIG="arch/arm/configs/multi_v7_defconfig" DEVICE_TREES="rk3288-veyron-jaq.dtb" DEVICE_TREES+=" sun8i-h3-libretech-all-h3-cc.dtb" DEVICE_TREES+=" imx6q-cubox-i.dtb" DEVICE_TREES+=" tegra124-jetson-tk1.dtb" KERNEL_IMAGE_NAME="zImage" . .gitlab-ci/container/create-cross-file.sh armhf CONTAINER_ARCH_PACKAGES=( libegl1-mesa-dev:armhf libelf-dev:armhf libgbm-dev:armhf libgles2-mesa-dev:armhf libpng-dev:armhf libudev-dev:armhf libvulkan-dev:armhf libwaffle-dev:armhf libwayland-dev:armhf libx11-xcb-dev:armhf libxkbcommon-dev:armhf ) else BUILD_CL="ON" BUILD_VK="ON" GCC_ARCH="x86_64-linux-gnu" KERNEL_ARCH="x86_64" DEFCONFIG="arch/x86/configs/x86_64_defconfig" DEVICE_TREES="" KERNEL_IMAGE_NAME="bzImage" CONTAINER_ARCH_PACKAGES=( libasound2-dev libcap-dev libfdt-dev libva-dev p7zip wine ) fi # Determine if we're in a cross build. if [[ -e /cross_file-$DEBIAN_ARCH.txt ]]; then EXTRA_MESON_ARGS="--cross-file /cross_file-$DEBIAN_ARCH.txt" EXTRA_CMAKE_ARGS="-DCMAKE_TOOLCHAIN_FILE=/toolchain-$DEBIAN_ARCH.cmake" if [ $DEBIAN_ARCH = arm64 ]; then RUST_TARGET="aarch64-unknown-linux-gnu" elif [ $DEBIAN_ARCH = armhf ]; then RUST_TARGET="armv7-unknown-linux-gnueabihf" fi rustup target add $RUST_TARGET export EXTRA_CARGO_ARGS="--target $RUST_TARGET" export ARCH=${KERNEL_ARCH} export CROSS_COMPILE="${GCC_ARCH}-" fi # no need to remove these at end, image isn't saved at the end CONTAINER_EPHEMERAL=( arch-test automake bc "clang-${LLVM_VERSION}" cmake curl mmdebstrap git glslang-tools jq libdrm-dev libegl1-mesa-dev libxext-dev libfontconfig-dev libgbm-dev libgl-dev libgles2-mesa-dev libglu1-mesa-dev libglx-dev libpng-dev libssl-dev libudev-dev libvulkan-dev libwaffle-dev libwayland-dev libx11-xcb-dev libxcb-dri2-0-dev libxkbcommon-dev libwayland-dev ninja-build openssh-server patch protobuf-compiler python-is-python3 python3-distutils python3-mako python3-numpy python3-serial python3-venv unzip wayland-protocols zstd ) [ "$BUILD_CL" == "ON" ] && CONTAINER_EPHEMERAL+=( ocl-icd-opencl-dev ) echo "deb [trusted=yes] https://gitlab.freedesktop.org/gfx-ci/ci-deb-repo/-/raw/${PKG_REPO_REV}/ ${FDO_DISTRIBUTION_VERSION%-*} main" | tee /etc/apt/sources.list.d/gfx-ci_.list apt-get update apt-get install -y --no-remove \ -o Dpkg::Options::='--force-confdef' -o Dpkg::Options::='--force-confold' \ "${CONTAINER_EPHEMERAL[@]}" \ "${CONTAINER_ARCH_PACKAGES[@]}" \ ${EXTRA_LOCAL_PACKAGES} export ROOTFS=/lava-files/rootfs-${DEBIAN_ARCH} mkdir -p "$ROOTFS" # rootfs packages PKG_BASE=( tzdata mount ) PKG_CI=( firmware-realtek bash ca-certificates curl initramfs-tools jq netcat-openbsd dropbear openssh-server libasan8 libubsan1 git python3-dev python3-pip python3-setuptools python3-wheel weston # Wayland xinit xserver-xorg-core xwayland # X11 ) PKG_MESA_DEP=( libdrm2 libsensors5 libexpat1 # common libvulkan1 # vulkan libx11-6 libx11-xcb1 libxcb-dri2-0 libxcb-dri3-0 libxcb-glx0 libxcb-present0 libxcb-randr0 libxcb-shm0 libxcb-sync1 libxcb-xfixes0 libxdamage1 libxext6 libxfixes3 libxkbcommon0 libxrender1 libxshmfence1 libxxf86vm1 # X11 ) PKG_DEP=( libpng16-16 libwaffle-1-0 libpython3.11 python3 python3-lxml python3-mako python3-numpy python3-packaging python3-pil python3-renderdoc python3-requests python3-simplejson python3-yaml # Python sntp strace waffle-utils zstd ) # arch dependent rootfs packages [ "$DEBIAN_ARCH" = "arm64" ] && PKG_ARCH=( libgl1 libglu1-mesa firmware-linux-nonfree firmware-qcom-media libfontconfig1 ) [ "$DEBIAN_ARCH" = "amd64" ] && PKG_ARCH=( firmware-amd-graphics firmware-misc-nonfree libgl1 libglu1-mesa inetutils-syslogd iptables libcap2 libfontconfig1 spirv-tools libelf1 libfdt1 "libllvm${LLVM_VERSION}" libva2 libva-drm2 socat sysvinit-core wine ) [ "$DEBIAN_ARCH" = "armhf" ] && PKG_ARCH=( firmware-misc-nonfree ) [ "$BUILD_CL" == "ON" ] && PKG_ARCH+=( clinfo "libclang-cpp${LLVM_VERSION}" "libclang-common-${LLVM_VERSION}-dev" ocl-icd-libopencl1 ) [ "$BUILD_VK" == "ON" ] && PKG_ARCH+=( libvulkan-dev ) mmdebstrap \ --variant=apt \ --arch="${DEBIAN_ARCH}" \ --components main,contrib,non-free-firmware \ --customize-hook='.gitlab-ci/container/get-firmware-from-source.sh "$ROOTFS" "$FIRMWARE_FILES"' \ --include "${PKG_BASE[*]} ${PKG_CI[*]} ${PKG_DEP[*]} ${PKG_MESA_DEP[*]} ${PKG_ARCH[*]}" \ bookworm \ "$ROOTFS/" \ "http://deb.debian.org/debian" \ "deb [trusted=yes] https://gitlab.freedesktop.org/gfx-ci/ci-deb-repo/-/raw/${PKG_REPO_REV}/ ${FDO_DISTRIBUTION_VERSION%-*} main" ############### Install mold . .gitlab-ci/container/build-mold.sh ############### Building STRIP_CMD="${GCC_ARCH}-strip" mkdir -p $ROOTFS/usr/lib/$GCC_ARCH ############### Build libclc if [ "$BUILD_CL" = "ON" ]; then rm -rf /usr/lib/clc/* . .gitlab-ci/container/build-libclc.sh mkdir -p $ROOTFS/usr/{share,lib}/clc mv /usr/share/clc/spirv*-mesa3d-.spv $ROOTFS/usr/share/clc/ ln -s /usr/share/clc/spirv64-mesa3d-.spv $ROOTFS/usr/lib/clc/ ln -s /usr/share/clc/spirv-mesa3d-.spv $ROOTFS/usr/lib/clc/ fi ############### Build Vulkan validation layer (for zink) if [ "$DEBIAN_ARCH" = "amd64" ]; then . .gitlab-ci/container/build-vulkan-validation.sh mv /usr/lib/x86_64-linux-gnu/libVkLayer_khronos_validation.so $ROOTFS/usr/lib/x86_64-linux-gnu/ mkdir -p $ROOTFS/usr/share/vulkan/explicit_layer.d mv /usr/share/vulkan/explicit_layer.d/* $ROOTFS/usr/share/vulkan/explicit_layer.d/ fi ############### Build apitrace . .gitlab-ci/container/build-apitrace.sh mkdir -p $ROOTFS/apitrace mv /apitrace/build $ROOTFS/apitrace rm -rf /apitrace ############### Build ANGLE if [[ "$DEBIAN_ARCH" = "amd64" ]]; then . .gitlab-ci/container/build-angle.sh mv /angle $ROOTFS/. rm -rf /angle fi ############### Build dEQP runner . .gitlab-ci/container/build-deqp-runner.sh mkdir -p $ROOTFS/usr/bin mv /usr/local/bin/*-runner $ROOTFS/usr/bin/. ############### Build dEQP DEQP_API=tools \ DEQP_TARGET=default \ . .gitlab-ci/container/build-deqp.sh DEQP_API=GL \ DEQP_TARGET=surfaceless \ . .gitlab-ci/container/build-deqp.sh DEQP_API=GLES \ DEQP_TARGET=surfaceless \ . .gitlab-ci/container/build-deqp.sh if [ "$BUILD_VK" == "ON" ]; then DEQP_API=VK \ DEQP_TARGET=default \ . .gitlab-ci/container/build-deqp.sh DEQP_API=VK-main \ DEQP_TARGET=default \ . .gitlab-ci/container/build-deqp.sh fi rm -rf /VK-GL-CTS mv /deqp-* $ROOTFS/. ############### Build SKQP if [[ "$DEBIAN_ARCH" = "arm64" ]] \ || [[ "$DEBIAN_ARCH" = "amd64" ]]; then . .gitlab-ci/container/build-skqp.sh mv /skqp $ROOTFS/. fi ############### Build piglit PIGLIT_OPTS="-DPIGLIT_USE_WAFFLE=ON -DPIGLIT_USE_GBM=ON -DPIGLIT_USE_WAYLAND=ON -DPIGLIT_USE_X11=ON -DPIGLIT_BUILD_GLX_TESTS=ON -DPIGLIT_BUILD_EGL_TESTS=ON -DPIGLIT_BUILD_WGL_TESTS=OFF -DPIGLIT_BUILD_GL_TESTS=ON -DPIGLIT_BUILD_GLES1_TESTS=ON -DPIGLIT_BUILD_GLES2_TESTS=ON -DPIGLIT_BUILD_GLES3_TESTS=ON -DPIGLIT_BUILD_CL_TESTS=$BUILD_CL -DPIGLIT_BUILD_VK_TESTS=$BUILD_VK -DPIGLIT_BUILD_DMA_BUF_TESTS=ON" \ . .gitlab-ci/container/build-piglit.sh mv /piglit $ROOTFS/. ############### Build libva tests if [[ "$DEBIAN_ARCH" = "amd64" ]]; then . .gitlab-ci/container/build-va-tools.sh mv /va/bin/* $ROOTFS/usr/bin/ fi ############### Build Crosvm if [[ ${DEBIAN_ARCH} = "amd64" ]]; then . .gitlab-ci/container/build-crosvm.sh mv /usr/local/bin/crosvm $ROOTFS/usr/bin/ mv /usr/local/lib/libvirglrenderer.* $ROOTFS/usr/lib/$GCC_ARCH/ mkdir -p $ROOTFS/usr/local/libexec/ mv /usr/local/libexec/virgl* $ROOTFS/usr/local/libexec/ fi ############### Build ci-kdl . .gitlab-ci/container/build-kdl.sh mv /ci-kdl $ROOTFS/ ############### Build local stuff for use by igt and kernel testing, which ############### will reuse most of our container build process from a specific ############### hash of the Mesa tree. if [[ -e ".gitlab-ci/local/build-rootfs.sh" ]]; then . .gitlab-ci/local/build-rootfs.sh fi ############### Download prebuilt kernel . .gitlab-ci/container/download-prebuilt-kernel.sh ############### Delete rust, since the tests won't be compiling anything. rm -rf /root/.cargo rm -rf /root/.rustup ############### Delete firmware files we don't need if [ "$DEBIAN_ARCH" = "amd64" ]; then dpkg -L firmware-misc-nonfree | grep -v "i915" | xargs rm || true fi ############### Fill rootfs cp .gitlab-ci/setup-test-env.sh $ROOTFS/. cp .gitlab-ci/container/setup-rootfs.sh $ROOTFS/. cp .gitlab-ci/container/strip-rootfs.sh $ROOTFS/. cp .gitlab-ci/container/debian/llvm-snapshot.gpg.key $ROOTFS/. cp .gitlab-ci/container/debian/winehq.gpg.key $ROOTFS/. chroot $ROOTFS bash /setup-rootfs.sh rm $ROOTFS/{llvm-snapshot,winehq}.gpg.key rm "$ROOTFS/setup-test-env.sh" rm "$ROOTFS/setup-rootfs.sh" rm "$ROOTFS/strip-rootfs.sh" cp /etc/wgetrc $ROOTFS/etc/. if [ "${DEBIAN_ARCH}" = "arm64" ]; then mkdir -p /lava-files/rootfs-arm64/lib/firmware/qcom/sm8350/ # for firmware imported later # Make a gzipped copy of the Image for db410c. gzip -k /lava-files/Image KERNEL_IMAGE_NAME+=" Image.gz" fi ROOTFSTAR="lava-rootfs.tar.zst" du -ah "$ROOTFS" | sort -h | tail -100 pushd $ROOTFS tar --zstd -cf /lava-files/${ROOTFSTAR} . popd . .gitlab-ci/container/container_post_build.sh ci-fairy s3cp --token-file "${S3_JWT_FILE}" /lava-files/"${ROOTFSTAR}" \ https://${S3_PATH}/"${ROOTFSTAR}" touch /lava-files/done ci-fairy s3cp --token-file "${S3_JWT_FILE}" /lava-files/done https://${S3_PATH}/done