OPTIMIZE ?= -O3 DEBUG ?= -g AR ?= ar CXX ?= g++ CXXFLAGS := -Wall -Werror -std=c++20 -fPIC -iquote . ${OPTIMIZE} ${DEBUG} libname = $(shell realpath --canonicalize-missing --relative-to . build/$(dir $(1))/lib$(notdir $(1))) PARTS := $(shell find * -type d -\( -name build -prune -o -name tools -prune -o -print -\)) PARTARS := $(foreach part, ${PARTS}, $(call libname, ${part}.a)) PARTSOS := $(foreach part, ${PARTS}, $(call libname, ${part}.so)) MAINOBJS := $(patsubst %.cpp, build/%.o, $(wildcard *.cpp)) MAINOBJS += build/git-tag.o HEADERS := $(find -type f -name \*.h) all: issim 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 $@ $+ build/issim-static: ${MAINOBJS} ${PARTARS} @mkdir -p $(dir $@) ${CXX} ${CXXFLAGS} -o $@ $+ clean: rm -rf build issim issim-static .PHONY: clean build/git-tag.cpp: @mkdir -p $(dir $@) tools/get-git-tag > $@ .PHONY: build/git-tag.cpp include $(shell find -type f -name \*.d) build/%.o: %.cpp @mkdir -p $(dir $@) ${CXX} ${CXXFLAGS} -MMD -c -o $@ $< build/%.o: build/%.cpp @mkdir -p $(dir $@) ${CXX} ${CXXFLAGS} -MMD -c -o $@ $< define mklib = $(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)) @mkdir -p $$(dir $$@) $${CXX} $${CXXFLAGS} -shared -o $$@ $$+ endef $(foreach part, ${PARTS}, $(eval $(call mklib, ${part}))) .SUFFIXES: .SECONDARY: