转发Makefile的命令行参数

时间:2015-04-28 23:28:22

标签: makefile mocha

我有一个围绕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会非常好。

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

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'停止。 Stop.`

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

那么,是否有任何方法可以继续关闭此ARGS路径并以某种方式阻止make尝试运行ARGS中找到的任何目标,从而允许all运行,并且那个错误信息没有出现?或者我应该完全改变策略,还有其他方法可以做到这一点吗?

1 个答案:

答案 0 :(得分:0)

您可以通过为每个参数添加一个虚拟规则来逃避这一点,例如:

Release

但是你不应该从$(ARGS): 读取你的论点,这会引起各种各样的问题。

您可以改为使用脚本或在shell中定义别名。这是一条可以帮助实现这一目标的规则:

MAKECMDGOALS

像这样使用:

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