# This Makefile is supposed to run on the Travis CI server and also locally # it assumes the nodejs package managaer npm is installed # make magic not needed MAKEFLAGS += --no-builtin-rules .SUFFIXES: BUILD_DIR=build SOURCEFILE = CppCoreGuidelines.md SOURCEPATH = ../$(SOURCEFILE) .PHONY: default default: all .PHONY: all all: \ check-markdown \ check-references \ check-notabs \ hunspell-check \ cpplint-all \ check-badchars $(BUILD_DIR): @mkdir -p $(BUILD_DIR) #### clean: remove all files generated by the productive rules .PHONY: clean clean: rm -rf $(BUILD_DIR) #### distclean: remove all helper executables that may be downloaded by the Makefile .PHONY: distclean distclean: rm -rf ./nodejs/node_modules #### check markdown ## run remark markdown checker based on configuration in .remarkrc .PHONY: check-markdown check-markdown: nodejs/node_modules/remark nodejs/remark/.remarkrc $(SOURCEPATH) $(BUILD_DIR) Makefile echo '##################### Markdown check ##################' ## run remark, paste output to temporary file cd nodejs; ./node_modules/.bin/remark ../$(SOURCEPATH) --no-color -q --config-path ./remark/.remarkrc 1> ../$(BUILD_DIR)/$(SOURCEFILE).fixed --frail ## show a diff with changes remark suggests .PHONY: show-diff show-diff: nodejs/node_modules/remark nodejs/remark/.remarkrc $(SOURCEPATH) $(BUILD_DIR) Makefile cd nodejs; ./node_modules/.bin/remark ../$(SOURCEPATH) --no-color -q --config-path ./remark/.remarkrc 1> ../$(BUILD_DIR)/$(SOURCEFILE).fixed ## compare temporary file to original, error and fail with message if differences exist diff $(SOURCEPATH) $(BUILD_DIR)/$(SOURCEFILE).fixed -u3 || \ (echo "Error: remark found bad markdown syntax, see output above" && false) .PHONY: check-references check-references: $(SOURCEPATH) $(BUILD_DIR) Makefile @echo '##################### References check ##################' ## check references unique @rm -f $(BUILD_DIR)/$(SOURCEFILE).uniq @cat $(SOURCEPATH) | perl -ne 'print "$$1\n" if (/ $(BUILD_DIR)/$(SOURCEFILE).uniq ## check if output has data @if [ -s "build/CppCoreGuidelines.md.uniq" ]; then echo 'Found duplicate anchors:'; cat $(BUILD_DIR)/$(SOURCEFILE).uniq; false; fi .PHONY: check-notabs check-notabs: $(SOURCEPATH) $(BUILD_DIR) Makefile @echo '##################### Tabs check ##################' # find lines with tabs # old file still might be around @rm -f $(BUILD_DIR)/CppCoreGuidelines.md.tabs # print file, add line numbers, remove tabs from nl tool, grep for remaining tabs, replace with stars @cat ../$(SOURCEFILE) | nl -ba | perl -pe 's/(^[^\t]*)\t/$1--/g' | perl -ne 'print if /\t/' | perl -pe 's/\t/\*\*\*\*/g' > $(BUILD_DIR)/$(SOURCEFILE).tabs @if [ -s $(BUILD_DIR)/CppCoreGuidelines.md.tabs ]; then echo 'Warning: Tabs found:'; cat $(BUILD_DIR)/CppCoreGuidelines.md.tabs; false; fi; .PHONY: check-badchars check-badchars: $(SOURCEPATH) $(BUILD_DIR) Makefile @echo '##################### Bad chars check ##################' # find lines with tabs # old file still might be around @rm -f $(BUILD_DIR)/CppCoreGuidelines.md.badchars # print file, add line numbers, grep for bad chars @cat ../$(SOURCEFILE) | nl -ba | perl -ne 'print if /’|‘|”|“|¸| |–|…|¦/' > $(BUILD_DIR)/$(SOURCEFILE).badchars || true @if [ -s $(BUILD_DIR)/CppCoreGuidelines.md.badchars ]; then echo 'Warning: Undesired chars (–’‘“”¸…¦) or Unicode EN SPACE found, use markdown-compatible symbols instead:'; cat $(BUILD_DIR)/CppCoreGuidelines.md.badchars; false; fi; .PHONY: hunspell-check hunspell-check: $(BUILD_DIR)/plain-nohtml.txt @echo '##################### Spell check ##################' sed -e 's!http\(s\)\{0,1\}://[^[:space:]]*!!g' build/plain-nohtml.txt | hunspell -d hunspell/en_US -p hunspell/isocpp.dic -u > $(BUILD_DIR)/hunspell-report.txt @if [ -s $(BUILD_DIR)/hunspell-report.txt ]; then echo 'Warning: Spellcheck failed, fix words or add to dictionary:'; cat $(BUILD_DIR)/hunspell-report.txt; false; fi; # only list words that are not in dict # to include all add them to bottom of hunspell/isocpp.dict, and run # cat hunspell/isocpp.dic | sort | uniq > hunspell/isocpp.dic2; mv hunspell/isocpp.dic2 hunspell/isocpp.dic .PHONY: hunspell-list hunspell-list: $(BUILD_DIR)/plain.txt sed -e 's!http\(s\)\{0,1\}://[^[:space:]]*!!g' build/plain-nohtml.txt | hunspell -p hunspell/isocpp.dic -l #### Cpplint .PHONY: cpplint-all cpplint-all: $(BUILD_DIR)/codeblocks $(BUILD_DIR)/Makefile python/Makefile.in @echo '##################### C++ Style check ##################' cd $(BUILD_DIR)/codeblocks; $(MAKE) cpplint-all -k #### generic makefile for sourceblocks (need to be evaluated after c++ file generation) $(BUILD_DIR)/Makefile: python/Makefile.in @cp python/Makefile.in $(BUILD_DIR)/codeblocks/Makefile #### split md file into plain text and code $(BUILD_DIR)/codeblocks: splitfile $(BUILD_DIR)/plain.txt: splitfile $(BUILD_DIR)/plain-nohtml.txt: $(BUILD_DIR)/plain.txt sed 's;