make 不检测源文件中的更改

make does not detect changes in source files

我有以下项目结构:

ProjectDir
|           
+---CurrentDir
|       Makefile
|       
+---App1
|   |   Source1.cs
|   |   Source2.cs
|   |   
|
\---App2
    |   Source1.cs
    |   Source2.cs
    |

并且我想在 CurrentDir 中构建所有应用程序。 Makefile如下:

APPS=App1.exe App2.exe

all: $(APPS)

$(APPS) : %.exe : $(wildcard ../%/*.cs) 
    csc /nologo /out:$@ ..\$(basename $@)\*.cs

应用程序构建没有任何问题,但每当我更改其中一个源文件中的某些内容时,make 不会重建二进制文件('all' 无需执行任何操作)。

这是为什么?我该如何解决?我想这与通配符表达式有关。

$(wildcard) 函数在 make parse time 被评估(当 % 不是特殊的时候)并且正在尝试 glob ../%/*.cs 这自然不匹配任何东西.要按照你写的那样做你想做的事,你需要使用 Secondary Expansion

.SECONDEXPANSION:
$(APPS) : %.exe : $$(wildcard ../$$*/*.cs)

也就是说,更多地手动执行此操作可能更有用(但需要更多地重写您的 makefile)。