diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..e7d3905 --- /dev/null +++ b/Makefile @@ -0,0 +1,101 @@ +# This software is licensed by the MIT License, see LICENSE file +# Copyright © 2022 Gregory Lirent + +######################################################################################################################## + +BUILD_PATH ?= ./bin +LIB_NAME = cdsb + +DEBUG_PATH = $(BUILD_PATH)/debug +RELEASE_PATH = $(BUILD_PATH)/release + +######################################################################################################################## + +CC = clang +MKDIR = mkdir -p +RMRF = rm -rf +AR = ar crs +CP = cp + +$(DEBUG_PATH)/obj/%.o: CFLAGS := $(CFLAGS) -DDEBUG -Og -fPIC -c -g3 -Wall +$(RELEASE_PATH)/obj/%.o: CFLAGS := $(CFLAGS) -DNDEBUG -O2 -fPIC -c + +######################################################################################################################## + +debug: modules $(DEBUG_PATH)/lib$(LIB_NAME).a +release: modules $(RELEASE_PATH)/lib$(LIB_NAME).a + +######################################################################################################################## + +c_objects = $(addsuffix .o,$(addprefix $(2),$(notdir $(basename $(wildcard $(1)*.c))))) + +OBJECTS = $(call c_objects,./src/,)\ + $(call c_objects,./src/string/,string-)\ + $(call c_objects,./src/array/,array-)\ + $(call c_objects,./src/list/,list-)\ + $(call c_objects,./src/map/,map-)\ + $(call c_objects,./src/set/,set-) + +######################################################################################################################## + +$(DEBUG_PATH)/lib$(LIB_NAME).a: $(addprefix $(DEBUG_PATH)/obj/,$(OBJECTS)) | $(DEBUG_PATH)/ +$(RELEASE_PATH)/lib$(LIB_NAME).a: $(addprefix $(RELEASE_PATH)/obj/,$(OBJECTS)) | $(RELEASE_PATH)/ + +######################################################################################################################## + +$(DEBUG_PATH)/obj/string-%.o: ./src/string/%.c | $(DEBUG_PATH)/obj/ + $(CC) $^ -o $@ $(CFLAGS) +$(DEBUG_PATH)/obj/array-%.o: ./src/array/%.c | $(DEBUG_PATH)/obj/ + $(CC) $^ -o $@ $(CFLAGS) +$(DEBUG_PATH)/obj/list-%.o: ./src/list/%.c | $(DEBUG_PATH)/obj/ + $(CC) $^ -o $@ $(CFLAGS) +$(DEBUG_PATH)/obj/map-%.o: ./src/map/%.c | $(DEBUG_PATH)/obj/ + $(CC) $^ -o $@ $(CFLAGS) +$(DEBUG_PATH)/obj/set-%.o: ./src/set/%.c | $(DEBUG_PATH)/obj/ + $(CC) $^ -o $@ $(CFLAGS) +$(DEBUG_PATH)/obj/%.o: ./src/%.c | $(DEBUG_PATH)/obj/ + $(CC) $^ -o $@ $(CFLAGS) + +######################################################################################################################## + +$(RELEASE_PATH)/obj/string-%.o: ./src/string/%.c | $(RELEASE_PATH)/obj/ + $(CC) $^ -o $@ $(CFLAGS) +$(RELEASE_PATH)/obj/array-%.o: ./src/array/%.c | $(RELEASE_PATH)/obj/ + $(CC) $^ -o $@ $(CFLAGS) +$(RELEASE_PATH)/obj/list-%.o: ./src/list/%.c | $(RELEASE_PATH)/obj/ + $(CC) $^ -o $@ $(CFLAGS) +$(RELEASE_PATH)/obj/map-%.o: ./src/map/%.c | $(RELEASE_PATH)/obj/ + $(CC) $^ -o $@ $(CFLAGS) +$(RELEASE_PATH)/obj/set-%.o: ./src/set/%.c | $(RELEASE_PATH)/obj/ + $(CC) $^ -o $@ $(CFLAGS) +$(RELEASE_PATH)/obj/%.o: ./src/%.c | $(RELEASE_PATH)/obj/ + $(CC) $^ -o $@ $(CFLAGS) + +######################################################################################################################## + +$(BUILD_PATH)/: + $(MKDIR) $@ +$(DEBUG_PATH)/: | $(BUILD_PATH)/ + $(MKDIR) $@ +$(RELEASE_PATH)/: | $(BUILD_PATH)/ + $(MKDIR) $@ +$(DEBUG_PATH)/obj/: | $(DEBUG_PATH)/ + $(MKDIR) $@ +$(RELEASE_PATH)/obj/: | $(RELEASE_PATH)/ + $(MKDIR) $@ + +######################################################################################################################## + +clean: + $(RMRF) ./bin/ + cd ./modules/libunic && $(MAKE) clean + +%.a: + $(AR) $@ $^ + +######################################################################################################################## + +modules: ./modules/libunic/bin/libunic.a + +./modules/libunic/bin/libunic.a: + cd ./modules/libunic && $(MAKE)