Make:$(通配符)保持目录打开

时间:2008-10-15 09:07:29

标签: makefile

所以GNU Make的$(通配符)函数似乎存在这个问题,在Windows上保持一个目录打开。见(未答复)帖子“make is holding a directory open”。 Google没有提供有关该主题的更多信息。

简而言之:Makefile在某些时候使用$(通配符)函数,并保持一个目录打开,这通常会阻止“make clean”规则正常工作。第二次重新运行“make clean”通常可以解决它。

我在标准的DOS-Box下使用GNU Make 3.81版。上面链接的帖子的作者使用的是Cygwin。

有人找到了解决此问题的方法吗?

2 个答案:

答案 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