SHELL=/bin/bash -o pipefail INTERACTIVE:=$(shell [ -t 0 ] && echo 1) ifdef INTERACTIVE CLEAN_ANSI= else CLEAN_ANSI=| sed -r 's/\x1B\[([0-9]{1,3}(;[0-9]{1,2};?)?)?[mGK]//g' endif CXX := clang++ CXX_FLAGS := -Wall -Wextra -Werror -std=c++20 \ -isystem include/ LD_FLAGS := -L/opt/homebrew/lib SOURCE_DIR := src/ TEST_DIR := tests/ INCLUDE_DIR := include/ HEADERS := $(shell find $(INCLUDE_DIR) -name *.h) CPP_SOURCES := $(wildcard $(SOURCE_DIR)*.cxx) CPP_OBJECTS := $(patsubst %.cxx, .build/%.o, $(CPP_SOURCES)) LIBRARY := abnf-parser.a LIBRARY := $(patsubst %, .build/lib/%, $(LIBRARY)) TEST_HEADERS := $(wildcard $(TEST_DIR)*.h) TEST_SOURCES := $(wildcard $(TEST_DIR)*.cxx) TEST_OBJECTS := $(patsubst %.cxx, .build/%.o, $(TEST_SOURCES)) TEST_BINARIES := .build/bin/selfvalidate EXECUTE_TESTS := $(patsubst %, %.run, $(TEST_BINARIES)) all: run-test debug: CXX_FLAGS := $(CXX_FLAGS) -g -fsanitize=address debug: LD_FLAGS := $(LD_FLAGS) -fsanitize=address debug: test clean: @ rm -rf .build build: $(LIBRARY) test: build test: $(TEST_BINARIES) run-test: test run-test: $(EXECUTE_TESTS) # Actual Definitions (non-phony) .build/src/%.o: src/%.cxx $(HEADERS) @ mkdir -p .build/src $(CXX) $(CXX_FLAGS) -c $< -o $@ .build/tests/%.o: tests/%.cxx $(HEADERS) $(TEST_HEADERS) @ mkdir -p .build/tests $(CXX) $(CXX_FLAGS) -c $< -o $@ .build/lib/abnf-parser.a: $(CPP_OBJECTS) @ mkdir -p .build/lib ar rc $@ $^ .build/bin/selfvalidate: .build/tests/selfvalidate_test.o $(LIBRARY) @ mkdir -p .build/bin @ rm -f $@.done $(CXX) $^ -o $@ $(LD_FLAGS) -lgmock -lgtest .build/bin/selfvalidate.run: .build/bin/selfvalidate .build/bin/selfvalidate @ touch $@