我使用Makefiles。
我有一个名为run的目标,它运行构建目标。简化后,如下图所示:
prog: ....
...
run: prog
./prog
有传递参数的方法吗?这
make run asdf --> ./prog asdf
make run the dog kicked the cat --> ./prog the dog kicked the cat
我使用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) )