我的开源项目分发了一个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感到兴奋。
答案 0 :(得分:1)
原则上它可能就是这样。但由于您只是预处理,并且您可以将任何命令用作条件,因此可以简化为:
.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//)