为什么 Make 不断地重复创建目录?

为什么 Make 不断地重复创建目录?

我有一个 makefile,它从我的源代码中创建一些文档:

/home/share/htdocs:
   #installs apache and make sure we have /htdocs...

/home/share/htdocs/doxjs: /home/share/htdocs
   mkdir -p $@
   chgrp users $@
   chmod g+w $@

/home/share/htdocs/dox: /home/share/htdocs
   mkdir -p $@
   chgrp users $@
   chmod g+w $@

.PHONY: dox
dox: /home/share/htdocs/dox /home/share/htdocs/doxjs
    # runs doxygen
    cp -r dox/html/* /home/share/htdocs/dox/
    cp -r doxjs/html/* /home/share/htdocs/doxjs/

这些规则应该只是创建并设置权限来提供来自 htdocs 的文件、构建文档并移动它们。

但当我跑步时,它会总是尝试创建/home/share/htdocs/dox

知道为什么吗?

即使我使用:

.PHONY: setup
setup: /home/share/htdocs/dox /home/share/htdocs/doxjs

这是我得到的:

$ sudo rm -fr /home/share/htdocs/dox*
$ sudo make setup
mkdir -p /home/share/htdocs/dox
chgrp users /home/share/htdocs/dox
chmod g+w /home/share/htdocs/dox
mkdir -p /home/share/htdocs/doxjs
chgrp users /home/share/htdocs/doxjs
chmod g+w /home/share/htdocs/doxjs

$ sudo make setup
mkdir -p /home/share/htdocs/dox
chgrp users /home/share/htdocs/dox
chmod g+w /home/share/htdocs/dox

$ sudo make setup
mkdir -p /home/share/htdocs/dox
chgrp users /home/share/htdocs/dox
chmod g+w /home/share/htdocs/dox

为什么?我假设我没有看到与修改时间有冲突。但我想象不出是什么。

答案1

我模拟了您的结构,并使用了make -r -d setup,其中-d显示调试输出,并-r忽略内置规则,因此输出较少。相关部分是

Considering target file 'setup'.
 File 'setup' does not exist.
  Considering target file 'htdocs/dox'.
    Considering target file 'htdocs'.
     Finished prerequisites of target file 'htdocs'.
   No need to remake target 'htdocs'.
   Finished prerequisites of target file 'htdocs/dox'.
   Prerequisite 'htdocs' is newer than target 'htdocs/dox'.
 Must remake target 'htdocs/dox'.

因此,进入 之后htdocs,该目录的访问时间比 更新htdocs/dox,因此make得出结论,需要重新制作。

解决方案:不要使用父目录作为先决条件。

实际上,创建目录然后在其中运行 make 的整个设置有点可疑;无论您想实现什么,您都应该能够使用静态目录结构来实现它。

答案2

你试过运行吗make -d?根据手册页,它提供:

除了正常处理之外,还有调试信息。调试信息指出哪些文件正在考虑重新制作,哪些文件时间正在比较以及结果如何,哪些文件实际上需要重新制作,哪些隐含规则正在考虑以及哪些规则将被应用---关于 make 如何决定做什么的所有有趣的信息。

相关内容