TARGETS := $(patsubst ./%/,%,$(dir $(shell find -L . -maxdepth 2 -mindepth 2 -type f -and -name Makefile))) .PHONY: all all: login $(TARGETS) include config.mk $(foreach target,$(TARGETS),$(eval include $(target)/Makefile)) container_image_name = $(REGISTRY_DOMAIN)/$(REGISTRY_USER)/$(CONTAINER_NAME_PREFIX)$(target) app_version = $(shell head -n 1 $(target)/version) remove_last_version_part = $(shell a="$(1)"; [ "$(1)" = "$${a%.*}" ] && echo "" || echo "$${a%.*}") all_versions = $(if $(1),$(1) $(call all_versions,$(call remove_last_version_part,$(1)))) tag_alpine_version_parts := alpine $(addprefix alpine,$(call all_versions,$(ALPINE_VERSION))) tag_app_version_parts = $(call all_versions,$(app_version)) tags = $(tag_app_version_parts) $(tag_alpine_version_parts)\ $(foreach app_part,$(tag_app_version_parts),$(addprefix $(app_part)-,$(tag_alpine_version_parts))) docker_context = $(if $(DOCKER_CONTEXT_$(target)),$(DOCKER_CONTEXT_$(target)),$(target)) define build_rule = .PHONY: build_$(target) build_$(target): podman build \ -t $(container_image_name):latest \ --build-arg "ALPINE_VERSION=$(ALPINE_VERSION)" \ --build-arg "VERSION=$(app_version)" \ $(docker_context) endef define tag_rule = .PHONY: tag_$(target) tag_$(target): podman tag $(container_image_name):latest $(addprefix $(container_image_name):,$(tags)) endef define push_rule = .PHONY: push_$(target) push_$(target): login podman push "$(container_image_name):latest" $(foreach tag,$(tags),podman push $(container_image_name):$(tag);) endef define target_rule = .PHONY: $(target) $(target): prepare_$(target) build_$(target) tag_$(target) push_$(target) endef .PHONY: login login: podman login $(REGISTRY_DOMAIN) $(foreach target,$(TARGETS),$(eval $(target_rule))) $(foreach target,$(TARGETS),$(eval $(build_rule))) $(foreach target,$(TARGETS),$(eval $(tag_rule))) $(foreach target,$(TARGETS),$(eval $(push_rule))) clean: $(foreach target,$(TARGETS),clean_$(target))