CppCoreGuidelines/scripts/Makefile

129 lines
5.3 KiB
Makefile
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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 (/<a name="([^\"]+)/)' | sort | uniq -d > $(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;<a \(name\|href\)=".*</a>;;g' $(BUILD_DIR)/plain.txt > $(BUILD_DIR)/plain-nohtml.txt
.PHONY: splitfile
splitfile: $(SOURCEPATH) ./python/md-split.py
@python ./python/md-split.py $(SOURCEPATH) $(BUILD_DIR)/plain.txt $(BUILD_DIR)/codeblocks
#### install npm modules
# install/update npm dependencies defined in file package.json
# requires npm (nodejs package manager)
nodejs/node_modules/%: nodejs/package.json
@cd nodejs; npm install