summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile41
-rw-r--r--Makefile.logic86
2 files changed, 105 insertions, 22 deletions
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
+