mirror of
https://source.denx.de/u-boot/u-boot.git
synced 2026-06-13 15:03:58 +03:00
Merge branch '2024-12-21-add-arm64-CI-host-support' into next
First, thanks to Simon Glass and also Linaro, we now have access to a few fast arm64 host machines in our Gitlab instance, to use as CI runners. This series finishes the work that I pushed earlier and Simon had started that enables arm64 hosts to be used for most things now. The first notable change, especially if you use this on your own Gitlab instance is that "DEFAULT_TAG" is now unused and we instead have: - DEFAULT_ALL_TAG: - DEFAULT_ARM64_TAG: - DEFAULT_AMD64_TAG: - DEFAULT_FAST_AMD64_TAG: This lets us say that some jobs can be run on all runners, because they are small enough that anything we'd connect to CI is fast enough and it also does not depend on the underlying host architecture. Next we have tags for any arm64 host, or any amd64 host. Finally, we have a tag for fast amd64 hosts. What these last three are for is that we have a few jobs that need to run on amd64 hosts and so we have to restrict them there, but we also have now reworked the world build jobs to build (almost) everything in a single job and on the fast amd64 machines this is still as quick as the old way was, in practice. To reach this point, we say that the Xtensa jobs can only run on amd64 hosts. Our targets only work with the binary-only toolchain and so this is a reasonable limit and we exclude them from the world build jobs. We also need to deal with ensuring the right toolchain is used regardless what the host architecture is and that we don't use the host toolchain by accident. Finally, because some of these changes needed to be worked out in the linter, fix some of the general warnings that notes as well.
This commit is contained in:
@@ -2,7 +2,7 @@ variables:
|
||||
windows_vm: windows-2022
|
||||
ubuntu_vm: ubuntu-24.04
|
||||
macos_vm: macOS-14
|
||||
ci_runner_image: trini/u-boot-gitlab-ci-runner:jammy-20240808-03Dec2024
|
||||
ci_runner_image: trini/u-boot-gitlab-ci-runner:jammy-20240911.1-08Dec2024
|
||||
# Add '-u 0' options for Azure pipelines, otherwise we get "permission
|
||||
# denied" error when it tries to "useradd -m -u 1001 vsts_azpcontainer",
|
||||
# since our $(ci_runner_image) user is not root.
|
||||
|
||||
@@ -1,18 +1,25 @@
|
||||
# SPDX-License-Identifier: GPL-2.0+
|
||||
|
||||
variables:
|
||||
DEFAULT_TAG: ""
|
||||
DEFAULT_ALL_TAG: "all"
|
||||
DEFAULT_ARM64_TAG: "arm64"
|
||||
DEFAULT_AMD64_TAG: "amd64"
|
||||
DEFAULT_FAST_AMD64_TAG: "fast amd64"
|
||||
MIRROR_DOCKER: docker.io
|
||||
SJG_LAB: ""
|
||||
PLATFORM: linux/amd64,linux/arm64
|
||||
|
||||
default:
|
||||
tags:
|
||||
- ${DEFAULT_TAG}
|
||||
- ${DEFAULT_ALL_TAG}
|
||||
|
||||
workflow:
|
||||
rules:
|
||||
- when: always
|
||||
|
||||
# Grab our configured image. The source for this is found
|
||||
# in the u-boot tree at tools/docker/Dockerfile
|
||||
image: ${MIRROR_DOCKER}/trini/u-boot-gitlab-ci-runner:jammy-20240808-03Dec2024
|
||||
image: ${MIRROR_DOCKER}/trini/u-boot-gitlab-ci-runner:jammy-20240911.1-08Dec2024
|
||||
|
||||
# We run some tests in different order, to catch some failures quicker.
|
||||
stages:
|
||||
@@ -102,54 +109,22 @@ stages:
|
||||
junit: results.xml
|
||||
expire_in: 1 week
|
||||
|
||||
.world_build:
|
||||
build all platforms in a single job:
|
||||
stage: world build
|
||||
dependencies: []
|
||||
rules:
|
||||
- when: always
|
||||
|
||||
build all 32bit ARM platforms:
|
||||
extends: .world_build
|
||||
parallel:
|
||||
matrix:
|
||||
- HOST: "arm64"
|
||||
- HOST: "fast amd64"
|
||||
tags:
|
||||
- ${HOST}
|
||||
script:
|
||||
- ret=0;
|
||||
git config --global --add safe.directory "${CI_PROJECT_DIR}";
|
||||
pip install -r tools/buildman/requirements.txt;
|
||||
./tools/buildman/buildman -o /tmp -PEWM arm -x aarch64 || ret=$?;
|
||||
if [[ $ret -ne 0 ]]; then
|
||||
./tools/buildman/buildman -o /tmp -seP;
|
||||
exit $ret;
|
||||
fi;
|
||||
|
||||
build all 64bit ARM platforms:
|
||||
extends: .world_build
|
||||
script:
|
||||
- virtualenv -p /usr/bin/python3 /tmp/venv
|
||||
- . /tmp/venv/bin/activate
|
||||
- ret=0;
|
||||
git config --global --add safe.directory "${CI_PROJECT_DIR}";
|
||||
pip install -r tools/buildman/requirements.txt;
|
||||
./tools/buildman/buildman -o /tmp -PEWM aarch64 || ret=$?;
|
||||
if [[ $ret -ne 0 ]]; then
|
||||
./tools/buildman/buildman -o /tmp -seP;
|
||||
exit $ret;
|
||||
fi;
|
||||
|
||||
build all PowerPC platforms:
|
||||
extends: .world_build
|
||||
script:
|
||||
- ret=0;
|
||||
git config --global --add safe.directory "${CI_PROJECT_DIR}";
|
||||
./tools/buildman/buildman -o /tmp -P -E -W powerpc || ret=$?;
|
||||
if [[ $ret -ne 0 ]]; then
|
||||
./tools/buildman/buildman -o /tmp -seP;
|
||||
exit $ret;
|
||||
fi;
|
||||
|
||||
build all other platforms:
|
||||
extends: .world_build
|
||||
script:
|
||||
- ret=0;
|
||||
git config --global --add safe.directory "${CI_PROJECT_DIR}";
|
||||
./tools/buildman/buildman -o /tmp -PEWM -x arm,powerpc || ret=$?;
|
||||
./tools/buildman/buildman -o /tmp -PEWM -x xtensa || ret=$?;
|
||||
if [[ $ret -ne 0 ]]; then
|
||||
./tools/buildman/buildman -o /tmp -seP;
|
||||
exit $ret;
|
||||
@@ -198,6 +173,8 @@ Build tools-only and envtools:
|
||||
|
||||
Run binman, buildman, dtoc, Kconfig and patman testsuites:
|
||||
extends: .testsuites
|
||||
tags:
|
||||
- ${DEFAULT_AMD64_TAG}
|
||||
script:
|
||||
- git config --global user.name "GitLab CI Runner";
|
||||
git config --global user.email trini@konsulko.com;
|
||||
@@ -257,22 +234,30 @@ Check packing of Python tools:
|
||||
|
||||
# Test sandbox with test.py
|
||||
sandbox test.py:
|
||||
tags:
|
||||
- ${DEFAULT_AMD64_TAG}
|
||||
variables:
|
||||
TEST_PY_BD: "sandbox"
|
||||
<<: *buildman_and_testpy_dfn
|
||||
|
||||
sandbox with clang test.py:
|
||||
tags:
|
||||
- ${DEFAULT_AMD64_TAG}
|
||||
variables:
|
||||
TEST_PY_BD: "sandbox"
|
||||
OVERRIDE: "-O clang-17"
|
||||
<<: *buildman_and_testpy_dfn
|
||||
|
||||
sandbox64 test.py:
|
||||
tags:
|
||||
- ${DEFAULT_AMD64_TAG}
|
||||
variables:
|
||||
TEST_PY_BD: "sandbox64"
|
||||
<<: *buildman_and_testpy_dfn
|
||||
|
||||
sandbox64 with clang test.py:
|
||||
tags:
|
||||
- ${DEFAULT_AMD64_TAG}
|
||||
variables:
|
||||
TEST_PY_BD: "sandbox64"
|
||||
OVERRIDE: "-O clang-17"
|
||||
@@ -327,6 +312,8 @@ evb-ast2600 test.py:
|
||||
<<: *buildman_and_testpy_dfn
|
||||
|
||||
sandbox_flattree test.py:
|
||||
tags:
|
||||
- ${DEFAULT_AMD64_TAG}
|
||||
variables:
|
||||
TEST_PY_BD: "sandbox_flattree"
|
||||
<<: *buildman_and_testpy_dfn
|
||||
@@ -451,6 +438,8 @@ qemu-xtensa-dc233c test.py:
|
||||
variables:
|
||||
TEST_PY_BD: "qemu-xtensa-dc233c"
|
||||
TEST_PY_TEST_SPEC: "not sleep and not efi"
|
||||
tags:
|
||||
- ${DEFAULT_AMD64_TAG}
|
||||
<<: *buildman_and_testpy_dfn
|
||||
|
||||
r2dplus_i82557c test.py:
|
||||
@@ -514,6 +503,8 @@ xtfpga test.py:
|
||||
TEST_PY_BD: "xtfpga"
|
||||
TEST_PY_TEST_SPEC: "not sleep"
|
||||
TEST_PY_ID: "--id qemu"
|
||||
tags:
|
||||
- ${DEFAULT_AMD64_TAG}
|
||||
<<: *buildman_and_testpy_dfn
|
||||
|
||||
coreboot test.py:
|
||||
@@ -531,6 +522,7 @@ coreboot test.py:
|
||||
- if: $SJG_LAB != "1"
|
||||
when: manual
|
||||
allow_failure: true
|
||||
dependencies: []
|
||||
tags: [ 'lab' ]
|
||||
script:
|
||||
- if [[ -z "${SJG_LAB}" ]]; then
|
||||
|
||||
20
doc/build/docker.rst
vendored
20
doc/build/docker.rst
vendored
@@ -4,21 +4,29 @@ GitLab CI / U-Boot runner container
|
||||
In order to have a reproducible and portable build environment for CI we use a container for building in. This means that developers can also reproduce the CI environment, to a large degree at least, locally. This file is located in the tools/docker directory.
|
||||
|
||||
The docker image supports both amd64 and arm64. Ensure that the
|
||||
'docker-buildx' Debian package is installed (or the equivalent on another
|
||||
distribution).
|
||||
`buildx` Docker CLI plugin is installed. This is often available in your
|
||||
distribution via the 'docker-buildx' or 'docker-buildx-plugin' package.
|
||||
|
||||
You will need a multi-platform container, otherwise this error is shown::
|
||||
|
||||
ERROR: Multi-platform build is not supported for the docker driver.
|
||||
Switch to a different driver, or turn on the containerd image store, and try again.
|
||||
|
||||
You can add one with::
|
||||
You can add a simple one with::
|
||||
|
||||
sudo docker buildx create --name multiarch --driver docker-container --use
|
||||
|
||||
Building is supported on both amd64 (i.e. 64-bit x86) and arm64 machines. While
|
||||
both amd64 and arm64 happen in parallel, the non-native part will take
|
||||
considerably longer as it must use QEMU to emulate the foreign code.
|
||||
This will result in a builder that will use QEMU for the non-native
|
||||
architectures request in a build. While both amd64 and arm64 happen in
|
||||
parallel, the non-native part will take considerably longer as it must use QEMU
|
||||
to emulate the foreign code. An alternative, if you have accesss to reasonably
|
||||
fast amd64 (i.e. 64-bit x86) and arm64 machines is::
|
||||
|
||||
sudo docker buildx create --name multiarch-multinode --node localNode --bootstrap --use
|
||||
sudo docker buildx create --name multiarch-multinode --append --node remoteNode --bootstrap ssh://user@host
|
||||
|
||||
And this will result in a builder named multiarch-multinode that will build
|
||||
each platform natively on each node.
|
||||
|
||||
To build the image yourself::
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
# This Dockerfile is used to build an image containing basic stuff to be used
|
||||
# to build U-Boot and run our test suites.
|
||||
|
||||
FROM ubuntu:jammy-20240808
|
||||
FROM ubuntu:jammy-20240911.1
|
||||
LABEL org.opencontainers.image.authors="Tom Rini <trini@konsulko.com>"
|
||||
LABEL org.opencontainers.image.description=" This image is for building U-Boot inside a container"
|
||||
|
||||
@@ -156,11 +156,11 @@ RUN git clone git://git.savannah.gnu.org/grub.git /tmp/grub && \
|
||||
mkdir -p /opt/grub && \
|
||||
./configure --target=aarch64 --with-platform=efi \
|
||||
CC=gcc \
|
||||
TARGET_CC=/opt/gcc-13.2.0-nolibc/aarch64-linux/bin/aarch64-linux-gcc \
|
||||
TARGET_OBJCOPY=/opt/gcc-13.2.0-nolibc/aarch64-linux/bin/aarch64-linux-objcopy \
|
||||
TARGET_STRIP=/opt/gcc-13.2.0-nolibc/aarch64-linux/bin/aarch64-linux-strip \
|
||||
TARGET_NM=/opt/gcc-13.2.0-nolibc/aarch64-linux/bin/aarch64-linux-nm \
|
||||
TARGET_RANLIB=/opt/gcc-13.2.0-nolibc/aarch64-linux/bin/aarch64-linux-ranlib && \
|
||||
TARGET_CC=/opt/gcc-${TCVER}-nolibc/aarch64-linux/bin/aarch64-linux-gcc \
|
||||
TARGET_OBJCOPY=/opt/gcc-${TCVER}-nolibc/aarch64-linux/bin/aarch64-linux-objcopy \
|
||||
TARGET_STRIP=/opt/gcc-${TCVER}-nolibc/aarch64-linux/bin/aarch64-linux-strip \
|
||||
TARGET_NM=/opt/gcc-${TCVER}-nolibc/aarch64-linux/bin/aarch64-linux-nm \
|
||||
TARGET_RANLIB=/opt/gcc-${TCVER}-nolibc/aarch64-linux/bin/aarch64-linux-ranlib && \
|
||||
make -j$(nproc) && \
|
||||
./grub-mkimage -O arm64-efi -o /opt/grub/grubaa64.efi --prefix= -d \
|
||||
grub-core cat chain configfile echo efinet ext2 fat halt help linux \
|
||||
@@ -170,11 +170,11 @@ RUN git clone git://git.savannah.gnu.org/grub.git /tmp/grub && \
|
||||
make clean && \
|
||||
./configure --target=arm --with-platform=efi \
|
||||
CC=gcc \
|
||||
TARGET_CC=/opt/gcc-13.2.0-nolibc/arm-linux-gnueabi/bin/arm-linux-gnueabi-gcc \
|
||||
TARGET_OBJCOPY=/opt/gcc-13.2.0-nolibc/arm-linux-gnueabi/bin/arm-linux-gnueabi-objcopy \
|
||||
TARGET_STRIP=/opt/gcc-13.2.0-nolibc/arm-linux-gnueabi/bin/arm-linux-gnueabi-strip \
|
||||
TARGET_NM=/opt/gcc-13.2.0-nolibc/arm-linux-gnueabi/bin/arm-linux-gnueabi-nm \
|
||||
TARGET_RANLIB=/opt/gcc-13.2.0-nolibc/arm-linux-gnueabi/bin/arm-linux-gnueabi-ranlib && \
|
||||
TARGET_CC=/opt/gcc-${TCVER}-nolibc/arm-linux-gnueabi/bin/arm-linux-gnueabi-gcc \
|
||||
TARGET_OBJCOPY=/opt/gcc-${TCVER}-nolibc/arm-linux-gnueabi/bin/arm-linux-gnueabi-objcopy \
|
||||
TARGET_STRIP=/opt/gcc-${TCVER}-nolibc/arm-linux-gnueabi/bin/arm-linux-gnueabi-strip \
|
||||
TARGET_NM=/opt/gcc-${TCVER}-nolibc/arm-linux-gnueabi/bin/arm-linux-gnueabi-nm \
|
||||
TARGET_RANLIB=/opt/gcc-${TCVER}-nolibc/arm-linux-gnueabi/bin/arm-linux-gnueabi-ranlib && \
|
||||
make -j$(nproc) && \
|
||||
./grub-mkimage -O arm-efi -o /opt/grub/grubarm.efi --prefix= -d \
|
||||
grub-core cat chain configfile echo efinet ext2 fat halt help linux \
|
||||
@@ -184,11 +184,11 @@ RUN git clone git://git.savannah.gnu.org/grub.git /tmp/grub && \
|
||||
make clean && \
|
||||
./configure --target=riscv64 --with-platform=efi \
|
||||
CC=gcc \
|
||||
TARGET_CC=/opt/gcc-13.2.0-nolibc/riscv64-linux/bin/riscv64-linux-gcc \
|
||||
TARGET_OBJCOPY=/opt/gcc-13.2.0-nolibc/riscv64-linux/bin/riscv64-linux-objcopy \
|
||||
TARGET_STRIP=/opt/gcc-13.2.0-nolibc/riscv64-linux/bin/riscv64-linux-strip \
|
||||
TARGET_NM=/opt/gcc-13.2.0-nolibc/riscv64-linux/bin/riscv64-linux-nm \
|
||||
TARGET_RANLIB=/opt/gcc-13.2.0-nolibc/riscv64-linux/bin/riscv64-linux-ranlib && \
|
||||
TARGET_CC=/opt/gcc-${TCVER}-nolibc/riscv64-linux/bin/riscv64-linux-gcc \
|
||||
TARGET_OBJCOPY=/opt/gcc-${TCVER}-nolibc/riscv64-linux/bin/riscv64-linux-objcopy \
|
||||
TARGET_STRIP=/opt/gcc-${TCVER}-nolibc/riscv64-linux/bin/riscv64-linux-strip \
|
||||
TARGET_NM=/opt/gcc-${TCVER}-nolibc/riscv64-linux/bin/riscv64-linux-nm \
|
||||
TARGET_RANLIB=/opt/gcc-${TCVER}-nolibc/riscv64-linux/bin/riscv64-linux-ranlib && \
|
||||
make -j$(nproc) && \
|
||||
./grub-mkimage -O riscv64-efi -o /opt/grub/grubriscv64.efi --prefix= -d \
|
||||
grub-core cat chain configfile echo efinet ext2 fat halt help linux \
|
||||
@@ -198,22 +198,22 @@ RUN git clone git://git.savannah.gnu.org/grub.git /tmp/grub && \
|
||||
make clean && \
|
||||
./configure --target=i386 --with-platform=efi \
|
||||
CC=gcc \
|
||||
TARGET_CC=/opt/gcc-13.2.0-nolibc/i386-linux/bin/i386-linux-gcc \
|
||||
TARGET_OBJCOPY=/opt/gcc-13.2.0-nolibc/i386-linux/bin/i386-linux-objcopy \
|
||||
TARGET_STRIP=/opt/gcc-13.2.0-nolibc/i386-linux/bin/i386-linux-strip \
|
||||
TARGET_NM=/opt/gcc-13.2.0-nolibc/i386-linux/bin/i386-linux-nm \
|
||||
TARGET_RANLIB=/opt/gcc-13.2.0-nolibc/i386-linux/bin/i386-linux-ranlib && \
|
||||
TARGET_CC=/opt/gcc-${TCVER}-nolibc/i386-linux/bin/i386-linux-gcc \
|
||||
TARGET_OBJCOPY=/opt/gcc-${TCVER}-nolibc/i386-linux/bin/i386-linux-objcopy \
|
||||
TARGET_STRIP=/opt/gcc-${TCVER}-nolibc/i386-linux/bin/i386-linux-strip \
|
||||
TARGET_NM=/opt/gcc-${TCVER}-nolibc/i386-linux/bin/i386-linux-nm \
|
||||
TARGET_RANLIB=/opt/gcc-${TCVER}-nolibc/i386-linux/bin/i386-linux-ranlib && \
|
||||
make -j$(nproc) && \
|
||||
./grub-mkimage -O i386-efi -o /opt/grub/grub_x86.efi --prefix= -d \
|
||||
grub-core normal echo lsefimmap lsefi lsefisystab efinet tftp minicmd && \
|
||||
make clean && \
|
||||
./configure --target=x86_64 --with-platform=efi \
|
||||
CC=gcc \
|
||||
TARGET_CC=/opt/gcc-13.2.0-nolibc/x86_64-linux/bin/x86_64-linux-gcc \
|
||||
TARGET_OBJCOPY=/opt/gcc-13.2.0-nolibc/x86_64-linux/bin/x86_64-linux-objcopy \
|
||||
TARGET_STRIP=/opt/gcc-13.2.0-nolibc/x86_64-linux/bin/x86_64-linux-strip \
|
||||
TARGET_NM=/opt/gcc-13.2.0-nolibc/x86_64-linux/bin/x86_64-linux-nm \
|
||||
TARGET_RANLIB=/opt/gcc-13.2.0-nolibc/x86_64-linux/bin/x86_64-linux-ranlib && \
|
||||
TARGET_CC=/opt/gcc-${TCVER}-nolibc/x86_64-linux/bin/x86_64-linux-gcc \
|
||||
TARGET_OBJCOPY=/opt/gcc-${TCVER}-nolibc/x86_64-linux/bin/x86_64-linux-objcopy \
|
||||
TARGET_STRIP=/opt/gcc-${TCVER}-nolibc/x86_64-linux/bin/x86_64-linux-strip \
|
||||
TARGET_NM=/opt/gcc-${TCVER}-nolibc/x86_64-linux/bin/x86_64-linux-nm \
|
||||
TARGET_RANLIB=/opt/gcc-${TCVER}-nolibc/x86_64-linux/bin/x86_64-linux-ranlib && \
|
||||
make -j$(nproc) && \
|
||||
./grub-mkimage -O x86_64-efi -o /opt/grub/grub_x64.efi --prefix= -d \
|
||||
grub-core normal echo lsefimmap lsefi lsefisystab efinet tftp minicmd && \
|
||||
@@ -318,9 +318,14 @@ RUN virtualenv -p /usr/bin/python3 /tmp/venv && \
|
||||
rm -rf /tmp/venv /tmp/*-requirements.txt
|
||||
|
||||
# Create the buildman config file
|
||||
RUN /bin/echo -e "[toolchain]\nroot = /usr" > ~/.buildman
|
||||
RUN /bin/echo -e "kernelorg = /opt/gcc-13.2.0-nolibc/*" >> ~/.buildman
|
||||
RUN /bin/echo -e "\n[toolchain-prefix]\nxtensa = /opt/2020.07/xtensa-dc233c-elf/bin/xtensa-dc233c-elf-" >> ~/.buildman;
|
||||
RUN /bin/echo -e "[toolchain]\nkernelorg = /opt/gcc-${TCVER}-nolibc/*" > ~/.buildman
|
||||
RUN /bin/echo -e "root = /usr" >> ~/.buildman
|
||||
RUN if [ "$TARGETPLATFORM" = "linux/amd64" ]; then \
|
||||
/bin/echo -e "\n[toolchain-prefix]\nxtensa = /opt/2020.07/xtensa-dc233c-elf/bin/xtensa-dc233c-elf-" >> ~/.buildman; \
|
||||
fi
|
||||
RUN if [ "$TARGETPLATFORM" = "linux/arm64" ]; then \
|
||||
/bin/echo -e "\n[toolchain-prefix]\naarch64 = /opt/gcc-${TCVER}-nolibc/aarch64-linux/bin/aarch64-linux-" >> ~/.buildman; \
|
||||
fi
|
||||
RUN /bin/echo -e "\n[toolchain-alias]\nsh = sh2" >> ~/.buildman
|
||||
RUN /bin/echo -e "\nx86 = i386" >> ~/.buildman;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user