2025-08-10 01:34:16 +02:00

137 lines
3.4 KiB
Makefile

CXXFLAGS_COMMON := -std=c++14
CXXFLAGS_COMMON += -Wall -Wextra -Werror
CXXFLAGS_COMMON += -I include
LDFLAGS_COMMON := -std=c++14
SPHINX_BUILD := sphinx-build
tests := \
tests/error_or.cpp
override V := $(if $V,,@)
build_type ?= asan
build-types := asan ubsan coverage
ifeq (,$(filter $(build-types), $(build_type)))
$(error bad build type (allowed: $(build-types)))
endif
# don't require build tools for docs-only build
ifneq ($(MAKECMDGOALS),docs)
ifneq (0,$(shell pkg-config gtest && echo 0))
$(error need gtest)
endif
CXXFLAGS_COMMON += $(shell pkg-config --cflags gtest)
LDFLAGS_COMMON += $(shell pkg-config --libs gtest)
endif
CXXFLAGS[asan] := -O1 -fsanitize=address
LDFLAGS[asan] := -fsanitize=address
CXXFLAGS[ubsan] := -O1 -fsanitize=undefined
LDFLAGS[ubsan] := -fsanitize=undefined
CXXFLAGS[coverage] := --coverage -fno-inline-functions
LDFLAGS[coverage] := --coverage
build-dir := build/$(build_type)
bin-dir := $(build-dir)/bin
obj-dir := $(build-dir)/obj
docs-dir := build/docs
docs-extracted-dir := docs/extracted
docs-source := $(wildcard include/nu/*)
override CXXFLAGS += $(CXXFLAGS_COMMON) $(CXXFLAGS[$(build_type)])
override LDFLAGS += $(LDFLAGS_COMMON) $(LDFLAGS[$(build_type)])
sources[tests] := $(tests)
objects[tests] := $(addsuffix .o, $(addprefix $(obj-dir)/, $(sources[tests])))
executables[tests] := \
$(bin-dir)/tests/runner
objects-for[$(bin-dir)/tests/runner] := $(objects[tests])
sources := $(sources[tests])
executables := $(executables[tests])
objects := $(objects[tests])
.PHONY: all
all: $(executables)
.PHONY: clean
clean:
rm -rf build $(docs-extracted-dir)
.PHONY: cov-check
cov-check: -cov-check-pre -cov-check-run -cov-genhtml
.PHONY: -cov-check-pre
-cov-check-pre:
! [ -d "$(build-dir)" ] || find $(build-dir) -iname '*.gcda' -delete
rm -f $(build-dir)/cov-info
rm -rf $(build-dir)/cov-data
.PHONY: -cov-check-run
-cov-check-run: -cov-check-pre check
.PHONY: -cov-genhtml
-cov-genhtml: -cov-check-run
geninfo -o $(build-dir)/cov-info --no-external --rc lcov_branch_coverage=1 -b . $(build-dir)
genhtml -o $(build-dir)/cov-data --branch-coverage $(build-dir)/cov-info
.PHONY: check
check: $(addprefix -run-test-, $(executables[tests]))
.PHONY: check-all-profiles
check-all-profiles:
$(MAKE) build_type=asan check
$(MAKE) build_type=ubsan check
$(MAKE) build_type=coverage cov-check
.PHONY: $(addprefix -run-test-, $(executables[tests]))
define declare-test-run-rule
-run-test-$1: $1
./$1
endef
$(foreach test,$(executables[tests]),$(eval $(call declare-test-run-rule,$(test))))
.PHONY: docs
docs: $(patsubst %.hpp,$(docs-extracted-dir)/%.rst,$(docs-source)) | -create-dirs
rm -rf $(docs-dir)
$(SPHINX_BUILD) -n "docs" "$(docs-dir)"
$(docs-extracted-dir)/%.rst: %.hpp
mkdir -p $(dir $@)
awk -f docs/extract.awk <$< >$@
-print-cxxflags:
@echo -n $(CXXFLAGS_COMMON) $(CXXFLAGS_EXTRA[$(file)])
-include $(addsuffix .d, $(objects))
-create-dirs:
mkdir -p $(sort $(dir $(objects)))
mkdir -p $(sort $(dir $(executables)))
mkdir -p $(docs-dir)
$(obj-dir)/%.cpp.o: %.cpp Makefile | -create-dirs
@echo "[CXX] $<"
$V$(CXX) $(CXXFLAGS) $(CXXFLAGS_EXTRA[$<]) -MM -MP -MT $@ -MF $@.d $<
$V$(CXX) $(CXXFLAGS) $(CXXFLAGS_EXTRA[$<]) -c -o $@ $<
define declare-executable-link-rule
$1: $$(objects-for[$1]) | -create-dirs
@echo "[LD] $(patsubst $(bin-dir)/%,%,$1)"
$V$$(CXX) $$(LDFLAGS) -o $$@ $$^
endef
$(foreach exe,$(executables),$(eval $(call declare-executable-link-rule,$(exe))))