<div dir="ltr">Yes, I agree that "specificed" should be corrected to "specified". Thank you for catching this.<br></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Tue, Oct 10, 2023 at 3:40 PM Aaron Conole <<a href="mailto:aconole@redhat.com">aconole@redhat.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Adam Hassick <<a href="mailto:ahassick@iol.unh.edu" target="_blank">ahassick@iol.unh.edu</a>> writes:<br>
<br>
> From: Owen Hilyard <<a href="mailto:ohilyard@iol.unh.edu" target="_blank">ohilyard@iol.unh.edu</a>><br>
><br>
> The Makefile that can be used to build all of the container images using<br>
> "make build", and can also be used to push them to a remote repository<br>
> (for use in CI).<br>
><br>
> Signed-off-by: Owen Hilyard <<a href="mailto:ohilyard@iol.unh.edu" target="_blank">ohilyard@iol.unh.edu</a>><br>
> Signed-off-by: Adam Hassick <<a href="mailto:ahassick@iol.unh.edu" target="_blank">ahassick@iol.unh.edu</a>><br>
> ---<br>
> containers/Makefile | 258 ++++++++++++++++++++++++++++++++++++++++++++<br>
> 1 file changed, 258 insertions(+)<br>
> create mode 100644 containers/Makefile<br>
><br>
> diff --git a/containers/Makefile b/containers/Makefile<br>
> new file mode 100644<br>
> index 0000000..047a208<br>
> --- /dev/null<br>
> +++ b/containers/Makefile<br>
> @@ -0,0 +1,258 @@<br>
> +# SPDX-License-Identifier: BSD-3-Clause<br>
> +# Copyright (c) 2023 University of New Hampshire<br>
> +<br>
> +# Recommended Resources:<br>
> +# All:<br>
> +# ~100 GB of disk space: These are not minimal containers, they<br>
> +# have full distros in them minus the kernel.<br>
> +# With ABI images, expect 10 GB per distro per<br>
> +# platform. Without, it's closer to 2 GB per distro<br>
> +# per platform.<br>
> +#<br>
> +# No ABI:<br>
> +# Serial Build (make -j 1): Should run on a laptop.<br>
> +# Parallel build (make -j $(nproc)): 1 GB of free ram per job should be good enough.<br>
> +# ABI:<br>
> +# Time: If you are building more than four distros, or you have one distro that is built under<br>
> +# emulation (x86 host + arm container or the inverse), it may be best to run it overnight.<br>
> +# Some versions of qemu + podman will try to compile with a single thread under emulation,<br>
> +# which can cause what should be an hour-long compile to turn into a 8+ hour compile.<br>
> +# Serial Build (make -j 1): 6 GB of free ram should be fine<br>
> +# Parallel build (make -j $(nproc)): 6 GB of free ram per job. You may be compiling ~20 versions of DPDK at the same time, with some under emulation.<br>
> +#<br>
> +<br>
> +<br>
> +############ Arguments #############<br>
> +# Set to 'Y' to override distro detection<br>
> +DPDK_CI_CONTAINERS_ON_RHEL?=$(shell (test -f /etc/redhat-release && grep -q 'Red Hat Enterprise Linux' /etc/redhat-release && echo 'Y') || echo 'N')<br>
> +<br>
> +# If set to 'Y' and any container is detected as unbuildable, fail the build.<br>
> +DPDK_CI_CONTAINERS_FAIL_ON_UNBUILDABLE?=N<br>
> +<br>
> +# If set to 'Y', build the ABIs for specificed DPDK versions and embed them<br>
<br>
If you agree, I can fix this to specified when committing to the repo.<br>
<br>
> +# in the container<br>
> +DPDK_CI_CONTAINERS_BUILD_ABI?=N<br>
> +<br>
> +# If set to 'Y', the "latest" tag for all images will be omitted. Intended for testing changes to your inventory.<br>
> +DPDK_CI_CONTAINERS_NO_LATEST_TAG?=N<br>
> +<br>
> +# If set to 'Y', will build containers that rely on the Coverity Scan tool.<br>
> +DPDK_CI_CONTAINERS_COVERITY?=N<br>
> +<br>
> +# The path to Coverity Scan binaries. These will be installed inside the container.<br>
> +# This field is only required if the Coverity flag is enabled.<br>
> +# DPDK_CI_CONTAINERS_COVERITY_PATH?=/opt/dpdklab/coverity<br>
> +<br>
> +# If set to a non-empty value, overrides the auto-generated date tag with the value.<br>
> +# DPDK_CI_CONTAINERS_DATE_TAG_OVERRIDE=70-01-01<br>
> +<br>
> +# If set to 'Y', build libabigail from source for distros that do not have it.<br>
> +# If DPDK_CI_CONTAINERS_BUILD_ABI='Y', then this is always enabled.<br>
> +ifeq ($(DPDK_CI_CONTAINERS_BUILD_ABI), Y)<br>
> +DPDK_CI_CONTAINERS_BUILD_LIBABIGAIL=Y<br>
> +else<br>
> +DPDK_CI_CONTAINERS_BUILD_LIBABIGAIL?=N<br>
> +endif<br>
> +<br>
> +# If set to an integer value, this will restrict the count of Ninja workers performing the ABI build to the given integer.<br>
> +# The argument is benign if DPDK_CI_CONTANERS_BUILD_ABI is 'N'.<br>
> +# DPDK_CI_CONTAINERS_NINJA_WORKERS?=16<br>
> +<br>
> +# If set to 'Y', only build containers matching the host architecture<br>
> +DPDK_CI_CONTAINERS_ONLY_HOST_ARCH?=N<br>
> +<br>
> +# If set to 'Y', assumes only host arch and disables the push_manifests target.<br>
> +DPDK_CI_CONTAINERS_IS_BUILDER?=N<br>
> +<br>
> +# Used to set the python interpreter<br>
> +DPDK_CI_CONTAINERS_PYTHON3_CMD?=python3.8<br>
> +<br>
> +# The base program to use to build individual containers.<br>
> +DPDK_CI_CONTAINER_BUILDER_PROGRAM?=podman<br>
> +<br>
> +# The url of the git repository to pull libabigail from<br>
> +DPDK_CI_CONTAINERS_LIBABIGAIL_CLONE_URL?=git://<a href="http://sourceware.org/git/libabigail.git" rel="noreferrer" target="_blank">sourceware.org/git/libabigail.git</a><br>
> +<br>
> +# The url of the git repository to pull DPDK from<br>
> +DPDK_CI_CONTAINERS_DPDK_CLONE_URL?=<a href="https://dpdk.org/git/dpdk" rel="noreferrer" target="_blank">https://dpdk.org/git/dpdk</a><br>
> +<br>
> +# The url of the git repository to pull the DPDK CI scripts from.<br>
> +DPDK_CI_CONTAINERS_DPDK_CI_CLONE_URL?=<a href="https://dpdk.org/git/tools/dpdk-ci" rel="noreferrer" target="_blank">https://dpdk.org/git/tools/dpdk-ci</a><br>
> +<br>
> +# The url of the git repository to pull DPDK stable from<br>
> +DPDK_CI_CONTAINERS_DPDK_STABLE_CLONE_URL?=<a href="https://dpdk.org/git/dpdk-stable" rel="noreferrer" target="_blank">https://dpdk.org/git/dpdk-stable</a><br>
> +<br>
> +# The tag to apply to the built container builder image<br>
> +DPDK_CI_CONTAINERS_CONTAINER_BUILDER_TAG?=dpdk_ci_container_builder<br>
> +<br>
> +# Extra arguments to add to the push command, can be used for credentials<br>
> +DPDK_CI_CONTAINERS_EXTRA_PUSH_ARGS?=<br>
> +<br>
> +# Provide the hostname of the registry to push up to<br>
> +DPDK_CI_CONTAINERS_REGISTRY_HOSTNAME?=localhost<br>
> +<br>
> +# The path to a directory to be recursively copied to $(DPDK_CI_CONTAINERS_CONTEXT_DIRECTORY). Not used if unset.<br>
> +#DPDK_CI_CONTAINERS_EXTRA_SCRIPTS_PATH?=<br>
> +<br>
> +DPDK_CI_CONTAINERS_CONTEXT_DIRECTORY?=$(CURDIR)/container_context<br>
> +############ End Arguments #############<br>
> +<br>
> +############ Internal Variables #############<br>
> +SCRIPT_ARGS=--output-dir "$(DPDK_CI_CONTAINERS_CONTEXT_DIRECTORY)"<br>
> +<br>
> +ifeq ($(DPDK_CI_CONTAINERS_ON_RHEL), Y)<br>
> + SCRIPT_ARGS +=--rhel<br>
> +endif<br>
> +<br>
> +ifeq ($(DPDK_CI_CONTAINERS_FAIL_ON_UNBUILDABLE), Y)<br>
> + SCRIPT_ARGS +=--fail-on-unbuildable<br>
> +endif<br>
> +<br>
> +ifeq ($(DPDK_CI_CONTAINERS_BUILD_ABI), Y)<br>
> + SCRIPT_ARGS +=--build-abi<br>
> +endif<br>
> +<br>
> +ifeq ($(DPDK_CI_CONTAINERS_BUILD_LIBABIGAIL), Y)<br>
> + SCRIPT_ARGS +=--build-libabigail<br>
> +endif<br>
> +<br>
> +ifeq ($(DPDK_CI_CONTAINERS_ONLY_HOST_ARCH), Y)<br>
> + SCRIPT_ARGS +=--host-arch-only<br>
> +endif<br>
> +<br>
> +ifeq ($(DPDK_CI_CONTAINERS_NO_LATEST_TAG), Y)<br>
> + SCRIPT_ARGS +=--omit-latest<br>
> +endif<br>
> +<br>
> +ifeq ($(DPDK_CI_CONTAINERS_IS_BUILDER), Y)<br>
> + SCRIPT_ARGS +=--builder-mode<br>
> +endif<br>
> +<br>
> +ifneq ($(DPDK_CI_CONTAINERS_DATE_TAG_OVERRIDE),)<br>
> + SCRIPT_ARGS +=--date $(DPDK_CI_CONTAINERS_DATE_TAG_OVERRIDE)<br>
> +endif<br>
> +<br>
> +ifneq ($(DPDK_CI_CONTAINERS_NINJA_WORKERS),)<br>
> + SCRIPT_ARGS +=--ninja-workers $(DPDK_CI_CONTAINERS_NINJA_WORKERS)<br>
> +endif<br>
> +<br>
> +ifeq ($(DPDK_CI_CONTAINERS_COVERITY), Y)<br>
> + SCRIPT_ARGS +=--coverity<br>
> +endif<br>
> +<br>
> +SCRIPT_DIRECTORY=$(CURDIR)/template_engine<br>
> +<br>
> +LIBABIGAIL_DIRECTORY=$(DPDK_CI_CONTAINERS_CONTEXT_DIRECTORY)/libabigail<br>
> +DPDK_DIRECTORY=$(DPDK_CI_CONTAINERS_CONTEXT_DIRECTORY)/dpdk<br>
> +DPDK_CI_DIRECTORY=$(DPDK_CI_CONTAINERS_CONTEXT_DIRECTORY)/dpdk-ci<br>
> +DPDK_STABLE_DIRECTORY=$(DPDK_CI_CONTAINERS_CONTEXT_DIRECTORY)/dpdk-stable<br>
> +<br>
> +DOCKERFILE=$(DPDK_CI_CONTAINERS_CONTEXT_DIRECTORY)/Dockerfile<br>
> +<br>
> +MAKE_DOCKERFILE_SCRIPT=$(SCRIPT_DIRECTORY)/make_dockerfile.py<br>
> +MAKE_DOCKERFILE_COMMAND=$(DPDK_CI_CONTAINERS_PYTHON3_CMD) $(MAKE_DOCKERFILE_SCRIPT)<br>
> +<br>
> +TEMPLATE_FILE_DIRECTORY=$(SCRIPT_DIRECTORY)/templates<br>
> +DOCKER_CONTAINER_TEMPLATE_DIR=$(TEMPLATE_FILE_DIRECTORY)/containers<br>
> +<br>
> +INVENTORY_FILE=$(SCRIPT_DIRECTORY)/inventory.yaml<br>
> +<br>
> +EXTRA_SCRIPTS_DIRECTORY=$(DPDK_CI_CONTAINERS_CONTEXT_DIRECTORY)/scripts<br>
> +<br>
> +COVERITY_DIRECTORY=$(DPDK_CI_CONTAINERS_CONTEXT_DIRECTORY)/coverity<br>
> +<br>
> +GIT_FETCH_ARGS=--all --tags<br>
> +<br>
> +CONTAINER_BUILDER_DOCKERFILE=$(CURDIR)/container_builder.dockerfile<br>
> +<br>
> +export<br>
> +############ End Internal Variables #############<br>
> +<br>
> +.PHONY: build push push_images push_manifests make_docker_files_in_container build_builder_container docker_deps extra_scripts libabigail dpdk dpdk-ci coverity clean_container_files clean<br>
> +<br>
> +build: make_docker_files_in_container external_files<br>
> + $(MAKE) -C $(DPDK_CI_CONTAINERS_CONTEXT_DIRECTORY) build_all<br>
> +<br>
> +push_images: make_docker_files_in_container external_files<br>
> + $(MAKE) -C $(DPDK_CI_CONTAINERS_CONTEXT_DIRECTORY) push_image_all<br>
> +<br>
> +push_manifests: make_docker_files_in_container<br>
> + $(MAKE) -C $(DPDK_CI_CONTAINERS_CONTEXT_DIRECTORY) push_manifest_all<br>
> +<br>
> +push: push_images push_manifests<br>
> +<br>
> +make_docker_files_in_container: build_builder_container $(DPDK_CI_CONTAINERS_CONTEXT_DIRECTORY)<br>
> + $(DPDK_CI_CONTAINER_BUILDER_PROGRAM) run --rm -v $(CURDIR):/container_workspace:z -v $(DPDK_CI_CONTAINERS_CONTEXT_DIRECTORY):/container_workspace/container_context:z \<br>
> + -e DPDK_CI_CONTAINERS_ON_RHEL=$(DPDK_CI_CONTAINERS_ON_RHEL) \<br>
> + -e DPDK_CI_CONTAINERS_BUILD_LIBABIGAIL=$(DPDK_CI_CONTAINERS_BUILD_LIBABIGAIL) \<br>
> + -e DPDK_CI_CONTAINERS_BUILD_ABI=$(DPDK_CI_CONTAINERS_BUILD_ABI) \<br>
> + -e DPDK_CI_CONTAINERS_FAIL_ON_UNBUILDABLE=$(DPDK_CI_CONTAINERS_FAIL_ON_UNBUILDABLE) \<br>
> + -e DPDK_CI_CONTAINERS_REGISTRY_HOSTNAME='$(DPDK_CI_CONTAINERS_REGISTRY_HOSTNAME)' \<br>
> + -e DPDK_CI_CONTAINERS_ONLY_HOST_ARCH='$(DPDK_CI_CONTAINERS_ONLY_HOST_ARCH)' \<br>
> + -e DPDK_CI_CONTAINERS_NO_LATEST_TAG='$(DPDK_CI_CONTAINERS_NO_LATEST_TAG)' \<br>
> + -e DPDK_CI_CONTAINERS_IS_BUILDER='$(DPDK_CI_CONTAINERS_IS_BUILDER)' \<br>
> + -e DPDK_CI_CONTAINERS_DATE_TAG_OVERRIDE='$(DPDK_CI_CONTAINERS_DATE_TAG_OVERRIDE)' \<br>
> + -e DPDK_CI_CONTAINERS_NINJA_WORKERS='$(DPDK_CI_CONTAINERS_NINJA_WORKERS)' \<br>
> + -e DPDK_CI_CONTAINERS_COVERITY='$(DPDK_CI_CONTAINERS_COVERITY)' \<br>
> + $(DPDK_CI_CONTAINERS_CONTAINER_BUILDER_TAG) make docker_deps<br>
> +<br>
> +external_files: $(DPDK_CI_CONTAINERS_CONTEXT_DIRECTORY) extra_scripts coverity<br>
> +<br>
> +build_builder_container:<br>
> + $(DPDK_CI_CONTAINER_BUILDER_PROGRAM) build -f $(CONTAINER_BUILDER_DOCKERFILE) -t $(DPDK_CI_CONTAINERS_CONTAINER_BUILDER_TAG) $(CURDIR)<br>
> +<br>
> +docker_deps: $(DOCKERFILE) deps extra_scripts<br>
> + chmod 666 $(DPDK_CI_CONTAINERS_CONTEXT_DIRECTORY)/*.dockerfile<br>
> +<br>
> +$(DOCKERFILE): $(INVENTORY_FILE) $(DPDK_CI_CONTAINERS_CONTEXT_DIRECTORY) deps $(MAKE_DOCKERFILE_SCRIPT) $(shell find $(DOCKER_CONTAINER_TEMPLATE_DIR) -type f)<br>
> + cd $(SCRIPT_DIRECTORY) && $(MAKE_DOCKERFILE_COMMAND) $(SCRIPT_ARGS)<br>
> +<br>
> +deps: $(DPDK_CI_CONTAINERS_CONTEXT_DIRECTORY) dpdk dpdk-ci libabigail dpdk-stable<br>
> +<br>
> +extra_scripts: $(DPDK_CI_CONTAINERS_CONTEXT_DIRECTORY) $(EXTRA_SCRIPTS_DIRECTORY) $(DPDK_CI_CONTAINERS_EXTRA_SCRIPTS_PATH)<br>
> +ifdef DPDK_CI_CONTAINERS_EXTRA_SCRIPTS_PATH<br>
> + cp -pur $(DPDK_CI_CONTAINERS_EXTRA_SCRIPTS_PATH)/* $(EXTRA_SCRIPTS_DIRECTORY)<br>
> +endif<br>
> +<br>
> +# Clone libabigail source<br>
> +libabigail: $(DPDK_CI_CONTAINERS_CONTEXT_DIRECTORY)<br>
> + git -C $(LIBABIGAIL_DIRECTORY) fetch $(GIT_FETCH_ARGS) || git clone $(DPDK_CI_CONTAINERS_LIBABIGAIL_CLONE_URL) $(LIBABIGAIL_DIRECTORY)<br>
> + git -C $(LIBABIGAIL_DIRECTORY) describe --tags `git -C $(LIBABIGAIL_DIRECTORY) rev-list --tags --max-count=1` | xargs -n 1 git -C $(LIBABIGAIL_DIRECTORY) checkout<br>
> +<br>
> +# Clone DPDK source<br>
> +dpdk: $(DPDK_CI_CONTAINERS_CONTEXT_DIRECTORY)<br>
> + git -C $(DPDK_DIRECTORY) fetch $(GIT_FETCH_ARGS) || git clone $(DPDK_CI_CONTAINERS_DPDK_CLONE_URL) $(DPDK_DIRECTORY)<br>
> +<br>
> +# Clone DPDK CI tools source.<br>
> +dpdk-ci: $(DPDK_CI_CONTAINERS_CONTEXT_DIRECTORY)<br>
> + git -C $(DPDK_CI_DIRECTORY) fetch $(GIT_FETCH_ARGS) || git clone $(DPDK_CI_CONTAINERS_DPDK_CI_CLONE_URL) $(DPDK_CI_DIRECTORY)<br>
> +<br>
> +# Copy the Coverity Scan binaries from a source into the context directory.<br>
> +coverity: $(DPDK_CI_CONTAINERS_CONTEXT_DIRECTORY) $(COVERITY_DIRECTORY)<br>
> +ifeq ($(DPDK_CI_CONTAINERS_COVERITY),Y)<br>
> +ifndef DPDK_CI_CONTAINERS_COVERITY_PATH<br>
> + exit 1 # The coverity path must be set if building Coverity containers is enabled.<br>
> +else<br>
> + cp -pur $(DPDK_CI_CONTAINERS_COVERITY_PATH)/* $(COVERITY_DIRECTORY)<br>
> +endif<br>
> +else<br>
> + # Coverity is disabled for this run.<br>
> +endif<br>
> +<br>
> +dpdk-stable: $(DPDK_CI_CONTAINERS_CONTEXT_DIRECTORY)<br>
> + git -C $(DPDK_STABLE_DIRECTORY) fetch $(GIT_FETCH_ARGS) || git clone $(DPDK_CI_CONTAINERS_DPDK_STABLE_CLONE_URL) $(DPDK_STABLE_DIRECTORY)<br>
> +<br>
> +$(EXTRA_SCRIPTS_DIRECTORY):<br>
> + mkdir -p $(EXTRA_SCRIPTS_DIRECTORY)<br>
> +<br>
> +$(COVERITY_DIRECTORY):<br>
> + mkdir -p $(COVERITY_DIRECTORY)<br>
> +<br>
> +$(DPDK_CI_CONTAINERS_CONTEXT_DIRECTORY):<br>
> + mkdir -p $(DPDK_CI_CONTAINERS_CONTEXT_DIRECTORY)<br>
> +<br>
> +clean_container_files:<br>
> + rm $(DOCKERFILE)<br>
> +<br>
> +clean:<br>
> + rm -rf $(DPDK_CI_CONTAINERS_CONTEXT_DIRECTORY)<br>
<br>
</blockquote></div><br clear="all"><br><span class="gmail_signature_prefix">-- </span><br><div dir="ltr" class="gmail_signature"><div dir="ltr"><div><div><b><span style="background-color:rgb(255,255,255)"><span style="color:rgb(102,102,102)">Adam Hassick</span></span></b><br></div><span style="color:rgb(102,102,102)"></span></div><div><span style="color:rgb(102,102,102)">Senior Developer</span></div><div><span style="color:rgb(102,102,102)"><span style="color:rgb(11,83,148)"><span style="background-color:rgb(255,255,255)">UNH InterOperability Lab</span></span></span><span style="color:rgb(102,102,102)"></span></div><div><span style="color:rgb(102,102,102)"><a href="mailto:ahassick@iol.unh.edu" target="_blank">ahassick@iol.unh.edu</a><br></span></div><div><span style="color:rgb(102,102,102)"><a href="https://www.iol.unh.edu/" target="_blank">iol.unh.edu</a><br></span></div>+1 (603) 475-8248<br></div></div>