summaryrefslogtreecommitdiff
path: root/Makefile
blob: be9dc32c05862acddcb1a218ddc0d45d1a5926a8 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
OPTIMIZE ?= -O3
DEBUG ?= -g

AR ?= ar
CXX ?= g++
IWYU ?= iwyu
CHRONIC ?= chronic

PKGS := fmt
PKG_FLAGS := $(shell pkg-config --cflags ${PKGS})
PKG_LIBS := -Wl,--push-state,--as-needed,--start-group $(shell pkg-config --libs ${PKGS}) -Wl,--end-group,--pop-state

CXXFLAGS := -Wall -Werror -std=c++20 -fPIC -iquote . ${PKG_FLAGS} ${OPTIMIZE} ${DEBUG}

.DEFAULT_GOAL := all

VERSION := $(shell git describe --always --dirty --long --tags 2> /dev/null)
ifndef VERSION
VERSION := unknown
endif
$(info Version ${VERSION})

define GITTAGCPP =
#include <string>

std::string GIT_TAG = "$(subst ",\",${VERSION})";
endef
export GITTAGCPP

ifneq ($(shell which ${IWYU}),)
iwyu = ${CHRONIC} ${IWYU} -Xiwyu --error -Xiwyu --mapping_file=tools/iwyu.imp -Xiwyu --no_fwd_decls ${CXXFLAGS} $(1)
else
$(warning Not using IWYU)
iwyu =
endif

libname = $(shell realpath --canonicalize-missing --relative-to . build/$(dir $(1))/lib$(notdir $(1)))

define mksodeps =
$(1)_SODEPS :=
endef

define mklib =

ifneq ($(wildcard $(1)/*.cpp),)

$(call libname,$(1).a): $(patsubst %.cpp,build/%.o,$(wildcard $(1)/*.cpp))
	@mkdir -p $$(dir $$@)
	$${AR} cr $$@ $$+

$(call libname,$(1).so): $(patsubst %.cpp,build/%.o,$(wildcard $(1)/*.cpp)) $${$(1)_SODEPS}
	@mkdir -p $$(dir $$@)
	$${CXX} $${CXXFLAGS} -shared -o $$@ -Wl,--start-group $$+ -Wl,--end-group

PARTARS += $(call libname,$(1).a)
PARTSOS += $(call libname,$(1).so)

endif

ifdef iwyu

build/$(1)/iwyu.cpp:
	@mkdir -p $$(dir $$@)
	@tools/iwyu-header $$(wildcard $(1)/*.h) > $$@
	@$$(call iwyu,$$@)
.PHONY: build/$(1)/iwyu.cpp

IWYU_CPPS += build/$(1)/iwyu.cpp

endif

endef

PARTS := $(patsubst ./%,%,$(shell find -mindepth 1 -type d -\( -name .\* -prune -o -name build -prune -o -name tools -prune -o -print -\)))

PARTARS :=
PARTSOS :=
IWYU_CPPS :=

$(foreach part,${PARTS},$(eval $(call mksodeps,${part})))

DEPFILES := $(shell find -mindepth 1 -name .\* -prune -o -type f -name \*.d -print)
include ${DEPFILES}

$(foreach part,${PARTS},$(eval $(call mklib,${part})))

MAINOBJS := $(patsubst %.cpp,build/%.o,$(wildcard *.cpp))
MAINOBJS += build/git-tag.o

$(info )

all: ${IWYU_CPPS} issim issim-static

issim: build/issim-dynamic
	@ln -sf $< $@
.PHONY: issim

issim-static: build/issim-static
	@ln -sf $< $@
.PHONY: issim-static

build/issim-dynamic: ${MAINOBJS} ${PARTSOS}
	@mkdir -p $(dir $@)
	${CXX} ${CXXFLAGS} -o $@ -Wl,--start-group $+ -Wl,--end-group ${PKG_LIBS}

build/issim-static: ${MAINOBJS} ${PARTARS}
	@mkdir -p $(dir $@)
	${CXX} ${CXXFLAGS} -o $@ -Wl,--start-group $+ -Wl,--end-group ${PKG_LIBS}

clean:
	rm -rf build issim issim-static
.PHONY: clean

build/git-tag.cpp:
	@mkdir -p $(dir $@)
	@echo "$$GITTAGCPP" > $@
.PHONY: build/git-tag.cpp

build/%.o: %.cpp
	@mkdir -p $(dir $@)
	@$(call iwyu,$<)
	${CXX} ${CXXFLAGS} -MMD -c -o $@ $<

build/%.o: build/%.cpp
	@mkdir -p $(dir $@)
	${CXX} ${CXXFLAGS} -MMD -c -o $@ $<

.SUFFIXES:
.SECONDARY: