From e223a1f707974826faa5ee27c889bcf090976135 Mon Sep 17 00:00:00 2001 From: nosamad Date: Tue, 9 Apr 2019 19:43:22 +0200 Subject: [PATCH] refactors makefile in preparation to extract common parts --- Makefile | 181 +++++++++--------- ...tings.sh => cmake_discover_cc_settings.sh} | 0 2 files changed, 95 insertions(+), 86 deletions(-) rename build/{discover_cc_settings.sh => cmake_discover_cc_settings.sh} (100%) diff --git a/Makefile b/Makefile index 27c7c61..1a2c181 100644 --- a/Makefile +++ b/Makefile @@ -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)) diff --git a/build/discover_cc_settings.sh b/build/cmake_discover_cc_settings.sh similarity index 100% rename from build/discover_cc_settings.sh rename to build/cmake_discover_cc_settings.sh