# 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


$(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
## 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
## check references unique
	rm -f $(BUILD_DIR)/$(SOURCEFILE).uniq
	grep -oP '(?<=<a name=")[^\"]+' $(SOURCEPATH) | 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


#### 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
