summaryrefslogtreecommitdiff
path: root/Makefile
diff options
context:
space:
mode:
Diffstat (limited to 'Makefile')
-rw-r--r--Makefile23
1 files changed, 15 insertions, 8 deletions
diff --git a/Makefile b/Makefile
index ed96817..be9dc32 100644
--- a/Makefile
+++ b/Makefile
@@ -8,7 +8,7 @@ CHRONIC ?= chronic
8 8
9PKGS := fmt 9PKGS := fmt
10PKG_FLAGS := $(shell pkg-config --cflags ${PKGS}) 10PKG_FLAGS := $(shell pkg-config --cflags ${PKGS})
11PKG_LIBS := -Wl,--push-state,--as-needed $(shell pkg-config --libs ${PKGS}) -Wl,--pop-state 11PKG_LIBS := -Wl,--push-state,--as-needed,--start-group $(shell pkg-config --libs ${PKGS}) -Wl,--end-group,--pop-state
12 12
13CXXFLAGS := -Wall -Werror -std=c++20 -fPIC -iquote . ${PKG_FLAGS} ${OPTIMIZE} ${DEBUG} 13CXXFLAGS := -Wall -Werror -std=c++20 -fPIC -iquote . ${PKG_FLAGS} ${OPTIMIZE} ${DEBUG}
14 14
@@ -28,7 +28,7 @@ endef
28export GITTAGCPP 28export GITTAGCPP
29 29
30ifneq ($(shell which ${IWYU}),) 30ifneq ($(shell which ${IWYU}),)
31iwyu = ${CHRONIC} ${IWYU} -Xiwyu --error -Xiwyu --mapping_file=tools/iwyu.imp ${CXXFLAGS} $(1) 31iwyu = ${CHRONIC} ${IWYU} -Xiwyu --error -Xiwyu --mapping_file=tools/iwyu.imp -Xiwyu --no_fwd_decls ${CXXFLAGS} $(1)
32else 32else
33$(warning Not using IWYU) 33$(warning Not using IWYU)
34iwyu = 34iwyu =
@@ -36,6 +36,10 @@ endif
36 36
37libname = $(shell realpath --canonicalize-missing --relative-to . build/$(dir $(1))/lib$(notdir $(1))) 37libname = $(shell realpath --canonicalize-missing --relative-to . build/$(dir $(1))/lib$(notdir $(1)))
38 38
39define mksodeps =
40$(1)_SODEPS :=
41endef
42
39define mklib = 43define mklib =
40 44
41ifneq ($(wildcard $(1)/*.cpp),) 45ifneq ($(wildcard $(1)/*.cpp),)
@@ -44,9 +48,9 @@ $(call libname,$(1).a): $(patsubst %.cpp,build/%.o,$(wildcard $(1)/*.cpp))
44 @mkdir -p $$(dir $$@) 48 @mkdir -p $$(dir $$@)
45 $${AR} cr $$@ $$+ 49 $${AR} cr $$@ $$+
46 50
47$(call libname,$(1).so): $(patsubst %.cpp,build/%.o,$(wildcard $(1)/*.cpp)) 51$(call libname,$(1).so): $(patsubst %.cpp,build/%.o,$(wildcard $(1)/*.cpp)) $${$(1)_SODEPS}
48 @mkdir -p $$(dir $$@) 52 @mkdir -p $$(dir $$@)
49 $${CXX} $${CXXFLAGS} -shared -o $$@ $$+ ${PKG_LIBS} 53 $${CXX} $${CXXFLAGS} -shared -o $$@ -Wl,--start-group $$+ -Wl,--end-group
50 54
51PARTARS += $(call libname,$(1).a) 55PARTARS += $(call libname,$(1).a)
52PARTSOS += $(call libname,$(1).so) 56PARTSOS += $(call libname,$(1).so)
@@ -73,6 +77,11 @@ PARTARS :=
73PARTSOS := 77PARTSOS :=
74IWYU_CPPS := 78IWYU_CPPS :=
75 79
80$(foreach part,${PARTS},$(eval $(call mksodeps,${part})))
81
82DEPFILES := $(shell find -mindepth 1 -name .\* -prune -o -type f -name \*.d -print)
83include ${DEPFILES}
84
76$(foreach part,${PARTS},$(eval $(call mklib,${part}))) 85$(foreach part,${PARTS},$(eval $(call mklib,${part})))
77 86
78MAINOBJS := $(patsubst %.cpp,build/%.o,$(wildcard *.cpp)) 87MAINOBJS := $(patsubst %.cpp,build/%.o,$(wildcard *.cpp))
@@ -92,11 +101,11 @@ issim-static: build/issim-static
92 101
93build/issim-dynamic: ${MAINOBJS} ${PARTSOS} 102build/issim-dynamic: ${MAINOBJS} ${PARTSOS}
94 @mkdir -p $(dir $@) 103 @mkdir -p $(dir $@)
95 ${CXX} ${CXXFLAGS} -o $@ $+ ${PKG_LIBS} 104 ${CXX} ${CXXFLAGS} -o $@ -Wl,--start-group $+ -Wl,--end-group ${PKG_LIBS}
96 105
97build/issim-static: ${MAINOBJS} ${PARTARS} 106build/issim-static: ${MAINOBJS} ${PARTARS}
98 @mkdir -p $(dir $@) 107 @mkdir -p $(dir $@)
99 ${CXX} ${CXXFLAGS} -o $@ $+ ${PKG_LIBS} 108 ${CXX} ${CXXFLAGS} -o $@ -Wl,--start-group $+ -Wl,--end-group ${PKG_LIBS}
100 109
101clean: 110clean:
102 rm -rf build issim issim-static 111 rm -rf build issim issim-static
@@ -107,8 +116,6 @@ build/git-tag.cpp:
107 @echo "$$GITTAGCPP" > $@ 116 @echo "$$GITTAGCPP" > $@
108.PHONY: build/git-tag.cpp 117.PHONY: build/git-tag.cpp
109 118
110include $(shell find -type f -name \*.d)
111
112build/%.o: %.cpp 119build/%.o: %.cpp
113 @mkdir -p $(dir $@) 120 @mkdir -p $(dir $@)
114 @$(call iwyu,$<) 121 @$(call iwyu,$<)