用两个词使目标

用户名

我正在使用Makefile来编译我的Clean代码。我的Clean文件的文件名具有该格式,*.icl并且会编译为具有相同名称但没有的二进制文件.icl这是通过以下规则完成的:

$(EXE): % : %.icl | copy
    $(CLM) $(CLM_LIBS) $(CLM_INC) $(CLM_OPTS) $@ -o $@

我现在想添加一条规则,使我可以运行二进制文件。目前,我经常在做

make some_module && ./some_module

我想要一个make目标,该目标取决于上述规则并运行该模块。但是,模块的名称本身已经是单独编译的目标,我希望保持这种状态。我想要的是一个可以调用两个单词的目标make run some_module,然后取决于上面的规则并./some_module随后运行

是否可以创建包含多个单词的目标?

我试图制定以下规则(现在仍然没有依赖项):

run $(EXE):
    ./$@

运行make run some_module导致许多配方被“覆盖”和“忽略”,最终./run不存在。

Makefile:24: warning: overriding recipe for target 'tut7_2_2'
Makefile:21: warning: ignoring old recipe for target 'tut7_2_2'
Makefile:24: warning: overriding recipe for target 'support_check'
Makefile:21: warning: ignoring old recipe for target 'support_check'
[...]
Makefile:24: warning: overriding recipe for target 'drawingframe'
Makefile:21: warning: ignoring old recipe for target 'drawingframe'
./run
/bin/bash: ./run: No such file or directory
Makefile:24: recipe for target 'run' failed
make: *** [run] Error 127
吉勒斯“别再邪恶了”

您可以检查MAKECMDGOALS以发现一个目标的存在,同时建立另一个目标。使%: %.icl运行检测run目标的存在,或者使run目标检查提及哪些可执行文件作为目标。如果您将多个可执行文件作为目标传递,则第一种方法使每个可执行文件在构建后立即运行,而第二种方法使所有运行都在结束时进行。

这种方法的缺点是无法与其他功能一起很好地扩展。例如,如果您将具有多个可执行文件的目标定义为依赖项,则具有run目标的方法将不起作用。

EXE = foo bar experimental
released: foo bar
run: $(filter $(EXE), $(MAKECMDGOALS))
        set -e; for x in $^; do ./$x; done

在这里make released run什么都不会运行。

在这种情况下,我通常要做的是为每个可执行文件定义一个“运行”目标。这使每个目标都表示为一个单词,这是一个主要优势。它很简单,并且不会破坏其他功能。

$(EXE): %.run: %
        ./$(@:.run=)
all.run: $(EXE:=.run)

然后,make {foo,bar}.run如果要构建和测试fooand bar,或者make all.run构建并运行它们全部,我就运行。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章