.POSIX: .SUFFIXES: # Source code location and files to watch for changes. SRC_DIR := src BUILD_DIR := build SRC_MAIN := $(SRC_DIR)/main.c WATCH_SRC := $(shell find $(SRC_DIR) -name "*.c" -or -name "*.s" -or -name "*.h") INC_DIRS := $(shell find $(SRC_DIR) -type d) INC_FLAGS := $(addprefix -I,$(INC_DIRS)) # Output executable. TARGET := bdl BIN := $(BUILD_DIR)/$(TARGET) # Compiler and linker configuration. CC := cc CFLAGS := -Wall -Wextra -pedantic -DBIN_NAME=\"$(TARGET)\" -Wno-missing-braces CFLAGS += $(INC_FLAGS) NASM_FLAGS ?= -felf64 LDFLAGS := LDLIBS := RELEASE_CFLAGS := -DNDEBUG -O2 DEBUG_CFLAGS := -DDEBUG -O0 -g .PHONY: build tests clean # Setup debug/release builds. # make clean && make DEBUG=0 # make clean && make DEBUG=1 DEBUG ?= 0 ifeq ($(DEBUG), 1) CFLAGS += $(DEBUG_CFLAGS) NASM_FLAGS += -g -F dwarf else ifeq ($(DEBUG), 2) CFLAGS += $(DEBUG_CFLAGS) -fsanitize=address NASM_FLAGS += -g -F dwarf else CFLAGS += $(RELEASE_CFLAGS) endif main: $(BIN) $(BIN): $(SRC_MAIN) $(WATCH_SRC) $(BUILD_DIR) $(CC) $(CFLAGS) $(LDFLAGS) -o $(BIN) $(SRC_MAIN) $(LDLIBS) # Create build directory if needed. $(BUILD_DIR): mkdir -p $(BUILD_DIR) tests: $(BIN) ./$(BIN) tests/constants/numbers.bdl run: $(BIN) $(BIN) example.bdl viz_lex: $(BIN) $(BIN) -pl example.bdl viz_par: $(BIN) $(BIN) -pp example.bdl | dot -Nfontname="Iosevka Term" -Tpng > viz.png viz_sem: $(BIN) $(BIN) -ps example.bdl | dot -Nfontname="Iosevka Term" -Tpng > viz.png viz_sym: $(BIN) $(BIN) -pt example.bdl | dot -Nfontname="Iosevka Term" -Tpng > viz.png # Remove build directory. clean: rm -rf $(BUILD_DIR)