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、変数にブーストインクルードパスがあるので、ファイルを直接探してみませんか? それには文字列操作が必要です。おそらくmakeは難しいでしょうが、makeppを使えば$(map $(BOOST_INCLUDE),s/^-I//)

于 2012-12-29T21:46:31.740 に答える