diff --git a/Makefile b/Makefile index 1a2c181..8c50cd0 100644 --- a/Makefile +++ b/Makefile @@ -1,140 +1,108 @@ MAKEFLAGS += $(_PARALLELMFLAGS) --no-builtin-rules +MAKEFILE := $(lastword $(MAKEFILE_LIST)) +SHELL := /bin/sh -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-.*' +.SUFFIXES: .PHONY: default default: all -# Overridable defaults +####################################################################################################################### +# Project macros -DOCKER ?= docker -DOCKER_BUILDKIT ?= +filter_targets = $(shell echo '$2' | sed -e 's@\s@\n@g' | sed -n$(foreach REGEX,$1, -e 's@$(REGEX)@\0@p')) -PARALLELMFLAGS ?= -NPROC ?= $(shell echo '$(PARALLELMFLAGS)' | sed -n -e 's@.*-j.*\([0-9]\+\)@\1@p') +regex_march_distro = '$1-$2-.*' -VERBOSE ?= -BUILDVERBOSE ?= +####################################################################################################################### +# Overridable project defaults + +PROJECTNAME ?= webfuse +PROJECTDIR ?= $(realpath $(dir $(MAKEFILE))) +SCRIPTDIR ?= $(PROJECTDIR)/build +OUTDIR ?= $(PROJECTDIR)/.build +BUILDTYPE ?= Debug DISABLE_DEFAULT_BUILDTARGET := $(or $(MARCH),$(DISTRO)) $(DISABLE_DEFAULT_BUILDTARGET)BUILDTARGET ?= amd64-ubuntu-builder -BUILDTYPE ?= Debug MARCH ?= '.*' DISTRO ?= '.*' FILTER ?= $(call regex_march_distro,$(MARCH),$(DISTRO)) -PROJECT_NAME ?= webfuse -PROJECT_ROOT ?= . -OUT ?= $(PROJECT_ROOT)/.build - -VERSION ?= $(shell cat $(PROJECT_ROOT)/VERSION) -VERSION := $(VERSION) - -USERID ?= $(shell id -u) -USERID := $(USERID) - 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) UBUNTU_CODENAME ?= bionic DEBIAN_CODENAME ?= testing-slim -SOURCE_DATE_EPOCH ?= $(shell $(PROJECT_ROOT)/build/get_source_date_epoch.sh) -SOURCE_DATE_EPOCH := $(SOURCE_DATE_EPOCH) -export SOURCE_DATE_EPOCH - -BUILDTIME ?= $(shell date -u -d '@$(SOURCE_DATE_EPOCH)' --rfc-3339 ns 2>/dev/null | sed -e 's/ /T/') -BUILDTIME := $(BUILDTIME) -export BUILDTIME - -$(HOST_CONTAINER)PORTABLE_WORSPACE ?= -CONTAINER_PROJECT_ROOT ?= /workspace/src -CONTAINER_OUT ?= /workspace/out -$(PORTABLE_WORSPACE)CONTAINER_PROJECT_ROOT = $(abspath $(PROJECT_ROOT)) -$(PORTABLE_WORSPACE)CONTAINER_OUT = $(abspath $(OUT)) - DISABLE_MD5SUM ?= $(call filter_out_command,md5sum) DISABLE_MD5SUM := $(DISABLE_MD5SUM) +####################################################################################################################### # Project dependencies DUMB_INIT_VERSION ?= 1.2.2 DOCKER_BUILDARGS += DUMB_INIT_VERSION=$(DUMB_INIT_VERSION) -FETCH_TARGETS += $(OUT)/dumb-init-$(DUMB_INIT_VERSION).tar.gz -$(OUT)/dumb-init-$(DUMB_INIT_VERSION).tar.gz: URL := https://github.com/Yelp/dumb-init/archive/v${DUMB_INIT_VERSION}.tar.gz -$(DISABLE_MD5SUM)$(OUT)/dumb-init-$(DUMB_INIT_VERSION).tar.gz: MD5 := 6166084b05772cdcf615a762c6f3b32e +FETCH_TARGETS += $(OUTDIR)/dumb-init-$(DUMB_INIT_VERSION).tar.gz +$(OUTDIR)/dumb-init-$(DUMB_INIT_VERSION).tar.gz: URL := https://github.com/Yelp/dumb-init/archive/v${DUMB_INIT_VERSION}.tar.gz +$(DISABLE_MD5SUM)$(OUTDIR)/dumb-init-$(DUMB_INIT_VERSION).tar.gz: MD5 := 6166084b05772cdcf615a762c6f3b32e GTEST_VERSION ?= 1.8.1 DOCKER_BUILDARGS += GTEST_VERSION=$(GTEST_VERSION) -FETCH_TARGETS += $(OUT)/googletest-release-$(GTEST_VERSION).tar.gz -$(OUT)/googletest-release-$(GTEST_VERSION).tar.gz: URL := https://github.com/google/googletest/archive/release-$(GTEST_VERSION).tar.gz -$(DISABLE_MD5SUM)$(OUT)/googletest-release-$(GTEST_VERSION).tar.gz: MD5 := 2e6fbeb6a91310a16efe181886c59596 +FETCH_TARGETS += $(OUTDIR)/googletest-release-$(GTEST_VERSION).tar.gz +$(OUTDIR)/googletest-release-$(GTEST_VERSION).tar.gz: URL := https://github.com/google/googletest/archive/release-$(GTEST_VERSION).tar.gz +$(DISABLE_MD5SUM)$(OUTDIR)/googletest-release-$(GTEST_VERSION).tar.gz: MD5 := 2e6fbeb6a91310a16efe181886c59596 FUSE_VERSION ?= 3.1.1 DOCKER_BUILDARGS += FUSE_VERSION=$(FUSE_VERSION) -FETCH_TARGETS += $(OUT)/libfuse-fuse-$(FUSE_VERSION).tar.gz -$(OUT)/libfuse-fuse-$(FUSE_VERSION).tar.gz: URL := https://github.com/libfuse/libfuse/archive/fuse-$(FUSE_VERSION).tar.gz -$(DISABLE_MD5SUM)$(OUT)/libfuse-fuse-$(FUSE_VERSION).tar.gz: MD5 := 097f194856938afdd98bea1a5c046edd +FETCH_TARGETS += $(OUTDIR)/libfuse-fuse-$(FUSE_VERSION).tar.gz +$(OUTDIR)/libfuse-fuse-$(FUSE_VERSION).tar.gz: URL := https://github.com/libfuse/libfuse/archive/fuse-$(FUSE_VERSION).tar.gz +$(DISABLE_MD5SUM)$(OUTDIR)/libfuse-fuse-$(FUSE_VERSION).tar.gz: MD5 := 097f194856938afdd98bea1a5c046edd WEBSOCKETS_VERSION ?= 3.1.0 DOCKER_BUILDARGS += WEBSOCKETS_VERSION=$(WEBSOCKETS_VERSION) -FETCH_TARGETS += $(OUT)/libwebsockets-$(WEBSOCKETS_VERSION).tar.gz -$(OUT)/libwebsockets-$(WEBSOCKETS_VERSION).tar.gz: URL := https://github.com/warmcat/libwebsockets/archive/v$(WEBSOCKETS_VERSION).tar.gz -$(DISABLE_MD5SUM)$(OUT)/libwebsockets-$(WEBSOCKETS_VERSION).tar.gz: MD5 := 325359a25d5f6d22725ff5d086db1c76 +FETCH_TARGETS += $(OUTDIR)/libwebsockets-$(WEBSOCKETS_VERSION).tar.gz +$(OUTDIR)/libwebsockets-$(WEBSOCKETS_VERSION).tar.gz: URL := https://github.com/warmcat/libwebsockets/archive/v$(WEBSOCKETS_VERSION).tar.gz +$(DISABLE_MD5SUM)$(OUTDIR)/libwebsockets-$(WEBSOCKETS_VERSION).tar.gz: MD5 := 325359a25d5f6d22725ff5d086db1c76 JANSSON_VERSION ?= 2.12 DOCKER_BUILDARGS += JANSSON_VERSION=$(JANSSON_VERSION) -FETCH_TARGETS += $(OUT)/jansson-$(JANSSON_VERSION).tar.gz -$(OUT)/jansson-$(JANSSON_VERSION).tar.gz: URL := https://github.com/akheron/jansson/archive/v$(JANSSON_VERSION).tar.gz -$(DISABLE_MD5SUM)$(OUT)/jansson-$(JANSSON_VERSION).tar.gz: MD5 := c4b106528d5ffb521178565de1ba950d +FETCH_TARGETS += $(OUTDIR)/jansson-$(JANSSON_VERSION).tar.gz +$(OUTDIR)/jansson-$(JANSSON_VERSION).tar.gz: URL := https://github.com/akheron/jansson/archive/v$(JANSSON_VERSION).tar.gz +$(DISABLE_MD5SUM)$(OUTDIR)/jansson-$(JANSSON_VERSION).tar.gz: MD5 := c4b106528d5ffb521178565de1ba950d QEMU_VERSION ?= v3.1.0-2 DOCKER_BUILDARGS += QEMU_VERSION_=$(QEMU_VERSION) -FETCH_TARGETS += $(OUT)/docker/qemu-arm-static-$(QEMU_VERSION) -$(OUT)/docker/qemu-arm-static-$(QEMU_VERSION): URL := https://github.com/multiarch/qemu-user-static/releases/download/$(QEMU_VERSION)/qemu-arm-static -$(DISABLE_MD5SUM)$(OUT)/docker/qemu-arm-static-$(QEMU_VERSION): MD5 := 8ebd24e63fdfa07c557d45373bd831b1 +FETCH_TARGETS += $(OUTDIR)/docker/qemu-arm-static-$(QEMU_VERSION) +$(OUTDIR)/docker/qemu-arm-static-$(QEMU_VERSION): URL := https://github.com/multiarch/qemu-user-static/releases/download/$(QEMU_VERSION)/qemu-arm-static +$(DISABLE_MD5SUM)$(OUTDIR)/docker/qemu-arm-static-$(QEMU_VERSION): MD5 := 8ebd24e63fdfa07c557d45373bd831b1 +####################################################################################################################### # Architecture-specific rule target configuration CMAKE_TARGETS += amd64-ubuntu-builder -$(OUT)/amd64-ubuntu-builder/cmake_rules.mk: TARGET := amd64-ubuntu-builder +$(OUTDIR)/amd64-ubuntu-builder/cmakerules.mk: TARGET := amd64-ubuntu-builder CMAKE_TARGETS += amd64-debian-builder -$(OUT)/amd64-debian-builder/cmake_rules.mk: TARGET := amd64-debian-builder +$(OUTDIR)/amd64-debian-builder/cmakerules.mk: TARGET := amd64-debian-builder CMAKE_TARGETS += arm32v7-ubuntu-builder -$(OUT)/arm32v7-ubuntu-builder/cmake_rules.mk: TARGET := arm32v7-ubuntu-builder +$(OUTDIR)/arm32v7-ubuntu-builder/cmakerules.mk: TARGET := arm32v7-ubuntu-builder CMAKE_TARGETS += arm32v7-debian-builder -$(OUT)/arm32v7-debian-builder/cmake_rules.mk: TARGET := arm32v7-debian-builder - -CMAKE_RULE_TARGETS += $(addsuffix /cmake_rules.mk,$(addprefix $(OUT)/,$(CMAKE_TARGETS))) +$(OUTDIR)/arm32v7-debian-builder/cmakerules.mk: TARGET := arm32v7-debian-builder MEMCHECK_FILTER = $(call regex_march_distro,'$(HOST_MARCH)','.*') UBUNTU_FILTER = $(call regex_march_distro,'.*','ubuntu') -UBUNTU_TARGETS = $(addprefix $(OUT)/docker/,$(call filter_targets,$(UBUNTU_FILTER),$(TARGETS))) +UBUNTU_TARGETS = $(addprefix $(OUTDIR)/docker/,$(call filter_targets,$(UBUNTU_FILTER),$(TARGETS))) DEBIAN_FILTER = $(call regex_march_distro,'.*','debian') -DEBIAN_TARGETS = $(addprefix $(OUT)/docker/,$(call filter_targets,$(DEBIAN_FILTER),$(TARGETS))) +DEBIAN_TARGETS = $(addprefix $(OUTDIR)/docker/,$(call filter_targets,$(DEBIAN_FILTER),$(TARGETS))) +####################################################################################################################### # Common rule target configuration -CMAKEFLAGS += '-GNinja' -CMAKEFLAGS += '-DCMAKE_BUILD_TYPE=$(BUILDTYPE)' - -BUILDSILENT := $(if $(BUILDVERBOSE),,1) -$(BUILDSILENT)NINJAFLAGS += -v - CURLFLAGS += -s DOCKER_RUNFLAGS += --device /dev/fuse @@ -144,234 +112,30 @@ DOCKER_RUNFLAGS += --security-opt apparmor:unconfined DOCKER_RUNFLAGS += --cap-add SYS_PTRACE DOCKER_RUNFLAGS += --security-opt seccomp=unconfined -DOCKER_RUNFLAGS += --user $(CONTAINER_USER):$(CONTAINER_GROUP) -DOCKER_RUNFLAGS += --env SOURCE_DATE_EPOCH -DOCKER_RUNFLAGS += --env BUILDTIME -DOCKER_RUNFLAGS += --env NINJA_STATUS - DOCKER_BUILDARGS += CODENAME=$(CODENAME) -DOCKER_BUILDARGS += PARALLELMFLAGS=$(_PARALLELMFLAGS) -DOCKER_BUILDARGS += USERID=$(USERID) -DOCKER_BUILDARGS += PROJECT_ROOT=$(CONTAINER_PROJECT_ROOT) -DOCKER_BUILDARGS += OUT=$(CONTAINER_OUT) -DOCKER_BUILDARGS += REGISTRY_PREFIX=$(REGISTRY_PREFIX) -DOCKER_BUILDFLAGS += $(addprefix --build-arg ,$(DOCKER_BUILDARGS)) +OUTDIRS += $(OUTDIR)/src -OUT_DIRS += $(OUT) -OUT_DIRS += $(OUT)/docker -OUT_DIRS += $(OUT)/src - -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)) -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)) -$(DISBALE_OSYNC)GNUMAKEFLAGS += --output-sync - -_NPROC = $(NPROC) -ifeq ($(strip $(_NPROC)),) -_NPROC = $(shell nproc) -endif -_PARALLELMFLAGS := $(addprefix -j,$(shell echo "$$(($(_NPROC)/$(TASKS)))")) +EXTRACT_TARGETS += $(patsubst $(OUTDIR)/%.tar.gz,$(OUTDIR)/src/%,$(FETCH_TARGETS)) +####################################################################################################################### # 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 -$(VERBOSE)echo_if_silent = echo $1 -$(VERBOSE)SILENT := @ - -curl = $(call echo_if_silent,curl -fSL $(CURLFLAGS) -o $1 $2) \ - && curl -fSL $(CURLFLAGS) -o $1 $2 \ - && { \ - if [ -n "$3" ]; then \ - echo "$3\t$1" > $1.md5; \ - md5sum -c $1.md5; \ - else \ - echo 'warning:$1: no md5 skipping verification' 1>&2; \ - fi; \ - } - -$(HOST_CONTAINER)image_run_volumes += --volume '$(realpath $(PROJECT_ROOT)):$(CONTAINER_PROJECT_ROOT):cached' -$(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)$(addprefix :,$(VERSION)) -image_run = $(DOCKER) run --rm --interactive $(DOCKER_RUNFLAGS) \ - $(call image_run_volumes,$1,$(HOST_CONTAINER)) \ - $(addprefix --cgroup-parent ,$(CONTAINER_CGROUP_PARENT)) \ - --workdir '$(CONTAINER_OUT)/$1/$(BUILDTYPE)' \ - $3 \ - $(call image_name,$1) \ - $2 - -image_rule = \ - $$(OUT)/docker/$1: $$(OUT)/docker/$1.dockerfile $$(EXTRACT_TARGETS) $$(PROJECT_ROOT)/Makefile; \ - $$(SILENT)$$(call image,$1) -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) - -cmake_configure_rule = \ - $$(OUT)/$1/$$(BUILDTYPE)/CMakeCache.txt: $$(PROJECT_ROOT)/CMakeLists.txt $$(OUT)/docker/$1 | $$(OUT)/$1/$$(BUILDTYPE)/gdbserver; \ - $$(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) $@ - -ninja_build_rule = \ - build-$1: $$(OUT)/$1/$$(BUILDTYPE)/CMakeCache.txt; \ - $$(SILENT)$$(call ninja_build,$1) -ninja_build = $(call run,$1,ninja $(_PARALLELMFLAGS) $(NINJAFLAGS) $(GOALS)) - -check_rule = \ - check-$1: build-$1; - -ctest_memcheck_rule = \ - memcheck-$1: build-$1; \ - $$(SILENT)$$(call ctest_memcheck,$1) -ctest_memcheck = $(call run,$1,ctest -T memcheck $(CTESTFLAGS)) - -run_rule = \ - run-$1: $$(OUT)/docker/$1; \ - $$(SILENT)$$(call run,$1,bash,--tty) || true -run = $(call echo_if_silent,TARGET=$1 BUILDTYPE=$(BUILDTYPE) $2) && $(call image_run,$1,$2,$3) - -clean_rule = \ - clean-$1: ; \ - $$(SILENT)-$$(call clean,$1) -clean = rm -rf $(OUT)/$1 - -cmake_discover_cc_settings_rule = \ - $$(OUT)/$1/$$(BUILDTYPE)/include_dirs.txt: $$(OUT)/$1/$$(BUILDTYPE)/CMakeCache.txt; \ - $$(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; \ - $$(SILENT)$$(call discover_cc,$1) -discover_cc = cat $< - -wrapper_rule = \ - $$(OUT)/$1/$$(BUILDTYPE)/gdbserver: $$(PROJECT_ROOT)/build/run_image.sh.template $$(OUT)/docker/$1; \ - $$(SILENT)$$(call wrapper,$1) -wrapper = \ - $(call echo_if_silent,generating $@) \ - && sed \ - -e 's@%PROJECT_ROOT%@$(abspath $(PROJECT_ROOT))@g' \ - -e 's@%DOCKER%@$(DOCKER)@g' \ - -e 's@%RUNFLAGS%@$(DOCKER_RUNFLAGS) $(call image_run_volumes,$1)@g' \ - -e 's@%IMAGE%@$(call image_name,$1)@g' \ - -e 's@%RUNCMD%@$(notdir $@)@g' \ - $< > $@ \ - && chmod +x $@ +MAKEFILE_DEPS += curl +MAKEFILE_DEPS += gunzip +MAKEFILE_DEPS += tar +MAKEFILE_DEPS += chmod +MAKEFILE_DEPS += touch +MAKEFILE_DEPS += test +MAKEFILE_DEPS += cp +MAKEFILE_DEPS += sed +####################################################################################################################### # Rules -ifneq ($(MAKECMDGOALS),distclean) --include $(RULE_TARGETS) -endif - -$(RULE_TARGETS): $(PROJECT_ROOT)/Makefile | $(MISSING_MAKEDEPS) $(OUT_DIRS) - -$(CMAKE_RULE_TARGETS): - $(SILENT) \ - { \ - echo '$(call image_rule,$(TARGET))'; \ - echo; \ - echo '$(call cmake_configure_rule,$(TARGET))'; \ - echo; \ - echo '$(call ninja_build_rule,$(TARGET))'; \ - echo; \ - echo '$(call check_rule,$(TARGET))'; \ - echo; \ - echo '$(call ctest_memcheck_rule,$(TARGET))'; \ - echo; \ - echo '$(call run_rule,$(TARGET))'; \ - echo; \ - echo '$(call clean_rule,$(TARGET))'; \ - echo; \ - echo '$(call cmake_discover_cc_settings_rule,$(TARGET))'; \ - echo; \ - echo '$(call discover_cc_rule,$(TARGET))'; \ - echo; \ - echo '$(call wrapper_rule,$(TARGET))'; \ - } > $@ - -.PHONY: all build-% -all: $(BUILD_TARGETS); - -.PHONY: check check-% -check: $(CHECK_TARGETS); - -.PHONY: memcheck memcheck-% -memcheck: $(MEMCHECK_TARGETS); - -.PHONY: lint lint-% -lint: $(LINT_TARGETS); - -.PHONY: run run-% -run: $(RUN_TARGETS); - -.PHONY: clean clean-% -clean: $(CLEAN_TARGETS); - -.PHONY: get-deps get-deps-% -get-deps: $(EXTRACT_TARGETS); - -.PHONY: discover-cc discover-cc-% -discover-cc: $(DISCOVER_CC_TARGETS); - -.PHONY: distclean -distclean: - $(SILENT)-rm -rf $(OUT_DIRS) - -.PHONY: debug-print-% -debug-print-%: - @printf '%s\n' '$*:' $($*) +include $(SCRIPTDIR)/cmake.mk +include $(SCRIPTDIR)/docker.mk +include $(SCRIPTDIR)/standardrules.mk $(CHECK_TARGETS): GOALS := test @@ -379,26 +143,20 @@ $(UBUNTU_TARGETS): CODENAME := $(UBUNTU_CODENAME) $(DEBIAN_TARGETS): CODENAME := $(DEBIAN_CODENAME) -$(OUT)/docker/qemu-arm-static-$(QEMU_VERSION): $(PROJECT_ROOT)/Makefile +$(OUTDIR)/docker/qemu-arm-static-$(QEMU_VERSION): $(MAKEFILE) $(SILENT)$(call curl,$@,$(URL),$(MD5)) && chmod +x $@ -$(OUT)/docker/% : $(PROJECT_ROOT)/build/% | $(OUT_DIRS) +$(OUTDIR)/docker/% : $(SCRIPTDIR)/% | $(OUTDIRS) cp $< $@ -$(OUT)/%.tar.gz: $(PROJECT_ROOT)/Makefile | $(OUT_DIRS) +$(OUTDIR)/%.tar.gz: $(MAKEFILE) | $(OUTDIRS) $(SILENT)$(call curl,$@,$(URL),$(MD5)) -$(OUT)/src/%: $(OUT)/%.tar.gz | $(OUT_DIRS) +$(OUTDIR)/src/%: $(OUTDIR)/%.tar.gz | $(OUTDIRS) $(SILENT) \ $(call echo_if_silent,tar -C $(dir $@) -xf $<) \ && tar -C $(dir $@) -xf $< \ && touch $@ -$(OUT_DIRS): - $(SILENT)mkdir -p $@ - -$(MISSING_MAKEDEPS): - $(error 'required commands $(MISSING_MAKEDEPS) not found; install appropriate packages e.g. docker-ce, busybox and curl') - .DELETE_ON_ERROR: $(FETCH_TARGETS) diff --git a/build/amd64-debian-builder.dockerfile b/build/amd64-debian-builder.dockerfile index ea3c6b8..9d451b9 100644 --- a/build/amd64-debian-builder.dockerfile +++ b/build/amd64-debian-builder.dockerfile @@ -90,15 +90,16 @@ ENV LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/usr/local/lib" ARG USERID=1000 -ARG PROJECT_ROOT=/workspace/src -ARG OUT=/workspace/out +ARG PROJECTDIR=/workspace/src +ARG OUTDIR=/workspace/out +ARG SCRIPTDIR=/workspace/bin RUN set -x \ && useradd -u "$USERID" -ms /bin/bash user \ - && mkdir -p "$PROJECT_ROOT" "$OUT" \ - && chown user:user "$PROJECT_ROOT" "$OUT" + && mkdir -p "$PROJECTDIR" "$OUTDIR" "$SCRIPTDIR" \ + && chown user:user "$PROJECTDIR" "$OUTDIR" "$SCRIPTDIR" -WORKDIR "$OUT" +WORKDIR "$OUTDIR" ENTRYPOINT ["dumb-init", "--"] diff --git a/build/amd64-ubuntu-builder.dockerfile b/build/amd64-ubuntu-builder.dockerfile index 46780fe..bc8d310 100644 --- a/build/amd64-ubuntu-builder.dockerfile +++ b/build/amd64-ubuntu-builder.dockerfile @@ -90,15 +90,16 @@ ENV LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/usr/local/lib" ARG USERID=1000 -ARG PROJECT_ROOT=/workspace/src -ARG OUT=/workspace/out +ARG PROJECTDIR=/workspace/src +ARG OUTDIR=/workspace/out +ARG SCRIPTDIR=/workspace/bin RUN set -x \ && useradd -u "$USERID" -ms /bin/bash user \ - && mkdir -p "$PROJECT_ROOT" "$OUT" \ - && chown user:user "$PROJECT_ROOT" "$OUT" + && mkdir -p "$PROJECTDIR" "$OUTDIR" "$SCRIPTDIR" \ + && chown user:user "$PROJECTDIR" "$OUTDIR" "$SCRIPTDIR" -WORKDIR "$OUT" +WORKDIR "$OUTDIR" ENTRYPOINT ["dumb-init", "--"] diff --git a/build/arm32v7-debian-builder.dockerfile b/build/arm32v7-debian-builder.dockerfile index 4d856af..b34fdfa 100644 --- a/build/arm32v7-debian-builder.dockerfile +++ b/build/arm32v7-debian-builder.dockerfile @@ -93,15 +93,16 @@ ENV LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/usr/local/lib" ARG USERID=1000 -ARG PROJECT_ROOT=/workspace/src -ARG OUT=/workspace/out +ARG PROJECTDIR=/workspace/src +ARG OUTDIR=/workspace/out +ARG SCRIPTDIR=/workspace/bin RUN set -x \ && useradd -u "$USERID" -ms /bin/bash user \ - && mkdir -p "$PROJECT_ROOT" "$OUT" \ - && chown user:user "$PROJECT_ROOT" "$OUT" + && mkdir -p "$PROJECTDIR" "$OUTDIR" "$SCRIPTDIR" \ + && chown user:user "$PROJECTDIR" "$OUTDIR" "$SCRIPTDIR" -WORKDIR "$OUT" +WORKDIR "$OUTDIR" ENTRYPOINT ["dumb-init", "--"] diff --git a/build/arm32v7-ubuntu-builder.dockerfile b/build/arm32v7-ubuntu-builder.dockerfile index f1f88bb..a2e1cd7 100644 --- a/build/arm32v7-ubuntu-builder.dockerfile +++ b/build/arm32v7-ubuntu-builder.dockerfile @@ -93,15 +93,16 @@ ENV LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/usr/local/lib" ARG USERID=1000 -ARG PROJECT_ROOT=/workspace/src -ARG OUT=/workspace/out +ARG PROJECTDIR=/workspace/src +ARG OUTDIR=/workspace/out +ARG SCRIPTDIR=/workspace/bin RUN set -x \ && useradd -u "$USERID" -ms /bin/bash user \ - && mkdir -p "$PROJECT_ROOT" "$OUT" \ - && chown user:user "$PROJECT_ROOT" "$OUT" + && mkdir -p "$PROJECTDIR" "$OUTDIR" "$SCRIPTDIR" \ + && chown user:user "$PROJECTDIR" "$OUTDIR" "$SCRIPTDIR" -WORKDIR "$OUT" +WORKDIR "$OUTDIR" ENTRYPOINT ["dumb-init", "--"] diff --git a/build/cmake.mk b/build/cmake.mk new file mode 100644 index 0000000..cbcc98d --- /dev/null +++ b/build/cmake.mk @@ -0,0 +1,109 @@ +CURRENT_MAKEFILE := $(lastword $(MAKEFILE_LIST))) + +####################################################################################################################### +# Overridable CMake defaults + +filter_targets ?= $2 + +CMAKE_BUILD_TYPE ?= $(BUILDTYPE) +CMAKE_MEMCHECK_FILTER ?= $(MEMCHECK_FILTER) +CMAKE_PROJECTDIR ?= $(CONTAINER_PROJECTDIR) +CMAKE_SCRIPTDIR ?= $(CONTAINER_SCRIPTDIR) + +ifndef _INCLUDE_DEFAULTS +include $(realpath $(dir $(CURRENT_MAKEFILE)))/defaults.mk +endif + +####################################################################################################################### +# CMake macros + +cmake_configure_rule = \ + $$(OUTDIR)/$1/$$(CMAKE_BUILD_TYPE)/CMakeCache.txt: $$(PROJECTDIR)/CMakeLists.txt $$(OUTDIR)/docker/$1 | $$(OUTDIR)/$1/$$(CMAKE_BUILD_TYPE)/gdbserver; \ + $$(SILENT)$$(call cmake_configure,$1) +cmake_configure = \ + $(call run,$1,sh -c 'cmake $(CMAKEFLAGS) $(CMAKE_PROJECTDIR) && $(CMAKE_SCRIPTDIR)/cmake_discover_cc_settings.sh $(notdir $@) $(realpath $(dir $@))') \ + && touch $(addprefix $(dir $@)/,include_dirs.txt) $@ + +cmake_discover_cc_settings_rule = \ + $$(OUTDIR)/$1/$$(CMAKE_BUILD_TYPE)/include_dirs.txt: $$(OUTDIR)/$1/$$(CMAKE_BUILD_TYPE)/CMakeCache.txt; \ + $$(SILENT)$$(call cmake_discover_cc_settings,$1) +cmake_discover_cc_settings = \ + $(call run,$1,$(CMAKE_SCRIPTDIR)/cmake_discover_cc_settings.sh $(notdir $<) $(realpath $(dir $<))) + +ninja_build_rule = \ + build-$1: $$(OUTDIR)/$1/$$(CMAKE_BUILD_TYPE)/CMakeCache.txt; \ + $$(SILENT)$$(call ninja_build,$1) +ninja_build = $(call run,$1,ninja $(_PARALLELMFLAGS) $(NINJAFLAGS) $(GOALS)) + +ctest_memcheck_rule = \ + memcheck-$1: build-$1; \ + $$(SILENT)$$(call ctest_memcheck,$1) +ctest_memcheck = $(call run,$1,ctest -T memcheck $(CTESTFLAGS)) + +####################################################################################################################### +# CMake rule target configuration + +$(BUILDSILENT)NINJAFLAGS += -v + +DOCKER_RUNFLAGS += --env NINJA_STATUS + +CMAKEFLAGS += '-GNinja' +CMAKEFLAGS += '-DCMAKE_BUILD_TYPE=$(CMAKE_BUILD_TYPE)' + +CMAKE_TARGET := $(filter $(BUILDTARGET),$(CMAKE_TARGETS)) +$(CMAKE_TARGET)CMAKE_ACTIVE_TARGETS += $(CMAKE_TARGETS) +CMAKE_ACTIVE_TARGETS += $(CMAKE_TARGET) +CMAKE_TARGETS := $(call filter_targets,$(FILTER),$(CMAKE_ACTIVE_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,$(CMAKE_MEMCHECK_FILTER),$(CMAKE_TARGETS))) +CMAKE_RUN_TARGETS += $(addprefix run-,$(firstword $(CMAKE_TARGETS))) +CMAKE_DISCOVER_CC_TARGETS += $(addprefix discover-cc-,$(firstword $(CMAKE_TARGETS))) +CMAKE_OUTDIRS += $(addsuffix /$(CMAKE_BUILD_TYPE),$(addprefix $(OUTDIR)/,$(CMAKE_TARGETS))) +CMAKE_RULE_TARGETS += $(addsuffix /cmakerules.mk,$(addprefix $(OUTDIR)/,$(CMAKE_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) +OUTDIRS += $(CMAKE_OUTDIRS) + +####################################################################################################################### +# Makefile dependencies + +MAKEFILE_DEPS += touch +MAKEFILE_DEPS += echo + +####################################################################################################################### +# CMake rules + +$(CMAKE_RULE_TARGETS): + $(SILENT) \ + { \ + echo '$(call image_rule,$(TARGET))'; \ + echo; \ + echo '$(call cmake_configure_rule,$(TARGET))'; \ + echo; \ + echo '$(call ninja_build_rule,$(TARGET))'; \ + echo; \ + echo '$(call check_rule,$(TARGET))'; \ + echo; \ + echo '$(call ctest_memcheck_rule,$(TARGET))'; \ + echo; \ + echo '$(call run_rule,$(TARGET))'; \ + echo; \ + echo '$(call clean_rule,$(TARGET))'; \ + echo; \ + echo '$(call cmake_discover_cc_settings_rule,$(TARGET))'; \ + echo; \ + echo '$(call discover_cc_rule,$(TARGET))'; \ + echo; \ + echo '$(call wrapper_rule,$(TARGET))'; \ + } > $@ + diff --git a/build/defaults.mk b/build/defaults.mk new file mode 100644 index 0000000..ad9606f --- /dev/null +++ b/build/defaults.mk @@ -0,0 +1,56 @@ +CURRENT_MAKEFILE := $(lastword $(MAKEFILE_LIST))) +_INCLUDE_DEFAULTS := T + +####################################################################################################################### +# Overridable common defaults + +# NOTE: default assumes first loaded makefile is located in root directory of project +MAKEFILE ?= $(firstword $(MAKEFILE_LIST)) +MAKEFILE := $(MAKEFILE) + +PROJECTDIR ?= $(realpath $(dir $(MAKEFILE))) +SCRIPTDIR ?= $(realpath $(dir $(CURRENT_MAKEFILE))) +OUTDIR ?= $(PROJECTDIR)/.build + +BUILDTYPE ?= Debug + +BUILDVERBOSE ?= +BUILDSILENT := $(if $(BUILDVERBOSE),,1) + +VERSION ?= $(shell cat $(PROJECTDIR)/VERSION) +VERSION := $(VERSION) + +USERID ?= $(shell id -u) +USERID := $(USERID) + +HOST_MARCH ?= $(shell dpkg --print-architecture 2>/dev/null) +HOST_CONTAINER ?= $(shell $(SCRIPTDIR)/get_container_id.sh) +HOST_CONTAINER := $(HOST_CONTAINER) + +$(HOST_CONTAINER)PORTABLE_WORSPACE ?= +CONTAINER_PROJECTDIR ?= /workspace/src +CONTAINER_SCRIPTDIR ?= /workspace/bin +CONTAINER_OUTDIR ?= /workspace/out +$(PORTABLE_WORSPACE)CONTAINER_PROJECTDIR = $(abspath $(PROJECTDIR)) +$(PORTABLE_WORSPACE)CONTAINER_SCRIPTDIR = $(abspath $(SCRIPTDIR)) +$(PORTABLE_WORSPACE)CONTAINER_OUTDIR = $(abspath $(OUTDIR)) + +SOURCE_DATE_EPOCH ?= $(shell $(SCRIPTDIR)/get_source_date_epoch.sh) +SOURCE_DATE_EPOCH := $(SOURCE_DATE_EPOCH) +export SOURCE_DATE_EPOCH + +BUILDTIME ?= $(shell date -u -d '@$(SOURCE_DATE_EPOCH)' --rfc-3339 ns 2>/dev/null | sed -e 's/ /T/') +BUILDTIME := $(BUILDTIME) +export BUILDTIME + +VERBOSE ?= +PARALLELMFLAGS ?= +NPROC ?= $(shell echo '$(PARALLELMFLAGS)' | sed -n -e 's@.*-j.*\([0-9]\+\)@\1@p') + +####################################################################################################################### +# Makefile dependencies + +MAKEFILE_DEPS += cat +MAKEFILE_DEPS += id +MAKEFILE_DEPS += echo +MAKEFILE_DEPS += sed diff --git a/build/docker.mk b/build/docker.mk new file mode 100644 index 0000000..3ad2224 --- /dev/null +++ b/build/docker.mk @@ -0,0 +1,87 @@ +CURRENT_MAKEFILE := $(lastword $(MAKEFILE_LIST)) + +####################################################################################################################### +# Overridable docker defaults + +DOCKER ?= docker +DOCKER_BUILDKIT ?= + +CONTAINER_CGROUP_PARENT ?= +CONTAINER_USER ?= $(USERID) +CONTAINER_GROUP ?= $(USERID) + +ifndef _INCLUDE_DEFAULTS +include $(realpath $(dir $(CURRENT_MAKEFILE)))/defaults.mk +endif + +####################################################################################################################### +# Docker macros + +image_run_volumes += $(addprefix --volumes-from ,$2) + +image_name = $(REGISTRY_PREFIX)$(subst -,/,$1)/$(PROJECTNAME)$(addprefix :,$(VERSION)) + +image_run = $(DOCKER) run --rm --interactive $(DOCKER_RUNFLAGS) \ + $(call image_run_volumes,$1,$(HOST_CONTAINER)) \ + $(addprefix --cgroup-parent ,$(CONTAINER_CGROUP_PARENT)) \ + --workdir '$(CONTAINER_OUTDIR)/$1/$(BUILDTYPE)' \ + $3 \ + $(call image_name,$1) \ + $2 + +image_rule = \ + $$(OUTDIR)/docker/$1: $$(OUTDIR)/docker/$1.dockerfile $$(EXTRACT_TARGETS) $$(MAKEFILE_LIST); \ + $$(SILENT)$$(call image,$1) +image = \ + $(call echo_if_silent,TARGET=$1 docker build $(call image_name,$1) $(OUTDIR)) \ + && $(DOCKER) build --rm $(DOCKER_BUILDFLAGS) --iidfile $@ --file $< --tag $(call image_name,$1) $(OUTDIR) + +run_rule = \ + run-$1: $$(OUTDIR)/docker/$1; \ + $$(SILENT)$$(call run,$1,bash,--tty) || true +run = $(call echo_if_silent,TARGET=$1 $(addprefix BUILDTYPE=,$(BUILDTYPE)) $2) && $(call image_run,$1,$2,$3) + +wrapper_rule = \ + $$(OUTDIR)/$1/$$(BUILDTYPE)/gdbserver: $$(SCRIPTDIR)/run_image.sh.template $$(OUTDIR)/docker/$1; \ + $$(SILENT)$$(call wrapper,$1) +wrapper = \ + $(call echo_if_silent,generating $@) \ + && sed \ + -e 's@%PROJECTDIR%@$(abspath $(PROJECTDIR))@g' \ + -e 's@%SCRIPTDIR%@$(abspath $(SCRIPTDIR))@g' \ + -e 's@%DOCKER%@$(DOCKER)@g' \ + -e 's@%RUNFLAGS%@$(DOCKER_RUNFLAGS) $(call image_run_volumes,$1)@g' \ + -e 's@%IMAGE%@$(call image_name,$1)@g' \ + -e 's@%RUNCMD%@$(notdir $@)@g' \ + $< > $@ \ + && chmod +x $@ + +####################################################################################################################### +# Docker rule target configuration + +DOCKER_RUNFLAGS += --env SOURCE_DATE_EPOCH +DOCKER_RUNFLAGS += --env BUILDTIME +DOCKER_RUNFLAGS += --user $(CONTAINER_USER):$(CONTAINER_GROUP) + +DOCKER_BUILDARGS += USERID=$(USERID) +DOCKER_BUILDARGS += PARALLELMFLAGS=$(_PARALLELMFLAGS) +DOCKER_BUILDARGS += PROJECTDIR=$(CONTAINER_PROJECTDIR) +DOCKER_BUILDARGS += SCRIPTDIR=$(CONTAINER_SCRIPTDIR) +DOCKER_BUILDARGS += OUTDIR=$(CONTAINER_OUTDIR) +DOCKER_BUILDARGS += REGISTRY_PREFIX=$(REGISTRY_PREFIX) + +DOCKER_BUILDFLAGS += $(addprefix --build-arg ,$(DOCKER_BUILDARGS)) + +OUTDIRS += $(OUTDIR)/docker + +$(HOST_CONTAINER)image_run_volumes += --volume '$(realpath $(PROJECTDIR)):$(CONTAINER_PROJECTDIR):cached' +$(HOST_CONTAINER)image_run_volumes += --volume '$(realpath $(SCRIPTDIR)):$(CONTAINER_SCRIPTDIR):cached' +$(HOST_CONTAINER)image_run_volumes += --volume '$(realpath $(OUTDIR)/$1):$(CONTAINER_OUTDIR)/$1:delegated' + +####################################################################################################################### +# Makefile dependencies + +MAKEFILE_DEPS += $(DOCKER) +MAKEFILE_DEPS += sed +MAKEFILE_DEPS += chmod + diff --git a/build/docker_compose.sh b/build/docker_compose.sh index 507b0c0..fb5e1a7 100755 --- a/build/docker_compose.sh +++ b/build/docker_compose.sh @@ -8,8 +8,8 @@ VERSION="${VERSION:-1.24.0}" IMAGE="${IMAGE:-${REGISTRY_PREFIX}docker/compose:${VERSION}}" NETWORK="${NETWORK:-host}" USERID="${USERID:-$(id -u)}" -SCRIPT_ROOT="${SCRIPT_ROOT:-"$(cd "$(dirname "$0")" && echo "$PWD")"}" -PROJECT_ROOT="${PROJECT_ROOT:-"$(cd "$SCRIPT_ROOT/.." && echo "$PWD")"}" +SCRIPTDIR="${SCRIPTDIR:-"$(cd "$(dirname "$0")" && echo "$PWD")"}" +PROJECTDIR="${PROJECTDIR:-"$PWD"}" ENTRYPOINT="${ENTRYPOINT:-docker-compose}" HOST_ENVFILTER="${HOST_ENVFILTER:-^DOCKER_\|^COMPOSE_}" @@ -24,11 +24,11 @@ if [ -n "$CONTAINER_CGROUP_PARENT" ]; then set -- --cgroup-parent "$CONTAINER_CGROUP_PARENT" "$@" fi -HOST_CONTAINER="${HOST_CONTAINER:-"$("$SCRIPT_ROOT/get_container_id.sh")"}" || true +HOST_CONTAINER="${HOST_CONTAINER:-"$("$SCRIPTDIR/get_container_id.sh")"}" || true if [ -n "$HOST_CONTAINER" ]; then set -- --volumes-from "$HOST_CONTAINER" "$@" else - set -- --volume "$PROJECT_ROOT:$PROJECT_ROOT:cached" "$@" + set -- --volume "$PROJECTDIR:$PROJECTDIR:cached" "$@" fi # setup options for connection to docker host @@ -39,7 +39,7 @@ else set -- -e DOCKER_HOST -e DOCKER_TLS_VERIFY -e DOCKER_CERT_PATH "$@" fi -if [ -t 0 ] && ! "$SCRIPT_ROOT/is_running_in_bg.sh" $$; then +if [ -t 0 ] && ! "$SCRIPTDIR/is_running_in_bg.sh" $$; then set -- --interactive "$@" fi diff --git a/build/run_image.sh.template b/build/run_image.sh.template index 9b041ae..1aa443d 100644 --- a/build/run_image.sh.template +++ b/build/run_image.sh.template @@ -5,15 +5,10 @@ set -e DOCKER="${DOCKER:-%DOCKER%}" IMAGE="${IMAGE:-%IMAGE%}" NETWORK="${NETWORK:-host}" -PROJECT_ROOT="${PROJECT_ROOT:-%PROJECT_ROOT%}" -SCRIPT_ROOT="${SCRIPT_ROOT:-"$PROJECT_ROOT/build"}" +PROJECTDIR="${PROJECTDIR:-%PROJECTDIR%}" +SCRIPTDIR="${SCRIPTDIR:-%SCRIPTDIR%}" ENTRYPOINT="${ENTRYPOINT:-%RUNCMD%}" -if [ ! -d "$SCRIPT_ROOT" ]; then - echo "error:$0: $SCRIPT_ROOT not found; set project root (PROJECT_ROOT=)" 1>&2 - exit 1 -fi - set -- --entrypoint "$ENTRYPOINT" "$IMAGE" "$@" set -- --network "$NETWORK" --workdir "$PWD" "$@" @@ -29,16 +24,16 @@ if [ -n "$CONTAINER_CGROUP_PARENT" ]; then set -- --cgroup-parent "$CONTAINER_CGROUP_PARENT" "$@" fi -HOST_CONTAINER="${HOST_CONTAINER:-"$("$SCRIPT_ROOT/get_container_id.sh")"}" || true +HOST_CONTAINER="${HOST_CONTAINER:-"$("$SCRIPTDIR/get_container_id.sh")"}" || true if [ -n "$HOST_CONTAINER" ]; then set -- --volumes-from "$HOST_CONTAINER" "$@" else - set -- --volume "$PROJECT_ROOT:$PROJECT_ROOT:cached" "$@" + set -- --volume "$PROJECTDIR:$PROJECTDIR:cached" "$@" fi set -- %RUNFLAGS% "$@" -if [ -t 0 ] && ! "$SCRIPT_ROOT/is_running_in_bg.sh" $$; then +if [ -t 0 ] && ! "$SCRIPTDIR/is_running_in_bg.sh" $$; then set -- --interactive "$@" fi diff --git a/build/standardrules.mk b/build/standardrules.mk new file mode 100644 index 0000000..28ee65d --- /dev/null +++ b/build/standardrules.mk @@ -0,0 +1,117 @@ + +####################################################################################################################### +# Overridable defaults + +ifndef _INCLUDE_DEFAULTS +include $(realpath $(dir $(CURRENT_MAKEFILE)))/defaults.mk +endif + +####################################################################################################################### +# Standard macros + +echo_if_silent = VERBOSE=1 +$(VERBOSE)echo_if_silent = echo $1 +$(VERBOSE)SILENT := @ + +filter_out_command ?= $(filter $1,$(foreach CMD,$1,$(shell command -v $(CMD) 2>&1 1>/dev/null || echo $(CMD)))) + +curl = $(call echo_if_silent,curl -fSL $(CURLFLAGS) -o $1 $2) \ + && curl -fSL $(CURLFLAGS) -o $1 $2 \ + && { \ + if [ -n "$3" ]; then \ + echo "$3\t$1" > $1.md5; \ + md5sum -c $1.md5; \ + else \ + echo 'warning:$1: no md5 skipping verification' 1>&2; \ + fi; \ + } + +check_rule = \ + check-$1: build-$1; + +clean_rule = \ + clean-$1: ; \ + $$(SILENT)-$$(call clean,$1) +clean = rm -rf $(OUTDIR)/$1 + +discover_cc_rule = \ + discover-cc-$1: $$(OUTDIR)/$1/$$(BUILDTYPE)/include_dirs.txt; \ + $$(SILENT)$$(call discover_cc,$1) +discover_cc = cat $< + +####################################################################################################################### +# Standard rule target configuration + +OUTDIRS += $(OUTDIR) + +OUTDIRS := $(sort $(OUTDIRS)) +TARGETS := $(sort $(TARGETS)) + +TASKS := $(words $(if $(TARGETS),$(TARGETS),_)) + +DISBALE_OSYNC ?= $(filter 1,$(TASKS)) +$(DISBALE_OSYNC)GNUMAKEFLAGS += --output-sync + +_NPROC = $(NPROC) +ifeq ($(strip $(_NPROC)),) +_NPROC = $(shell nproc) +endif +_PARALLELMFLAGS := $(addprefix -j,$(shell echo "$$(($(_NPROC)/$(TASKS)))")) + +####################################################################################################################### +# Makefile dependencies + +MAKEFILE_DEPS += rm +MAKEFILE_DEPS += mkdir +MAKEFILE_DEPS += echo + +MAKEFILE_DEPS := $(sort $(MAKEFILE_DEPS)) + +UNSATISFIED_MAKEFILE_DEPS := $(call filter_out_command,$(MAKEFILE_DEPS)) + +####################################################################################################################### +# Standard rules + +ifneq ($(MAKECMDGOALS),distclean) +-include $(RULE_TARGETS) +endif + +.PHONY: all build-% +all: $(BUILD_TARGETS); + +.PHONY: check check-% +check: $(CHECK_TARGETS); + +.PHONY: memcheck memcheck-% +memcheck: $(MEMCHECK_TARGETS); + +.PHONY: lint lint-% +lint: $(LINT_TARGETS); + +.PHONY: run run-% +run: $(RUN_TARGETS); + +.PHONY: clean clean-% +clean: $(CLEAN_TARGETS); + +.PHONY: get-deps get-deps-% +get-deps: $(EXTRACT_TARGETS); + +.PHONY: discover-cc discover-cc-% +discover-cc: $(DISCOVER_CC_TARGETS); + +.PHONY: distclean +distclean: + $(SILENT)-rm -rf $(OUTDIRS) + +.PHONY: debug-print-% +debug-print-%: + @printf '%s\n' '$*:' $($*) + +$(RULE_TARGETS): $(filter-out $(RULE_TARGETS),$(MAKEFILE_LIST)) | $(UNSATISFIED_MAKEFILE_DEPS) $(OUTDIRS) + +$(OUTDIRS): + $(SILENT)mkdir -p $@ + +$(UNSATISFIED_MAKEFILE_DEPS): + $(error 'required commands $(UNSATISFIED_MAKEFILE_DEPS) not found; install appropriate packages e.g. docker-ce, busybox and curl')