Function makefile中的局部变量未正确展开

Function makefile中的局部变量未正确展开,function,makefile,variable-expansion,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

我在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)
您需要在每行末尾使用\将它们合并到单个配方行中,否则当第一个配方行的shell终止时,您设置的变量将脱离上下文。您似乎正在使用windows,因此我认为您需要使用%varname%语法来引用变量。注意,在本例中,$ROOT是一个makefile变量,因此它仍然使用$syntax。请注意,如果您在bash中,则需要使用$$引用shell变量。您还需要将目录名中的\\加倍,因为make会将第一个斜杠解释为转义,然后将一个斜杠传递给cmd


请注意,我的windows计算机上没有安装make,因此我无法测试上述内容,因此很可能我遗漏了一些内容。

分配既不是有效的cmd,也不是sh;错误消息表示您试图在未显示的配方中使用它。在cmd中,变量赋值使用set;在sh中,等号周围不能有空格。实际上,它的缺陷不止于此——如果它是在配方中展开的宏,那么:SRC_DIR将设置在配方的第一行,在第二行中不可见。即使您连接了这些行,当它试图将宏作为makefile变量展开时,它也会展开$SRC_DIR,因此生成的bash命令将是cd…啊,没关系-这是一个windows脚本。。。我相信菜谱线的东西持有-美元肯定不工作,虽然。。。您可能需要%SRC_DIR%…cmd不理解;&是用来代替的谢谢。正如你所看到的,我更喜欢狂欢。。。希望可以运行。不幸的是,无法猜测Windows上的make外壳是什么。如果路径中有任何sh.exe,那么gmake将使用它而不是cmd。注意:根据@Matt的评论:如果它使用sh,那么目录名中的斜杠是错误的,它将需要使用;,$SRC_DIR将被视为命令而不是变量。。。这将是一个完全不同的答案。。。