Makefile中的局部变量未正确展开

时间:2019-06-24 17:20:35

标签: function makefile variable-expansion

我在makefile中具有以下功能:

define INSTALL_SCRIPT
SRC_DIR = $(ROOT)\src
cd $(SRC_DIR)
$(SRC_DIR)\stage.bat
endef

我也回应了这些步骤,所以这是上面代码片段的输出:

$SRC_DIR = C:\project_root\src
'SRC_DIR' is not recognized as an internal or external command,
operable program or batch file.
$cd
C:\project_root
\stage.bat
'\stage.bat' is not recognized as an internal or external command,
operable program or batch file.

似乎在赋值语句中该值已正确扩展,但随后$(SRC_DIR)给出了错误。然后cd转到一个目录(而不是src),然后当我需要执行批处理文件时,$(SRC_DIR)的值似乎为空。

1 个答案:

答案 0 :(得分:1)

假设您要尝试从配方上下文中执行此操作,则需要执行以下操作:

define INSTALL_SCRIPT
   set SRC_DIR=$(ROOT)\\src & \
   cd %SRC_DIR% & \
   %SRC_DIR%\\stage.bat
endef

sometarget:
   @$(INSTALL_SCRIPT)

您需要在每一行的末尾使用\来将它们合并为一个配方行(否则,当第一个配方行的外壳终止时,您设置的变量将脱离上下文)。您似乎正在使用Windows,所以我相信您需要使用%varname%语法来引用变量。请注意,在这种情况下,$(ROOT)是一个makefile变量,因此它仍然使用$语法。 (请注意,如果您使用的是bash,则需要使用$$来引用shell变量)。您还需要将目录名中的\\加倍,因为make会将第一个斜杠解释为转义符,然后将单个斜杠传递给cmd。

请注意,我的Windows机器尚未安装make,因此我无法测试上述内容,因此很可能错过了一些东西。