所以GNU Make的$(通配符)函数似乎存在这个问题,在Windows上保持一个目录打开。见(未答复)帖子“make is holding a directory open”。 Google没有提供有关该主题的更多信息。
简而言之:Makefile在某些时候使用$(通配符)函数,并保持一个目录打开,这通常会阻止“make clean”规则正常工作。第二次重新运行“make clean”通常可以解决它。
我在标准的DOS-Box下使用GNU Make 3.81版。上面链接的帖子的作者使用的是Cygwin。
有人找到了解决此问题的方法吗?
答案 0 :(得分:2)
听起来像是文件描述符泄露,没问题 - 对于UNIX上非常短暂的进程(如make)无害,但在Windows上是正确的PITA。
因为据说这是make中的一个错误,而不是它的使用问题,所以首先要通过验证它在最新上游版本的源代码构建时仍然存在,然后通过filing a bug report来解决它。与GNU make项目(或与您有适当支持合同的任何经销商),或潜入源并尝试自行修复。
尝试在Linux上重现并不会有什么坏处 - 在这里检查文件描述符泄漏要容易得多,因为人们可以只看/proc/self/fd
(或者,对于make的孩子,{{1} })对于不属于的东西。
答案 1 :(得分:0)
我找到了问题的解决方法,这至少让我安心工作。
问题是$(wildcard)
函数用于收集源文件。但是,我的清洁规则只删除一个目录 - 不需要收集费用。所以我基本上把需要收集源文件的Makefile部分放在条件语句中:
# The clean rule is always parsed
clean:
rm -rf $(OUTPUT_DIRECTORY)
# The compile rule is only interpreted if we did not invoke 'make clean'. We
# can test the value of $(MAKECMDGOALS) for that:
ifeq ($(filter $(MAKECMDGOALS),clean),)
SOURCE_FILES := $(wildcard ...)
compile:
g++ $(SOURCE_FILES) ...
endif