Makefile:要测试头文件的目标

Makefile:要测试头文件的目标,makefile,Makefile,我的开源项目分发一个Makefile。只要用户安装了Boost和OpenSSL,“make”本身就可以正常工作。如果不是,他会得到一个编译错误 我希望向用户显示一条错误消息,并说明如何修复,而不是让用户从编译器输出中识别问题 我已经将一个小脚本嵌入到一个Makefile中,该脚本将进行快速而肮脏的编译,以在允许构建核心代码之前验证是否存在一个先决条件头文件。如果代码无法编译,它将显示错误消息并中止编译。看起来效果不错 # BOOST_INCLUDE := -I/home/jselbie/boos

我的开源项目分发一个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
#BOOST_包括:=-I/home/jselbie/BOOST_1_51_0
全部:myapp
testforboost.o:
@echo“测试是否存在Boost头文件…”
@rm-f testforboost.o
“回声”包括“$ $(CXX)$(BooStIX包含)-XC++ +C--O TestFooPosi.O 2>TESTErr;真的
@rm-f测试仪
@if[-e testforboost.o]\
然后\
echo“已验证的Boost头文件可用”\
否则\
回声“****************************************************************”\
echo“*错误:Boost头文件不可用”\
echo“*查阅自述文件了解如何修复”\
回声“****************************************************************”\
出口1\
fi
myapp:testforboost.o
$(CXX)$(BOOST_INCLUDE)myapp.cpp-o myapp

我的脚本是这样做的好方法吗?我假设它可以移植到Linux之外(Solaris、BSD、MacOS)。或者有没有其他标准的做法可以做到这一点?我知道Autotool可以做类似的事情,但我对学习所有Autotool并重新编写生成文件并不太感兴趣。

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

.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
.PHONY:testforboost
testforboost:
@echo“测试是否存在Boost头文件…”
@如果“回声”包含“$ $(cxx)-x C++ +e>/DEV/null 2>1;
然后\
echo“已验证的Boost头文件可用”\
否则\
回声“****************************************************************”\
echo“*错误:Boost头文件不可用”\
echo“*查阅自述文件了解如何修复”\
回声“****************************************************************”\
出口1\
fi

OTOH,既然变量中有boost include路径,为什么不直接查找文件呢?这需要一些字符串操作。可能很难制作,但是它将是代码> $(map $(BooStIsApple),S/^ -I/]

当然,这不是学习AutoTooTM的好时机,但是考虑使用CMACH.COOL。我喜欢简化。BOOST_INCLUDE仅用于手动覆盖现有包含路径中没有的用户。我去查一下makeepp。