1

我的开源项目分发了一个 Makefile。只要用户安装了 Boost 和 OpenSSL,“make”本身就可以正常工作。如果没有,他会得到一个编译错误。

我想向用户显示一条错误消息,其中包含有关如何修复的说明,而不是让他从编译器输出中辨别出问题。

我已经编写了一个小脚本嵌入到 Makefile 中,它将进行快速而肮脏的编译,以在允许构建核心代码之前验证是否存在先决条件头文件。如果代码无法编译,它会显示错误消息并中止编译。它似乎运作良好。

# BOOST_INCLUDE := -I/home/jselbie/boost_1_51_0

all: myapp

testforboost.o:
    @echo "Testing for the presence of Boost header files..."
    @rm -f testforboost.o
    @echo "#include <boost/shared_ptr.hpp> " | $(CXX) $(BOOST_INCLUDE) -x c++ -c - -o testforboost.o 2>testerr; true
    @rm -f testerr
    @if [ -e testforboost.o ];\
    then \
        echo "Validated Boost header files are available";\
    else \
        echo "* ********************************************";\
        echo "* Error: Boost header files are not avaialble";\
        echo "* Consult the README file on how to fix";\
        echo "* ********************************************";\
        exit 1;\
    fi

myapp: testforboost.o
    $(CXX) $(BOOST_INCLUDE) myapp.cpp -o myapp

我的脚本是做到这一点的好方法吗?我假设它可以移植到 Linux(Solaris、BSD、MacOS)之外。还是有其他标准做法可以做到这一点?我知道 Autotools 可以做类似的事情,但我对学习所有 Autotools 和重写我的 Makefile 并不太兴奋。

4

1 回答 1

2

原则上是可以的。但是由于您只是进行预处理,并且可以使用任何命令作为条件,因此可以将其简化为:

.PHONY: testforboost
testforboost:
    @echo "Testing for the presence of Boost header files..."
    @if echo "#include <boost/shared_ptr.hpp> " | $(CXX) -x c++ -E - >/dev/null 2>&1;\
    then \
        echo "Validated Boost header files are available";\
    else \
        echo "* ********************************************";\
        echo "* Error: Boost header files are not avaialble";\
        echo "* Consult the README file on how to fix";\
        echo "* ********************************************";\
        exit 1;\
    fi

OTOH,既然您在变量中有 boost 包含路径,为什么不直接查找文件呢?那将需要一些字符串操作。可能很难制作,但使用makepp会是$(map $(BOOST_INCLUDE),s/^-I//)

于 2012-12-29T21:46:31.740 回答