LIB_NAME ?= weaver BUILD_DIR ?= build SRC_DIR ?= src INCLUDE_DIRS := include src/include MODE ?= debug RELEASE_OPT ?= 2 CLINE_SIZE ?= 64 CXX ?= clang++ AR ?= ar ARFLAGS := rcs SRCS := $(shell find $(SRC_DIR) -name '*.cc') OBJS := $(patsubst $(SRC_DIR)/%.cc,$(BUILD_DIR)/%.o,$(SRCS)) DEPS := $(OBJS:.o=.d) INCLUDES := $(addprefix -I,$(INCLUDE_DIRS)) WARN_FLAGS := \ -Wall \ -Wextra \ -Wpedantic \ -Werror COMMON_CXXFLAGS := \ -std=c++20 \ -MMD -MP \ -flto \ --param=destructive-interference-size=$(CLINE_SIZE) \ $(WARN_FLAGS) \ $(INCLUDES) DEBUG_CXXFLAGS := \ -O0 \ -g \ -fsanitize=thread \ -fno-omit-frame-pointer RELEASE_CXXFLAGS := \ -O$(RELEASE_OPT) \ -DNDEBUG ifeq ($(MODE),debug) CXXFLAGS := $(COMMON_CXXFLAGS) $(DEBUG_CXXFLAGS) else ifeq ($(MODE),release) CXXFLAGS := $(COMMON_CXXFLAGS) $(RELEASE_CXXFLAGS) else $(error Unknown MODE '$(MODE)'; use MODE=debug or MODE=release) endif LIB := $(BUILD_DIR)/lib$(LIB_NAME).a .PHONY: all clean all: $(LIB) $(LIB): $(OBJS) @mkdir -p $(dir $@/bin) $(AR) $(ARFLAGS) $@/bin $^ $(BUILD_DIR)/%.o: $(SRC_DIR)/%.cc @mkdir -p $(dir $@) $(CXX) $(CXXFLAGS) -c $< -o $@ -include $(DEPS) clean: rm -rf $(BUILD_DIR)