From b9c157b8687c3e2d0d9a40b4f5c5191e34b728d4 Mon Sep 17 00:00:00 2001 From: Kai Gunger Date: Thu, 25 Sep 2025 00:37:24 -0400 Subject: Improve makefile (from a college project I did) --- Makefile | 41 +++++++++++++--------------- Makefile.logic | 86 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 105 insertions(+), 22 deletions(-) create mode 100644 Makefile.logic diff --git a/Makefile b/Makefile index 0802007..b0835fd 100644 --- a/Makefile +++ b/Makefile @@ -1,31 +1,28 @@ +BUILD_PROFILE = release -SRC_DIR = src -BUILD_DIR = build -OBJ_DIR = $(BUILD_DIR)/artifacts -INCLUDE_DIR = ./include +.PHONY: build debug clean format install install_debug uninstall run -SRCS = $(notdir $(wildcard $(SRC_DIR)/*.c)) -OBJS = $(addsuffix .o, $(basename $(SRCS))) +build: + BUILD_PROFILE=$(BUILD_PROFILE) $(MAKE) -f Makefile.logic -CFLAGS ?= -Werror -Wall +debug: BUILD_PROFILE = debug +debug: build -build: build_dir $(OBJS) - $(CC) -shared -o $(BUILD_DIR)/libopensmarts.so $(addprefix $(OBJ_DIR)/, $(OBJS)) +clean: + BUILD_PROFILE=$(BUILD_PROFILE) $(MAKE) -f Makefile.logic clean -install: build - install -m 755 ./build/libopensmarts.so /usr/lib/libopensmarts.so - rm -rf /usr/include/osm - mkdir -p /usr/include/osm - cp -r ./include/osm /usr/include +format: + $(MAKE) -f Makefile.logic format -remove: - rm -rf /usr/include/osm - rm -rf /usr/lib/libopensmarts.so +install: + BUILD_PROFILE=$(BUILD_PROFILE) $(MAKE) -f Makefile.logic install -%.o: $(SRC_DIR)/%.c - $(CC) $(CFLAGS) -c -fpic -I$(INCLUDE_DIR) -o $(BUILD_DIR)/artifacts/$@ $< +install_debug: BUILD_PROFILE = debug +install_debug: install -build_dir: - mkdir -p $(BUILD_DIR) - mkdir -p $(OBJ_DIR) +uninstall: + $(MAKE) -f Makefile.logic uninstall + +run: + $(MAKE) -f Makefile.logic run diff --git a/Makefile.logic b/Makefile.logic new file mode 100644 index 0000000..00064a7 --- /dev/null +++ b/Makefile.logic @@ -0,0 +1,86 @@ +# 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 + -- cgit v1.2.3