在makefile期间检查错误时错误的comportement

时间:2013-08-30 07:48:52

标签: bash makefile doxygen

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

这是我的目标定义:

#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时,第二次之后会出现此错误:

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

第二个make doc(总是文档中的错误) - >创建文档时出错,请检查../ doc / doxyLog.log

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

1 个答案:

答案 0 :(得分:2)

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

<强>首先

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

根据我的理解test,如果文件存在,它将返回0,如果文件,则返回1。我怀疑你在将它放入你的makefile之前没有测试过。

其次,您使用 Make 命令混淆 shell 命令。这样:

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

Make 条件。 Make会在运行任何规则之前对其进行评估。由于日志文件尚不存在,shell命令将返回1(请参阅第一个),条件将评估为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