为什么当目标目录是文件时 Make 不抱怨?

Why does Make not complain when a target directory is a file instead?

如果我这样做就会出现

touch output

然后 运行 make 使用以下 Makefile

output/:
    mkdir $@

我明白了

make: 'output' is up to date.

尽管 output 是一个文件,因此 output/ 不是一个存在的目录。

为什么 Make 不抱怨这个,或者尝试 运行 目标目录的配方?

这似乎是一个错误,在 3.81 版 之后的某个时间修复了,因为在更新的版本中不会出现这种情况,例如 4.2.1:

mkdir output
mkdir: cannot create directory 'output': File exists

特别是这意味着在 Mac OS X 上仍然会遇到这个错误,因为 Apple 没有从旧版本的 GNU 软件中继续前进。

因此,为了可移植性,您需要在 makefile 中防止这种情况发生。

据我了解(并非 100% 确定)这并不是真正的错误,而是一项功能。 make 3.81 认为 targettarget/ 是相同的,而 make 4.2.1 认为它们是不同的目标。因此,make 3.81 不会尝试重做 output,而 make 4.2.1 会重做但失败,因为文件 output 阻止创建同名目录。