From 3c683a5e3ae8f5d956c6bb3bec4cf8199184cfe4 Mon Sep 17 00:00:00 2001 From: nosamad Date: Thu, 28 Mar 2019 00:34:47 +0100 Subject: [PATCH] extends targets and fixes discovery adds convenience run and discovery targets (for first build target) allows usage of host container (volume mount/ dind) fixes portable workspace configuration adds makefile targets to CDT configuration fixes localization --- .cproject | 53 ++++++++++++++++- .settings/language.settings.xml | 2 +- .settings/org.eclipse.cdt.core.prefs | 6 +- Makefile | 87 ++++++++++++++++++---------- build/discover_cc_settings.sh | 11 +++- build/get_container_id.sh | 39 +++++++++++++ 6 files changed, 158 insertions(+), 40 deletions(-) create mode 100755 build/get_container_id.sh diff --git a/.cproject b/.cproject index 28b2dfe..7f5b252 100644 --- a/.cproject +++ b/.cproject @@ -47,7 +47,6 @@ - @@ -63,4 +62,56 @@ + + + + make + + check + true + true + true + + + make + + memcheck + true + true + true + + + make + + distclean + true + true + true + + + make + + discover-cc + true + true + true + + + make + + all + true + true + true + + + make + + lint + true + true + true + + + diff --git a/.settings/language.settings.xml b/.settings/language.settings.xml index e916e4f..dc364b8 100644 --- a/.settings/language.settings.xml +++ b/.settings/language.settings.xml @@ -6,7 +6,7 @@ - + diff --git a/.settings/org.eclipse.cdt.core.prefs b/.settings/org.eclipse.cdt.core.prefs index b2821d3..7ab0c7a 100644 --- a/.settings/org.eclipse.cdt.core.prefs +++ b/.settings/org.eclipse.cdt.core.prefs @@ -5,8 +5,8 @@ environment/project/cdt.managedbuild.toolchain.gnu.base.2091678410/BUILDTARGET/v environment/project/cdt.managedbuild.toolchain.gnu.base.2091678410/BUILDVERBOSE/delimiter=\: environment/project/cdt.managedbuild.toolchain.gnu.base.2091678410/BUILDVERBOSE/operation=append environment/project/cdt.managedbuild.toolchain.gnu.base.2091678410/BUILDVERBOSE/value=1 -environment/project/cdt.managedbuild.toolchain.gnu.base.2091678410/NINJA_STATUS/delimiter=\: -environment/project/cdt.managedbuild.toolchain.gnu.base.2091678410/NINJA_STATUS/operation=append -environment/project/cdt.managedbuild.toolchain.gnu.base.2091678410/NINJA_STATUS/value= +environment/project/cdt.managedbuild.toolchain.gnu.base.2091678410/VERBOSE/delimiter=\: +environment/project/cdt.managedbuild.toolchain.gnu.base.2091678410/VERBOSE/operation=replace +environment/project/cdt.managedbuild.toolchain.gnu.base.2091678410/VERBOSE/value= environment/project/cdt.managedbuild.toolchain.gnu.base.2091678410/append=true environment/project/cdt.managedbuild.toolchain.gnu.base.2091678410/appendContributed=true diff --git a/Makefile b/Makefile index 45dca17..235d7f9 100644 --- a/Makefile +++ b/Makefile @@ -1,3 +1,6 @@ +PARALLELMFLAGS ?= -j$(shell nproc) +MAKEFLAGS += $(PARALLELMFLAGS) --no-builtin-rules + .PHONY: default default: all @@ -5,6 +8,9 @@ default: all export SOURCE_DATE_EPOCH ?= $(shell $(PROJECT_ROOT)/build/get_source_date_epoch.sh) export BUILDTIME ?= $(shell date -u -d '@$(SOURCE_DATE_EPOCH)' --rfc-3339 ns 2>/dev/null | sed -e 's/ /T/') +export DOCKER ?= docker + +DOCKER_BUILDKIT ?= VERBOSE ?= BUILDVERBOSE ?= @@ -16,16 +22,15 @@ PROJECT_ROOT ?= . VERSION ?= $(shell cat $(PROJECT_ROOT)/VERSION) OUT ?= $(PROJECT_ROOT)/.build -PARALLELMFLAGS ?= -j$(shell nproc) UID ?= $(shell id -u) -DOCKER ?= docker -DOCKER_BUILDKIT ?= - CONTAINER_USER ?= $(UID) CONTAINER_GROUP ?= $(shell id -g) -PORTABLE_WORSPACE ?= +HOST_CONTAINER ?= $(shell $(PROJECT_ROOT)/build/get_container_id.sh) +HOST_CONTAINER := $(HOST_CONTAINER) + +$(HOST_CONTAINER)PORTABLE_WORSPACE ?= CONTAINER_PROJECT_ROOT ?= /workspace/src CONTAINER_OUT ?= /workspace/out $(PORTABLE_WORSPACE)CONTAINER_PROJECT_ROOT = $(abspath $(PROJECT_ROOT)) @@ -86,8 +91,6 @@ $(addprefix $(OUT)/docker/,$(UBUNTU_TARGETS)): CODENAME := $(UBUNTU_CODENAME) # Common rule target configuration -MAKEFLAGS += $(PARALLELMFLAGS) --no-builtin-rules - CMAKEFLAGS += '-GNinja' BUILDSILENT := $(if $(BUILDVERBOSE),,1) @@ -101,6 +104,7 @@ DOCKER_RUNFLAGS += --device /dev/fuse --cap-add SYS_ADMIN --security-opt apparmo DOCKER_RUNFLAGS += --env SOURCE_DATE_EPOCH DOCKER_RUNFLAGS += --env BUILDTIME DOCKER_RUNFLAGS += --env NINJA_STATUS +DOCKER_RUNFLAGS += $(addprefix --volumes-from ,$(HOST_CONTAINER)) DOCKER_BUILDARGS += CODENAME=$(CODENAME) DOCKER_BUILDARGS += PARALLELMFLAGS=$(PARALLELMFLAGS) @@ -118,8 +122,10 @@ OUT_DIRS += $(addprefix $(OUT)/,$(TARGETS)) BUILD_TARGETS += $(addprefix build-,$(TARGETS)) CHECK_TARGETS += $(addprefix check-,$(TARGETS)) +CLEAN_TARGETS += $(addprefix clean-,$(TARGETS)) +RUN_TARGETS += $(addprefix run-,$(firstword $(TARGETS))) EXTRACT_TARGETS += $(patsubst $(OUT)/%.tar.gz,$(OUT)/src/%,$(FETCH_TARGETS)) -DISCOVER_CC_TARGETS += $(addprefix discover-cc-,$(TARGETS)) +DISCOVER_CC_TARGETS += $(addprefix discover-cc-,$(firstword $(TARGETS))) RULE_TARGETS = $(addprefix $(OUT)/,$(addsuffix /rules.mk,$(TARGETS))) TARGETS := $(sort $(TARGETS)) @@ -130,9 +136,11 @@ echo_if_silent = VERBOSE=1 $(VERBOSE)echo_if_silent = echo $1 $(VERBOSE)SILENT := @ +$(HOST_CONTAINER)container_run_volumes += '$(realpath $(PROJECT_ROOT)):$(CONTAINER_PROJECT_ROOT):cached' +$(HOST_CONTAINER)container_run_volumes += '$(realpath $(OUT)/$1):$(CONTAINER_OUT)/$1:delegated' + container_run = $(DOCKER) run $(DOCKER_RUNFLAGS) $3 \ - --volume '$(realpath $(PROJECT_ROOT)):$(CONTAINER_PROJECT_ROOT)' \ - --volume '$(realpath $(OUT)/$1):$(CONTAINER_OUT)/$1' \ + $(addprefix --volume ,$(call container_run_volumes,$1)) \ --workdir '$(CONTAINER_OUT)/$1' \ $(PROJECT_NAME)-$1:$(VERSION) \ $2 @@ -148,24 +156,22 @@ run_rule = \ run-$1: $$(OUT)/docker/$1; \ $$(call run_recipe,$1,/bin/bash,--tty) run = $(call echo_if_silent,TARGET=$1 $2) && $(call container_run,$1,$2,$3) -run_recipe = $(SILENT)$(call run,$1,$2,$3) +run_recipe = $(SILENT)-$(call run,$1,$2,$3) configure_rule = \ $$(OUT)/$1/CMakeCache.txt: $$(PROJECT_ROOT)/CMakeLists.txt $$(OUT)/docker/$1; \ $$(call configure,$1) configure = $(SILENT) \ - $(call run,$1,sh -c 'cmake $(CMAKEFLAGS) $(CONTAINER_PROJECT_ROOT) && $(CONTAINER_PROJECT_ROOT)/build/discover_cc_settings.sh $(notdir $@)') \ + $(call run,$1,sh -c 'cmake $(CMAKEFLAGS) $(CONTAINER_PROJECT_ROOT) && $(CONTAINER_PROJECT_ROOT)/build/discover_cc_settings.sh $(notdir $@) $(realpath $(dir $@))') \ && touch $@ build_rule = \ build-$1: $$(OUT)/$1/CMakeCache.txt; \ $$(call build,$1) -build = $(SILENT)$(call run,$1,ninja $(PARALLELMFLAGS) $(NINJAFLAGS) $(GLOAS)) +build = $(SILENT)$(call run,$1,ninja $(PARALLELMFLAGS) $(NINJAFLAGS) $(GOALS)) check_rule = \ - check-$1: build-$1; \ - $$(call check,$1) -check = $(SILENT)$(call run,$1,ctest $(CTESTFLAGS)) + check-$1: build-$1; memcheck_rule = \ memcheck-$1: build-$1; \ @@ -176,16 +182,21 @@ discover_cc_settings_rule = \ $$(OUT)/$1/include_dirs.txt: $$(OUT)/$1/CMakeCache.txt; \ $$(call discover_cc_settings,$1) discover_cc_settings = $(SILENT) \ - $(call run,$1,$(CONTAINER_PROJECT_ROOT)/build/discover_cc_settings.sh $(notdir $<)) \ + $(call run,$1,$(CONTAINER_PROJECT_ROOT)/build/discover_cc_settings.sh $(notdir $<) $(realpath $(dir $<))) discover_cc_rule = \ discover-cc-$1: $$(OUT)/$1/include_dirs.txt; \ $$(call discover_cc,$1) discover_cc = $(SILENT)cat $< +clean_rule = \ + clean-$1: ; \ + $$(call clean,$1) +clean = $(SILENT)-rm -rf $(OUT)/$1 + # Rules -ifneq ($(MAKECMDGOALS),clean) +ifneq ($(MAKECMDGOALS),distclean) -include $(RULE_TARGETS) endif @@ -208,31 +219,43 @@ $(RULE_TARGETS): $(PROJECT_ROOT)/Makefile | $(OUT_DIRS) echo '$(call discover_cc_settings_rule,$(TARGET))'; \ echo; \ echo '$(call discover_cc_rule,$(TARGET))'; \ + echo; \ + echo '$(call clean_rule,$(TARGET))'; \ } > $@ -.PHONY: all -all: $(BUILD_TARGETS) +.PHONY: all build-% +all: $(BUILD_TARGETS); -.PHONY: check -check: $(CHECK_TARGETS) +.PHONY: check check-% +check: $(CHECK_TARGETS); -.PHONY: memcheck -memcheck: $(MEMCHECK_TARGETS) +.PHONY: memcheck memcheck-% +memcheck: $(MEMCHECK_TARGETS); -.PHONY: clean -clean: $(CLEAN_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: get-deps -get-deps: $(EXTRACT_TARGETS) - -.PHONY: discover-cc -discover-cc: $(DISCOVER_CC_TARGETS) - .PHONY: debug-print-% debug-print-%: @printf '%s\n' '$*:' $($*) +$(CHECK_TARGETS): GOALS := test $(CHECK_TARGETS) $(MEMCHECK_TARGETS): CONTAINER_USER := user $(OUT)/docker/qemu-arm-static-$(QEMU_VERSION): diff --git a/build/discover_cc_settings.sh b/build/discover_cc_settings.sh index f6c8c74..61a08fd 100755 --- a/build/discover_cc_settings.sh +++ b/build/discover_cc_settings.sh @@ -2,6 +2,9 @@ set -e +export LANG=C +export LC_ALL=C + cleanup() { rm -rf "$INCLUDE_DIRS_TMPFILE" } @@ -9,13 +12,15 @@ cleanup() { trap cleanup TERM INT EXIT DEST="${DEST:-$PWD}" -INCLUDE_DIRS_TMPFILE="${2:-$(mktemp -p "$DEST" include_dirs_XXXXXXXXXX.txt)}" -INCLUDE_DIRS_FILE="${INCLUDE_DIRS_FILE:-$DEST/include_dirs.txt}" CMAKE_CACHE_FILE="${1:-CMakeCache.txt}" CMAKE_CXX_COMPILER="$(sed -n -e 's/CMAKE_CXX_COMPILER:FILEPATH=\(.*\)$/\1/p' "$CMAKE_CACHE_FILE")" CMAKE_C_COMPILER="$(sed -n -e 's/CMAKE_C_COMPILER:FILEPATH=\(.*\)$/\1/p' "$CMAKE_CACHE_FILE")" +INCLUDE_DIRS_PREFIX="${2:-$DEST}" +INCLUDE_DIRS_TMPFILE="$(mktemp -p "$DEST" include_dirs_XXXXXXXXXX.txt)" +INCLUDE_DIRS_FILE="${INCLUDE_DIRS_FILE:-$DEST/include_dirs.txt}" + C_BUILTIN_FILE="${C_BUILTIN_FILE:-$DEST/builtins.h}" CXX_BUILTIN_FILE="${CXX_BUILTIN_FILE:-$DEST/builtins.hpp}" @@ -36,7 +41,7 @@ fi { echo '#include <...> search starts here:' - cat "$INCLUDE_DIRS_TMPFILE" | sed -n -e "s@\(.*\)@$DEST\1@p" + sed -n -e "s@\(.*\)@$INCLUDE_DIRS_PREFIX\1@p" "$INCLUDE_DIRS_TMPFILE" echo 'End of search list.' } > "$INCLUDE_DIRS_FILE" diff --git a/build/get_container_id.sh b/build/get_container_id.sh new file mode 100755 index 0000000..d262287 --- /dev/null +++ b/build/get_container_id.sh @@ -0,0 +1,39 @@ +#!/bin/sh + +set -e + +container_id() { + if [ "$#" -le 0 ]; then + # shellcheck disable=SC2119 + container_id_by_cgroup + else + "$DOCKER" inspect --format='{{.Id}}' "$@" + fi +} + +# shellcheck disable=SC2120 +container_id_by_cgroup() { + impl_container_id_by_cgroup "$@" || return "$?" +} + +impl_container_id_by_cgroup() { + file="${1:-/proc/self/cgroup}" + + while IFS= read -r cmd; do + id="$(echo "$cmd" | sed -n -e 's/[^:]*:[^:]*:.*\/\([0-9a-fA-F]\+\)$/\1/p')" + if container_id "$id" >/dev/null 2>&1; then + echo "$id" + return 0 + fi + done < "$file" + + return 1 +} + +DOCKER="${DOCKER:-docker}" + +if [ -z "${CONTAINER+x}" ] && [ -n "$DOCKER" ]; then + CONTAINER="$(container_id "$@")" || true +fi + +echo "$CONTAINER"