我使用Makefiles。

我有一个名为run的目标,它运行构建目标。简化后,如下图所示:

prog: ....
  ...

run: prog
  ./prog

有传递参数的方法吗?这

make run asdf --> ./prog asdf
make run the dog kicked the cat --> ./prog the dog kicked the cat

当前回答

Run: ./prog看起来有点奇怪,因为正确的部分应该是一个先决条件,所以Run: prog看起来更好。

我的建议很简单:

.PHONY: run

run:
    prog $(arg1)

我想补充一点,可以传递参数:

作为参数:使arg1="asdf"运行 或者定义为environment: arg1="asdf" make run

其他回答

不。看看GNU make手册页中的语法

生成[-f makefile][选项]…[目标]……

您可以指定多个目标,因此是'no'(至少以您指定的确切方式为no)。

不是很自豪,但我不想传递环境变量,所以我把运行罐装命令的方式颠倒了:

run:
    @echo command-you-want

这将打印你想要运行的命令,所以只需要在subshell中求值即可:

$(make run) args to my command

我不知道怎么做你想要的,但一个变通的方法可能是:

run: ./prog
    ./prog $(ARGS)

然后:

make ARGS="asdf" run
# or
make run ARGS="asdf"

我找到了一种方法,用等号=!这个答案是对@lesmana的回答的补充(因为它在这里是最完整和解释最充分的回答),但是它太大了,不能作为评论来写。再一次,我重复他的信息:TL;DR不要试图这样做!

我需要一种方法来处理我的参数——xyz-enabled=false(因为默认为true),现在我们都知道这不是一个make目标,因此不是$(MAKECMDGOALS)的一部分。

当通过回显$(.VARIABLES)查看所有的make变量时,我得到了这些有趣的输出:

[...] -*-command-variables-*- --xyz-enabled [...]

这允许我们有两种方法:要么以——开头(如果适用于您的情况),要么查看GNU的特定变量(可能不打算让我们使用)-*-command-variables-*-。**参见页脚的其他选项**在我的情况下,这个变量持有:

--xyz-enabled=false

通过这个变量,我们可以将它与已经存在的解决方案$(MAKECMDGOALS)结合起来,从而定义:

# the other technique to invalidate other targets is still required, see linked post
run:
    @echo ./prog $(-*-command-variables-*-) $(filter-out $@,$(MAKECMDGOALS))`

并使用它与(显式地混合参数的顺序):

make run -- config --xyz-enabled=false over=9000 --foo=bar show  isit=alwaysreversed? --help

返回:

./prog isit=alwaysreversed? --foo=bar over=9000 --xyz-enabled=false config show --help

如你所见,我们打乱了参数的总顺序。带有“assignment”-args的部分似乎被颠倒了,“target”-args的顺序保持不变。我把赋值参数放在开头,希望你的程序不关心参数放在哪里。


下面的make变量看起来也很有希望:

MAKEFLAGS =  -- isit=alwaysreverse? --foo=bar over=9000 --xyz-enabled=false
MAKEOVERRIDES = isit=alwaysreverse? --foo=bar over=9000 --xyz-enabled=false

您可以显式地提取命令行中的第n个参数。要做到这一点,你可以使用变量MAKECMDGOALS,它保存给'make'的命令行参数列表,它将其解释为目标列表。如果你想提取第n个参数,你可以使用该变量与"word"函数结合使用,例如,如果你想要第二个参数,你可以将它存储在一个变量中,如下所示:

second_argument := $(word 2, $(MAKECMDGOALS) )