为什么当目标目录是文件时 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 认为 target
和 target/
是相同的,而 make 4.2.1 认为它们是不同的目标。因此,make 3.81 不会尝试重做 output
,而 make 4.2.1 会重做但失败,因为文件 output
阻止创建同名目录。
如果我这样做就会出现
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 认为 target
和 target/
是相同的,而 make 4.2.1 认为它们是不同的目标。因此,make 3.81 不会尝试重做 output
,而 make 4.2.1 会重做但失败,因为文件 output
阻止创建同名目录。