我正面临着gmake 3.8和gmake 4.0之间行为的一些奇怪变化。这是在运行Windows 7的同一台机器上观察到的。以下是一个非常简单的示例 - 它显然不是一个有用的makefile,但说明了这个问题。
make -v output for 3.8标识为:
GNU Make 3.80
和4.0 as:
GNU Make 4.0
专为Windows32构建
3.8输出中缺少“Built for Windows32”,但我认为这是在3.8版本之后添加的。
考虑以下目录结构:
.
./Build
./PROJ1
./PROJ1/Makefile
在PROJ1中跟随makefile:
.PHONY: build clean
build:
@echo Build Recipe
clean:
@echo Clean Recipe
此makefile从父目录运行,例如:
make -C PROJ1 build
。
在gmake 3.8中,这可以实现预期的打印Build Recipe
:
make: Entering Directory PROJ1
Build Recipe
make: Exiting Directory PROJ1
但是,gmake 4.0中的同一个makefile会出现意外情况:
make -C PROJ1 build
make: Entering directory 'PROJ1'
make: *** No rule to make target 'Build'. Stop.
make: Leaving directory 'PROJ1'
奇怪。出于某种原因,它试图制造'Build'而不是'build'。现在,如果我们尝试清理,那么在3.8和4.0中我们得到以下结果:
testmake>make -C PROJ1 clean
make: Entering directory 'PROJ1'
Clean Recipe
make: Leaving directory 'PROJ1'
这是所需的行为。我注意到的一件事是,这会影响每个目标,其中有一个名称只有大小写的目录 - 我们可以通过创建一个目录“Clean”来证明这一点:
.
./Build
./Clean
./PROJ1
./PROJ1/Makefile
make -C PROJ1 clean
make: Entering directory 'PROJ1'
make: *** No rule to make target 'Clean'. Stop.
make: Leaving directory 'PROJ1'
发生了什么,我该如何解决这个问题?
有趣的是,在cygwin中运行的gmake 4.2.1 不表现出疯狂的行为 - 它正确地按照要求正确执行构建或清理配方。