.POSIX: .SUFFIXES: # Source code location and files to watch for changes. SRC_DIR := src SRC_MAIN := $(SRC_DIR)/main.c SRC_APP := $(SRC_DIR)/app.c WATCH_SRC := $(wildcard $(SRC_DIR)/*.c) WATCH_SRC += $(wildcard $(SRC_DIR)/*.h) # Output library names and executables. BIN_NAME := app LIB_NAME := libmic.so BUILD_DIR := build BIN := $(BUILD_DIR)/$(BIN_NAME) LIB := $(BUILD_DIR)/$(LIB_NAME) LIB_DIR := $(BUILD_DIR) # Compiler and linker configuration. CC := gcc CFLAGS := -Wall -Wextra -pedantic -std=c99 LDFLAGS := LDLIBS := RELEASE_CFLAGS := -DNDEBUG -O2 DEBUG_CFLAGS := -DDEBUG -g .PHONY: dynamic static clean run # Setup debug/release builds. # make clean && make DEBUG=0 # make clean && make DEBUG=1 DEBUG ?= 0 ifeq ($(DEBUG), 1) CFLAGS += $(DEBUG_CFLAGS) else CFLAGS += $(RELEASE_CFLAGS) endif dynamic: CFLAGS += -fPIC dynamic: CFLAGS += -DLIB_NAME=\"$(LIB_NAME)\" dynamic: CFLAGS += -DLIB_DIR=\"$(LIB_DIR)\" dynamic: LDFLAGS += -ldl dynamic: $(BUILD_DIR) $(LIB) $(BIN) static: SRC_MAIN += $(SRC_APP) static: $(BUILD_DIR) $(BIN) $(BIN): $(SRC_MAIN) $(WATCH_SRC) $(CC) $(CFLAGS) $(LDFLAGS) -o $(BIN) $(SRC_MAIN) $(LDLIBS) $(LIB): $(SRC_APP) $(WATCH_SRC) $(CC) $(CFLAGS) -shared $(LDFLAGS) -o $@ $(SRC_APP) $(LDLIBS) $(BUILD_DIR): mkdir -p $(BUILD_DIR) run: $(BIN) exec $(BIN) clean: rm -r $(BUILD_DIR)