function - 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)
的值似乎为空。
解决方案
假设您尝试从配方上下文中执行此操作,您需要按以下方式执行此操作:
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,所以我无法测试上述内容,所以很可能我错过了一些东西。
推荐阅读
- kubernetes - 使用 Azure Pipelines 在 Kubernetes 清单文件中更新 Docker 映像的正确方法
- php - 将excel中的日期列转换为Laravel Excel中的日期字符串
- pandas - Pandas:不确定这是枢轴还是堆栈,或者是否有内置函数
- python - 使用 tf.GradientTape 的自定义 GAN 训练循环返回 [None] 作为生成器的梯度,而它适用于鉴别器
- python - 为什么说某物的名称是未定义的,即使它是字典中的键?
- python - extIOWrapper.write() 只接受一个参数(给定 2 个)
- amazon-web-services - 使用 CDK 到 Lambda 的 API 网关出现问题
- php - 为什么我的全局变量 `null` 在 `web.php` 文件中的函数内?
- flutter - 一旦我们在颤动中从 esp32 获取数据,如何同时播放音频
- dart - 5.0.0 迁移后使用提供程序的多提供程序失败