题
所以GNU Make的$(通配符)函数似乎存在这个问题,在Windows上保持一个目录打开。请参阅(未答复)帖子“ make正在打开目录&QUOT ;. Google没有提供有关该主题的更多信息。
简而言之:Makefile在某些时候使用$(通配符)函数,并保持一个目录打开,这通常会阻止“make clean”。规则正确地开展工作。重新运行“make clean”第二次通常会解决它。
我在标准的DOS-Box下使用GNU Make 3.81版。上面链接的帖子的作者使用的是Cygwin。
有人找到了解决此问题的方法吗?
解决方案 2
我找到了问题的解决方法,这至少让我安心工作。
问题是 $(通配符)
函数用于收集源文件。但是,我的清洁规则只删除一个目录 - 不需要收集费用。所以我基本上把需要收集源文件的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
其他提示
听起来像是文件描述符泄露,没问题 - 对于UNIX上非常短暂的进程(如make)无害,但在Windows上是正确的PITA。
因为据说这是make中的一个错误,而不是它的使用问题,所以应首先通过验证它在最新上游版本的源代码构建时仍然存在,然后通过向GNU make项目提交错误报告(或与您有适当支持合同的任何经销商) ),或潜入源头并试图自己修复它。
尝试在Linux上重现并不会有害 - 在这里检查文件描述符泄漏要容易得多,因为可以只看一下 / proc / self / fd
(或者,对于对于不属于的东西,make的子, / proc / $ PPID / fd
)。
不隶属于 StackOverflow