gmake 4.0中奇怪的makefile行为

时间:2018-02-19 15:43:16

标签: makefile gnu-make

我正面临着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 表现出疯狂的行为 - 它正确地按照要求正确执行构建或清理配方。

0 个答案:

没有答案