Makefile - 获取传递给make的参数

时间:2015-12-28 20:07:11

标签: 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"

所以我能做到:

make foo
You passed to make: foo

(不要告诉任何人,但我要创造一个让我成为三明治的东西)

2 个答案:

答案 0 :(得分:4)

不,你不能"看" 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。

答案 1 :(得分:2)

好吧,我想出了自己的问题。

您可以创建一个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并使用所有的args。

如果你想告诉make为某些args运行规则:

if [ $1 = 'foo' ]; then
    make somerule
fi