• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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