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),release) CFLAGS += -O2 -s -DNDEBUG _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) BUILD_DIR = $(addsuffix $(ARCH), $(_BUILD_DIR)/) OBJECT_DIR = $(addsuffix $(ARCH), $(_OBJECT_DIR)/) endif # 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 linalg matio OBJ = $(patsubst %,$(OBJECT_DIR)/%.o,$(SRC) $(BINARY_NAME)) $(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 -rf $(OBJECT_DIR)/*.o build .PHONY : valgrind valgrind: valgrind $(VALGRIND_ARGS) $(BUILD_DIR)/$(BINARY_NAME).$(ARCH)