从makefile内部传递命令行参数

时间:2018-02-07 12:15:38

标签: makefile gnu-make

我有一个makefile,我试图调用一个可执行文件,可执行文件需要5个参数,我如何从makefile传递这些参数

这样做不起作用

run-exe:
  arg1 = "somevalue"
  arg2 = "somevalue"
  arg3 = "somevalue"
  arg4 = "somevalue"
  arg5 = "somevalue"
  $(ExeFolderPath)/Task $(arg1) $(arg2) $(arg3) $(arg4) $(arg5)

参数被忽略了。

2 个答案:

答案 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(或更新版本)。