1#!/usr/bin/env bash 2# shellcheck disable=SC1091 # The relative paths in this file only become valid at runtime. 3# shellcheck disable=SC2034 # Variables are used in scripts called from here 4# shellcheck disable=SC2086 # we want word splitting 5# shellcheck disable=SC2016 # non-expanded variables are intentional 6# When changing this file, you need to bump the following 7# .gitlab-ci/image-tags.yml tags: 8# KERNEL_ROOTFS_TAG 9 10set -e 11 12. .gitlab-ci/setup-test-env.sh 13 14set -o xtrace 15 16export DEBIAN_FRONTEND=noninteractive 17export LLVM_VERSION="${LLVM_VERSION:=15}" 18export FIRMWARE_FILES="${FIRMWARE_FILES}" 19 20check_minio() 21{ 22 S3_PATH="${S3_HOST}/${S3_KERNEL_BUCKET}/$1/${DISTRIBUTION_TAG}/${DEBIAN_ARCH}" 23 if curl -L --retry 4 -f --retry-delay 60 -s -X HEAD \ 24 "https://${S3_PATH}/done"; then 25 echo "Remote files are up-to-date, skip rebuilding them." 26 exit 27 fi 28} 29 30check_minio "${FDO_UPSTREAM_REPO}" 31check_minio "${CI_PROJECT_PATH}" 32 33. .gitlab-ci/container/container_pre_build.sh 34 35# Install rust, which we'll be using for deqp-runner. It will be cleaned up at the end. 36. .gitlab-ci/container/build-rust.sh 37 38if [[ "$DEBIAN_ARCH" = "arm64" ]]; then 39 BUILD_CL="ON" 40 BUILD_VK="ON" 41 GCC_ARCH="aarch64-linux-gnu" 42 KERNEL_ARCH="arm64" 43 DEFCONFIG="arch/arm64/configs/defconfig" 44 DEVICE_TREES="rk3399-gru-kevin.dtb" 45 DEVICE_TREES+=" meson-g12b-a311d-khadas-vim3.dtb" 46 DEVICE_TREES+=" meson-gxl-s805x-libretech-ac.dtb" 47 DEVICE_TREES+=" meson-gxm-khadas-vim2.dtb" 48 DEVICE_TREES+=" sun50i-h6-pine-h64.dtb" 49 DEVICE_TREES+=" imx8mq-nitrogen.dtb" 50 DEVICE_TREES+=" mt8192-asurada-spherion-r0.dtb" 51 DEVICE_TREES+=" mt8183-kukui-jacuzzi-juniper-sku16.dtb" 52 DEVICE_TREES+=" tegra210-p3450-0000.dtb" 53 DEVICE_TREES+=" apq8016-sbc-usb-host.dtb" 54 DEVICE_TREES+=" apq8096-db820c.dtb" 55 DEVICE_TREES+=" sc7180-trogdor-lazor-limozeen-nots-r5.dtb" 56 DEVICE_TREES+=" sc7180-trogdor-kingoftown.dtb" 57 DEVICE_TREES+=" sm8350-hdk.dtb" 58 KERNEL_IMAGE_NAME="Image" 59 60elif [[ "$DEBIAN_ARCH" = "armhf" ]]; then 61 BUILD_CL="OFF" 62 BUILD_VK="OFF" 63 GCC_ARCH="arm-linux-gnueabihf" 64 KERNEL_ARCH="arm" 65 DEFCONFIG="arch/arm/configs/multi_v7_defconfig" 66 DEVICE_TREES="rk3288-veyron-jaq.dtb" 67 DEVICE_TREES+=" sun8i-h3-libretech-all-h3-cc.dtb" 68 DEVICE_TREES+=" imx6q-cubox-i.dtb" 69 DEVICE_TREES+=" tegra124-jetson-tk1.dtb" 70 KERNEL_IMAGE_NAME="zImage" 71 . .gitlab-ci/container/create-cross-file.sh armhf 72 CONTAINER_ARCH_PACKAGES=( 73 libegl1-mesa-dev:armhf 74 libelf-dev:armhf 75 libgbm-dev:armhf 76 libgles2-mesa-dev:armhf 77 libpng-dev:armhf 78 libudev-dev:armhf 79 libvulkan-dev:armhf 80 libwaffle-dev:armhf 81 libwayland-dev:armhf 82 libx11-xcb-dev:armhf 83 libxkbcommon-dev:armhf 84 ) 85else 86 BUILD_CL="ON" 87 BUILD_VK="ON" 88 GCC_ARCH="x86_64-linux-gnu" 89 KERNEL_ARCH="x86_64" 90 DEFCONFIG="arch/x86/configs/x86_64_defconfig" 91 DEVICE_TREES="" 92 KERNEL_IMAGE_NAME="bzImage" 93 CONTAINER_ARCH_PACKAGES=( 94 libasound2-dev libcap-dev libfdt-dev libva-dev p7zip wine 95 ) 96fi 97 98# Determine if we're in a cross build. 99if [[ -e /cross_file-$DEBIAN_ARCH.txt ]]; then 100 EXTRA_MESON_ARGS="--cross-file /cross_file-$DEBIAN_ARCH.txt" 101 EXTRA_CMAKE_ARGS="-DCMAKE_TOOLCHAIN_FILE=/toolchain-$DEBIAN_ARCH.cmake" 102 103 if [ $DEBIAN_ARCH = arm64 ]; then 104 RUST_TARGET="aarch64-unknown-linux-gnu" 105 elif [ $DEBIAN_ARCH = armhf ]; then 106 RUST_TARGET="armv7-unknown-linux-gnueabihf" 107 fi 108 rustup target add $RUST_TARGET 109 export EXTRA_CARGO_ARGS="--target $RUST_TARGET" 110 111 export ARCH=${KERNEL_ARCH} 112 export CROSS_COMPILE="${GCC_ARCH}-" 113fi 114 115# no need to remove these at end, image isn't saved at the end 116CONTAINER_EPHEMERAL=( 117 arch-test 118 automake 119 bc 120 "clang-${LLVM_VERSION}" 121 cmake 122 curl 123 mmdebstrap 124 git 125 glslang-tools 126 jq 127 libdrm-dev 128 libegl1-mesa-dev 129 libxext-dev 130 libfontconfig-dev 131 libgbm-dev 132 libgl-dev 133 libgles2-mesa-dev 134 libglu1-mesa-dev 135 libglx-dev 136 libpng-dev 137 libssl-dev 138 libudev-dev 139 libvulkan-dev 140 libwaffle-dev 141 libwayland-dev 142 libx11-xcb-dev 143 libxcb-dri2-0-dev 144 libxkbcommon-dev 145 libwayland-dev 146 ninja-build 147 openssh-server 148 patch 149 protobuf-compiler 150 python-is-python3 151 python3-distutils 152 python3-mako 153 python3-numpy 154 python3-serial 155 python3-venv 156 unzip 157 wayland-protocols 158 zstd 159) 160 161[ "$BUILD_CL" == "ON" ] && CONTAINER_EPHEMERAL+=( 162 ocl-icd-opencl-dev 163) 164 165 166echo "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 167 168apt-get update 169apt-get install -y --no-remove \ 170 -o Dpkg::Options::='--force-confdef' -o Dpkg::Options::='--force-confold' \ 171 "${CONTAINER_EPHEMERAL[@]}" \ 172 "${CONTAINER_ARCH_PACKAGES[@]}" \ 173 ${EXTRA_LOCAL_PACKAGES} 174 175export ROOTFS=/lava-files/rootfs-${DEBIAN_ARCH} 176mkdir -p "$ROOTFS" 177 178# rootfs packages 179PKG_BASE=( 180 tzdata mount 181) 182PKG_CI=( 183 firmware-realtek 184 bash ca-certificates curl 185 initramfs-tools jq netcat-openbsd dropbear openssh-server 186 libasan8 187 libubsan1 188 git 189 python3-dev python3-pip python3-setuptools python3-wheel 190 weston # Wayland 191 xinit xserver-xorg-core xwayland # X11 192) 193PKG_MESA_DEP=( 194 libdrm2 libsensors5 libexpat1 # common 195 libvulkan1 # vulkan 196 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 197) 198PKG_DEP=( 199 libpng16-16 200 libwaffle-1-0 201 libpython3.11 python3 python3-lxml python3-mako python3-numpy python3-packaging python3-pil python3-renderdoc python3-requests python3-simplejson python3-yaml # Python 202 sntp 203 strace 204 waffle-utils 205 zstd 206) 207# arch dependent rootfs packages 208[ "$DEBIAN_ARCH" = "arm64" ] && PKG_ARCH=( 209 libgl1 libglu1-mesa 210 firmware-linux-nonfree firmware-qcom-media 211 libfontconfig1 212) 213[ "$DEBIAN_ARCH" = "amd64" ] && PKG_ARCH=( 214 firmware-amd-graphics 215 firmware-misc-nonfree 216 libgl1 libglu1-mesa 217 inetutils-syslogd iptables libcap2 218 libfontconfig1 219 spirv-tools 220 libelf1 libfdt1 "libllvm${LLVM_VERSION}" 221 libva2 libva-drm2 222 socat 223 sysvinit-core 224 wine 225) 226[ "$DEBIAN_ARCH" = "armhf" ] && PKG_ARCH=( 227 firmware-misc-nonfree 228) 229 230[ "$BUILD_CL" == "ON" ] && PKG_ARCH+=( 231 clinfo 232 "libclang-cpp${LLVM_VERSION}" 233 "libclang-common-${LLVM_VERSION}-dev" 234 ocl-icd-libopencl1 235) 236[ "$BUILD_VK" == "ON" ] && PKG_ARCH+=( 237 libvulkan-dev 238) 239 240mmdebstrap \ 241 --variant=apt \ 242 --arch="${DEBIAN_ARCH}" \ 243 --components main,contrib,non-free-firmware \ 244 --customize-hook='.gitlab-ci/container/get-firmware-from-source.sh "$ROOTFS" "$FIRMWARE_FILES"' \ 245 --include "${PKG_BASE[*]} ${PKG_CI[*]} ${PKG_DEP[*]} ${PKG_MESA_DEP[*]} ${PKG_ARCH[*]}" \ 246 bookworm \ 247 "$ROOTFS/" \ 248 "http://deb.debian.org/debian" \ 249 "deb [trusted=yes] https://gitlab.freedesktop.org/gfx-ci/ci-deb-repo/-/raw/${PKG_REPO_REV}/ ${FDO_DISTRIBUTION_VERSION%-*} main" 250 251############### Install mold 252. .gitlab-ci/container/build-mold.sh 253 254############### Building 255STRIP_CMD="${GCC_ARCH}-strip" 256mkdir -p $ROOTFS/usr/lib/$GCC_ARCH 257 258############### Build libclc 259 260if [ "$BUILD_CL" = "ON" ]; then 261 rm -rf /usr/lib/clc/* 262 . .gitlab-ci/container/build-libclc.sh 263 mkdir -p $ROOTFS/usr/{share,lib}/clc 264 mv /usr/share/clc/spirv*-mesa3d-.spv $ROOTFS/usr/share/clc/ 265 ln -s /usr/share/clc/spirv64-mesa3d-.spv $ROOTFS/usr/lib/clc/ 266 ln -s /usr/share/clc/spirv-mesa3d-.spv $ROOTFS/usr/lib/clc/ 267fi 268 269############### Build Vulkan validation layer (for zink) 270if [ "$DEBIAN_ARCH" = "amd64" ]; then 271 . .gitlab-ci/container/build-vulkan-validation.sh 272 mv /usr/lib/x86_64-linux-gnu/libVkLayer_khronos_validation.so $ROOTFS/usr/lib/x86_64-linux-gnu/ 273 mkdir -p $ROOTFS/usr/share/vulkan/explicit_layer.d 274 mv /usr/share/vulkan/explicit_layer.d/* $ROOTFS/usr/share/vulkan/explicit_layer.d/ 275fi 276 277############### Build apitrace 278. .gitlab-ci/container/build-apitrace.sh 279mkdir -p $ROOTFS/apitrace 280mv /apitrace/build $ROOTFS/apitrace 281rm -rf /apitrace 282 283############### Build ANGLE 284if [[ "$DEBIAN_ARCH" = "amd64" ]]; then 285 . .gitlab-ci/container/build-angle.sh 286 mv /angle $ROOTFS/. 287 rm -rf /angle 288fi 289 290############### Build dEQP runner 291. .gitlab-ci/container/build-deqp-runner.sh 292mkdir -p $ROOTFS/usr/bin 293mv /usr/local/bin/*-runner $ROOTFS/usr/bin/. 294 295 296############### Build dEQP 297 298DEQP_API=tools \ 299DEQP_TARGET=default \ 300. .gitlab-ci/container/build-deqp.sh 301 302DEQP_API=GL \ 303DEQP_TARGET=surfaceless \ 304. .gitlab-ci/container/build-deqp.sh 305 306DEQP_API=GLES \ 307DEQP_TARGET=surfaceless \ 308. .gitlab-ci/container/build-deqp.sh 309 310if [ "$BUILD_VK" == "ON" ]; then 311 DEQP_API=VK \ 312 DEQP_TARGET=default \ 313 . .gitlab-ci/container/build-deqp.sh 314 315 DEQP_API=VK-main \ 316 DEQP_TARGET=default \ 317 . .gitlab-ci/container/build-deqp.sh 318fi 319 320rm -rf /VK-GL-CTS 321 322mv /deqp-* $ROOTFS/. 323 324 325############### Build SKQP 326if [[ "$DEBIAN_ARCH" = "arm64" ]] \ 327 || [[ "$DEBIAN_ARCH" = "amd64" ]]; then 328 . .gitlab-ci/container/build-skqp.sh 329 mv /skqp $ROOTFS/. 330fi 331 332############### Build piglit 333PIGLIT_OPTS="-DPIGLIT_USE_WAFFLE=ON 334 -DPIGLIT_USE_GBM=ON 335 -DPIGLIT_USE_WAYLAND=ON 336 -DPIGLIT_USE_X11=ON 337 -DPIGLIT_BUILD_GLX_TESTS=ON 338 -DPIGLIT_BUILD_EGL_TESTS=ON 339 -DPIGLIT_BUILD_WGL_TESTS=OFF 340 -DPIGLIT_BUILD_GL_TESTS=ON 341 -DPIGLIT_BUILD_GLES1_TESTS=ON 342 -DPIGLIT_BUILD_GLES2_TESTS=ON 343 -DPIGLIT_BUILD_GLES3_TESTS=ON 344 -DPIGLIT_BUILD_CL_TESTS=$BUILD_CL 345 -DPIGLIT_BUILD_VK_TESTS=$BUILD_VK 346 -DPIGLIT_BUILD_DMA_BUF_TESTS=ON" \ 347 . .gitlab-ci/container/build-piglit.sh 348mv /piglit $ROOTFS/. 349 350############### Build libva tests 351if [[ "$DEBIAN_ARCH" = "amd64" ]]; then 352 . .gitlab-ci/container/build-va-tools.sh 353 mv /va/bin/* $ROOTFS/usr/bin/ 354fi 355 356############### Build Crosvm 357if [[ ${DEBIAN_ARCH} = "amd64" ]]; then 358 . .gitlab-ci/container/build-crosvm.sh 359 mv /usr/local/bin/crosvm $ROOTFS/usr/bin/ 360 mv /usr/local/lib/libvirglrenderer.* $ROOTFS/usr/lib/$GCC_ARCH/ 361 mkdir -p $ROOTFS/usr/local/libexec/ 362 mv /usr/local/libexec/virgl* $ROOTFS/usr/local/libexec/ 363fi 364 365############### Build ci-kdl 366. .gitlab-ci/container/build-kdl.sh 367mv /ci-kdl $ROOTFS/ 368 369############### Build local stuff for use by igt and kernel testing, which 370############### will reuse most of our container build process from a specific 371############### hash of the Mesa tree. 372if [[ -e ".gitlab-ci/local/build-rootfs.sh" ]]; then 373 . .gitlab-ci/local/build-rootfs.sh 374fi 375 376 377############### Download prebuilt kernel 378. .gitlab-ci/container/download-prebuilt-kernel.sh 379 380############### Delete rust, since the tests won't be compiling anything. 381rm -rf /root/.cargo 382rm -rf /root/.rustup 383 384############### Delete firmware files we don't need 385if [ "$DEBIAN_ARCH" = "amd64" ]; then 386 dpkg -L firmware-misc-nonfree | grep -v "i915" | xargs rm || true 387fi 388 389############### Fill rootfs 390cp .gitlab-ci/setup-test-env.sh $ROOTFS/. 391cp .gitlab-ci/container/setup-rootfs.sh $ROOTFS/. 392cp .gitlab-ci/container/strip-rootfs.sh $ROOTFS/. 393cp .gitlab-ci/container/debian/llvm-snapshot.gpg.key $ROOTFS/. 394cp .gitlab-ci/container/debian/winehq.gpg.key $ROOTFS/. 395chroot $ROOTFS bash /setup-rootfs.sh 396rm $ROOTFS/{llvm-snapshot,winehq}.gpg.key 397rm "$ROOTFS/setup-test-env.sh" 398rm "$ROOTFS/setup-rootfs.sh" 399rm "$ROOTFS/strip-rootfs.sh" 400cp /etc/wgetrc $ROOTFS/etc/. 401 402if [ "${DEBIAN_ARCH}" = "arm64" ]; then 403 mkdir -p /lava-files/rootfs-arm64/lib/firmware/qcom/sm8350/ # for firmware imported later 404 # Make a gzipped copy of the Image for db410c. 405 gzip -k /lava-files/Image 406 KERNEL_IMAGE_NAME+=" Image.gz" 407fi 408 409ROOTFSTAR="lava-rootfs.tar.zst" 410du -ah "$ROOTFS" | sort -h | tail -100 411pushd $ROOTFS 412 tar --zstd -cf /lava-files/${ROOTFSTAR} . 413popd 414 415. .gitlab-ci/container/container_post_build.sh 416 417ci-fairy s3cp --token-file "${S3_JWT_FILE}" /lava-files/"${ROOTFSTAR}" \ 418 https://${S3_PATH}/"${ROOTFSTAR}" 419 420touch /lava-files/done 421ci-fairy s3cp --token-file "${S3_JWT_FILE}" /lava-files/done https://${S3_PATH}/done 422