把握一个Makefile的脉络
首先列出其中的target:
- grep -E '^[^: \t]+:' Makefile
- grep -E '^[a-zA-Z0-9_.-]+:' Makefile
- grep -E '^[^[:space:]:]+:' Makefile
- grep -P '^[^\s:]+:' Makefile
-E和-P
- -E --extended-regexp Interpret PATTERNS as extended regular expressions.
- -P, --perl-regexp Interpret PATTERNS as Perl-compatible regular expressions (PCREs).
可以在.bashrc里alias grep='grep -E'?ls -i发现/usr/bin/grep和egrep居然i-node不同,都不是符号链接。哦,egrep是个脚本:
#!/bin/sh cmd=${0##*/} exec grep -E "$@"
哈!AI前两天还一口咬定shebang后有空格才标准;我又得改自己的Python烂程序了(屎上雕花)。
$*把所有参数视为一个整体,$@把每个参数视为独立的单词…… 还有"$*"和"$@"的不同。
pgrep, pkill, pidwait - look up, signal, or wait for processes based on name and other attributes
我决定alias grep='grep -P',都有p嘛。
然后看看变量的值。准备个print-vars.mk,内容如下:
print-all-vars:
$(foreach V, $(sort $(.VARIABLES)), $(info $V=$($V)))
# $(foreach <var>, <list>, <text>)
print-vars:
$(foreach V, $(sort $(.VARIABLES)),\
$(if $(filter-out environment% default automatic, $(origin $V)),\
$(info $V=$($V))))
# $(if <condition>, <then-part>[, <else-part>])
# $(filter-out <patterns>, <text>)
# $(warning text) 输出时带文件名和行号
在Makefile的最后面include print-vars.mk,然后make print-vars或make print-all-vars
这个文件可以复用。
关于环境变量,我们来试验下。写个shell脚本起名叫make:
~$ cat make echo "\$*=$*" echo "V=$V" ~$ V=1 make $*= V=1
~$ make build V=1 $*=build V=1 V= make处理argv,把V=1设上了? ~$ V=1; make $*= V= ~$ export V=1; make $*= V=1
我是把.放在PATH的最前面。
make这语法也不是天下掉下来的,大概和m4 macro language和LISP有关。awk则是{}门的。
补充,再写个空Makefile试试:
$ cat Makefile clean: include print-vars.mk $ make print-all-vars WORD=eureka | grep eu -*-command-variables-*-=WORD=eureka MAKEFLAGS= -- WORD=eureka MAKEOVERRIDES=WORD=eureka WORD=eureka
此贴堪称closure, 从此以后Makefile再无神秘,也不查手册,问AI Makefile里这是啥,或我想在Makefile干啥,即可。

浙公网安备 33010602011771号