# Variables ROOT_DIR := $(PWD) RPMS_DIR := $(ROOT_DIR)/rpms REPO_OPTIONS := --disablerepo=* --enablerepo=unkin # Automatically find all package/version directories PACKAGES := $(shell find $(RPMS_DIR) -mindepth 2 -maxdepth 2 -type d | sed "s|$(RPMS_DIR)/||" | grep -Ev '(scripts|/resources)') # Default target to build all packages and versions .PHONY: all list cache build clean all: cache $(PACKAGES) list: @echo "Builds:" @for package in $(PACKAGES); do \ echo " '$$package'"; \ done cache: echo "Refreshing DNF cache..." && \ dnf clean all && \ dnf makecache # Build specific package/version .PHONY: $(PACKAGES) $(PACKAGES): @PACKAGE_NAME=$(shell echo $(@) | cut -d/ -f1) && \ PACKAGE_VERSION=$(shell echo $(@) | cut -d/ -f2) && \ echo "Starting build $$PACKAGE_NAME/$$PACKAGE_VERSION" && \ $(MAKE) build PACKAGE_NAME=$$PACKAGE_NAME PACKAGE_VERSION=$$PACKAGE_VERSION # Build target build: @mkdir -p $(ROOT_DIR)/dist/$(PACKAGE_NAME)/ @cd $(RPMS_DIR)/$(PACKAGE_NAME) && \ export PACKAGE_RELEASE=$$(cat $(PACKAGE_VERSION)/release) && \ export PACKAGE_FULL_NAME=$(PACKAGE_NAME)-$(PACKAGE_VERSION)-$$PACKAGE_RELEASE && \ echo "Checking repos for $$PACKAGE_FULL_NAME" && \ if dnf info $$PACKAGE_FULL_NAME $(REPO_OPTIONS) > /dev/null 2>&1; then \ echo "Skipping build for $(PACKAGE_NAME) version $(PACKAGE_VERSION) (already exists in the repository)"; \ else \ echo "Building RPM for $(PACKAGE_NAME) version $(PACKAGE_VERSION)"; \ docker build \ --build-arg PACKAGE_VERSION=$(PACKAGE_VERSION) \ --build-arg PACKAGE_RELEASE=$${PACKAGE_RELEASE} \ -t $$(echo $(PACKAGE_NAME)-builder \ | tr '[:upper:]' '[:lower:]') . && \ docker create --name $(PACKAGE_NAME)-$(PACKAGE_VERSION)-builder \ $$(echo $(PACKAGE_NAME)-builder | tr '[:upper:]' '[:lower:]') && \ docker start -a $(PACKAGE_NAME)-$(PACKAGE_VERSION)-builder && \ docker cp $(PACKAGE_NAME)-$(PACKAGE_VERSION)-builder:/app/dist/. $(ROOT_DIR)/dist/$(PACKAGE_NAME)/ && \ docker rm $(PACKAGE_NAME)-$(PACKAGE_VERSION)-builder; \ fi # Clean target clean: @echo "Cleaning build artifacts..." rm -rf $(ROOT_DIR)/dist