Makefile-获取传递给make的参数

SIG*_*ULT 7 makefile

我有一个像这样的makefile:

.SILENT: #don't echo commands as we run them.

###
# here, set $1 (in the latter bash script) to the first make arg.
# $2 to the second one.
# et cetera.
# ($0 being set properly is optional)
###

foo:
    echo "you passed to make: $1 $2 $3 $4 $5 $6"
Run Code Online (Sandbox Code Playgroud)

所以我可以做:

make foo
You passed to make: foo
Run Code Online (Sandbox Code Playgroud)

(不要告诉任何人,但我正在创建“给我做三明治”的东西)

Ale*_*ohn 7

不,您无法在 Makefile 中“看到”完整的make命令参数列表。您可以按照在命令行中输入的顺序查看“目标”列表,例如

make a   c b   d
Run Code Online (Sandbox Code Playgroud)

将产生$(MAKECMDGOALS)a c b d.

您可以专门检查make命令行上是否设置了某些内容,例如

make A=B C=D
Run Code Online (Sandbox Code Playgroud)

将产生$(A)B,和$(C)D。但你永远不会知道它是make A=B C=D还是make C=D A=Bmake A=F -B C=D A=B

如果它真的很重要,您可以将您的 make 包装在一个 shell 脚本中,并拥有它的全部功能:

make.sh a A=B c
Run Code Online (Sandbox Code Playgroud)

电话

#!/bin/bash
make MAKECMDLINE="$*" $*
Run Code Online (Sandbox Code Playgroud)

现在在 Makefile 中,您可以根据需要解析$(MAKECMDLINE)

请注意,某些命令行选项可能会禁用您的解析器,例如

make A=B C=D -h
Run Code Online (Sandbox Code Playgroud)

永远不会读取您的 Makefile,并且

make A=B C=D -f /dev/null
Run Code Online (Sandbox Code Playgroud)

也会忽略你的 Makefile。

  • 有时 make 不会调用自身,因此将 make 包装在 shell 脚本中不起作用? (2认同)