gpt4 book ai didi

makefile - 从 makefile 内部传递命令行参数

转载 作者:行者123 更新时间:2023-12-01 11:17:31 24 4
gpt4 key购买 nike

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

这样做是行不通的

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

参数被忽略了。

最佳答案

makefile 配方中的命令由 shell 而不是 Make 执行,并且每一行都在一个新的 shell 子进程中执行,因此在前几行定义的变量不再在该行之后定义(除非您使用 .ONESHELLthis answer 所示。

所以你不能在那里设置 Make 变量,然后像 $(arg1) 那样使用它们。您需要设置 shell 变量(= 周围没有空格)并使用 shell 变量语法引用它们,即 $arg1${arg1} code>,但你需要转义 $ 符号,这样 Make 就不会尝试自己解释它们,即使用 $$arg1$${arg1

您尝试引用名为 $(arg1)$(arg2) 的 Make 变量,但这些变量从未在 Makefile 中定义,因此它们展开什么都没有,也没有传递任何参数。

此外,make 配方的每一行都在一个单独的 shell 进程中执行,所以按照您编写的方式,make 创建一个新的 shell 子进程,设置 arg1="somevalue" 然后该 shell 进程退出(因此变量定义丢失)。然后它启动一个新的 shell,设置另一个变量,然后退出那个 shell 等等。

设置变量和使用它们需要在单个 shell 进程中发生,如果您使用的是 GNU Make 3.82 或更高版本,则可以使用 .ONESHELL 来完成。对于其他版本的 Make,另一种确保变量定义和使用都在同一个 shell 进程中的方法是将它们都放在一行中:

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

但这很难阅读,因此您可以将它们放在不同的行中,但使用反斜杠,这样 make 仍将它们视为一行并在同一个 shell 进程中运行它们:

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

关于makefile - 从 makefile 内部传递命令行参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48663572/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com