# Project setup BUILD_PROFILE?= BUILD_DIR = target/$(BUILD_PROFILE) OBJ_DIR = artifacts SRC_DIR ?= ./src INC_DIR = ./include INC_SUB_NAME = opensmarts INC_SUB_DIR = $(INC_DIR)/$(INC_SUB_NAME) PROJECT_NAME = libopensmarts PROJECT_TYPE = lib SHARED=1 # Objects NAMES = $(basename $(notdir $(wildcard $(SRC_DIR)/*.c))) HEADS = $(addprefix $(INC_SUB_DIR)/, $(notdir $(wildcard $(INC_SUB_DIR)/*.h))) SRCS = $(addsuffix .c, $(NAMES)) OBJS = $(addsuffix .o, $(NAMES)) # C compiler CC ?= gcc # Setup C flags CC_FLAGS_all ?= -std=c23 -Wextra -Wall -I$(INC_DIR) CC_FLAGS ?= -O2 -DNDEBUG CC_FLAGS += $(CC_FLAGS_all) CC_FLAGS_debug ?= -ggdb CC_FLAGS_debug += $(CC_FLAGS_all) ifeq ($(BUILD_PROFILE),debug) CC_FLAGS=$(CC_FLAGS_debug) endif # Detect target BUILD_FLAGS=$(CC_FLAGS) BUILD_TOOL=$(CC) BUILD_FILE_TYPE= ifeq ($(OS),Windows_NT) ifeq ($(PROJECT_TYPE),lib) BUILD_FLAGS+=-shared BUILD_FILE_TYPE=.dll else BUILD_FILE_TYPE=.exe endif else ifeq ($(PROJECT_TYPE),lib) ifeq ($(SHARED),1) BUILD_FLAGS+=-shared BUILD_FILE_TYPE=.so CC_FLAGS += -fpic else BUILD_TOOL=ar BUILD_FLAGS=-crs BUILD_FILE_TYPE=.a endif endif endif # Actual makefile targets build: $(BUILD_DIR) $(addprefix $(BUILD_DIR)/$(OBJ_DIR)/, $(OBJS)) echo $(NAMES) $(BUILD_TOOL) $(BUILD_FLAGS) -o $(BUILD_DIR)/$(PROJECT_NAME)$(BUILD_FILE_TYPE) $(addprefix $(BUILD_DIR)/$(OBJ_DIR)/, $(OBJS)) clean: rm -rf $(BUILD_DIR) install: build install -m 755 $(BUILD_DIR)/$(PROJECT_NAME)$(BUILD_FILE_TYPE) /usr/lib/$(BUILD_PREFIX)$(PROJECT_NAME)$(BUILD_FILE_TYPE) cp -rf $(INC_SUB_DIR) /usr/include remove: rm -rf /usr/include/$(INC_SUB_NAME) rm -rf /usr/lib/$(PROJECT_NAME)$(BUILD_FILE_TYPE) $(BUILD_DIR)/$(OBJ_DIR)/%.o: $(SRC_DIR)/%.c $(HEADS) $(CC) $(CC_FLAGS) -c -o $@ $< $(BUILD_DIR): mkdir -p $(BUILD_DIR) mkdir -p $(BUILD_DIR)/$(OBJ_DIR) format: echo $(addprefix $(SRC_DIR)/, $(SRCS)) $(HEADS) | xargs clang-format --style=file -i