.SUFFIXES: MAKEFLAGS+=-r config=debug defines=standard cxxstd=c++11 # set cxxstd=any to disable use of -std=... BUILD=build/make-$(CXX)-$(config)-$(defines)-$(cxxstd) SOURCES=src/pugixml.cpp $(filter-out tests/fuzz_%,$(wildcard tests/*.cpp)) EXECUTABLE=$(BUILD)/test VERSION=$(shell sed -n 's/.*version \(.*\).*/\1/p' src/pugiconfig.hpp) RELEASE=$(filter-out scripts/archive.py docs/%.adoc,$(shell git ls-files contrib docs scripts src CMakeLists.txt readme.txt)) CXXFLAGS=-g -Wall -Wextra -Werror -pedantic -Wundef -Wshadow -Wcast-align -Wcast-qual -Wold-style-cast LDFLAGS= ifeq ($(config),release) CXXFLAGS+=-O3 -DNDEBUG endif ifeq ($(config),coverage) CXXFLAGS+=-coverage LDFLAGS+=-coverage endif ifeq ($(config),sanitize) CXXFLAGS+=-fsanitize=address LDFLAGS+=-fsanitize=address ifneq ($(shell uname),Darwin) CXXFLAGS+=-fsanitize=undefined LDFLAGS+=-fsanitize=undefined endif endif ifeq ($(config),analyze) CXXFLAGS+=--analyze endif ifneq ($(defines),standard) COMMA=, CXXFLAGS+=-D $(subst $(COMMA), -D ,$(defines)) endif ifneq ($(findstring PUGIXML_NO_EXCEPTIONS,$(defines)),) CXXFLAGS+=-fno-exceptions endif ifneq ($(cxxstd),any) CXXFLAGS+=-std=$(cxxstd) endif OBJECTS=$(SOURCES:%=$(BUILD)/%.o) all: $(EXECUTABLE) ifeq ($(config),coverage) test: $(EXECUTABLE) -@find $(BUILD) -name '*.gcda' -exec rm {} + ./$(EXECUTABLE) @gcov -b -o $(BUILD)/src/ pugixml.cpp.gcda | sed -e '/./{H;$!d;}' -e 'x;/pugixml.cpp/!d;' @find . -name '*.gcov' -and -not -name 'pugixml.cpp.gcov' -exec rm {} + else test: $(EXECUTABLE) ./$(EXECUTABLE) endif fuzz_%: $(BUILD)/fuzz_% @mkdir -p build/$@ $< build/$@ tests/data_fuzz_$* -max_len=1024 -dict=tests/fuzz_$*.dict clean: rm -rf $(BUILD) release: build/pugixml-$(VERSION).tar.gz build/pugixml-$(VERSION).zip docs: docs/quickstart.html docs/manual.html build/pugixml-%: .FORCE | $(RELEASE) @mkdir -p $(BUILD) TIMESTAMP=`git show v$(VERSION) -s --format=%ct` && python scripts/archive.py $@ pugixml-$(VERSION) $$TIMESTAMP $| $(EXECUTABLE): $(OBJECTS) $(CXX) $(OBJECTS) $(LDFLAGS) -o $@ build/libFuzzer.o: svn co http://llvm.org/svn/llvm-project/llvm/trunk/lib/Fuzzer build/Fuzzer ls build/Fuzzer/*.cpp | xargs printf '#include "%s"\n' >build/libFuzzer.cpp clang++ build/libFuzzer.cpp -c -g -O2 -fno-omit-frame-pointer -std=c++11 -I . -o build/libFuzzer.o $(BUILD)/fuzz_%: tests/fuzz_%.cpp src/pugixml.cpp build/libFuzzer.o @mkdir -p $(BUILD) clang++ $(CXXFLAGS) -fsanitize=address -fsanitize-coverage=trace-pc-guard $^ -o $@ $(BUILD)/%.o: % @mkdir -p $(dir $@) $(CXX) $< $(CXXFLAGS) -c -MMD -MP -o $@ -include $(OBJECTS:.o=.d) .SECONDEXPANSION: docs/%.html: docs/%.adoc $$(shell sed -n 's/include\:\:\(.*\)\[.*/docs\/\1/p' docs/%.adoc) asciidoctor -b html5 -a version=$(VERSION) $< -o $@ .PHONY: all test clean release .FORCE