自动让 "make help "打印你的Makefile的用法

533 阅读1分钟

自我记录的Makefile

自动让 "make help "打印你的Makefile的用法。

由于在golang社区的广泛使用,Makefiles正在卷土重来。唯一的问题是......它们是做什么的?阅读makefile是一件很困难的事情--它通常很难看,而且许多目标只供内部使用。而且,与一个好的CLI程序不同的是,没有相当于--help

如果你能对makefile进行标记,并让make help ,自动产生一个使用说明,那不是很好吗?

我第一次在Marme Lab博客上读到如何做到这一点,是在Self-Documented Makefile。在Hacker News上有一个后续报道,在接近底部的地方,m6w6发布了一个甚至更好的版本:

# https://www.client9.com/self-documenting-makefiles/
help:
        @awk -F ':|##' '/^[^\t].+?:.*?##/ {\
        printf "\033[36m%-30s\033[0m %s\n", $$1, $$NF \
        }' $(MAKEFILE_LIST)
.DEFAULT_GOAL=help
.PHONY=help

把这个添加到你的makefile的底部(并确保用tab来代替前面的空格)。或者在bash中作为一个单行代码:

@awk -F ':|##' '/^[^\t].+?:.*?##/ {printf "\033[36m%-30s\033[0m %s\n", $1, $NF}' Makefile

天啊,在一行中,你得到了makefile的东西、awk的东西、正则表达式、printf格式和终端颜色。理解这一点可能很难,但使用它却非常容易。只要在同一行中使用## 注释来记录你的目标:

build: ## build but do not install
        go build .
install: ## install command
        go install .
lint: ## run linters
        gometalinter ...
clean:  ## cleanup
        go clean ./..

并尝试一下:

$ make help
build               build but do not install
install             install command
lint                run linters
clean               cleanup

如果你想要排序的输出,尽可以在help 目标的末尾添加一个|sort

我见过一些其他的解决方案来为Makefiles添加文档。其中一个是用另一个程序来包装make。我很想让make help 调用一个golang程序来解析Makefile来生成帮助。但这个awk 的技巧是迄今为止最好的,因为它在几乎所有的系统上都能开箱即用。我已经在macOS、linux和带有busyboxAlpine Linux上进行了测试awk