gmake在开始工作之前反复创建和删除批处理文件

时间:2013-10-25 09:32:54

标签: makefile gnu gnu-make

我在Windows下有一个C-Project,它是用makefile构建的。 现在我注意到,在调用gmake之后,它需要大约40秒才会发生任何事情(直到那时没有输出生成且没有任何事情发生)。

然后我使用-d标志来查找此问题的根源 - 使用此标志运行gmake会在40秒内生成以下输出:

Creating temporary batch file C:\Users\User\AppData\Local\Temp\make564-1.bat
CreateProcess(C:\Users\User\AppData\Local\Temp\make564-1.bat, C:\Users\User\AppData\Local\Temp\make564-1.bat,...)
Cleaning up temporary batch file C:\Users\User\AppData\Local\Temp\make564-1.bat

此操作在前40秒内一次又一次地发生(同样的蝙蝠文件一遍又一遍)。 bat文件本身包含:

@echo off
dir /b/a-d/-W/s .\*.c .\*.s 

我不认为这种行为是正常的(或者是吗?) - 我的意思是它只是一遍又一遍地创建相同的文件 - 我没有看到任何含义。 这个问题就是我每次尝试编译它时(不必要地丢失)的时间。

1 个答案:

答案 0 :(得分:2)

请提供您正在使用的工具的版本(在本例中为GNU make),以及Windows的版本以及如何为Windows构建命令(cygwin,mingw,MSVC等)

make绝对不会调用这样的命令。这意味着makefile中的某些东西正在这样做。我建议你查看你的makefile以找到包含该命令的行。

我怀疑当你找到它时,它会是这样的:

FOO = $(shell dir /b/a-d/-W/s .\\*.c .\\*.s)

每次使用变量时,这将重新评估右侧 。因此,如果您使用该变量20次,它将运行该命令20次。

=更改为:=,这将强制命令在定义变量时运行一次。

您还可以考虑使用make的内置$(wildcard ...)函数,该函数比dir更快,更便携。