首页 > 解决方案 > makefile 中的局部变量未正确展开

问题描述

我在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)的值似乎为空。

标签: functionmakefilevariable-expansion

解决方案


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

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 变量)。您还需要将\\in 目录名称加倍,因为 make 会将第一个斜杠解释为转义,然后将单个斜杠传递给 cmd。

请注意,我的 windows 机器上没有安装 make,所以我无法测试上述内容,所以很可能我错过了一些东西。


推荐阅读