default:
ifeq ($(CI),)
ifneq ($(V),1)
Q = @
endif
endif
ifneq ($(CI),)
REGISTRY_AUTH_FILE ?= $(HOME)/.docker/config.json
export REGISTRY_AUTH_FILE
endif
_buildmk_path := $(lastword $(MAKEFILE_LIST))
TERM ?= dumb
_tput = $(shell command -v tput)
ifneq ($(_tput),)
_log_before = if test -t 1; then $(_tput) -T $(TERM) setaf 14; fi
_log_after = if test -t 1; then $(_tput) -T $(TERM) sgr0; fi
else
_log_before = :
_log_after = :
endif
define _cmd =
@$(if $(_log_cmd_$(1)), $(_log_before);printf ' %-9s %s\n' $(_log_cmd_$(1));$(_log_after);)
$(_cmd_$(1))
endef
define _cmd_clean =
$(Q)rm -rf -- $(CLEANUP_FILES)
endef
_log_cmd_clean = CLEAN
.PHONY: clean
clean:
$(call _cmd,clean)
ARCHIVE_PREFIX ?= ./
_archive_prefix := $(patsubst %/,%,$(patsubst /%,%,$(ARCHIVE_PREFIX)))/
GIT ?= git
_git = $(shell command -v $(GIT))
_git_working_copy_clean = $(_git) diff-index --quiet HEAD
CURL ?= curl
_curl = $(shell command -v $(CURL))
ifneq ($(SOURCE_ARCHIVE),)
CLEANUP_FILES += $(SOURCE_ARCHIVE)
SOURCE_ARCHIVE_PATH ?= .
ifeq ($(_git),)
$(SOURCE_ARCHIVE):
$(error Git does not appear to be installed)
else
GIT_HEAD_REF := $(shell $(_git) rev-parse --symbolic-full-name HEAD)
GIT_TOP_DIR := $(shell $(_git) rev-parse --show-toplevel)
GIT_HEAD_REF_FILE := $(shell $(_git) rev-parse --git-path $(GIT_HEAD_REF))
GIT_HEAD_REF_FILE := $(shell if [ -f $(GIT_HEAD_REF_FILE) ]; then \
echo $(GIT_HEAD_REF_FILE); \
else \
echo $(GIT_TOP_DIR)/$(GIT_HEAD_REF_FILE); \
fi)
define _cmd_source_archive =
$(Q)if ! $(_git_working_copy_clean); then \
echo >&2 "*** NOTE - These uncommitted changes aren't included in $@: ***"; \
$(_git) status --short; \
fi; \
set -u && \
tmpdir=$$(pwd)/$$(mktemp -d submodules.XXXXX) && \
trap "rm -rf -- \"$$tmpdir\"" EXIT INT TERM && \
(cd "$(GIT_TOP_DIR)" && \
$(_git) archive \
-o "$(CURDIR)/$@" \
--prefix="$(_archive_prefix)" \
HEAD^{tree} $(SOURCE_ARCHIVE_PATH) && \
$(_git) submodule sync && \
$(_git) submodule update --init && \
$(_git) submodule --quiet foreach 'echo $$path' | while read path; do \
match=$$(find $(SOURCE_ARCHIVE_PATH) -samefile $$path); \
if [ -n "$$match" ]; then \
(cd "$$path" && \
$(_git) archive \
-o "$$tmpdir/submodule.tar" \
--prefix="$(_archive_prefix)$$path/" \
HEAD^{tree} . && \
tar --concatenate -f "$(CURDIR)/$@" "$$tmpdir/submodule.tar"); \
fi \
done) && \
rm -rf -- "$$tmpdir"
endef
_log_cmd_source_archive = SOURCE $@
$(SOURCE_ARCHIVE): $(GIT_HEAD_REF_FILE)
$(call _cmd,source_archive)
endif endif
NODE = node
PACKAGE_JSON ?= package.json
NODE_MODULES ?= $(dir $(PACKAGE_JSON))node_modules/.mark
$(NODE_MODULES): $(PACKAGE_JSON)
$(Q)(cd $(dir $<) && \
if command -v yarn >/dev/null; then \
yarn; \
elif command -v npm >/dev/null; then \
npm install; \
else \
echo >&2 "Neither yarn nor npm is available"; \
exit 1; \
fi; \
) && touch $@
ifneq ($(COMPILED_ARCHIVE),)
CLEANUP_FILES += $(COMPILED_ARCHIVE)
define _cmd_compile_archive =
$(Q)set -u && \
tmpdir=$$(pwd)/$$(mktemp -d compilation.XXXXX) && \
trap "rm -rf -- \"$$tmpdir\"" EXIT INT TERM && \
(tar -C "$$tmpdir" -xf $(SOURCE_ARCHIVE) && \
(cd "$$tmpdir"/$(_archive_prefix) && $(COMPILE_COMMAND)) && \
tar -C "$$tmpdir" -cf $(COMPILED_ARCHIVE) $(_archive_prefix))
rm -rf -- "$$tmpdir"
endef
_log_cmd_compile_archive = COMPILE $(COMPILED_ARCHIVE)
$(COMPILED_ARCHIVE): $(SOURCE_ARCHIVE)
$(call _cmd,compile_archive)
endif
define _cmd_image =
@$(if $(_log_cmd_image_$(1)), $(_log_before);printf ' %-9s %s\n' $(_log_cmd_image_$(1));$(_log_after);)
$(Q)if command -v podman >/dev/null >/dev/null; then \
$(_cmd_image_podman_$(1)); \
elif command -v docker >/dev/null; then \
$(_cmd_image_docker_$(1)); \
else \
echo >&2 "Neither podman nor docker is available"; \
exit 1; \
fi
endef
ifneq ($(IMAGE_REPO),)
.PHONY: build save load run-image remove-local-image publish build-publish login temp-publish temp-pull
IMAGE_DOCKERFILE ?= Dockerfile
IMAGE_ARCHIVE ?= dummy.tar
CLEANUP_FILES += $(IMAGE_ARCHIVE)
ifeq ($(_git),)
build-publish $(IMAGE_ARCHIVE) build save publish:
$(error Git does not appear to be installed, images cannot be tagged)
else
CI_COMMIT_REF_NAME ?= $(shell $(_git) rev-parse --abbrev-ref HEAD)
CI_COMMIT_REF_NAME := $(subst /,_,$(CI_COMMIT_REF_NAME))
CI_COMMIT_REF_NAME := $(subst \#,_,$(CI_COMMIT_REF_NAME))
CI_COMMIT_SHA ?= $(shell git rev-parse HEAD)
CI_PIPELINE_ID ?= no-pipeline
_host := $(shell uname -a)
_date := $(shell date +%FT%H:%M%z)
CI_PROJECT_URL ?= http://localhost.localdomain/
ifneq ($(IMAGE_TAG_PREFIX),)
_image_tag_prefix := $(patsubst %-,%,$(IMAGE_TAG_PREFIX))-
endif
IMAGE_TAG_SUFFIX ?= $(CI_COMMIT_REF_NAME)
IMAGE_LOCAL_TAG = $(_image_repo):$(_image_tag_prefix)$(CI_PIPELINE_ID)
IMAGE_TAG = $(_image_repo):$(_image_tag_prefix)$(IMAGE_TAG_SUFFIX)
_podman = podman
ifdef IMAGE_BUILD_ARGS
_image_build_args = $(IMAGE_BUILD_ARGS)
else
_image_build_args =
endif
ifdef IMAGE_BUILD_FROM
export IMAGE_BUILD_FROM
_image_build_args += --build-arg=IMAGE_BUILD_FROM
endif
ifdef IMAGE_BUILD_VOLUME
_build_volume = --volume $(IMAGE_BUILD_VOLUME):/build:ro,z
else
_build_volume =
endif
ifdef BUILDAH_RUNTIME
$(warning You should use PODMAN_RUNTIME instead of BUILDAH_RUNTIME)
endif
ifdef PODMAN_RUNTIME
_podman_run = $(_podman) --runtime=$(PODMAN_RUNTIME) run
else ifdef BUILDAH_RUNTIME
_podman_run = $(_podman) --runtime=$(BUILDAH_RUNTIME) run
else
_podman_run = $(_podman) run
endif
ifdef PODMAN_PULL
_podman_pull_args = $(PODMAN_PULL)
else
_podman_pull_args = --pull-always
endif
ifdef BUILDAH_PULL
$(error You should use PODMAN_PULL instead of BUILDAH_PULL)
endif
define _cmd_image_podman_build =
$(_podman) build $(_podman_pull_args) \
$(_build_volume) \
--file=$< \
--build-arg=BRANCH="$(CI_COMMIT_REF_NAME)" \
--build-arg=COMMIT="$(CI_COMMIT_SHA)" \
--build-arg=URL="$(CI_PROJECT_URL)" \
--build-arg=DATE="$(_date)" \
--build-arg=HOST="$(_host)" \
$(_image_build_args) \
--tag=$(IMAGE_LOCAL_TAG) \
.
endef
define _cmd_image_docker_build =
docker build --pull --no-cache \
--file=$< \
$(_build_volume) \
--build-arg=BRANCH="$(CI_COMMIT_REF_NAME)" \
--build-arg=COMMIT="$(CI_COMMIT_SHA)" \
--build-arg=URL="$(CI_PROJECT_URL)" \
--build-arg=DATE="$(_date)" \
--build-arg=HOST="$(_host)" \
$(_image_build_args) \
--tag=$(IMAGE_LOCAL_TAG) \
.
endef
_log_cmd_image_build = BUILD $(IMAGE_LOCAL_TAG)
define _cmd_image_podman_publish =
$(_podman) push $(IMAGE_LOCAL_TAG) docker://$(IMAGE_TAG) && \
$(_podman) rmi $(IMAGE_LOCAL_TAG)
endef
define _cmd_image_docker_publish =
docker tag $(IMAGE_LOCAL_TAG) $(IMAGE_TAG) && \
docker rmi $(IMAGE_LOCAL_TAG) && \
docker push $(IMAGE_TAG) && \
docker rmi $(IMAGE_TAG)
endef
_log_cmd_image_publish = PUBLISH $(IMAGE_TAG)
define _cmd_image_podman_temp-publish =
$(_podman) push $(IMAGE_LOCAL_TAG) docker://$(IMAGE_LOCAL_TAG) && \
$(_podman) rmi $(IMAGE_LOCAL_TAG)
endef
define _cmd_image_docker_temp-publish =
docker push $(IMAGE_LOCAL_TAG) && \
docker rmi $(IMAGE_LOCAL_TAG)
endef
_log_cmd_image_temp-publish = TEMP-PUBLISH $(IMAGE_LOCAL_TAG)
define _cmd_image_podman_save =
$(_podman) push $(IMAGE_LOCAL_TAG) docker-archive:$(IMAGE_ARCHIVE):$(IMAGE_LOCAL_TAG) && \
$(_podman) rmi $(IMAGE_LOCAL_TAG)
endef
define _cmd_image_docker_save =
docker save $(IMAGE_LOCAL_TAG) > $(IMAGE_ARCHIVE) && \
docker rmi $(IMAGE_LOCAL_TAG)
endef
_log_cmd_image_save = SAVE $(IMAGE_ARCHIVE)
build-publish: $(IMAGE_DOCKERFILE) $(IMAGE_FILES)
$(call _cmd_image,build)
$(call _cmd_image,test)
$(call _cmd_image,publish)
temp-publish: $(IMAGE_DOCKERFILE) $(IMAGE_FILES)
$(call _cmd_image,build)
$(call _cmd_image,test)
$(call _cmd_image,temp-publish)
$(IMAGE_ARCHIVE): $(IMAGE_DOCKERFILE) $(IMAGE_FILES)
$(call _cmd_image,build)
$(Q)rm -f -- $(IMAGE_ARCHIVE)
$(call _cmd_image,save)
build save: $(IMAGE_ARCHIVE)
publish:
$(call _cmd_image,load)
$(call _cmd_image,publish)
endif
define _cmd_image_podman_load =
podman load < $(IMAGE_ARCHIVE)
endef
define _cmd_image_docker_load =
docker load < $(IMAGE_ARCHIVE)
endef
_log_cmd_image_load = LOAD $(IMAGE_ARCHIVE)
load:
$(call _cmd_image,load)
define _cmd_image_podman_temp-pull =
$(_podman) pull docker://$(IMAGE_LOCAL_TAG)
endef
define _cmd_image_docker_temp-pull =
docker pull $(IMAGE_LOCAL_TAG)
endef
_log_cmd_image_temp-pull = TEMP-PULL $(IMAGE_LOCAL_TAG)
temp-pull:
$(call _cmd_image,temp-pull)
$(call _cmd_image,save)
define _cmd_image_podman_run =
$(_podman_run) --rm $(IMAGE_RUN_ARGS) $(IMAGE_LOCAL_TAG) $(IMAGE_RUN_CMD)
endef
define _cmd_image_docker_run =
docker run --rm $(IMAGE_RUN_ARGS) $(IMAGE_LOCAL_TAG) $(IMAGE_RUN_CMD)
endef
_log_cmd_image_run = RUN $(IMAGE_LOCAL_TAG)
run-image:
$(call _cmd_image,run)
IMAGE_TEST_ARGS ?= $(IMAGE_RUN_ARGS)
define _cmd_image_podman_test =
$(if $(IMAGE_TEST_CMD),$(_podman_run) --rm $(IMAGE_TEST_ARGS) $(IMAGE_LOCAL_TAG) $(IMAGE_TEST_CMD),:)
endef
define _cmd_image_docker_test =
$(if $(IMAGE_TEST_CMD),docker run --rm $(IMAGE_TEST_ARGS) $(IMAGE_LOCAL_TAG) $(IMAGE_TEST_CMD),:)
endef
_log_cmd_image_test = TEST $(IMAGE_LOCAL_TAG) $(if $(IMAGE_TEST_CMD),,"(skipped)")
test-image:
$(call _cmd_image,test)
define _cmd_image_podman_rmi_local =
podman rmi $(IMAGE_LOCAL_TAG)
endef
define _cmd_image_docker_rmi_local =
docker rmi $(IMAGE_LOCAL_TAG)
endef
_log_cmd_image_rmi_local = RMI $(IMAGE_LOCAL_TAG)
remove-local-image:
$(call _cmd_image,rmi_local)
endif
ifneq ($(IMAGE_REPO)$(CI_REGISTRY)$(IMAGE_REGISTRY),)
_image_repo_fixup = $(patsubst /%,localhost/%,$(IMAGE_REPO))
_image_repo_registry = $(firstword $(subst /, ,$(_image_repo_fixup)))
ifeq ($(IMAGE_REGISTRY),)
ifneq ($(CI_REGISTRY),)
IMAGE_REGISTRY = $(CI_REGISTRY)
else
IMAGE_REGISTRY = $(_image_repo_registry)
endif endif
_image_repo = $(patsubst $(_image_repo_registry)/%,$(IMAGE_REGISTRY)/%,$(_image_repo_fixup))
ifneq ($(CI),)
ifeq ($(CI_REGISTRY),$(IMAGE_REGISTRY))
_registry_login_user = -u gitlab-ci-token
endif endif
define _cmd_image_podman_login =
echo "$$CI_BUILD_TOKEN" | podman login $(_registry_login_user) --password-stdin $(IMAGE_REGISTRY)
endef
define _cmd_image_docker_login =
echo "$$CI_BUILD_TOKEN" | docker login $(_registry_login_user) --password-stdin $(IMAGE_REGISTRY)
endef
_log_cmd_image_login = LOGIN $(IMAGE_REGISTRY)
login:
$(call _cmd_image,login)
endif
RECORD_TEST_STATUS = let "_result=_result|$$?";
RETURN_TEST_STATUS = ! let _result;
ifneq ($(FEDORA_ROOT_ARCHIVE),)
CLEANUP_FILES += $(FEDORA_ROOT_ARCHIVE)
ifeq ($(FEDORA_ROOT_RELEASE),)
$(error You must set FEDORA_ROOT_RELEASE to build a Fedora root file system)
endif
define _cmd_fedora_root =
$(Q)set -u && \
tmpdir=$$(pwd)/$$(mktemp -d fedora_root.XXXXX) && \
trap "rm -rf -- \"$$tmpdir\"" EXIT INT TERM && \
dnf install \
--installroot "$$tmpdir" \
--releasever $(FEDORA_ROOT_RELEASE) \
--disablerepo "*" \
--enablerepo "fedora" \
--enablerepo "updates" \
$(FEDORA_ROOT_PACKAGES) \
glibc-minimal-langpack \
--setopt install_weak_deps=false \
--assumeyes && \
rm -rf -- \
"$$tmpdir"/var/cache \
"$$tmpdir"/var/log/dnf* && \
tar -C "$$tmpdir" -cf $(CURDIR)/$@ . && \
rm -rf -- "$$tmpdir"
endef
_log_cmd_fedora_root = DNF $@
$(FEDORA_ROOT_ARCHIVE):
$(call _cmd,fedora_root)
endif
_buildmk_baseurl = https://gitlab.com/ModioAB/build.mk
_buildmk_release_ref = main
_buildmk_repo = $(_buildmk_baseurl).git
define _cmd_update_buildmk =
$(Q)if ! $(_git_working_copy_clean); then \
echo >&2 "The git working copy needs to be clean."; \
else \
$(_git) ls-remote -q $(_buildmk_repo) $(_buildmk_release_ref) | \
(read buildmk_commit rest; \
buildmk_url=$(_buildmk_baseurl)/raw/$${buildmk_commit}/build.mk; \
$(_curl) -o $(_buildmk_path) $${buildmk_url}; \
if $(_git) diff-index --quiet HEAD; then \
echo >&2 "No changes to build.mk."; \
else \
$(_git) add $(_buildmk_path); \
printf \
"Update build.mk to %s\n\nThis version of build.mk was fetched from:\n%s" \
$${buildmk_commit} \
$${buildmk_url} | \
$(_git) commit -F -; \
fi); \
fi
endef
_log_cmd_update_buildmk = UPDATE $(_buildmk_path)
.PHONY: update-build.mk
update-build.mk:
ifeq ($(_git),)
$(error Git does not appear to be installed)
else ifeq ($(_curl),)
$(error Curl does not appear to be installed)
else
$(call _cmd,update_buildmk)
endif