PROJECT := ortools BUILD_SYSTEM := bazel BRANCH := $(shell git rev-parse --abbrev-ref HEAD) SHA1 := $(shell git rev-parse --verify HEAD) # General commands .PHONY: help BOLD=\e[1m RESET=\e[0m help: @echo -e "${BOLD}SYNOPSIS${RESET}" @echo -e "\tmake [NOCACHE=1]" @echo @echo -e "${BOLD}DESCRIPTION${RESET}" @echo -e "\ttest build inside docker container to have a reproductible build." @echo @echo -e "${BOLD}MAKE TARGETS${RESET}" @echo -e "\t${BOLD}help${RESET}: display this help and exit." @echo @echo -e "\t${BOLD}${RESET}: build all docker images." @echo -e "\t${BOLD}_${RESET}: build the docker image for a specific distro." @echo -e "\t${BOLD}save_${RESET}: Save all docker images." @echo -e "\t${BOLD}save__${RESET}: Save the docker image for a specific distro." @echo -e "\t${BOLD}sh__${RESET}: run a container using the docker image (debug purpose)." @echo @echo -e "\t${BOLD}${RESET}:" @echo -e "\t\t${BOLD}env${RESET}" @echo -e "\t\t${BOLD}devel${RESET}" @echo -e "\t\t${BOLD}build${RESET}" @echo -e "\t\t${BOLD}test${RESET}" @echo @echo -e "\t${BOLD}${RESET}:" @echo -e "\t\t${BOLD}alpine${RESET} (edge)" @echo -e "\t\t${BOLD}archlinux${RESET} (latest)" @echo -e "\t\t${BOLD}centos${RESET} (latest)" @echo -e "\t\t${BOLD}debian${RESET} (latest)" @echo -e "\t\t${BOLD}fedora${RESET} (latest)" @echo -e "\t\t${BOLD}opensuse${RESET} (tumbleweed)" @echo -e "\t\t${BOLD}ubuntu${RESET} (rolling)" @echo -e "\te.g. 'make ubuntu_test'" @echo @echo -e "\t${BOLD}clean${RESET}: Remove cache and ALL docker images." @echo -e "\t${BOLD}clean_${RESET}: Remove cache and docker images for the specified distro." @echo @echo -e "\t${BOLD}NOCACHE=1${RESET}: use 'docker build --no-cache' when building container (default use cache)." @echo @echo -e "branch: $(BRANCH)" @echo -e "sha1: $(SHA1)" # Need to add cmd_distro to PHONY otherwise target are ignored since they do not # contain recipe (using FORCE do not work here) .PHONY: all all: build # Delete all implicit rules to speed up makefile MAKEFLAGS += --no-builtin-rules .SUFFIXES: # Remove some rules from gmake that .SUFFIXES does not remove. SUFFIXES = # Keep all intermediate files # ToDo: try to remove it later .SECONDARY: # Docker image name prefix. IMAGE := ${PROJECT}/${BUILD_SYSTEM} ifdef NOCACHE DOCKER_BUILD_CMD := docker build --no-cache else DOCKER_BUILD_CMD := docker build endif DOCKER_RUN_CMD := docker run --rm --init --net=host # Currently supported distro DISTROS = alpine archlinux centos debian fedora opensuse ubuntu # $* stem # $< first prerequist # $@ target name STAGES = env devel build test define make-stage-target = #$$(info STAGE: $1) .PHONY: $1 #$$(info Create targets: $1 $(addsuffix _$1, $(DISTROS)).) targets_$1 = $(addsuffix _$1, $(DISTROS)) .PHONY: $(targets_$1) $1: $$(targets_$1) $$(targets_$1): %_$1: docker/%/Dockerfile #@docker image rm -f ${IMAGE}:$$*_$1 2>/dev/null ${DOCKER_BUILD_CMD} --target=$1 --tag ${IMAGE}:$$*_$1 -f $$< .. #$$(info Create targets: save_$1 $(addprefix save_, $(addsuffix _$1, $(DISTROS))) (debug).) save_targets_$1 = $(addprefix save_, $(addsuffix _$1, $(DISTROS))) .PHONY: save_$1 $(save_targets_$1) save_$1: $$(save_targets_$1) $$(save_targets_$1): save_%_$1: cache/%/docker_$1.tar cache/%/docker_$1.tar: %_$1 @rm -f $$@ mkdir -p cache/$$* docker save ${IMAGE}:$$*_$1 -o $$@ #$$(info Create targets: $(addprefix sh_, $(addsuffix _$1, $(DISTROS))) (debug).) sh_targets_$1 = $(addprefix sh_, $(addsuffix _$1, $(DISTROS))) .PHONY: $(sh_targets_$1) $$(sh_targets_$1): sh_%_$1: %_$1 ${DOCKER_RUN_CMD} -it --name ${PROJECT}_${BUILD_SYSTEM}_$$*_$1 ${IMAGE}:$$*_$1 #$$(info Create targets: $(addprefix clean_, $(addsuffix _$1, $(DISTROS))).) clean_targets_$1 = $(addprefix clean_, $(addsuffix _$1, $(DISTROS))) .PHONY: clean_$1 $(clean_targets_$1) clean_$1: $$(clean_targets_$1) $$(clean_targets_$1): clean_%_$1: docker image rm -f ${IMAGE}:$$*_$1 2>/dev/null rm -f cache/$$*/docker_$1.tar endef $(foreach stage,$(STAGES),$(eval $(call make-stage-target,$(stage)))) ## CLEAN ## clean_targets = $(addprefix clean_, $(DISTROS)) .PHONY: clean $(clean_targets) clean: $(clean_targets) docker container prune -f docker image prune -f -rmdir cache $(clean_targets): clean_%: $(addprefix clean_%_, $(STAGES)) -rmdir cache/$* .PHONY: distclean distclean: clean -docker container rm -f $$(docker container ls -aq) -docker image rm -f $$(docker image ls -aq)