我有一个 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 如何决定做什么的所有有趣的信息。