Makefile 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. SHELL=/bin/bash -o pipefail
  2. INTERACTIVE:=$(shell [ -t 0 ] && echo 1)
  3. ifdef INTERACTIVE
  4. CLEAN_ANSI=
  5. else
  6. CLEAN_ANSI=| sed -r 's/\x1B\[([0-9]{1,3}(;[0-9]{1,2};?)?)?[mGK]//g'
  7. endif
  8. CXX := clang++
  9. CXX_FLAGS := -Wall -Wextra -Werror -std=c++20 \
  10. -isystem include/
  11. LD_FLAGS := -L/opt/homebrew/lib
  12. SOURCE_DIR := src/
  13. TEST_DIR := tests/
  14. INCLUDE_DIR := include/
  15. HEADERS := $(shell find $(INCLUDE_DIR) -name *.h)
  16. CPP_SOURCES := $(wildcard $(SOURCE_DIR)*.cxx)
  17. CPP_OBJECTS := $(patsubst %.cxx, .build/%.o, $(CPP_SOURCES))
  18. LIBRARY := abnf-parser.a
  19. LIBRARY := $(patsubst %, .build/lib/%, $(LIBRARY))
  20. TEST_HEADERS := $(wildcard $(TEST_DIR)*.h)
  21. TEST_SOURCES := $(wildcard $(TEST_DIR)*.cxx)
  22. TEST_OBJECTS := $(patsubst %.cxx, .build/%.o, $(TEST_SOURCES))
  23. TEST_BINARIES := .build/bin/selfvalidate
  24. EXECUTE_TESTS := $(patsubst %, %.run, $(TEST_BINARIES))
  25. all: run-test
  26. debug: CXX_FLAGS := $(CXX_FLAGS) -g -fsanitize=address
  27. debug: LD_FLAGS := $(LD_FLAGS) -fsanitize=address
  28. debug: test
  29. clean:
  30. @ rm -rf .build
  31. build: $(LIBRARY)
  32. test: build
  33. test: $(TEST_BINARIES)
  34. run-test: test
  35. run-test: $(EXECUTE_TESTS)
  36. # Actual Definitions (non-phony)
  37. .build/src/%.o: src/%.cxx $(HEADERS)
  38. @ mkdir -p .build/src
  39. $(CXX) $(CXX_FLAGS) -c $< -o $@
  40. .build/tests/%.o: tests/%.cxx $(HEADERS) $(TEST_HEADERS)
  41. @ mkdir -p .build/tests
  42. $(CXX) $(CXX_FLAGS) -c $< -o $@
  43. .build/lib/abnf-parser.a: $(CPP_OBJECTS)
  44. @ mkdir -p .build/lib
  45. ar rc $@ $^
  46. .build/bin/selfvalidate: .build/tests/selfvalidate_test.o $(LIBRARY)
  47. @ mkdir -p .build/bin
  48. @ rm -f $@.done
  49. $(CXX) $^ -o $@ $(LD_FLAGS) -lgmock -lgtest
  50. .build/bin/selfvalidate.run: .build/bin/selfvalidate
  51. .build/bin/selfvalidate
  52. @ touch $@