| PROJECT := cpu_features |
| 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 <target> [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}amd64_<stage>${RESET}: build <stage> docker image using an Ubuntu:latest x86_64 base image." |
| @echo -e "\t${BOLD}save_amd64_<stage>${RESET}: Save the <stage> docker image." |
| @echo -e "\t${BOLD}sh_amd64_<stage>${RESET}: run a container using the <stage> docker image (debug purpose)." |
| @echo -e "\t${BOLD}clean_amd64_<stage>${RESET}: Remove cache and docker image." |
| @echo |
| @echo -e "\tWith ${BOLD}<stage>${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 -e "\t\t${BOLD}install_env${RESET}" |
| @echo -e "\t\t${BOLD}install_devel${RESET}" |
| @echo -e "\t\t${BOLD}install_build${RESET}" |
| @echo -e "\t\t${BOLD}install_test${RESET}" |
| @echo -e "\te.g. 'make amd64_build'" |
| @echo |
| @echo -e "\t${BOLD}<target>_<toolchain_stage>${RESET}: build <stage> docker image for a specific toolchain target." |
| @echo -e "\t${BOLD}save_<target>_<toolchain_stage>${RESET}: Save the <stage> docker image for a specific platform." |
| @echo -e "\t${BOLD}sh_<target>_<toolchain_stage>${RESET}: run a container using the <stage> docker image specified (debug purpose)." |
| @echo -e "\t${BOLD}clean_<target>_<toolchain_stage>${RESET}: Remove cache and docker image." |
| @echo |
| @echo -e "\tWith ${BOLD}<target>${RESET}:" |
| @echo -e "\t\t${BOLD}arm-linux-gnueabihf${RESET} (linaro toolchain)" |
| @echo -e "\t\t${BOLD}armv8l-linux-gnueabihf${RESET} (linaro toolchain)" |
| @echo -e "\t\t${BOLD}arm-linux-gnueabi${RESET} (linaro toolchain)" |
| @echo -e "\t\t${BOLD}armeb-linux-gnueabihf${RESET} (linaro toolchain)" |
| @echo -e "\t\t${BOLD}armeb-linux-gnueabi${RESET} (linaro toolchain)" |
| @echo -e "\t\t${BOLD}aarch64-linux-gnu${RESET} (linaro toolchain)" |
| @echo -e "\t\t${BOLD}aarch64_be-linux-gnu${RESET} (linaro toolchain)" |
| @echo -e "\t\t${BOLD}mips32${RESET} (codespace toolchain)" |
| @echo -e "\t\t${BOLD}mips64${RESET} (codespace toolchain)" |
| @echo -e "\t\t${BOLD}mips32el${RESET} (codespace toolchain)" |
| @echo -e "\t\t${BOLD}mips64el${RESET} (codespace toolchain)" |
| @echo |
| @echo -e "\tWith ${BOLD}<toolchain_stage>${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 -e "\te.g. 'make aarch64_test'" |
| @echo |
| @echo -e "\t${BOLD}<VM>${RESET}: build the vagrant <VM> virtual machine." |
| @echo -e "\t${BOLD}clean_<VM>${RESET}: Remove virtual machine for the specified vm." |
| @echo |
| @echo -e "\t${BOLD}<VM>${RESET}:" |
| @echo -e "\t\t${BOLD}freebsd${RESET} (FreeBSD)" |
| @echo |
| @echo -e "\t${BOLD}clean${RESET}: Remove cache and ALL docker images." |
| @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_platform 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} |
| |
| 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 |
| |
| # $* stem |
| # $< first prerequist |
| # $@ target name |
| |
| ############ |
| ## NATIVE ## |
| ############ |
| STAGES = env devel build test install_env install_devel install_build install_test |
| |
| targets_amd64 = $(addprefix amd64_, $(STAGES)) |
| .PHONY: $(targets_amd64) |
| $(targets_amd64): amd64_%: docker/amd64/Dockerfile |
| #@docker image rm -f ${IMAGE}:amd64_$* 2>/dev/null |
| ${DOCKER_BUILD_CMD} \ |
| --tag ${IMAGE}:amd64_$* \ |
| --target=$* \ |
| -f $< \ |
| .. |
| |
| #$(info Create targets: save_amd64 $(addprefix save_amd64_, $(STAGES)) (debug).) |
| save_targets_amd64 = $(addprefix save_amd64_, $(STAGES)) |
| .PHONY: $(save_targets_amd64) |
| $(save_targets_amd64): save_amd64_%: cache/amd64/docker_%.tar |
| cache/amd64/docker_%.tar: amd64_% |
| @rm -f $@ |
| mkdir -p cache/amd64 |
| docker save ${IMAGE}:amd64_$* -o $@ |
| |
| #$(info Create targets: $(addprefix sh_amd64_, $(STAGES)) (debug).) |
| sh_targets_amd64 = $(addprefix sh_amd64_, $(STAGES)) |
| .PHONY: $(sh_targets_amd64) |
| $(sh_targets_amd64): sh_amd64_%: amd64_% |
| ${DOCKER_RUN_CMD} -it --name ${IMAGE}_amd64_$* ${IMAGE}:amd64_$* |
| |
| #$(info Create targets: $(addprefix clean_amd64_, $(STAGES)).) |
| clean_targets_amd64 = $(addprefix clean_amd64_, $(STAGES)) |
| .PHONY: clean_amd64 $(clean_targets_amd64) |
| clean_amd64: $(clean_targets_amd64) |
| $(clean_targets_amd64): clean_amd64_%: |
| docker image rm -f ${IMAGE}:amd64_$* 2>/dev/null |
| rm -f cache/amd64/docker_$*.tar |
| |
| |
| ############### |
| ## TOOLCHAIN ## |
| ############### |
| TOOLCHAIN_TARGETS = \ |
| arm-linux-gnueabihf armv8l-linux-gnueabihf arm-linux-gnueabi armeb-linux-gnueabihf armeb-linux-gnueabi \ |
| aarch64-linux-gnu aarch64_be-linux-gnu \ |
| mips32 mips32el mips64 mips64el |
| TOOLCHAIN_STAGES = env devel build test |
| define toolchain-stage-target = |
| #$$(info STAGE: $1) |
| #$$(info Create targets: toolchain_$1 $(addsuffix _$1, $(TOOLCHAIN_TARGETS)).) |
| targets_toolchain_$1 = $(addsuffix _$1, $(TOOLCHAIN_TARGETS)) |
| .PHONY: toolchain_$1 $$(targets_toolchain_$1) |
| toolchain_$1: $$(targets_toolchain_$1) |
| $$(targets_toolchain_$1): %_$1: docker/toolchain/Dockerfile |
| #@docker image rm -f ${IMAGE}:$$*_$1 2>/dev/null |
| ${DOCKER_BUILD_CMD} \ |
| --tag ${IMAGE}:$$*_$1 \ |
| --build-arg TARGET=$$* \ |
| --target=$1 \ |
| -f $$< \ |
| .. |
| |
| #$$(info Create targets: save_toolchain_$1 $(addprefix save_, $(addsuffix _$1, $(TOOLCHAIN_TARGETS))) (debug).) |
| save_targets_toolchain_$1 = $(addprefix save_, $(addsuffix _$1, $(TOOLCHAIN_TARGETS))) |
| .PHONY: save_toolchain_$1 $$(save_targets_toolchain_$1) |
| save_toolchain_$1: $$(save_targets_toolchain_$1) |
| $$(save_targets_toolchain_$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, $(TOOLCHAIN_TARGETS))) (debug).) |
| sh_targets_toolchain_$1 = $(addprefix sh_, $(addsuffix _$1, $(TOOLCHAIN_TARGETS))) |
| .PHONY: $$(sh_targets_toolchain_$1) |
| $$(sh_targets_toolchain_$1): sh_%_$1: %_$1 |
| ${DOCKER_RUN_CMD} -it --name ${IMAGE}_$$*_$1 ${IMAGE}:$$*_$1 |
| |
| #$$(info Create targets: clean_toolchain_$1 $(addprefix clean_, $(addsuffix _$1, $(TOOLCHAIN_TARGETS))).) |
| clean_targets_toolchain_$1 = $(addprefix clean_, $(addsuffix _$1, $(TOOLCHAIN_TARGETS))) |
| .PHONY: clean_toolchain_$1 $$(clean_targets_toolchain_$1) |
| clean_toolchain_$1: $$(clean_targets_toolchain_$1) |
| $$(clean_targets_toolchain_$1): clean_%_$1: |
| docker image rm -f ${IMAGE}:$$*_$1 2>/dev/null |
| rm -f cache/$$*/docker_$1.tar |
| endef |
| |
| $(foreach stage,$(TOOLCHAIN_STAGES),$(eval $(call toolchain-stage-target,$(stage)))) |
| |
| ## MERGE ## |
| .PHONY: clean_toolchain |
| clean_toolchain: $(addprefix clean_toolchain_, $(TOOLCHAIN_STAGES)) |
| -rmdir $(addprefix cache/, $(TOOLCHAIN_TARGETS)) |
| |
| .PHONY: env devel build test |
| env: amd64_env toolchain_env |
| devel: amd64_devel toolchain_devel |
| build: amd64_build toolchain_build |
| test: amd64_test toolchain_test |
| |
| .PHONY: install_env install_devel install_build install_test |
| install_env: amd64_install_env |
| install_devel: amd64_install_devel |
| install_build: amd64_install_build |
| install_test: amd64_install_test |
| |
| ############# |
| ## VAGRANT ## |
| ############# |
| VMS = freebsd |
| |
| vms_targets = $(addsuffix _build, $(VMS)) |
| .PHONY: $(vms_targets) |
| $(vms_targets): %_build: vagrant/%/Vagrantfile |
| @cd vagrant/$* && vagrant destroy -f |
| cd vagrant/$* && vagrant up |
| |
| clean_vms_targets = $(addprefix clean_, $(VMS)) |
| .PHONY: clean_vms $(clean_vms_targets) |
| clean_vms: $(clean_vms_targets) |
| $(clean_vms_targets): clean_%: |
| cd vagrant/$* && vagrant destroy -f |
| -rm -rf vagrant/$*/.vagrant |
| |
| ########### |
| ## CLEAN ## |
| ########### |
| .PHONY: clean |
| clean: clean_amd64 clean_toolchain clean_vms |
| docker container prune -f |
| docker image prune -f |
| -rmdir cache |
| |
| .PHONY: distclean |
| distclean: clean |
| -docker container rm -f $$(docker container ls -aq) |
| -docker image rm -f $$(docker image ls -aq) |
| -vagrant box remove -f generic/freebsd12 |