0

我想用我的makefile自动制作我的项目文档。我还创建了一个目标文档(和一个变量DOC_DIRECTORY = ../doc)来指定文档的目录。在我的 doxygen 文件中,我在 ../doc/ 目录中添加了一个日志文件名“doxyLog.log”。

这是我的目标定义:

#Creation of the Doxygen documentation
doc: $(DOC_DIRECTORY)/path_finder_doc
    doxygen $(DOC_DIRECTORY)/path_finder_doc
    @echo $(shell test -s ../doc/doxyLog.log; echo $$?)
ifeq ($(shell test -s ../doc/doxyLog.log; echo $$?),1)
    @echo "Generation of the doxygen documentation done"
else
    @echo "Error during the creation of the documentation, please check $(DOC_DIRECTORY)/doxyLog.log"
endif

为了测试我的检查是否有效,我在文档中手动引入了一个错误(一个错误的命令,如 \retufjdkshrn 而不是 \return)。但是,当我启动时,第二make doc次出现此错误:

首先制作文档(文档中有错误)->完成doxygen文档的生成

二make doc(总是doc里的错误)-->文档创建过程中出错,请查看../doc/doxyLog.log

我不明白为什么,有人可以帮我吗?

4

1 回答 1

2

这里似乎有两件事是错误的,所以这个答案的一部分必须是猜测。

第一的:

ifeq ($(shell test -s ../doc/doxyLog.log; echo $$?),1)
    @echo "Generation of the doxygen documentation done"

据我了解,如果文件存在并且文件不存在test,它将返回。我怀疑您在将其放入 makefile 之前没有对其进行测试。01

其次,您将shell命令与Make命令混淆了。这个:

ifeq ($(shell test -s ../doc/doxyLog.log; echo $$?),1)
    @echo "Generation of the doxygen documentation done"
else
    @echo "Error..."
endif

是一个使条件。Make 将在运行任何规则之前对其进行评估。由于日志文件尚不存在,该shell命令将返回1(参见First),条件将评估为 true,整个if-then-else语句将变为

    @echo "Generation of the doxygen documentation done"

这将在规则执行之前成为规则的一部分。在下一次通过时,文件已经存在,shell命令返回0,语句变为

    @echo "Error..."

这解释了为什么你会得到奇怪的结果。

如果您希望 Make 报告刚刚尝试的结果,则必须在规则中的命令中放置一个shell条件:

doc: $(DOC_DIRECTORY)/path_finder_doc
    doxygen $(DOC_DIRECTORY)/path_finder_doc
    @if [ -s ../doc/doxyLog.log ]; then echo Log done; else echo error...; fi
于 2013-09-02T19:11:40.930 回答