Files
threadweaver/Makefile

71 lines
1.2 KiB
Makefile

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)