diff --git a/Makefile b/Makefile index 266bc05..b2aab68 100644 --- a/Makefile +++ b/Makefile @@ -1,36 +1,65 @@ +CC = gcc +INCLUDE_DIR = ./include +SOURCE_DIR = ./src +CFLAGS += -I$(INCLUDE_DIR) -ansi -std=c99 +LIBS += -lgsl -lopenblas -lm # Debug flags and release flags for GCC -ifeq ($(BUILD),debug) -CFLAGS += -O0 -g -BUILD_DIR = build/debug -else +ifeq ($(BUILD),release) CFLAGS += -O2 -s -DNDEBUG -BUILD_DIR = build/release +_BUILD_DIR = ./build/release +_OBJECT_DIR = ./obj/release +else +CFLAGS += -O0 -g +_BUILD_DIR = ./build/debug +_OBJECT_DIR = ./obj/debug endif +# Check for required directories for GCC outputs +ifeq ($(wildcard $(OBJECT_DIR)/.),) +$(shell mkdir -p $(OBJECT_DIR)) +endif + +# Valgrind specific flags for debugging help +VALGRIND_ARGS += -s --leak-check=full --track-origins=yes \ + --show-leak-kinds=all + # Get the system architecture if not specified ifeq ($(ARCH),) - ARCH = $(shell uname -m) +ARCH = $(shell uname -m) +BUILD_DIR = $(addsuffix $(ARCH), $(_BUILD_DIR)/) +OBJECT_DIR = $(addsuffix $(ARCH), $(_OBJECT_DIR)/) endif -VALGRIND_ARGS += --leak-check=full --track-origins=yes --show-leak-kinds=all +# Create directories if they don't exist +ifeq ($(wildcard $(BUILD_DIR)/.),) +$(shell mkdir -p $(BUILD_DIR)) +endif +ifeq ($(wildcard $(OBJECT_DIR)/.),) +$(shell mkdir -p $(OBJECT_DIR)) +endif + +# Binary name for executable to compile BINARY_NAME = demo +# Source list files +SRC = kernels solve gp demo +OBJ = $(patsubst %,$(OBJECT_DIR)/%.o,$(SRC)) -$(BUILD_DIR)/$(ARCH)/$(BINARY_NAME): obj/kernels.o obj/solve.o obj/gp.o obj/main.o - gcc -std=c99 $(CFLAGS) obj/kernels.o obj/gp.o obj/solve.o obj/main.o\ - -lgsl -lopenblas -lm -o $(BUILD_DIR)/$(ARCH)/$(BINARY_NAME).$(ARCH) -obj/$(BINARY_NAME).o: $(BINARY_NAME).c - gcc -Wall -c main.c -o obj/main.o -obj/kernels.o: src/kernels.c - gcc -Wall -c src/kernels.c -o obj/kernels.o -obj/solve.o: src/solve.c - gcc -Wall -c src/solve.c -o obj/solve.o -obj/gp.o: src/gp.c - gcc -Wall -c src/gp.c -o obj/gp.o -.PHONY : debug -debug: - $(MAKE) "BUILD=debug" && valgrind $(VALGRIND_ARGS) build/debug/main.x86_64 + +$(OBJECT_DIR)/%.o: $(SOURCE_DIR)/%.c + $(CC) -c -o $@ $< $(CFLAGS) + +$(BUILD_DIR)/$(BINARY_NAME).$(ARCH): $(OBJ) + gcc -std=c99 $(CFLAGS) $(OBJ) $(LIBS) -o $(BUILD_DIR)/$(BINARY_NAME).$(ARCH) + +.PHONY : release +release: + $(MAKE) "BUILD=release" .PHONY : clean clean: - rm obj/*.o + rm -rf $(OBJECT_DIR)/*.o build + +.PHONY : valgrind +valgrind: + valgrind $(VALGRIND_ARGS) $(BUILD_DIR)/$(BINARY_NAME).$(ARCH)