我有一个makefile,我试图调用一个可执行文件,可执行文件需要5个参数,我如何从makefile传递这些参数
这样做不起作用
run-exe:
arg1 = "somevalue"
arg2 = "somevalue"
arg3 = "somevalue"
arg4 = "somevalue"
arg5 = "somevalue"
$(ExeFolderPath)/Task $(arg1) $(arg2) $(arg3) $(arg4) $(arg5)
参数被忽略了。
答案 0 :(得分:3)
makefile配方中的命令由shell执行,而不是由Make执行,并且每一行都在新的shell子进程中执行,因此在该行之后不再定义在先前行上定义的变量(除非使用{{1如this answer)所示。
所以你不能在那里设置Make变量,然后像.ONESHELL
一样使用它们。您需要设置shell变量($(arg1)
周围没有空格)并使用shell变量语法引用它们,即=
或$arg1
,但您需要转义${arg1}
}标志,以便Make不会尝试自己解释它们,即使用$
或$$arg1
。
尝试引用Make变量名为$${arg1}
和$(arg1)
,但这些变量从未在Makefile中定义,因此它们扩展为空,并且不传递任何参数。
此外,make配方的每一行都在一个单独的shell进程中执行,所以你编写它的方式,$(arg2)
创建一个新的shell子进程,设置make
然后退出该shell进程(所以变量定义丢失了)。然后它启动一个新shell,设置另一个变量,然后退出该shell等。
设置变量并使用它们需要在单个shell进程中进行,如果您使用的是GNU Make 3.82或更高版本,则可以使用arg1="somevalue"
来完成。对于其他版本的Make,确保变量定义和用法都在同一个shell进程中的另一种方法是将它们全部放在一行:
.ONESHELL
但是这很难理解,所以你可以将它们放在不同的行上,但是使用反斜杠,以便run-exe:
arg1="somevalue" ; arg2="somevalue" ; arg3="somevalue" ; arg4="somevalue" ; arg5="somevalue" ; $(ExeFolderPath)/Task $$arg1 $$arg2 $$arg3 $$arg4 $$arg5
仍然将它们视为一行,并在同一个shell进程中运行它们:
make
答案 1 :(得分:2)
run-exe
规则的配方中的每一行都在不同的shell实例中运行。因此,如果您在一行中设置变量,则该分配对下一行不会产生任何影响,因为下一行在新的shell实例中运行。
然而,您可以通过定义.ONESHELL
- 目标来保持您的方法,以便获得在单个shell中执行的配方的所有行(命令):
.ONESHELL:
run-exe:
arg1="somevalue"
arg2="somevalue"
arg3="somevalue"
arg4="somevalue"
arg5="somevalue"
$(ExeFolderPath)/Task $$arg1 $$arg2 $$arg3 $$arg4 $$arg5
请注意,=
周围不应有空格,因为这些变量赋值是由shell运行的,而不是make。
另请注意,$
应针对shell变量进行转义(即:$$
而不是$
)。
为了使用.ONESHELL
,您将需要GNU Make 3.82(或更新版本)。