diff options
Diffstat (limited to 'cmark/Makefile')
| -rw-r--r-- | cmark/Makefile | 214 |
1 files changed, 214 insertions, 0 deletions
diff --git a/cmark/Makefile b/cmark/Makefile new file mode 100644 index 0000000000..609bbfa560 --- /dev/null +++ b/cmark/Makefile @@ -0,0 +1,214 @@ +SRCDIR=src +DATADIR=data +BUILDDIR?=build +GENERATOR?=Unix Makefiles +MINGW_BUILDDIR?=build-mingw +MINGW_INSTALLDIR?=windows +SPEC=test/spec.txt +SITE=_site +SPECVERSION=$(shell perl -ne 'print $$1 if /^version: *([0-9.]+)/' $(SPEC)) +FUZZCHARS?=2000000 # for fuzztest +BENCHDIR=bench +BENCHSAMPLES=$(wildcard $(BENCHDIR)/samples/*.md) +BENCHFILE=$(BENCHDIR)/benchinput.md +ALLTESTS=alltests.md +NUMRUNS?=10 +CMARK=$(BUILDDIR)/src/cmark +CMARK_FUZZ=$(BUILDDIR)/src/cmark-fuzz +PROG?=$(CMARK) +VERSION?=$(SPECVERSION) +RELEASE?=cmark-$(VERSION) +INSTALL_PREFIX?=/usr/local +CLANG_CHECK?=clang-check +CLANG_FORMAT=clang-format -style llvm -sort-includes=0 -i +AFL_PATH?=/usr/local/bin + +.PHONY: all cmake_build leakcheck clean fuzztest test debug ubsan asan mingw archive newbench bench format update-spec afl libFuzzer lint + +all: cmake_build man/man3/cmark.3 + +$(CMARK): cmake_build + +cmake_build: $(BUILDDIR) + cmake --build $(BUILDDIR) + @echo "Binaries can be found in $(BUILDDIR)/src" + +$(BUILDDIR): + @cmake --version > /dev/null || (echo "You need cmake to build this program: http://www.cmake.org/download/" && exit 1) + cmake \ + -S . -B $(BUILDDIR) -G "$(GENERATOR)" \ + -DCMAKE_BUILD_TYPE=$(BUILD_TYPE) \ + -DCMAKE_INSTALL_PREFIX=$(INSTALL_PREFIX) \ + -DCMAKE_EXPORT_COMPILE_COMMANDS=ON \ + -DBUILD_SHARED_LIBS=YES + +install: $(BUILDDIR) + cmake --install $(BUILDDIR) + +uninstall: $(BUILDDIR)/install_manifest.txt + xargs rm < $< + +debug: + cmake \ + -S . -B $(BUILDDIR) -G "$(GENERATOR)" \ + -DCMAKE_BUILD_TYPE=Debug \ + -DBUILD_SHARED_LIBS=YES + cmake --build $(BUILDDIR) + +ubsan: + cmake \ + -S . -B $(BUILDDIR) -G "$(GENERATOR)" \ + -DCMAKE_BUILD_TYPE=Ubsan + cmake --build $(BUILDDIR) + +asan: + cmake \ + -S . -B $(BUILDDIR) -G "$(GENERATOR)" \ + -DCMAKE_BUILD_TYPE=Asan + cmake --build $(BUILDDIR) + +prof: + cmake \ + -S . -B $(BUILDDIR) -G "$(GENERATOR)" \ + -DCMAKE_BUILD_TYPE=Profile + cmake --build $(BUILDDIR) + +afl: + @[ -n "$(AFL_PATH)" ] || { echo '$$AFL_PATH not set'; false; } + cmake \ + -S . -B $(BUILDDIR) -G "$(GENERATOR)" \ + -DBUILD_TESTING=NO \ + -DCMAKE_C_COMPILER=$(AFL_PATH)/afl-clang + cmake --build $(BUILDDIR) + $(AFL_PATH)/afl-fuzz \ + -i fuzz/afl_test_cases \ + -o fuzz/afl_results \ + -x fuzz/dictionary \ + -t 100 \ + $(CMARK) $(CMARK_OPTS) + +libFuzzer: + cmake \ + -S . -B $(BUILDDIR) -G "$(GENERATOR)" \ + -DCMAKE_C_COMPILER=clang \ + -DCMAKE_CXX_COMPILER=clang++ \ + -DCMAKE_BUILD_TYPE=Asan \ + -DCMARK_LIB_FUZZER=ON + cmake --build $(BUILDDIR) + mkdir -p fuzz/corpus + $(BUILDDIR)/fuzz/cmark-fuzz \ + -dict=fuzz/dictionary \ + -max_len=1000 \ + -timeout=1 \ + fuzz/corpus + +lint: $(BUILDDIR) + errs=0 ; \ + for f in `ls src/*.[ch] | grep -v "scanners.c"` ; \ + do echo $$f ; clang-tidy -header-filter='^build/.*' -p=build -warnings-as-errors='*' $$f || errs=1 ; done ; \ + exit $$errs + +mingw: + cmake \ + -S . -B $(MINGW_BUILDDIR) -G "$(GENERATOR)" \ + -DCMAKE_TOOLCHAIN_FILE=toolchain-mingw32.cmake \ + -DCMAKE_INSTALL_PREFIX=$(MINGW_INSTALLDIR) + cmake --build $(MINGW_BUILDDIR) + cmake --install $(MINGW_BUILDDIR) + +man/man3/cmark.3: src/cmark.h | $(CMARK) + python3 man/make_man_page.py $< > $@ \ + +archive: + git archive --prefix=$(RELEASE)/ -o $(RELEASE).tar.gz HEAD + git archive --prefix=$(RELEASE)/ -o $(RELEASE).zip HEAD + +clean: + rm -rf $(BUILDDIR) $(MINGW_BUILDDIR) $(MINGW_INSTALLDIR) + +# We include case_fold.inc in the repository, so this shouldn't +# normally need to be generated. +$(SRCDIR)/case_fold.inc: $(DATADIR)/CaseFolding.txt + python3 tools/make_case_fold_inc.py < $< > $@ + +# We include scanners.c in the repository, so this shouldn't +# normally need to be generated. +$(SRCDIR)/scanners.c: $(SRCDIR)/scanners.re + @case "$$(re2c -v)" in \ + *\ 0.13.*|*\ 0.14|*\ 0.14.1) \ + echo "re2c >= 0.14.2 is required"; \ + false; \ + ;; \ + esac + re2c -W -Werror --case-insensitive -b -i --no-generation-date \ + -o $@ $< + $(CLANG_FORMAT) $@ + +# We include entities.inc in the repository, so normally this +# doesn't need to be regenerated: +$(SRCDIR)/entities.inc: tools/make_entities_inc.py + python3 $< > $@ + +update-spec: + curl 'https://raw.githubusercontent.com/jgm/CommonMark/master/spec.txt'\ + > $(SPEC) + +test: cmake_build + ctest --test-dir $(BUILDDIR) --output-on-failure || (cat $(BUILDDIR)/Testing/Temporary/LastTest.log && exit 1) + +$(ALLTESTS): + python3 test/spec_tests.py --spec $(SPEC) --dump-tests | python3 -c 'import json; import sys; tests = json.loads(sys.stdin.read()); print("\n".join([test["markdown"] for test in tests]))' > $@ + +leakcheck: $(ALLTESTS) + for format in html man xml latex commonmark; do \ + for opts in "" "--smart"; do \ + echo "cmark -t $$format $$opts" ; \ + valgrind -q --leak-check=full --dsymutil=yes --error-exitcode=1 $(PROG) -t $$format $$opts $(ALLTESTS) >/dev/null || exit 1;\ + done; \ + done; + +fuzztest: + { for i in `seq 1 10`; do \ + cat /dev/urandom | head -c $(FUZZCHARS) | iconv -f latin1 -t utf-8 | tee fuzz-$$i.txt | \ + /usr/bin/env time -p $(PROG) >/dev/null && rm fuzz-$$i.txt ; \ + done } 2>&1 | grep 'user\|abnormally' + +progit: + git clone https://github.com/progit/progit.git + +$(BENCHFILE): progit + echo "" > $@ + for lang in ar az be ca cs de en eo es es-ni fa fi fr hi hu id it ja ko mk nl no-nb pl pt-br ro ru sr th tr uk vi zh zh-tw; do \ + cat progit/$$lang/*/*.markdown >> $@; \ + done + +# for more accurate results, run with +# sudo renice -10 $$; make bench +bench: $(BENCHFILE) + { for x in `seq 1 $(NUMRUNS)` ; do \ + /usr/bin/env time -p $(PROG) </dev/null >/dev/null ; \ + /usr/bin/env time -p $(PROG) $< >/dev/null ; \ + done \ + } 2>&1 | grep 'real' | awk '{print $$2}' | python3 'bench/stats.py' + +newbench: + for f in $(BENCHSAMPLES) ; do \ + printf "%26s " `basename $$f` ; \ + { for x in `seq 1 $(NUMRUNS)` ; do \ + /usr/bin/env time -p $(PROG) </dev/null >/dev/null ; \ + for x in `seq 1 200` ; do cat $$f ; done | \ + /usr/bin/env time -p $(PROG) > /dev/null; \ + done \ + } 2>&1 | grep 'real' | awk '{print $$2}' | \ + python3 'bench/stats.py'; done + +format: + $(CLANG_FORMAT) src/*.c src/*.h api_test/*.c api_test/*.h + +operf: $(CMARK) + operf $< < $(BENCHFILE) > /dev/null + +distclean: clean + -rm -rf *.dSYM + -rm -f README.html + -rm -rf $(BENCHFILE) $(ALLTESTS) progit |
