Skip to content
Snippets Groups Projects
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
eclipse.Dockerfile 4.96 KiB
ARG USER="eclipse"
ARG PDM_VERSION="2.22.4"
ARG CONAN_VERSION="2.13.0"

FROM ubuntu:24.04 AS vaf-base
ARG TZ="Europe/Berlin"
ARG USER
ARG CONAN_VERSION

ENV LC_ALL="C.UTF-8" \
    LANG="C.UTF-8"

# Install common APT packages
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone \
    && apt-get update \
    && apt-get install -y --no-install-recommends \
    build-essential \
    ca-certificates \
    ccache \
    cmake \
    g++-12 \
    git \
    pipx \
    python3-pip \
    python3.12 \
    python3.12-venv \
    sudo \
    ssh \
    && apt-get clean autoclean \
    && apt-get autoremove -y \
    && rm -rf /var/lib/apt/lists/* \
    && rm -rf /var/cache/* \
    && rm -rf /var/log/*

# Comment out and adapt the lines below to add SSL certificates if needed:
# ADD url-to-your-certificate-one /usr/local/share/ca-certificates/your-certificates-folder
# ADD url-to-your-certificate-two /usr/local/share/ca-certificates/your-certificates-folder
# RUN update-ca-certificates /usr/local/share/ca-certificates/
# ENV REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt

# Create working directory and add user
RUN mkdir -p /workspaces \
    # Create a default user
    && userdel -r ubuntu \
    && useradd -m -s /bin/bash -u 1000 ${USER} --groups sudo \
    # Allow usage of sudo without password
    && echo "${USER} ALL=(ALL) NOPASSWD: ALL" > /etc/sudoers.d/${USER}_all \
    && chown -R ${USER}:${USER} /workspaces
USER ${USER}

# Install common python dependencies
RUN pip3 install conan==${CONAN_VERSION} --break-system-packages\
    && rm -rf /home/${USER}/.cache/*

WORKDIR /workspaces

FROM vaf-base AS builder
ARG PDM_VERSION

# Install build dependencies
RUN pipx ensurepath \
    && pipx install pdm==${PDM_VERSION}

# Build SIL Kit
RUN mkdir -p /tmp/silkit \
    && git clone --recurse-submodules -j4 https://github.com/vectorgrp/sil-kit.git /tmp/silkit \
    && git -C /tmp/silkit checkout tags/v4.0.55 \
    && git -C /tmp/silkit submodule update --init --recursive \
    && mkdir /tmp/silkit/build \
    && cmake -DSILKIT_BUILD_DEMOS=OFF -DSILKIT_BUILD_TESTS=OFF -DSILKIT_BUILD_DASHBOARD=OFF -DSILKIT_BUILD_STATIC=ON \
    -DCMAKE_INSTALL_PREFIX=/tmp/silkit/install -S /tmp/silkit -B /tmp/silkit/build \
    && cmake --build /tmp/silkit/build --target install --parallel 12

# Build conan packages
RUN --mount=type=bind,source=SwLibraries/vaf_core_library,target=/tmp/vafcpp/src,readwrite \
    --mount=type=bind,source=Container/conan,target=/tmp/conan,readwrite \
    --mount=type=bind,source=version.txt,target=/tmp/version.txt \
    sudo chown -R 1000:1000 /tmp/vafcpp /tmp/conan \
    && export PATH="$PATH:/home/${USER}/.local/bin" \
    && cd /tmp/vafcpp/src \
    && conan create . --profile:all=./test_package/gcc12__x86_64-pc-linux-elf -s build_type=Release \
    && conan create . --profile:all=./test_package/gcc12__x86_64-pc-linux-elf -s build_type=Debug \
    && conan install /tmp/conan -pr:a=/tmp/conan/gcc12__x86_64-pc-linux-elf --build=missing \
    && conan install /tmp/conan -pr:a=/tmp/conan/gcc12__x86_64-pc-linux-elf --build=missing -s build_type=Debug \
    && conan cache clean

# Build vafcli
RUN --mount=type=bind,source=VAF,target=/tmp/vaf/src,readwrite \
    --mount=type=bind,source=version.txt,target=/tmp/version.txt \
    sudo chown -R 1000:1000 /tmp/vaf \
    && rm -f /tmp/vaf/.python-version \
    && export PATH="$PATH:/home/${USER}/.local/bin" \
    && export PDM_BUILD_SCM_VERSION=$(cat /tmp/version.txt) \
    && make -C /tmp/vaf/src clean build \
    && mv /tmp/vaf/src/dist/*.whl /tmp/vaf

FROM vaf-base AS devcontainer

# Install packages requiring root permissions
USER root
RUN apt-get update \
    && apt-get install -y --no-install-recommends \
    bash-completion \
    clangd \
    emacs \
    gdb \
    && apt-get clean autoclean \
    && apt-get autoremove -y \
    && rm -rf /var/lib/apt/lists/* \
    && rm -rf /var/cache/* \
    && rm -rf /var/log/*

# Install SIL Kit
RUN --mount=type=bind,from=builder,source=/tmp/silkit,target=/tmp/silkit \
    cp /tmp/silkit/install/bin/* /usr/local/bin/ \
    && cp -r /tmp/silkit/install/include/silkit /usr/local/include/ \
    && cp -r /tmp/silkit/install/lib/cmake /usr/local/lib/ \
    # Workaround for broken installation when building statically linked libraries
    && cp /tmp/silkit/build/ThirdParty/_tp_spdlog/libspdlog.a /usr/local/lib/ \
    && cp /tmp/silkit/build/ThirdParty/_tp_yaml-cpp/libyaml-cpp.a /usr/local/lib/ \
    && cp /tmp/silkit/build/Release/libSilKit.a /usr/local/lib/

# Switch user and set environment variables
USER ${USER}
ENV PATH="$PATH:/home/${USER}/.local/bin"

# Install remaining artifacts from build stage
RUN --mount=type=bind,from=builder,source=/tmp/vaf,target=/tmp/vaf \
    # Install vafcli
    pip3 install /tmp/vaf/*.whl --break-system-packages \
    && rm -rf /home/${USER}/.cache/* \
    && _VAF_COMPLETE=bash_source vaf | sudo tee /usr/share/bash-completion/completions/vaf > /dev/null

COPY --from=builder /home/${USER}/.conan2 /home/${USER}/.conan2

# Add Demos
COPY Demo /opt/vaf/Demo