如何只将参数值传递给Makefile目标?

时间:2018-06-09 13:13:49

标签: go makefile

我来自NodeJS世界所以我认为Makefile是"脚本"参与npm package.json,这可能是错误的(或不是?)。

所以我的想法是在安装新依赖项时通过输入以下内容来自动执行重复操作:

make install github.com/stretchr/testify

并找到一种方法来获取github.com/stretchr/testify参数,而不必使用重参数名称 - 值声明FOO=bar(=> make install DEP=github.com/stretchr/testify)建议。

所以,在this answer之后,我尝试了这个:

install %:
    go get $*
    godep save ./...
    git add Godeps vendor
    git commit -m "godep: add $*"

但未成功:它运行go get,没有任何参数和git commit -m "godep: add"

试验

1 - 当我这样做时:

install %:
    echo $*

我看到了我的" github.com/stretchr/testify"。

2 - 当我这样做时:

install %:
    go get ${*}

它循环两次并首先运行go get而没有任何参数,然后运行go get github.com/stretchr/testify(如所希望的那样)。

看起来${*}表示"数组" params解析目标后的字符组,第一个是installgithub.com/stretchr/testify之间的空格,第二个是github.com/stretchr/testify

2 个答案:

答案 0 :(得分:2)

您无法在同一规则中使用明确的定位条件和模式,因此您的规则% install:将无效。

您可以使用the CMDGOALS variable使用GNU make来执行此操作,但它非常容易出错且容易出错,我不推荐它。

ARG := $(filter-out install,$(MAKECMDGOALS))

install:
        go get $(ARG)
        godep save ./...
        git add Godeps vendor
        git commit -m "godep: add $(ARG)"

正如您所看到的,您需要在没有其他参数的情况下添加处理,或者在有多个其他参数的情况下添加处理,当然,如果不将它们添加到{ {1}}列表等

只是......不是IMO的好方法。

为什么不这样做呢:

filter-out

然后运行:

install-%:
        go get $*
        godep save ./...
        git add Godeps vendor
        git commit -m "godep: add $*"

答案 1 :(得分:1)

让变量可以做你想做的事:

host> cat Makefile
install:
    go get $(P)
    godep save ./...
    git add Godeps vendor
    git commit -m "godep: add $(P)"

host> make install P=github.com/stretchr/testify

但是使用make只是为了这个可能是矫枉过正的。它不仅仅是一种脚本语言。