Last active
December 1, 2021 18:40
-
-
Save rmchale/fb93dfbeee9cc475ccb8a0afd872e284 to your computer and use it in GitHub Desktop.
Makefile template borrowed from MIke Small
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
.PHONY: clean init plan apply format lint validate | |
## hello | |
hello: | |
@echo "hello world" | |
# https://stackoverflow.com/a/25668869 | |
# https://stackoverflow.com/a/19107231 | |
ifeq (, $(shell which fzf)) | |
# simple, brief make rules help generated from comments in Makefile. | |
.DEFAULT_GOAL := show-help | |
else | |
.DEFAULT_GOAL := show-help-fzf | |
endif | |
# Inspired by <http://marmelab.com/blog/2016/02/29/auto-documented-makefile.html> | |
# sed script explained: | |
# /^##/: | |
# * save line in hold space | |
# * purge line | |
# * Loop: | |
# * append newline + line to hold space | |
# * go to next line | |
# * if line starts with doc comment, strip comment character off and loop | |
# * remove target prerequisites | |
# * append hold space (+ newline) to line | |
# * replace newline plus comments by `---` | |
# * print line | |
# Separate expressions are necessary because labels cannot be delimited by | |
# semicolon; see <http://stackoverflow.com/a/11799865/1968> | |
.PHONY: show-help | |
show-help-fzf: | |
$(eval TARGET := $(shell sed -n -e "/^## / { \ | |
h; \ | |
s/.*//; \ | |
:doc" \ | |
-e "H; \ | |
n; \ | |
s/^## //; \ | |
t doc" \ | |
-e "s/:.*//; \ | |
G; \ | |
s/\\n## /---/; \ | |
s/\\n/ /g; \ | |
p; \ | |
}" ${MAKEFILE_LIST} \ | |
| LC_ALL='C' sort --ignore-case \ | |
| awk -F '---' \ | |
-v ncol=$$(tput cols) \ | |
-v indent=29 \ | |
-v col_on="$$(tput setaf 6)" \ | |
-v col_off="$$(tput sgr0)" \ | |
'{ \ | |
printf "%s%*s%s ", col_on, -indent, $$1, col_off; \ | |
n = split($$2, words, " "); \ | |
line_length = ncol - indent; \ | |
for (i = 1; i <= n; i++) { \ | |
line_length -= length(words[i]) + 1; \ | |
if (line_length <= 0) { \ | |
line_length = ncol - indent - length(words[i]) - 1; \ | |
printf "\n%*s ", -indent, " "; \ | |
} \ | |
printf "%s ", words[i]; \ | |
} \ | |
printf "\n"; \ | |
}' \ | |
| fzf --ansi --delimiter=' ' | cut -d ' ' -f 1)) | |
@[ "$(TARGET)" ] && $(MAKE) $(TARGET) | |
show-help: | |
@echo "$$(tput bold)Available rules:$$(tput sgr0)" | |
@echo | |
@sed -n -e "/^## / { \ | |
h; \ | |
s/.*//; \ | |
:doc" \ | |
-e "H; \ | |
n; \ | |
s/^## //; \ | |
t doc" \ | |
-e "s/:.*//; \ | |
G; \ | |
s/\\n## /---/; \ | |
s/\\n/ /g; \ | |
p; \ | |
}" ${MAKEFILE_LIST} \ | |
| LC_ALL='C' sort --ignore-case \ | |
| awk -F '---' \ | |
-v ncol=$$(tput cols) \ | |
-v indent=29 \ | |
-v col_on="$$(tput setaf 6)" \ | |
-v col_off="$$(tput sgr0)" \ | |
'{ \ | |
printf "%s%*s%s ", col_on, -indent, $$1, col_off; \ | |
n = split($$2, words, " "); \ | |
line_length = ncol - indent; \ | |
for (i = 1; i <= n; i++) { \ | |
line_length -= length(words[i]) + 1; \ | |
if (line_length <= 0) { \ | |
line_length = ncol - indent - length(words[i]) - 1; \ | |
printf "\n%*s ", -indent, " "; \ | |
} \ | |
printf "%s ", words[i]; \ | |
} \ | |
printf "\n"; \ | |
}' \ | |
| more $(shell test $(shell uname) = Darwin && echo '--no-init --raw-control-chars') |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment