把握一个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干啥,即可。

posted @ 2025-10-08 16:00  华容道专家  阅读(5)  评论(0)    收藏  举报