【问题标题】:Forward command-line arguments to Makefile将命令行参数转发到 Makefile
【发布时间】:2015-07-08 00:40:37
【问题描述】:

我有一个环绕 mocha 的 Makefile,可以由 npm test 调用。 Makefile 中有几个目标,如下所示:

COMPILERS = --compilers coffee:coffee-script/register
REPORTER = --reporter dot
TEST_DIR = test
SRC = -name test_*.coffee
RUNNER = ${TEST_DIR}/runner.coffee
MOCHA = NODE_ENV=test ./node_modules/mocha/bin/mocha ${COMPILERS} ${REPORTER} ${RUNNER} ${TEST_DIR}

all:
    $(MOCHA) $(shell find ${TEST_DIR} ${SRC})

subtest1:
    $(MOCHA) $(shell find ${TEST_DIR}/subtest1 ${SRC})

...

现在,这是从package.json 调用的npm test,其中npm test subtest1 仅运行subtest1。但是,允许附加任意 mocha 标志会非常好,例如:

make subtest1 -g "some test I want to run"

这可以通过定义一个ARGS 变量来完成,因此输入:

make subtest1 ARGS="-g 'some test I want to run'"

但这很冗长。

因此,将参数传递给 Mocha 会非常好。

我最接近的是在Makefile 的顶部定义ARGS

ARGS = $(filter-out all subtest1, $(MAKECMDGOALS))

并将ARGS 附加到MOCHA 变量。然后可以将其称为make subtest1 -- -g "some test I want to run"。这行得通,它运行测试,但make 然后以make: *** No rule to make target-g' 停止。停止。`

在执行 make -- -g "some test I want to run" 时会显示相同的错误消息。

那么,有什么方法可以继续沿着ARGS 路径向下运行,并以某种方式阻止 make 尝试运行在 ARGS 中找到的任何目标,从而允许 all 运行,并且不会出现该错误消息?还是我应该完全改变策略并且有其他方法可以做到这一点?

【问题讨论】:

标签: makefile mocha.js


【解决方案1】:

您可以简单地通过为每个参数添加一个虚拟规则来解决这个问题,如下所示:

$(ARGS):

但是你不应该从MAKECMDGOALS 那里阅读你的论点,它会导致各种各样的问题。

您可以改为使用脚本或在 shell 中定义别名。这里有一条可以帮助做到这一点的规则:

shortcut-%:
    @echo '$* () { make -C "$(CURDIR)" -f $(abspath $(firstword $(MAKEFILE_LIST))) $* ARGS="$$(printf "%q " "$$@")"; }'

像这样使用它:

eval `make shortcut-subtest1`
subtest1 -g test

【讨论】:

    猜你喜欢
    • 2021-12-31
    • 1970-01-01
    • 2013-03-08
    • 2010-12-12
    • 2019-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-10
    相关资源
    最近更新 更多