| #!/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 |
| # When changing this file, you need to bump the following |
| # .gitlab-ci/image-tags.yml tags: |
| # KERNEL_ROOTFS_TAG |
| |
| set -e |
| set -o xtrace |
| |
| export DEBIAN_FRONTEND=noninteractive |
| export LLVM_VERSION="${LLVM_VERSION:=15}" |
| |
| 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" |
| SKQP_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.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" |
| SKQP_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" |
| SKQP_ARCH="x64" |
| 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=( |
| automake |
| bc |
| "clang-${LLVM_VERSION}" |
| cmake |
| curl |
| mmdebstrap |
| git |
| glslang-tools |
| 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} |
| |
| 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 |
| 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 \ |
| --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 |
| |
| ############### Setuping |
| if [ "$DEBIAN_ARCH" = "amd64" ]; then |
| . .gitlab-ci/container/setup-wine.sh "/dxvk-wine64" |
| . .gitlab-ci/container/install-wine-dxvk.sh |
| mv /dxvk-wine64 $ROOTFS |
| fi |
| |
| ############### Installing |
| if [ "$DEBIAN_ARCH" = "amd64" ]; then |
| . .gitlab-ci/container/install-wine-apitrace.sh |
| mkdir -p "$ROOTFS/apitrace-msvc-win64" |
| mv /apitrace-msvc-win64/bin "$ROOTFS/apitrace-msvc-win64" |
| rm -rf /apitrace-msvc-win64 |
| fi |
| |
| ############### 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 /lava-files/rootfs-${DEBIAN_ARCH}/. |
| 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=GL \ |
| DEQP_TARGET=surfaceless \ |
| . .gitlab-ci/container/build-deqp.sh |
| |
| DEQP_API=GLES \ |
| DEQP_TARGET=surfaceless \ |
| . .gitlab-ci/container/build-deqp.sh |
| |
| [ "$BUILD_VK" == "ON" ] && DEQP_API=VK \ |
| DEQP_TARGET=default \ |
| . .gitlab-ci/container/build-deqp.sh |
| |
| 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 |
| section_start kdl "Prepare a venv for kdl" |
| . .gitlab-ci/container/build-kdl.sh |
| mv ci-kdl.venv $ROOTFS |
| section_end kdl |
| |
| ############### 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/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-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 |