[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH v4 1/3] automation: Create Yocto docker images


  • To: Bertrand Marquis <Bertrand.Marquis@xxxxxxx>
  • From: Michal Orzel <michal.orzel@xxxxxxx>
  • Date: Fri, 18 Nov 2022 12:54:12 +0100
  • Arc-authentication-results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 165.204.84.17) smtp.rcpttodomain=arm.com smtp.mailfrom=amd.com; dmarc=pass (p=quarantine sp=quarantine pct=100) action=none header.from=amd.com; dkim=none (message not signed); arc=none
  • Arc-message-signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=MHeY02Uor8a+jFLjLXF4b+MgmGw/wpZxA3vetYBSEIk=; b=Wq8mWoMSgmthLp0MqRQnihkeutpgBl/HL1FKUMNhlnQ4oQRyuzaj7V2eTK0qVJcXys11AXuSvAMehfxq7w21GuymkauflPhlkpLXqs7sX217q9h0krZMU9bPw3DW1DYcKtTUavv87z3foss1nJllg9AHilZnqS6BndQqeOJIxfpBhGzetYsnnRa72/RNAUAWH1Vfx9qvyEjT4z0n7jIBd3cKYfl+YUERFV6BgzIiovfoXW1PTHhlNEtgE3gMY6EWhsqM2eCXEGW7+QaID+4DrKSmP5OpxCbI4COEDwadznjCa5s+pKZl8NBIRY5RuW1nI4BC85Yd0SF/hT9jKXcCoQ==
  • Arc-seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=kYh4sbx56I8ltotLkd4EjICHx9SK77RA4wsBGGe8Ig1ZzT0fzfU51mpO2qhqjswcs3GmXuyx7wj9DXryFtNFs+XXmLm5/YTfj2ox4lhNcfYjYpt7NXv5WPoBkheLvLO1/1vuRS5MMhCpiO+fQgm72HDxKL9M5M77ApDLfAHfRNf467tu4mThE7QKM9mxSO/alC+GQwlXLdJ9t2YW4LQbuyZHNFaEJjoM5oJJb5YJPnsD4YnLpbfTPRvP5b4I5Q6fPEqNzquu4XAcVTaZ33t42IODBW4nyRJwUGNHmxGe8umndXrEfvaMaULJYU/paGS5qWvfPXkMR9HJTx558b3TUw==
  • Cc: "xen-devel@xxxxxxxxxxxxxxxxxxxx" <xen-devel@xxxxxxxxxxxxxxxxxxxx>, "Doug Goldstein" <cardoe@xxxxxxxxxx>, Stefano Stabellini <sstabellini@xxxxxxxxxx>
  • Delivery-date: Fri, 18 Nov 2022 11:54:42 +0000
  • List-id: Xen developer discussion <xen-devel.lists.xenproject.org>

Hi Bertrand,

On 18/11/2022 12:44, Bertrand Marquis wrote:
> 
> 
> Hi Michal,
> 
>> On 18 Nov 2022, at 08:53, Michal Orzel <michal.orzel@xxxxxxx> wrote:
>>
>> Hi Bertrand,
>>
>> Just, some minor comments.
>>
>> On 17/11/2022 10:39, Bertrand Marquis wrote:
>>>
>>>
>>> Add containers suitable to run yocto kirkstone build based on ubuntu
>>> 22.04. It contains all packages required by Yocto and a checkout of the
>>> layers required to build Xen with Yocto.
>>>
>>> Add a generic docker image template to be used to automatically generate
>>> docker files for different configurations:
>>> - specific yocto version
>>> - different targets (qemu arm, arm64 and x86)
>>> - different host platforms (x86 or arm64)
>>>
>>> During a call to 'make all', only the images for the current host
>>> platform will be generated.
>> This looks like a stale comment. The reason being, in the new version, by 
>> default
>> we build the images for the architectures expected by the CI and its runners
>> to match the current workflow.
> 
> Right I will fix the commit message.
> 
>>
>>> If needed, images for an other host platform can be generated manually
>>> by calling the right make target (see make help).
>>>
>>> Add a build script to build and run xen on qemu using Yocto.
>>> The script supports arm32, arm64 and x86_64 and checks that dom0 is
>>> properly booting. At this stage this does not run any guest on top of
>>> dom0. The script is to be executed in one of the docker images to build
>>> and run a system using a Xen source tree.
>>>
>>> Signed-off-by: Bertrand Marquis <bertrand.marquis@xxxxxxx>
>>> ---
>>> Changes in v4:
>>> - Rework the system to have one dockerfile template from which make will
>>> generate the required dockerfiles for the wanted configuration
>> That is great.
> 
> Thanks :-)
>>
>>> - add support for different host architectures
>>> - Merge the generation system into one single dockerfile
>>> - Merge patches 1 and 2 in a single patch
>>> - Introduce CONTAINERS_EXTRA to have extra containers not built by
>>> default (for those not used by CI but useful to users)
>>> Changes in v3:
>>> - limit number of jobs in yocto by default to 8 and add --num-jobs
>>> option to the script to set a custom number of jobs
>>> - do not copy anymore the build-yocto.sh script inside the main image so
>>> that the current one in the repository is used when running
>>> Changes in v2:
>>> - add a --dump-log command line option to build-yocto.sh script to dump
>>> the logs if an error occurs.
>>> Changes in v1:
>>> - add --image command line argument to build-yocto.sh to allow building
>>> something different than xen-image-minimal.
>>> - modify dockerfile to have one layer per line and make it easier to add
>>> other. I kept the for loop to keep the number of docker steps lower
>>> - update commit message to warn that no guest are tested.
>>> - fix build-yocto script to properly return with an error if expect
>>> script ends up in timeout or EOF.
>>> ---
>>> automation/build/Makefile                  |  14 +-
>>> automation/build/yocto/build-yocto.sh      | 349 +++++++++++++++++++++
>>> automation/build/yocto/yocto.dockerfile.in | 114 +++++++
>>> automation/build/yocto/yocto.inc           |  41 +++
>>> 4 files changed, 516 insertions(+), 2 deletions(-)
>>> create mode 100755 automation/build/yocto/build-yocto.sh
>>> create mode 100644 automation/build/yocto/yocto.dockerfile.in
>>> create mode 100644 automation/build/yocto/yocto.inc
>>>
>>> diff --git a/automation/build/Makefile b/automation/build/Makefile
>>> index a4b2b85178cf..72a5335baec1 100644
>>> --- a/automation/build/Makefile
>>> +++ b/automation/build/Makefile
>>> @@ -1,13 +1,18 @@
>>>
>>> # the base of where these containers will appear
>>> REGISTRY := registry.gitlab.com/xen-project/xen
>>> -CONTAINERS = $(subst .dockerfile,,$(wildcard */*.dockerfile))
>>> +CONTAINERS = $(filter-out yocto/%,$(subst .dockerfile,,$(wildcard 
>>> */*.dockerfile)))
>>> +CONTAINERS_EXTRA =
>>> DOCKER_CMD ?= docker
>>>
>>> +include yocto/yocto.inc
>>> +
>>> help:
>>>        @echo "Builds containers for building Xen based on different distros"
>>>        @echo "To build one run 'make DISTRO/VERSION'. Available containers:"
>>>        @$(foreach file,$(sort $(CONTAINERS)),echo ${file};)
>>> +       @echo "Extra containers (not built using make all):"
>>> +       @$(foreach file,$(sort $(CONTAINERS_EXTRA)),echo ${file};)
>>>        @echo "To push container builds, set the env var PUSH"
>>>
>>> %: %.dockerfile ## Builds containers
>>> @@ -16,5 +21,10 @@ help:
>>>                $(DOCKER_CMD) push $(REGISTRY)/$(@D):$(@F); \
>>>        fi
>>>
>>> -.PHONY: all
>>> +.PHONY: all clean
>>> all: $(CONTAINERS)
>>> +
>>> +# Remove generated dockerfiles for yocto
>>> +clean:
>>> +       rm -f yocto/*.dockerfiles
>> Are these files needed after make is completed?
>> If not, maybe to avoid having some untracked files in the tree, they could 
>> be removed after make is done?
> 
> I do not agree here, on might want to inspect those files to check.
> Cleaning during make clean is more standard.
> 
> Also those are intermediate files so make should/could clean them 
> automatically.
> I will make a try to flag them intermediate if not handled automatically 
> already but I will still keep this here.
> 
It is ok for me. I just raised a concern :)

>>
>>> +
>>> diff --git a/automation/build/yocto/build-yocto.sh 
>>> b/automation/build/yocto/build-yocto.sh
>>> new file mode 100755
>>> index 000000000000..d0c93dfaffe0
>>> --- /dev/null
>>> +++ b/automation/build/yocto/build-yocto.sh
>>> @@ -0,0 +1,349 @@
>>> +#!/bin/bash
>>> +#
>>> +# Yocto meta virtualization build and run script
>>> +#
>>> +# This script is building Yocto xen-image-minimal for qemu targets and run
>>> +# them using runqemu inside yocto to check that dom0 is booting properly
>> Missing dot at the end of a sentence.
> 
> Will fix
> 
>>
>>> +# The build is using a local xen source tree so that specific patches can 
>>> be
>>> +# tested.
>>> +# In order to optimize the build time, a build cache is used so that only 
>>> xen
>>> +# packages and its dependencies are rebuilt (qemu and final image mainly).
>>> +#
>>> +
>>> +# Directories
>>> +YOCTODIR="$HOME/yocto-layers"
>>> +CACHEDIR="$HOME/yocto-cache"
>>> +LOGDIR="$HOME/logs"
>>> +XENDIR="$HOME/xen"
>>> +BUILDDIR="$HOME/build"
>>> +
>>> +# what yocto bsp we support
>>> +TARGET_SUPPORTED="qemuarm qemuarm64 qemux86-64"
>>> +VERBOSE="n"
>>> +TARGETLIST=""
>>> +BUILDJOBS="8"
>>> +
>>> +# actions to do
>>> +do_clean="n"
>>> +do_build="y"
>>> +do_run="y"
>>> +do_localsrc="n"
>>> +do_dump="n"
>>> +build_result=0
>>> +
>>> +# layers to include in the project
>>> +build_layerlist="poky/meta poky/meta-poky poky/meta-yocto-bsp \
>>> +                 meta-openembedded/meta-oe meta-openembedded/meta-python \
>>> +                 meta-openembedded/meta-filesystems \
>>> +                 meta-openembedded/meta-networking meta-virtualization"
>>> +
>>> +# yocto image to build
>>> +build_image="xen-image-minimal"
>>> +
>>> +function print_progress() {
>>> +    echo -n "$(date +%T) $*"
>>> +}
>>> +
>>> +function run_task() {
>>> +    local task_name="$1"
>>> +    local task_target="$2"
>>> +
>>> +    task_log="${task_name//project_}-${task_target}"
>>> +
>>> +    mkdir -p "${LOGDIR}"
>>> +    print_progress
>>> +    echo -n "${task_name//project_} ${task_target}: "
>>> +    if [ "${VERBOSE}" = "n" ]; then
>>> +        $@ > "${LOGDIR}/${task_log}.log" 2>&1
>>> +    else
>>> +        $@ 2>&1 | tee "${LOGDIR}/${task_log}.log"
>>> +    fi
>>> +
>>> +    if [ ${?} -ne 0 ]; then
>>> +        echo "Error"
>>> +        build_result=$((build_result+1))
>>> +        if [ "${do_dump}" = "y" ]; then
>>> +            echo
>>> +            echo "############ LOGS-START ############"
>>> +            cat "${LOGDIR}/${task_log}.log"
>>> +            echo "############  LOGS-END  ############"
>>> +            echo
>>> +        fi
>>> +        return 1
>>> +    else
>>> +        echo "OK"
>>> +        return 0
>>> +    fi
>>> +}
>>> +
>>> +function project_create() {
>>> +    target="${1:?}"
>>> +    destdir="${BUILDDIR}/${target}"
>>> +
>>> +    (
>>> +        # init yocto project
>>> +        source ${YOCTODIR}/poky/oe-init-build-env "${destdir}"
>>> +
>>> +        # add needed layers
>>> +        for layer in ${build_layerlist}; do
>>> +            bitbake-layers add-layer ${YOCTODIR}/${layer} || exit 1
>>> +        done
>>> +    ) || return 1
>>> +
>>> +    # customize project configuration
>>> +    cat <<EOF >> "${destdir}/conf/local.conf"
>>> +# Yocto BSP
>>> +MACHINE = "${target}"
>>> +
>>> +# Use local cache to reuse previous builds results
>>> +SSTATE_DIR = "${CACHEDIR}/sstate-cache"
>>> +DL_DIR = "${CACHEDIR}/downloads"
>>> +
>>> +# Enable xen and virtualization
>>> +DISTRO_FEATURES = " virtualization xen ipv4"
>>> +
>>> +# Speed up run by not generating ssh host keys
>>> +IMAGE_INSTALL:append:pn-xen-image-minimal = " ssh-pregen-hostkeys"
>>> +
>>> +# Save some disk space
>>> +INHERIT += "rm_work"
>>> +
>>> +# Reduce number of jobs
>>> +BB_NUMBER_THREADS="${BUILDJOBS}"
>>> +
>>> +EOF
>>> +
>>> +    if [ "${do_localsrc}" = "y" ]; then
>>> +        XENVERS=$(grep -e "^XEN_REL" \
>>> +            
>>> "${YOCTODIR}"/meta-virtualization/recipes-extended/xen/xen_*.bb \
>>> +            2> /dev/null | tr -d ' ' | tr -d '?' | tr -d '"' \
>>> +            | sed -e "s/.*=//" | sort -V | tail -n 1)
>>> +
>>> +        XENBASE=$(dirname "$(realpath -m "${XENDIR}")")
>>> +        XENSUB=$(basename "$(realpath -m "${XENDIR}")")
>>> +
>>> +        cat <<EOF >> "${destdir}/conf/local.conf"
>>> +# Use local sources for xen and xen-tools
>>> +FILESEXTRAPATHS:prepend:pn-xen := "${XENBASE}:"
>>> +FILESEXTRAPATHS:prepend:pn-xen-tools := "${XENBASE}:"
>>> +
>>> +SRC_URI:pn-xen = "file://${XENSUB}/;subdir=local-xen/"
>>> +SRC_URI:pn-xen-tools = "file://${XENSUB}/;subdir=local-xen/"
>>> +
>>> +PREFERRED_VERSION:pn-xen = "${XENVERS}%"
>>> +PREFERRED_VERSION:pn-xen-tools = "${XENVERS}%"
>>> +
>>> +S:pn-xen = "\${WORKDIR}/local-xen/${XENSUB}"
>>> +S:pn-xen-tools = "\${WORKDIR}/local-xen/${XENSUB}"
>>> +
>>> +SRCREV:pn-xen = "\${AUTOREV}"
>>> +SRCREV:pn-xen-tools = "\${AUTOREV}"
>>> +
>>> +SRCPV:pn-xen = "1"
>>> +SRCPV:pn-xen-tools = "1"
>>> +
>>> +# Disable all QA errors as the recipe is not up to date with changes in Xen
>>> +# when we use local sources
>>> +ERROR_QA:pn-xen = "arch"
>>> +ERROR_QA:pn-xen-tools = "arch"
>>> +
>>> +EOF
>>> +    fi
>>> +}
>>> +
>>> +function project_build() {
>>> +    target="${1:?}"
>>> +    destdir="${BUILDDIR}/${target}"
>>> +
>>> +    (
>>> +        source ${YOCTODIR}/poky/oe-init-build-env "${destdir}"
>>> +
>>> +        bitbake "${build_image}" || exit 1
>>> +    ) || return 1
>>> +}
>>> +
>>> +function project_clean() {
>>> +    target="${1:?}"
>>> +    destdir="${BUILDDIR}/${target}"
>>> +
>>> +    rm -rf "${destdir}"
>>> +}
>>> +
>>> +function project_run() {
>>> +    target="${1:?}"
>>> +    destdir="${BUILDDIR}/${target}"
>>> +    (
>>> +        source ${YOCTODIR}/poky/oe-init-build-env "${destdir}" > /dev/null 
>>> 2>&1
>>> +
>>> +        /usr/bin/expect <<EOF
>>> +set timeout 100
>>> +spawn bash -c "runqemu serialstdio nographic slirp"
>>> +
>>> +expect_after {
>>> +    -re "(.*)\r" {
>>> +        exp_continue
>>> +    }
>>> +    timeout {send_user "ERROR-Timeout!\n"; exit 1}
>>> +    eof {send_user "ERROR-EOF!\n"; exit 1}
>>> +}
>>> +
>>> +# wait initial login
>>> +expect -re ".* login: "
>>> +send "root\r"
>>> +expect -re "root@.*# "
>>> +
>>> +EOF
>>> +    exit $?
>>> +    ) || return 1
>>> +}
>>> +
>>> +function help() {
>>> +    cat <<EOF
>>> +Usage: ${0} [TARGET1] [TARGET2]
>>> +
>>> +This script is build the yocto xen-image-minimal for different qemu targets
>>> +and is running it after.
>>> +Without any target specified, all supported targets are done.
>>> +
>>> +Options:
>>> +  -h, --help       Print this help
>>> +  -v, --verbose    Verbose build
>>> +  --list-target    List supported targets
>>> +  --clean          Clean existing project before starting
>>> +  --no-build       Do not build (to run an already built project)
>>> +  --no-run         Do not run
>>> +  --num-jobs=NUM   Define the number of parallel jobs in Yocto.
>>> +                   Default: ${BUILDJOBS}
>>> +  --dump-log       On error, dump the logs on the console
>>> +  --image=IMG      Yocto image or package to build
>>> +                   Default: xen-image-minimal
>>> +  --xen-dir=DIR    path to xen hypervisor source tree
>>> +                   if not provide, normal yocto version of xen is built
>>> +                   Default: ${XENDIR}
>>> +  --out-dir=DIR    directory where to create the projectss
>>> +                   Default: ${BUILDDIR}
>>> +  --log-dir=DIR    directory to store logs
>>> +                   Default: ${LOGDIR}
>>> +  --cache-dir=DIR  directory where to take and store build cache
>>> +                   Default: ${CACHEDIR}
>>> +  --layer-dir=DIR  directory containing the checkout of yocto layers
>>> +                   Default: ${YOCTODIR}
>>> +EOF
>>> +}
>>> +
>>> +for OPTION in "$@"
>>> +do
>>> +    case ${OPTION} in
>>> +        -h|--help)
>>> +            help
>>> +            exit 0
>>> +            ;;
>>> +        -v|--verbose)
>>> +            VERBOSE="y"
>>> +            ;;
>>> +        --list-targets)
>>> +            echo "${TARGET_SUPPORTED}"
>>> +            exit 0
>>> +            ;;
>>> +        --clean)
>>> +            do_clean="y"
>>> +            ;;
>>> +        --no-build)
>>> +            do_build="n"
>>> +            ;;
>>> +        --no-run)
>>> +            do_run="n"
>>> +            ;;
>>> +        --dump-log)
>>> +            do_dump="y"
>>> +            ;;
>>> +        --num-jobs=*)
>>> +            BUILDJOBS="${OPTION#*=}"
>>> +            ;;
>>> +        --image=*)
>>> +            build_image="${OPTION#*=}"
>>> +            ;;
>>> +        --xen-dir=*)
>>> +            XENDIR="${OPTION#*=}"
>>> +            if [ ! -e "${XENDIR}/xen/Makefile" ]; then
>>> +                echo "No Xen source tree in ${XENDIR}"
>>> +                exit 1
>>> +            fi
>>> +            do_localsrc="y"
>>> +            ;;
>>> +        --out-dir=*)
>>> +            BUILDDIR="${OPTION#*=}"
>>> +            ;;
>>> +        --log-dir=*)
>>> +            LOGDIR="${OPTION#*=}"
>>> +            ;;
>>> +        --cache-dir=*)
>>> +            CACHEDIR="${OPTION#*=}"
>>> +            ;;
>>> +        --layer-dir=*)
>>> +            YOCTODIR="${OPTION#*=}"
>>> +            ;;
>>> +        --*)
>>> +            echo "Invalid option ${OPTION}"
>>> +            help
>>> +            exit 1
>>> +            ;;
>>> +        *)
>>> +            if echo "${TARGET_SUPPORTED}" | grep -q -w "${OPTION}"; then
>>> +                TARGETLIST="${TARGETLIST} ${OPTION}"
>>> +            else
>>> +                echo "Unsupported target ${OPTION}"
>>> +                exit 1
>>> +            fi
>>> +            ;;
>>> +    esac
>>> +done
>>> +
>>> +# if no target is specified build all targets
>>> +if [ -z "${TARGETLIST}" ]; then
>>> +    TARGETLIST="${TARGET_SUPPORTED}"
>>> +fi
>>> +
>>> +mkdir -p "${CACHEDIR}"
>>> +mkdir -p "${LOGDIR}"
>>> +mkdir -p "${BUILDDIR}"
>>> +
>>> +# Make sure we have an absolute path
>>> +YOCTODIR=$(realpath -m "${YOCTODIR}")
>>> +CACHEDIR=$(realpath -m "${CACHEDIR}")
>>> +BUILDDIR=$(realpath -m "${BUILDDIR}")
>>> +LOGDIR=$(realpath -m "${LOGDIR}")
>>> +if [ "${do_localsrc}" = "y" ]; then
>>> +    XENDIR=$(realpath -m "${XENDIR}")
>>> +fi
>>> +
>>> +# Check that we have all the layers we need
>>> +for f in ${build_layerlist}; do
>>> +    if [ ! -f "${YOCTODIR}/${f}/conf/layer.conf" ]; then
>>> +        echo "Layer ${f} missing in ${YOCTODIR}"
>>> +        exit 1
>>> +    fi
>>> +done
>>> +
>>> +for f in ${TARGETLIST}; do
>>> +    if [ "${do_clean}" = "y" ]; then
>>> +        run_task project_clean ${f}
>>> +    fi
>>> +    if [ ! -f ${BUILDDIR}/${f}/conf/local.conf ]; then
>>> +        run_task project_create ${f}
>>> +    fi
>>> +    if [ -f ${BUILDDIR}/${f}/conf/local.conf ]; then
>>> +        if [ "${do_build}" = "y" ]; then
>>> +            run_task project_build ${f}
>>> +        fi
>>> +        if [ "${do_run}" = "y" ]; then
>>> +            run_task project_run ${f}
>>> +        fi
>>> +
>>> +    fi
>>> +done
>>> +
>>> +print_progress "Build Complete (${build_result} errors)"
>>> +echo
>>> +exit ${build_result}
>>> +
>>> diff --git a/automation/build/yocto/yocto.dockerfile.in 
>>> b/automation/build/yocto/yocto.dockerfile.in
>>> new file mode 100644
>>> index 000000000000..5350bb2b87b7
>>> --- /dev/null
>>> +++ b/automation/build/yocto/yocto.dockerfile.in
>>> @@ -0,0 +1,114 @@
>>> +# Docker file to create an environment to build yocto with virtualization
>>> +#
>>> +# Arguments that can be passed during image creation using --build-arg:
>>> +# "host_uid=$(id -u)": to use current user uid for build user in the image
>>> +# "host_gid=$(id -g)": to use current user gid for build user in the image
>>> +# "ubuntu_version=VERS": to select the ubuntu version number
>> Is is the case, that this dockerfile and the packages installed will work on 
>> any
>> version of ubuntu we will pass here? If not, maybe we should just stick to 
>> 22.04 and
>> not give the user the opportunity to change this.
> 
> There is no support right now to build for a different version of ubuntu 
> without
> modifying the docker file. I kept that as argument here because the generated
> file/container does not contain an ubuntu version in its name so changing the
> value here in the future will make it clearer.
Ok.
> 
> I am ok to remove the variable and directly use the value if you think this 
> is necessary.
No need.

> 
>>
>>> +
>>> +# Use standard ubuntu minimal
>>> +ARG ubuntu_version=22.04
>>> +From ##DOCKERPLAT##ubuntu:$ubuntu_version AS base
>>> +LABEL maintainer.name="The Xen Project " \
>>> +      maintainer.email="xen-devel@xxxxxxxxxxxxxxxxxxxx"
>>> +
>>> +ENV DEBIAN_FRONTEND=noninteractive
>>> +
>>> +# Install minimal ubuntu requirements for yocto and other tools we need
>>> +# See 
>>> https://nam11.safelinks.protection.outlook.com/?url=https%3A%2F%2Fdocs.yoctoproject.org%2F4.0.1%2Fbrief-yoctoprojectqs%2Findex.html%23build-host-packages&amp;data=05%7C01%7Cmichal.orzel%40amd.com%7Cd5eca08f965d4fd1a99508dac95a41e7%7C3dd8961fe4884e608e11a82d994e183d%7C0%7C0%7C638043686755292322%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000%7C%7C%7C&amp;sdata=D%2FAe%2FCUo2%2FWcvJAXjRW4vW9z4pwWcUEOhe1TdlozECw%3D&amp;reserved=0
>>> +RUN apt-get update && \
>>> +    apt-get --quiet --yes install \
>>> +        gawk \
>>> +        wget \
>>> +        git \
>>> +        diffstat \
>>> +        unzip \
>>> +        texinfo \
>>> +        gcc \
>>> +        build-essential \
>>> +        chrpath \
>>> +        socat \
>>> +        cpio \
>>> +        python3 \
>>> +        python3-pip \
>>> +        python3-pexpect \
>>> +        xz-utils \
>>> +        debianutils \
>>> +        iputils-ping \
>>> +        python3-git \
>>> +        python3-jinja2 \
>>> +        libegl1-mesa \
>>> +        libsdl1.2-dev \
>>> +        python3-subunit \
>>> +        mesa-common-dev \
>>> +        zstd \
>>> +        liblz4-tool \
>>> +        file \
>>> +        vim \
>>> +        bison \
>>> +        expect \
>>> +        locales \
>>> +        liblz4-tool \
>>> +        zstd \
>>> +        openssl \
>>> +        libssl3 \
>>> +        ca-certificates \
>>> +        && \
>>> +        apt-get autoremove -y && \
>>> +        apt-get clean && \
>>> +        rm -rf /var/lib/apt/lists* /tmp/* /var/tmp/*
>>> +
>>> +# Use bash as shell
>>> +RUN rm /bin/sh && ln -s bash /bin/sh
>>> +
>>> +# Fix local for yocto
>>> +RUN locale-gen en_US.UTF-8 && update-locale LC_ALL=en_US.UTF-8 \
>>> +    LANG=en_US.UTF-8
>>> +ENV LANG en_US.UTF-8
>>> +ENV LC_ALL en_US.UTF-8
>>> +
>>> +# Create a user for the build (we don't want to build as root)
>>> +ENV USER_NAME docker-build
>>> +ARG host_uid=1000
>>> +ARG host_gid=1000
>>> +RUN groupadd -g $host_gid $USER_NAME && \
>>> +    useradd -g $host_gid -m -s /bin/bash -u $host_uid $USER_NAME
>>> +
>>> +# Switch to our user instead of root and start in its home
>>> +USER $USER_NAME
>>> +WORKDIR /home/$USER_NAME
>>> +
>>> +# Create needed directories
>>> +RUN mkdir -p /home/$USER_NAME/yocto-layers \
>>> +             /home/$USER_NAME/yocto-cache \
>>> +             /home/$USER_NAME/logs \
>>> +             /home/$USER_NAME/bin \
>>> +             /home/$USER_NAME/xen && \
>>> +    chown $USER_NAME.$USER_NAME /home/$USER_NAME/*
>>> +
>>> +# clone yocto repositories we need
>>> +RUN for rep in \
>>> +                
>>> https://nam11.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgithub.com%2Fopenembedded%2Fmeta-openembedded&amp;data=05%7C01%7Cmichal.orzel%40amd.com%7Cd5eca08f965d4fd1a99508dac95a41e7%7C3dd8961fe4884e608e11a82d994e183d%7C0%7C0%7C638043686755292322%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000%7C%7C%7C&amp;sdata=5IB%2BO9M0DU3D7hN7q9Ft9OivqfmTVKuOVKgFWuElUu4%3D&amp;reserved=0
>>>  \
>>> +                
>>> https://nam11.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgit.yoctoproject.org%2Fpoky&amp;data=05%7C01%7Cmichal.orzel%40amd.com%7Cd5eca08f965d4fd1a99508dac95a41e7%7C3dd8961fe4884e608e11a82d994e183d%7C0%7C0%7C638043686755448030%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000%7C%7C%7C&amp;sdata=fMRgTFNrjR5athu9kXSNXAL%2FeN2RwO%2Bu6CZxCbhesyU%3D&amp;reserved=0
>>>  \
>>> +                
>>> https://nam11.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgit.yoctoproject.org%2Fmeta-virtualization&amp;data=05%7C01%7Cmichal.orzel%40amd.com%7Cd5eca08f965d4fd1a99508dac95a41e7%7C3dd8961fe4884e608e11a82d994e183d%7C0%7C0%7C638043686755448030%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000%7C%7C%7C&amp;sdata=J6JQP3Ibn2WaD1cTtduC4T%2BbnNWlUHmFPXrLsIe1CSw%3D&amp;reserved=0
>>>  \
>>> +            ; do \
>>> +        git -C /home/$USER_NAME/yocto-layers \
>>> +            clone -b ##YOCTOVERSION## --single-branch $rep; \
>>> +    done
>>> +
>>> +# The builder stage is building an initial cache state that we include in 
>>> the
>>> +# final image
>>> +From base AS builder
>>> +
>>> +# This step can take one to several hours depending on your download 
>>> bandwith
>>> +# and the speed of your computer
>>> +COPY ./build-yocto.sh /
>>> +RUN /build-yocto.sh --dump-log ##YOCTOTARGET##
>>> +
>>> +From base
>>> +
>>> +# Only copy the cache status
>>> +COPY --from=builder /home/$USER_NAME/yocto-cache 
>>> /home/$USER_NAME/yocto-cache/.
>>> +
>>> +LABEL maintainer.name="The Xen Project " \
>>> +      maintainer.email="xen-devel@xxxxxxxxxxxxxxxxxxxx"
>>> +
>>> diff --git a/automation/build/yocto/yocto.inc 
>>> b/automation/build/yocto/yocto.inc
>>> new file mode 100644
>>> index 000000000000..04076bc8d174
>>> --- /dev/null
>>> +++ b/automation/build/yocto/yocto.inc
>>> @@ -0,0 +1,41 @@
>>> +# This makefile generates the docker files for Yocto builds
>>> +# The containers for the current architecture are the one built using make 
>>> all
>>> +# To build containers for a different architecture, you need to call make 
>>> for
>>> +# the image you want explicitely
>> Could you please add a dot at the end of each sentence above. This will 
>> improve readability.
> 
> Yes will do.
> 
>>
>>> +# The containers are named this way:
>>> +# YOCTOVERSION-TARGET for x86_64 hosts
>>> +# YOCTOVERSION-TARGET-arm64v8 for arm64 hosts
>>> +
>>> +# Yocto versions we are currently using
>>> +YOCTO_VERSION = kirkstone
>>> +
>>> +# Yocto BSPs we want to build for
>>> +YOCTO_TARGETS = qemuarm64 qemuarm qemux86-64
>>> +
>>> +# Supported Host platforms (host architecture specific ones)
>> To avoid mismatch \wrt platform vs architecture I would stick to the latter 
>> one.
>> In the docker world, arm64v8 is an architecture whereas linux/arm64/v8 is a 
>> platform.
> 
> So "yocto target” and “container platform” ?
container architecture

> 
>>
>>> +YOCTO_HOSTS = amd64 arm64v8
>>> +
>>> +# Architecture we want to use in gitlab CI (depends on runners arch)
>>> +CI_ARCH = arm64v8
>>> +
>>> +define GEN_DOCKER
>>> +# Make all is generating what we want in the CI
>>> +ifeq ($(CI_ARCH),$(3))
>>> +CONTAINERS += yocto/$(1)-$(2)$(4)
>>> +else
>>> +CONTAINERS_EXTRA += yocto/$(1)-$(2)$(4)
>>> +endif
>>> +
>>> +yocto/$(1)-$(2)$(4).dockerfile: yocto/yocto.dockerfile.in
>>> +       echo > $$@
>>> +       cat $$< | \
>>> +           sed -e "s,##YOCTOVERSION##,$(1),g" | \
>>> +           sed -e "s,##YOCTOTARGET##,$(2),g" | \
>>> +           sed -e "s,##DOCKERPLAT##,$(3)/,g" > $$@
>>> +
>>> +endef
>>> +
>>> +$(eval $(foreach vers,$(YOCTO_VERSION),\
>>> +    $(foreach tar,$(YOCTO_TARGETS),\
>>> +    $(foreach hst,$(YOCTO_HOSTS),\
>>> +    $(call GEN_DOCKER,$(vers),$(tar),$(hst),$(if $(filter 
>>> amd64,$(hst)),,-$(hst)))))))
>> This could be aligned under first foreach. Also I think there is no need to 
>> try to shorten the version,target,host.
> 
> This is something you requested me in order to have container names for yocto 
> coherent
> with other xen containers (ie only have the -arm64v8 suffix for arm).
> 
> Do you want me to revert this and have names containing the amd64 suffix ?
This is not what I meant.
I just wanted to use the full words like target,host,version instead of 
tar,hst,vers
and for the "foreach" to be aligned.

> 
> Thanks for the review
> 
> Cheers
> Bertrand
> 
>>
>>> --
>>> 2.25.1
>>>
>>
>> ~Michal
> 
~Michal




 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.