我有一个这样的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"
所以我可以做:
make foo
You passed to make: foo
((不告诉任何人,但我正在创建“给我做三明治”的东西)]
否,您不能在Makefile中“看到” make命令的参数的完整列表。您可以按照在命令行上输入的顺序查看“目标”列表,例如
make a c b d
将产生带有a c b d
的$(MAKECMDGOALS)。
例如,您可以专门检查在[[make命令行上是否设置了某些内容
make A=B C=D
将使用,并使用B
生成$(A)
D
生成$(C)。但是您永远不会知道它是make A=B C=D
还是make C=D A=B
或make A=F -B C=D A=B
。如果真的很重要,则可以将make封装在shell脚本中,并具有全部功能:make.sh a A=B c
通话
#!/bin/bash make MAKECMDLINE="$*" $*
现在在Makefile中,您可以根据需要解析。请注意,某些命令行选项可能会禁用您的解析器,例如$(MAKECMDLINE)
make A=B C=D -h
将永远不会读取您的Makefile,并且
make A=B C=D -f /dev/null
也会忽略您的Makefile。
[Edit 2019:哇,过去的我太蠢了。
您可以创建一个shell脚本来完全控制:
$ cat make.sh
if [ $1 = 'me' ]; then
if [ $1 = 'a' ]; then
if[ $3 = 'sandwich' ];then
if [ `whoami` = 'root' ];
echo "Okay."
#todo: echo an actual sandwich in ascii.
else
echo "what? Make it yourself!"
fi
exit 0
fi
fi
fi
make $@
$ echo 'alias make="/home/connor/make.sh"' >> .bashrc
$ source .bashrc
...多田!现在,当您调用make时,它实际上会调用shell脚本,检查您传递给make的参数是否是“让我成为三明治”,如果不是,请使用所有的参数调用make。如果要告诉make为某些参数运行规则:
if [ $1 = 'foo' ]; then make somerule fi