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