1
0
mirror of https://github.com/falk-werner/webfuse synced 2025-06-13 12:54:15 +00:00

refactors makefile in preparation to extract common parts

This commit is contained in:
nosamad 2019-04-09 19:43:22 +02:00
parent 5d6dc552c5
commit e223a1f707
2 changed files with 95 additions and 86 deletions

181
Makefile
View File

@ -1,5 +1,11 @@
MAKEFLAGS += $(_PARALLELMFLAGS) --no-builtin-rules MAKEFLAGS += $(_PARALLELMFLAGS) --no-builtin-rules
filter_targets = $(shell echo '$2' | sed -e 's@\s@\n@g' | sed -n$(foreach REGEX,$1, -e 's@$(REGEX)@\0@p'))
filter_out_command = $(filter $1,$(foreach CMD,$1,$(shell command -v $(CMD) 2>&1 1>/dev/null || echo $(CMD))))
regex_march_distro = '$1-$2-.*'
.PHONY: default .PHONY: default
default: all default: all
@ -14,10 +20,12 @@ NPROC ?= $(shell echo '$(PARALLELMFLAGS)' | sed -n -e 's@.*-j.*\([0-9]\+\)@\1@p'
VERBOSE ?= VERBOSE ?=
BUILDVERBOSE ?= BUILDVERBOSE ?=
$(MARCH)BUILDTARGET ?= amd64-ubuntu-builder DISABLE_DEFAULT_BUILDTARGET := $(or $(MARCH),$(DISTRO))
$(DISABLE_DEFAULT_BUILDTARGET)BUILDTARGET ?= amd64-ubuntu-builder
BUILDTYPE ?= Debug BUILDTYPE ?= Debug
MARCH ?= $(call march,$(BUILDTARGET)) MARCH ?= '.*'
DISTRO ?= DISTRO ?= '.*'
FILTER ?= $(call regex_march_distro,$(MARCH),$(DISTRO))
PROJECT_NAME ?= webfuse PROJECT_NAME ?= webfuse
PROJECT_ROOT ?= . PROJECT_ROOT ?= .
@ -33,6 +41,7 @@ CONTAINER_USER ?= user
CONTAINER_GROUP ?= user CONTAINER_GROUP ?= user
CONTAINER_CGROUP_PARENT ?= CONTAINER_CGROUP_PARENT ?=
HOST_MARCH ?= $(shell dpkg --print-architecture 2>/dev/null)
HOST_CONTAINER ?= $(shell $(PROJECT_ROOT)/build/get_container_id.sh) HOST_CONTAINER ?= $(shell $(PROJECT_ROOT)/build/get_container_id.sh)
HOST_CONTAINER := $(HOST_CONTAINER) HOST_CONTAINER := $(HOST_CONTAINER)
@ -53,8 +62,6 @@ CONTAINER_OUT ?= /workspace/out
$(PORTABLE_WORSPACE)CONTAINER_PROJECT_ROOT = $(abspath $(PROJECT_ROOT)) $(PORTABLE_WORSPACE)CONTAINER_PROJECT_ROOT = $(abspath $(PROJECT_ROOT))
$(PORTABLE_WORSPACE)CONTAINER_OUT = $(abspath $(OUT)) $(PORTABLE_WORSPACE)CONTAINER_OUT = $(abspath $(OUT))
filter_out_command = $(filter $1,$(foreach CMD,$1,$(shell command -v $(CMD) 2>&1 1>/dev/null || echo $(CMD))))
DISABLE_MD5SUM ?= $(call filter_out_command,md5sum) DISABLE_MD5SUM ?= $(call filter_out_command,md5sum)
DISABLE_MD5SUM := $(DISABLE_MD5SUM) DISABLE_MD5SUM := $(DISABLE_MD5SUM)
@ -98,39 +105,27 @@ $(DISABLE_MD5SUM)$(OUT)/docker/qemu-arm-static-$(QEMU_VERSION): MD5 := 8ebd24e63
# Architecture-specific rule target configuration # Architecture-specific rule target configuration
march = $(shell echo '$1' | sed -n -e 's@\([^-]*\)-.*@\1@p') CMAKE_TARGETS += amd64-ubuntu-builder
$(OUT)/amd64-ubuntu-builder/cmake_rules.mk: TARGET := amd64-ubuntu-builder
TARGETS += $(BUILDTARGET) CMAKE_TARGETS += amd64-debian-builder
MARCH := $(MARCH) $(OUT)/amd64-debian-builder/cmake_rules.mk: TARGET := amd64-debian-builder
DISABLE_AMD64 := $(filter-out amd64,$(MARCH)) CMAKE_TARGETS += arm32v7-ubuntu-builder
$(DISABLE_AMD64)MARCHS += amd64 $(OUT)/arm32v7-ubuntu-builder/cmake_rules.mk: TARGET := arm32v7-ubuntu-builder
$(DISABLE_AMD64)$(BUILDTARGET)TARGETS += amd64-ubuntu-builder CMAKE_TARGETS += arm32v7-debian-builder
$(OUT)/amd64-ubuntu-builder/rules.mk: TARGET := amd64-ubuntu-builder $(OUT)/arm32v7-debian-builder/cmake_rules.mk: TARGET := arm32v7-debian-builder
$(DISABLE_AMD64)$(BUILDTARGET)TARGETS += amd64-debian-builder CMAKE_RULE_TARGETS += $(addsuffix /cmake_rules.mk,$(addprefix $(OUT)/,$(CMAKE_TARGETS)))
$(OUT)/amd64-debian-builder/rules.mk: TARGET := amd64-debian-builder
DISABLE_ARM32V7 := $(filter-out arm32v7,$(MARCH)) MEMCHECK_FILTER = $(call regex_march_distro,'$(HOST_MARCH)','.*')
$(DISABLE_ARM32V7)MARCHS += arm32v7
$(DISABLE_ARM32V7)$(BUILDTARGET)TARGETS += arm32v7-ubuntu-builder UBUNTU_FILTER = $(call regex_march_distro,'.*','ubuntu')
$(OUT)/arm32v7-ubuntu-builder/rules.mk: TARGET := arm32v7-ubuntu-builder UBUNTU_TARGETS = $(addprefix $(OUT)/docker/,$(call filter_targets,$(UBUNTU_FILTER),$(TARGETS)))
$(DISABLE_ARM32V7)$(BUILDTARGET)TARGETS += arm32v7-debian-builder DEBIAN_FILTER = $(call regex_march_distro,'.*','debian')
$(OUT)/arm32v7-debian-builder/rules.mk: TARGET := arm32v7-debian-builder DEBIAN_TARGETS = $(addprefix $(OUT)/docker/,$(call filter_targets,$(DEBIAN_FILTER),$(TARGETS)))
$(DISABLE_AMD64)MEMCHECK_TARGETS += $(addprefix memcheck-,$(TARGETS))
ARM_TARGETS = $(filter arm%,$(TARGETS))
$(addprefix $(OUT)/docker/,$(ARM_TARGETS)): $(OUT)/docker/qemu-arm-static-$(QEMU_VERSION)
UBUNTU_TARGETS = $(filter $(addsuffix -ubuntu%,$(MARCHS)),$(TARGETS))
$(addprefix $(OUT)/docker/,$(UBUNTU_TARGETS)): CODENAME := $(UBUNTU_CODENAME)
DEBIAN_TARGETS = $(filter $(addsuffix -debian%,$(MARCHS)),$(TARGETS))
$(addprefix $(OUT)/docker/,$(DEBIAN_TARGETS)): CODENAME := $(DEBIAN_CODENAME)
# Common rule target configuration # Common rule target configuration
@ -163,28 +158,36 @@ DOCKER_BUILDARGS += REGISTRY_PREFIX=$(REGISTRY_PREFIX)
DOCKER_BUILDFLAGS += $(addprefix --build-arg ,$(DOCKER_BUILDARGS)) DOCKER_BUILDFLAGS += $(addprefix --build-arg ,$(DOCKER_BUILDARGS))
OUT_TARGETS += $(addprefix $(OUT)/,$(TARGETS))
OUT_DIRS += $(OUT) OUT_DIRS += $(OUT)
OUT_DIRS += $(OUT)/docker OUT_DIRS += $(OUT)/docker
OUT_DIRS += $(OUT)/src OUT_DIRS += $(OUT)/src
OUT_DIRS += $(addsuffix /$(BUILDTYPE),$(OUT_TARGETS))
BUILD_TARGETS += $(addprefix build-,$(TARGETS)) CMAKE_TARGET := $(filter $(BUILDTARGET),$(CMAKE_TARGETS))
CHECK_TARGETS += $(addprefix check-,$(TARGETS)) $(CMAKE_TARGET)CMAKE_ACTIVE_TARGETS += $(CMAKE_TARGETS)
CLEAN_TARGETS += $(addprefix clean-,$(TARGETS)) CMAKE_ACTIVE_TARGETS += $(CMAKE_TARGET)
RUN_TARGETS += $(addprefix run-,$(firstword $(TARGETS)))
CMAKE_BUILD_TARGETS += $(addprefix build-,$(CMAKE_TARGETS))
CMAKE_CLEAN_TARGETS += $(addprefix clean-,$(CMAKE_TARGETS))
CMAKE_CHECK_TARGETS += $(addprefix check-,$(CMAKE_TARGETS))
CMAKE_MEMCHECK_TARGETS += $(addprefix memcheck-,$(call filter_targets,$(MEMCHECK_FILTER),$(CMAKE_TARGETS)))
CMAKE_RUN_TARGETS += $(addprefix run-,$(firstword $(CMAKE_TARGETS)))
CMAKE_DISCOVER_CC_TARGETS += $(addprefix discover-cc-,$(firstword $(CMAKE_TARGETS)))
CMAKE_TARGETS := $(call filter_targets,$(FILTER),$(CMAKE_ACTIVE_TARGETS))
CMAKE_OUT_DIRS += $(addsuffix /$(BUILDTYPE),$(addprefix $(OUT)/,$(CMAKE_TARGETS)))
EXTRACT_TARGETS += $(patsubst $(OUT)/%.tar.gz,$(OUT)/src/%,$(FETCH_TARGETS)) EXTRACT_TARGETS += $(patsubst $(OUT)/%.tar.gz,$(OUT)/src/%,$(FETCH_TARGETS))
DISCOVER_CC_TARGETS += $(addprefix discover-cc-,$(firstword $(TARGETS))) BUILD_TARGETS += $(CMAKE_BUILD_TARGETS)
RULE_TARGETS += $(addsuffix /rules.mk,$(OUT_TARGETS)) CHECK_TARGETS += $(CMAKE_CHECK_TARGETS)
MEMCHECK_TARGETS += $(CMAKE_MEMCHECK_TARGETS)
uc = $(shell echo '$1' | sed -e 's/.*/\U&/g') CLEAN_TARGETS += $(CMAKE_CLEAN_TARGETS)
RUN_TARGETS += $(CMAKE_RUN_TARGETS)
DISTRO_PREFIX = $(addsuffix _,$(call uc,$(DISTRO))) DISCOVER_CC_TARGETS += $(CMAKE_DISCOVER_CC_TARGETS)
RULE_TARGETS += $(CMAKE_RULE_TARGETS)
MARCHS := $(sort $(MARCHS)) TARGETS += $(CMAKE_TARGETS)
TARGETS := $(sort $($(DISTRO_PREFIX)TARGETS)) OUT_DIRS += $(CMAKE_OUT_DIRS)
OUT_DIRS := $(sort $(OUT_DIRS))
TARGETS := $(sort $(TARGETS))
TASKS := $(words $(if $(TARGETS),$(TARGETS),_)) TASKS := $(words $(if $(TARGETS),$(TARGETS),_))
DISBALE_OSYNC ?= $(filter 1,$(TASKS)) DISBALE_OSYNC ?= $(filter 1,$(TASKS))
@ -196,6 +199,24 @@ _NPROC = $(shell nproc)
endif endif
_PARALLELMFLAGS := $(addprefix -j,$(shell echo "$$(($(_NPROC)/$(TASKS)))")) _PARALLELMFLAGS := $(addprefix -j,$(shell echo "$$(($(_NPROC)/$(TASKS)))"))
# Makefile dependencies
MAKEDEPS += $(DOCKER)
MAKEDEPS += id
MAKEDEPS += cat
MAKEDEPS += cp
MAKEDEPS += rm
MAKEDEPS += mkdir
MAKEDEPS += sed
MAKEDEPS += chmod
MAKEDEPS += test
MAKEDEPS += touch
MAKEDEPS += curl
MAKEDEPS += tar
MAKEDEPS += gunzip
MISSING_MAKEDEPS := $(call filter_out_command,$(MAKEDEPS))
# Common macros # Common macros
echo_if_silent = VERBOSE=1 echo_if_silent = VERBOSE=1
@ -217,7 +238,7 @@ $(HOST_CONTAINER)image_run_volumes += --volume '$(realpath $(PROJECT_ROOT)):$(CO
$(HOST_CONTAINER)image_run_volumes += --volume '$(realpath $(OUT)/$1):$(CONTAINER_OUT)/$1:delegated' $(HOST_CONTAINER)image_run_volumes += --volume '$(realpath $(OUT)/$1):$(CONTAINER_OUT)/$1:delegated'
image_run_volumes += $(addprefix --volumes-from ,$2) image_run_volumes += $(addprefix --volumes-from ,$2)
image_name = $(REGISTRY_PREFIX)$(subst -,/,$1)/$(PROJECT_NAME):$(VERSION) image_name = $(REGISTRY_PREFIX)$(subst -,/,$1)/$(PROJECT_NAME)$(addprefix :,$(VERSION))
image_run = $(DOCKER) run --rm --interactive $(DOCKER_RUNFLAGS) \ image_run = $(DOCKER) run --rm --interactive $(DOCKER_RUNFLAGS) \
$(call image_run_volumes,$1,$(HOST_CONTAINER)) \ $(call image_run_volumes,$1,$(HOST_CONTAINER)) \
$(addprefix --cgroup-parent ,$(CONTAINER_CGROUP_PARENT)) \ $(addprefix --cgroup-parent ,$(CONTAINER_CGROUP_PARENT)) \
@ -233,25 +254,25 @@ image = \
$(call echo_if_silent,TARGET=$1 docker build $(call image_name,$1) $(OUT)) \ $(call echo_if_silent,TARGET=$1 docker build $(call image_name,$1) $(OUT)) \
&& $(DOCKER) build --rm $(DOCKER_BUILDFLAGS) --iidfile $@ --file $< --tag $(call image_name,$1) $(OUT) && $(DOCKER) build --rm $(DOCKER_BUILDFLAGS) --iidfile $@ --file $< --tag $(call image_name,$1) $(OUT)
configure_rule = \ cmake_configure_rule = \
$$(OUT)/$1/$$(BUILDTYPE)/CMakeCache.txt: $$(PROJECT_ROOT)/CMakeLists.txt $$(OUT)/docker/$1 | $$(OUT)/$1/$$(BUILDTYPE)/gdbserver; \ $$(OUT)/$1/$$(BUILDTYPE)/CMakeCache.txt: $$(PROJECT_ROOT)/CMakeLists.txt $$(OUT)/docker/$1 | $$(OUT)/$1/$$(BUILDTYPE)/gdbserver; \
$$(SILENT)$$(call configure,$1) $$(SILENT)$$(call cmake_configure,$1)
configure = \ cmake_configure = \
$(call run,$1,sh -c 'cmake $(CMAKEFLAGS) $(CONTAINER_PROJECT_ROOT) && $(CONTAINER_PROJECT_ROOT)/build/discover_cc_settings.sh $(notdir $@) $(realpath $(dir $@))') \ $(call run,$1,sh -c 'cmake $(CMAKEFLAGS) $(CONTAINER_PROJECT_ROOT) && $(CONTAINER_PROJECT_ROOT)/build/cmake_discover_cc_settings.sh $(notdir $@) $(realpath $(dir $@))') \
&& touch $(addprefix $(dir $@)/,include_dirs.txt) $@ && touch $(addprefix $(dir $@)/,include_dirs.txt) $@
build_rule = \ ninja_build_rule = \
build-$1: $$(OUT)/$1/$$(BUILDTYPE)/CMakeCache.txt; \ build-$1: $$(OUT)/$1/$$(BUILDTYPE)/CMakeCache.txt; \
$$(SILENT)$$(call build,$1) $$(SILENT)$$(call ninja_build,$1)
build = $(call run,$1,ninja $(_PARALLELMFLAGS) $(NINJAFLAGS) $(GOALS)) ninja_build = $(call run,$1,ninja $(_PARALLELMFLAGS) $(NINJAFLAGS) $(GOALS))
check_rule = \ check_rule = \
check-$1: build-$1; check-$1: build-$1;
memcheck_rule = \ ctest_memcheck_rule = \
memcheck-$1: build-$1; \ memcheck-$1: build-$1; \
$$(SILENT)$$(call memcheck,$1) $$(SILENT)$$(call ctest_memcheck,$1)
memcheck = $(call run,$1,ctest -T memcheck $(CTESTFLAGS)) ctest_memcheck = $(call run,$1,ctest -T memcheck $(CTESTFLAGS))
run_rule = \ run_rule = \
run-$1: $$(OUT)/docker/$1; \ run-$1: $$(OUT)/docker/$1; \
@ -263,11 +284,11 @@ clean_rule = \
$$(SILENT)-$$(call clean,$1) $$(SILENT)-$$(call clean,$1)
clean = rm -rf $(OUT)/$1 clean = rm -rf $(OUT)/$1
discover_cc_settings_rule = \ cmake_discover_cc_settings_rule = \
$$(OUT)/$1/$$(BUILDTYPE)/include_dirs.txt: $$(OUT)/$1/$$(BUILDTYPE)/CMakeCache.txt; \ $$(OUT)/$1/$$(BUILDTYPE)/include_dirs.txt: $$(OUT)/$1/$$(BUILDTYPE)/CMakeCache.txt; \
$$(SILENT)$$(call discover_cc_settings,$1) $$(SILENT)$$(call cmake_discover_cc_settings,$1)
discover_cc_settings = \ cmake_discover_cc_settings = \
$(call run,$1,$(CONTAINER_PROJECT_ROOT)/build/discover_cc_settings.sh $(notdir $<) $(realpath $(dir $<))) $(call run,$1,$(CONTAINER_PROJECT_ROOT)/build/cmake_discover_cc_settings.sh $(notdir $<) $(realpath $(dir $<)))
discover_cc_rule = \ discover_cc_rule = \
discover-cc-$1: $$(OUT)/$1/$$(BUILDTYPE)/include_dirs.txt; \ discover-cc-$1: $$(OUT)/$1/$$(BUILDTYPE)/include_dirs.txt; \
@ -288,24 +309,6 @@ wrapper = \
$< > $@ \ $< > $@ \
&& chmod +x $@ && chmod +x $@
# Makefile dependencies
MAKEDEPS += $(DOCKER)
MAKEDEPS += id
MAKEDEPS += cat
MAKEDEPS += cp
MAKEDEPS += rm
MAKEDEPS += mkdir
MAKEDEPS += sed
MAKEDEPS += chmod
MAKEDEPS += test
MAKEDEPS += touch
MAKEDEPS += curl
MAKEDEPS += tar
MAKEDEPS += gunzip
MISSING_MAKEDEPS += $(call filter_out_command,$(MAKEDEPS))
# Rules # Rules
ifneq ($(MAKECMDGOALS),distclean) ifneq ($(MAKECMDGOALS),distclean)
@ -313,23 +316,25 @@ ifneq ($(MAKECMDGOALS),distclean)
endif endif
$(RULE_TARGETS): $(PROJECT_ROOT)/Makefile | $(MISSING_MAKEDEPS) $(OUT_DIRS) $(RULE_TARGETS): $(PROJECT_ROOT)/Makefile | $(MISSING_MAKEDEPS) $(OUT_DIRS)
$(CMAKE_RULE_TARGETS):
$(SILENT) \ $(SILENT) \
{ \ { \
echo '$(call image_rule,$(TARGET))'; \ echo '$(call image_rule,$(TARGET))'; \
echo; \ echo; \
echo '$(call configure_rule,$(TARGET))'; \ echo '$(call cmake_configure_rule,$(TARGET))'; \
echo; \ echo; \
echo '$(call build_rule,$(TARGET))'; \ echo '$(call ninja_build_rule,$(TARGET))'; \
echo; \ echo; \
echo '$(call check_rule,$(TARGET))'; \ echo '$(call check_rule,$(TARGET))'; \
echo; \ echo; \
echo '$(call memcheck_rule,$(TARGET))'; \ echo '$(call ctest_memcheck_rule,$(TARGET))'; \
echo; \ echo; \
echo '$(call run_rule,$(TARGET))'; \ echo '$(call run_rule,$(TARGET))'; \
echo; \ echo; \
echo '$(call clean_rule,$(TARGET))'; \ echo '$(call clean_rule,$(TARGET))'; \
echo; \ echo; \
echo '$(call discover_cc_settings_rule,$(TARGET))'; \ echo '$(call cmake_discover_cc_settings_rule,$(TARGET))'; \
echo; \ echo; \
echo '$(call discover_cc_rule,$(TARGET))'; \ echo '$(call discover_cc_rule,$(TARGET))'; \
echo; \ echo; \
@ -370,12 +375,16 @@ debug-print-%:
$(CHECK_TARGETS): GOALS := test $(CHECK_TARGETS): GOALS := test
$(OUT)/docker/% : $(PROJECT_ROOT)/build/% | $(OUT_DIRS) $(UBUNTU_TARGETS): CODENAME := $(UBUNTU_CODENAME)
cp $< $@
$(DEBIAN_TARGETS): CODENAME := $(DEBIAN_CODENAME)
$(OUT)/docker/qemu-arm-static-$(QEMU_VERSION): $(PROJECT_ROOT)/Makefile $(OUT)/docker/qemu-arm-static-$(QEMU_VERSION): $(PROJECT_ROOT)/Makefile
$(SILENT)$(call curl,$@,$(URL),$(MD5)) && chmod +x $@ $(SILENT)$(call curl,$@,$(URL),$(MD5)) && chmod +x $@
$(OUT)/docker/% : $(PROJECT_ROOT)/build/% | $(OUT_DIRS)
cp $< $@
$(OUT)/%.tar.gz: $(PROJECT_ROOT)/Makefile | $(OUT_DIRS) $(OUT)/%.tar.gz: $(PROJECT_ROOT)/Makefile | $(OUT_DIRS)
$(SILENT)$(call curl,$@,$(URL),$(MD5)) $(SILENT)$(call curl,$@,$(URL),$(MD5))