Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
228 changes: 228 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,228 @@
# Example makefile for building all the images locally
# This is useful when debugging, so as to not REQUIRE the use of CI/CD to build

LOCAL_TAG ?= $(shell git rev-parse --short HEAD)
TGT_REPO ?= ghcr.io/core-flight-system/containers
REPO_TAG ?= latest

# If AUTOBUILD_DEPS is set, then recursively build any missing images
# that are dependencies of the target image. If this is not set,
# then the build will fail if the dependency does not exist. This
# must always be true at the top level or else nothing will build.
ifeq ($(MAKELEVEL),0)
AUTOBUILD_DEPS ?= 1
endif

ifneq ($(AUTOBUILD_DEPS),)
BUILD_DEP_CMD = $(MAKE) $(IMAGE_NAME).build
else
BUILD_DEP_CMD = /bin/false
endif

# The option --no-cache can be specified on command line if desired
EXTRA_BUILDARGS += --progress=plain

QUALIFIED_IMAGE_NAME = $(IMAGE_NAME):$(LOCAL_TAG)

BASIC_IMAGE_SET += docker-executor
BASIC_IMAGE_SET += cfsexec-qemu
BASIC_IMAGE_SET += cfsexec-linux
BASIC_IMAGE_SET += cfsexec-ubuntu22
BASIC_IMAGE_SET += gaisler-sparc-rcc-sdk
BASIC_IMAGE_SET += arm-linux-sdk
ALL_IMAGE_SET += $(BASIC_IMAGE_SET)

BUILDENV_IMAGE_SET += cfsbuildenv-doxygen
BUILDENV_IMAGE_SET += cfsbuildenv-linux
BUILDENV_IMAGE_SET += cfsbuildenv-mcdc
BUILDENV_IMAGE_SET += cfsbuildenv-rtems5
BUILDENV_IMAGE_SET += cfsbuildenv-rtems6
# BUILDENV_IMAGE_SET += cfsbuildenv-yocto
BUILDENV_IMAGE_SET += cfsbuildenv-arm-linux
BUILDENV_IMAGE_SET += cfsbuildenv-gaisler-sparc-rcc
BUILDENV_IMAGE_SET += cfsbuildenv-ubuntu22
BUILDENV_IMAGE_SET += cfsbuildenv-el9
BUILDENV_IMAGE_SET += cfsbuildenv-el8
ALL_IMAGE_SET += $(BUILDENV_IMAGE_SET)

# The rest of the images each need a custom rule with custom deps
ALL_IMAGE_SET += yocto-sources
ALL_IMAGE_SET += yocto-compile-qemuriscv64
ALL_IMAGE_SET += yocto-image-qemuriscv64
ALL_IMAGE_SET += yocto-sdk-qemuriscv64
ALL_IMAGE_SET += yocto-compile-qemumips
ALL_IMAGE_SET += yocto-image-qemumips
ALL_IMAGE_SET += yocto-sdk-qemumips
ALL_IMAGE_SET += rtems5-tools
ALL_IMAGE_SET += rtems6-tools
ALL_IMAGE_SET += rtems5-rtos
ALL_IMAGE_SET += rtems6-rtos

ALL_BUILD_TARGETS := $(addsuffix .build,$(ALL_IMAGE_SET))
ALL_IMAGE_TARGETS := $(addsuffix .image,$(ALL_IMAGE_SET))
ALL_PUSH_TARGETS := $(addsuffix .push,$(ALL_IMAGE_SET))
ALL_PULL_TARGETS := $(addsuffix .pull,$(ALL_IMAGE_SET))

$(ALL_BUILD_TARGETS) $(ALL_IMAGE_TARGETS) $(ALL_PUSH_TARGETS) $(ALL_PULL_TARGETS): IMAGE_NAME = $(basename $(@))

all: $(ALL_IMAGE_TARGETS)
push: $(ALL_PUSH_TARGETS)
pull: $(ALL_PULL_TARGETS)

check:
env

rtems5-rtos.image: rtems5-tools.image
rtems6-rtos.image: rtems6-tools.image
cfsbuildenv-rtems5.image: rtems5-rtos.image
cfsbuildenv-rtems6.image: rtems6-rtos.image
cfsbuildenv-arm-linux.image: arm-linux-sdk.image cfsbuildenv-linux.image
cfsbuildenv-gaisler-sparc-rcc.image: gaisler-sparc-rcc-sdk.image cfsbuildenv-linux.image
yocto-sdk.image: cfsbuildenv-linux.image


%.build:
docker build $(EXTRA_BUILDARGS) -t $(QUALIFIED_IMAGE_NAME) -f $(subst rtems5-,rtems-,$(subst rtems6-,rtems-,$(IMAGE_NAME)))/Dockerfile .

# RTEMS 5 Tools
rtems5-tools.build:
docker build $(EXTRA_BUILDARGS) -t $(QUALIFIED_IMAGE_NAME) \
--build-arg RTEMS_VER=5 \
-f rtems-tools/Dockerfile .

# RTEMS 6 Tools
rtems6-tools.build:
docker build $(EXTRA_BUILDARGS) -t $(QUALIFIED_IMAGE_NAME) \
--build-arg RTEMS_VER=6 \
-f rtems-tools/Dockerfile .

# RTEMS 5 RTOS
rtems5-rtos.build:
docker build $(EXTRA_BUILDARGS) -t $(QUALIFIED_IMAGE_NAME) \
--build-arg TOOLS_IMAGE=rtems5-tools:$(LOCAL_TAG) \
--build-arg RTEMS_VER=5 \
-f rtems-rtos/Dockerfile .

# RTEMS 6 RTOS
rtems6-rtos.build:
docker build $(EXTRA_BUILDARGS) -t $(QUALIFIED_IMAGE_NAME) \
--build-arg TOOLS_IMAGE=rtems6-tools:$(LOCAL_TAG) \
--build-arg RTEMS_VER=6 \
-f rtems-rtos/Dockerfile .

# cFS Build Environment - RTEMS 5
cfsbuildenv-rtems5.build:
docker build $(EXTRA_BUILDARGS) -t $(QUALIFIED_IMAGE_NAME) \
--build-arg RTEMS_RTOS_IMAGE=rtems5-rtos:$(LOCAL_TAG) \
-f cfsbuildenv-rtems/Dockerfile .

# cFS Build Environment - RTEMS 6
cfsbuildenv-rtems6.build:
docker build $(EXTRA_BUILDARGS) -t $(QUALIFIED_IMAGE_NAME) \
--build-arg RTEMS_RTOS_IMAGE=rtems6-rtos:$(LOCAL_TAG) \
-f cfsbuildenv-rtems/Dockerfile .

cfsbuildenv-doxygen.build:
docker build $(EXTRA_BUILDARGS) -t $(QUALIFIED_IMAGE_NAME) -f cfsbuildenv-doxygen/Dockerfile .

cfsbuildenv-mcdc.build:
docker build $(EXTRA_BUILDARGS) -t $(QUALIFIED_IMAGE_NAME) -f cfsbuildenv-mcdc/Dockerfile .

cfsbuildenv-linux.build cfsbuildenv-ubuntu22.build:
docker build $(EXTRA_BUILDARGS) -t $(QUALIFIED_IMAGE_NAME) -f cfsbuildenv-dpkg/Dockerfile .

cfsbuildenv-el8.build cfsbuildenv-el9.build:
docker build $(EXTRA_BUILDARGS) -t $(QUALIFIED_IMAGE_NAME) -f cfsbuildenv-rpm/Dockerfile .

yocto-sources.build: cfsbuildenv-linux.image
yocto-sources.build:
docker build $(EXTRA_BUILDARGS) -t $(QUALIFIED_IMAGE_NAME) \
--build-arg BASE_IMAGE=cfsbuildenv-linux:$(LOCAL_TAG) \
-f yocto-sources/Dockerfile .

yocto-compile-qemuriscv64.build: yocto-sources.image
yocto-compile-qemumips.build: yocto-sources.image
yocto-compile-%.build:
docker build $(EXTRA_BUILDARGS) -t $(QUALIFIED_IMAGE_NAME) \
--build-arg BASE_IMAGE=yocto-sources:$(LOCAL_TAG) \
--build-arg MACHINE=$(*) \
-f yocto-compile/Dockerfile .

yocto-image-qemuriscv64.build: yocto-compile-qemuriscv64.image
yocto-image-qemumips.build: yocto-compile-qemumips.image
yocto-image-%.build:
docker build $(EXTRA_BUILDARGS) -t $(QUALIFIED_IMAGE_NAME) \
--build-arg BASE_IMAGE=yocto-compile-$(*):$(LOCAL_TAG) \
--build-arg MACHINE=$(*) \
-f yocto-image/Dockerfile .

yocto-sdk-qemuriscv64.build: yocto-compile-qemuriscv64.image
yocto-sdk-qemumips.build: yocto-compile-qemumips.image
yocto-sdk-%.build:
docker build $(EXTRA_BUILDARGS) -t $(QUALIFIED_IMAGE_NAME) \
--build-arg BASE_IMAGE=yocto-compile-$(*):$(LOCAL_TAG) \
--build-arg MACHINE=$(*) \
-f yocto-sdk/Dockerfile .

cfsbuildenv-yocto.build:
docker build $(EXTRA_BUILDARGS) -t $(QUALIFIED_IMAGE_NAME) \
--build-arg YOCTO_SDK_IMAGE=yocto-sdk:$(LOCAL_TAG) \
-f cfsbuildenv-yocto/Dockerfile .

cfsbuildenv-arm-linux.build:
docker build $(EXTRA_BUILDARGS) -t $(QUALIFIED_IMAGE_NAME) \
--build-arg BASE_IMAGE=cfsbuildenv-linux:$(LOCAL_TAG) \
--build-arg SDK_IMAGE=arm-linux-sdk:$(LOCAL_TAG) \
-f cfsbuildenv-arm-linux/Dockerfile .

cfsbuildenv-gaisler-sparc-rcc.build:
docker build $(EXTRA_BUILDARGS) -t $(QUALIFIED_IMAGE_NAME) \
--build-arg BASE_IMAGE=cfsbuildenv-linux:$(LOCAL_TAG) \
--build-arg SDK_IMAGE=gaisler-sparc-rcc-sdk:$(LOCAL_TAG) \
-f cfsbuildenv-gaisler-sparc-rcc/Dockerfile .

cfsexec-linux.build cfsexec-ubuntu22.build:
docker build $(EXTRA_BUILDARGS) -t $(QUALIFIED_IMAGE_NAME) -f cfsexec-dpkg/Dockerfile .

%.push:
docker tag $(QUALIFIED_IMAGE_NAME) $(TGT_REPO)/$(QUALIFIED_IMAGE_NAME)
docker push $(TGT_REPO)/$(QUALIFIED_IMAGE_NAME)

%.pull:
docker pull $(TGT_REPO)/$(IMAGE_NAME):$(REPO_TAG)

# the idea here is to check if the image was already built, and if so, just
# use the already-built image from the container repo. This is done by commit hash.
%.image:
docker pull $(TGT_REPO)/$(QUALIFIED_IMAGE_NAME) || /bin/true
docker inspect $(QUALIFIED_IMAGE_NAME) > /dev/null || $(BUILD_DEP_CMD)

# The following is a list of images that rely on a base
# image that uses the Debian-style package management via
# apt and dpkg, e.g. Debian/Ubuntu or any derivative thereof.
DPKG_BUILD_TARGETS += arm-linux-sdk.build
DPKG_BUILD_TARGETS += cfsbuildenv-doxygen.build
DPKG_BUILD_TARGETS += docker-executor.build
DPKG_BUILD_TARGETS += gaisler-sparc-rcc-sdk.build
DPKG_BUILD_TARGETS += rtems5-rtos.build
DPKG_BUILD_TARGETS += rtems5-tools.build
DPKG_BUILD_TARGETS += rtems6-rtos.build
DPKG_BUILD_TARGETS += rtems6-tools.build
DPKG_BUILD_TARGETS += cfsbuildenv-rtems5.build
DPKG_BUILD_TARGETS += cfsbuildenv-rtems6.build
DPKG_BUILD_TARGETS += cfsbuildenv-linux.build
DPKG_BUILD_TARGETS += cfsexec-linux.build

$(DPKG_BUILD_TARGETS): EXTRA_BUILDARGS += --build-arg BASE_IMAGE=debian:bookworm

# These images use rocky linux as an stand-in for RHEL
# They should work on any RHEL-like distro that uses rpm/dnf package management
%-el8.build: EXTRA_BUILDARGS += --build-arg BASE_IMAGE=rockylinux:8
%-el9.build: EXTRA_BUILDARGS += --build-arg BASE_IMAGE=rockylinux:9

# These images are intentially using the older ubuntu baseline
%-ubuntu22.build: EXTRA_BUILDARGS += --build-arg BASE_IMAGE=ubuntu:jammy

# attempt to pull the image before building it here
.SECONDEXPANSION:
$(ALL_PUSH_TARGETS): $$(IMAGE_NAME).image
3 changes: 0 additions & 3 deletions README.md

This file was deleted.

19 changes: 19 additions & 0 deletions arm-linux-sdk/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
#########################################################
# Build the ARM SDK image - contains the reference toolchain from the ARM developer website
#########################################################

ARG BASE_IMAGE=debian:latest
FROM ${BASE_IMAGE} AS arm-linux-sdk

RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y \
tar xz-utils curl ca-certificates \
${EXTRA_PKGS} && \
rm -rf /var/cache/apt

# Fetch SDK binary packages
RUN curl -fsL -o /root/arm-gnu-toolchain-11.3.rel1-x86_64-arm-none-linux-gnueabihf.tar.xz 'https://developer.arm.com/-/media/Files/downloads/gnu/11.3.rel1/binrel/arm-gnu-toolchain-11.3.rel1-x86_64-arm-none-linux-gnueabihf.tar.xz?rev=65520e9cdf324eca9c02f5302c904fa4&hash=0A1256D118EB7077B4BAA5B2A44FFB72'

# Install SDK
RUN mkdir -p /opt && \
tar Jxf /root/arm-gnu-toolchain-11.3.rel1-x86_64-arm-none-linux-gnueabihf.tar.xz -C /opt && \
chown -R root:root /opt/
13 changes: 13 additions & 0 deletions cfsbuildenv-arm-linux/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
#########################################################
# This adds all the needed packages to build CFS
# for an embedded Linux target using Yocto
#########################################################

ARG SDK_IMAGE=arm-linux-sdk:test
ARG BASE_IMAGE=cfsbuildenv-linux:test

FROM ${SDK_IMAGE} AS arm-linux-sdk
FROM ${BASE_IMAGE} AS cfsbuildenv-arm-linux

# Bring the SDK entirely from the sdk image,
COPY --from=arm-linux-sdk /opt /opt
22 changes: 22 additions & 0 deletions cfsbuildenv-doxygen/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
#########################################################
# This adds all the needed packages to build CFS
# documentation and guides using Doxygen
#########################################################

ARG BASE_IMAGE=debian:latest
FROM ${BASE_IMAGE} AS cfsbuildenv-doxygen

ARG EXTRA_PKGS=""

RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y \
sudo build-essential git cmake curl lsb-release software-properties-common rsync jq \
doxygen graphviz texlive texlive-plain-generic texlive-fonts-extra texlive-latex-extra \
${EXTRA_PKGS} && \
rm -rf /var/cache/apt

# Create a non-root user to do the build, but grant sudo to permit adding dependencies if needed
RUN useradd -m -c "Docker user" -U -G sudo docker && \
echo "%sudo ALL=(ALL:ALL) NOPASSWD:ALL" > /etc/sudoers

USER docker
WORKDIR /home/docker
13 changes: 13 additions & 0 deletions cfsbuildenv-doxygen/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
# cfsbuildenv-ubuntu22 container

This container is intended to host containerized jobs in workflows

It is not started or built directly from this docker compose because
it would only be started via workflow jobs when needed.

It must be built separately using `docker build`, for example:

```
docker build -t cfsbuildenv-ubuntu22:latest .
```

27 changes: 27 additions & 0 deletions cfsbuildenv-dpkg/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
#########################################################
# This adds all the needed packages to build CFS
# in the native configurations
#
# This variant of the container may be built on a Debian-style base
# that uses dpkg and apt as the package management system
#########################################################

ARG BASE_IMAGE=debian:latest
FROM ${BASE_IMAGE} AS cfsbuildenv-dpkg

ARG EXTRA_PKGS=""

RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y \
sudo ca-certificates curl lsb-release software-properties-common \
build-essential git gcc g++ gawk cmake lcov xsltproc rsync jq file \
python3 python3-venv python3-dev python3-pip openssh-client \
libexpat-dev liblua5.3-dev libjson-c-dev xz-utils cppcheck clang-format \
${EXTRA_PKGS} && \
rm -rf /var/cache/apt

# Create a non-root user to do the build, but grant sudo to permit adding dependencies if needed
RUN useradd -m -c "Docker user" -U -G sudo docker && \
echo "%sudo ALL=(ALL:ALL) NOPASSWD:ALL" > /etc/sudoers

USER docker
WORKDIR /home/docker
13 changes: 13 additions & 0 deletions cfsbuildenv-gaisler-sparc-rcc/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
#########################################################
# This adds all the needed packages to build CFS
# for an embedded Linux target using Yocto
#########################################################

ARG SDK_IMAGE=gaisler-sparc-rcc:test
ARG BASE_IMAGE=cfsbuildenv-linux:test

FROM ${SDK_IMAGE} AS gaisler-sparc-rcc-sdk
FROM ${BASE_IMAGE} AS cfsbuildenv-gaisler-sparc-rcc

# Bring the SDK entirely from the sdk image,
COPY --from=gaisler-sparc-rcc-sdk /opt /opt
24 changes: 24 additions & 0 deletions cfsbuildenv-mcdc/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
#########################################################
# Image capable of building CFS and providing MC/DC coverage analysis
# This requires use of a very recent GCC version
#########################################################

ARG BASE_IMAGE=docker.io/gcc:14
FROM ${BASE_IMAGE} AS gcc14-build

ARG EXTRA_PKGS=""

# Install the basic CFS build environment
RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y \
sudo curl lsb-release apt-transport-https \
git gawk cmake lcov xsltproc rsync jq \
python3 python3-venv python3-dev libexpat-dev liblua5.3-dev libjson-c-dev \
${EXTRA_PKGS} && \
rm -rf /var/cache/apt

# Create a non-root user to do the build, but grant sudo to permit adding dependencies if needed
RUN useradd -m -c "Docker user" -U -G sudo docker && \
echo "%sudo ALL=(ALL:ALL) NOPASSWD:ALL" > /etc/sudoers

USER docker
WORKDIR /home/docker
Loading