Makefile 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  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/ -I/opt/homebrew/opt/icu4c/include \
  11. -DJVALIDATE_USE_EXCEPTIONS -DJVALIDATE_LOAD_FAILURE_AS_FALSE_SCHEMA
  12. LD_FLAGS := -L/opt/homebrew/lib -L/opt/homebrew/opt/icu4c/lib -licuuc -licui18n -lada-idna
  13. TEST_DIR := tests/
  14. INCLUDE_DIR := include/
  15. HEADERS := $(shell find $(INCLUDE_DIR) -name *.h)
  16. TEST_HEADERS := $(wildcard $(TEST_DIR)*.h)
  17. TEST_SOURCES := $(wildcard $(TEST_DIR)*.cxx)
  18. TEST_OBJECTS := $(patsubst %.cxx, .build/%.o, $(TEST_SOURCES))
  19. TEST_BINARIES := .build/bin/selfvalidate .build/bin/annotation_test .build/bin/extension_test
  20. EXECUTE_TESTS := $(patsubst %, %.done, $(TEST_BINARIES))
  21. EXCLUDED_FORMAT_TESTS := color ip_address host_name
  22. EXCLUDED_FORMAT_TESTS := $(shell printf ":*optional_format_%s*" $(EXCLUDED_FORMAT_TESTS) | cut -c2-)
  23. EXCLUDED_FORMAT_TESTS := Draft3/JsonSchema.TestSuite/optional_format_time:$(EXCLUDED_FORMAT_TESTS)
  24. EXCLUDED_TESTS := content *ecmascript_regex zeroTerminatedFloats non_bmp_regex
  25. EXCLUDED_TESTS := $(shell printf ":*optional_%s" $(EXCLUDED_TESTS) | cut -c2-):$(EXCLUDED_FORMAT_TESTS)
  26. EXCLUDED_TEST_CASES = "*leap second*"
  27. .PHONY: all
  28. all: validate
  29. all: run-test
  30. .PHONY: debug
  31. debug: CXX_FLAGS := $(CXX_FLAGS) -g -fsanitize=address
  32. debug: LD_FLAGS := $(LD_FLAGS) -fsanitize=address
  33. debug: test
  34. .PHONY: clean
  35. clean:
  36. @ rm -rf .build
  37. .PHONY: test
  38. test: $(TEST_BINARIES)
  39. .PHONY: run-test
  40. run-test: test
  41. run-test: $(EXECUTE_TESTS)
  42. .PHONY: validate
  43. validate: .build/bin/validate
  44. .PHONY: annotation_test
  45. annotation_test: .build/bin/annotation_test.done
  46. .PHONY: extension_test
  47. extension_test: .build/bin/extension_test.done
  48. .PHONY: selfvalidate_test
  49. selfvalidate_test: .build/bin/selfvalidate_test.done
  50. # Actual Definitions (non-phony)
  51. .build/tests/%.o: tests/%.cxx $(HEADERS) $(TEST_HEADERS)
  52. @ mkdir -p .build/tests
  53. $(CXX) $(CXX_FLAGS) -c $< -o $@ -Wno-character-conversion
  54. .build/bin/validate: src/validate.cxx $(HEADERS)
  55. @ mkdir -p .build/bin
  56. $(CXX) $< -o $@ $(CXX_FLAGS) $(LD_FLAGS) -ljsoncpp -lcurl
  57. .build/bin/selfvalidate: .build/tests/selfvalidate_test.o
  58. @ mkdir -p .build/bin
  59. @ rm -f $@.done
  60. $(CXX) $< -o $@ $(LD_FLAGS) -ljsoncpp -lgmock -lcurl -lgtest
  61. .build/bin/selfvalidate.done: .build/bin/selfvalidate
  62. .build/bin/selfvalidate --gtest_filter=-$(EXCLUDED_TESTS) \
  63. --json_case_filter=-$(EXCLUDED_TEST_CASES) $(CLEAN_ANSI)
  64. @ touch $@
  65. .build/bin/annotation_test: .build/tests/annotation_test.o
  66. @ mkdir -p .build/bin
  67. @ rm -f .build/test/annotation_test.done
  68. $(CXX) $< -o $@ $(LD_FLAGS) -ljsoncpp -lgmock -lgtest
  69. .build/bin/annotation_test.done: .build/bin/annotation_test
  70. .build/bin/annotation_test $(CLEAN_ANSI)
  71. @ touch $@
  72. .build/bin/extension_test: .build/tests/extension_test.o
  73. @ mkdir -p .build/bin
  74. @ rm -f .build/test/extension_test.done
  75. $(CXX) $< -o $@ $(LD_FLAGS) -ljsoncpp -lgmock -lgtest
  76. .build/bin/extension_test.done: .build/bin/extension_test
  77. .build/bin/extension_test $(CLEAN_ANSI)
  78. @ touch $@