2009-07-17 3 views
2

私は現在、私のオートツールセットプロジェクトで10のテストを受けています。 src /ファイルのいずれかを変更して再コンパイルするたびに、各テストが再構築され、リンクされます。これは私の開発時間に大きな影響を与え始めています。条件付きでプログラム(テストなど)をビルドするためにautomakeとautoconfをセットアップするには

GNU autotoolsetを使用してバイナリプログラム、テストなどを条件付きでビルドするには、どのような方法が最適ですか?たとえば、私がtest/check_curl_requestheaders.ccで作業していて、変更を加えたら、ライブラリを再コンパイルし、その1つのテストと他のバイナリは一切作成しません。

automake条件文(WANTS_XXXなど)を使用していることがわかりましたが、私が探していることは100%確信していませんし、autoconfによってどのように設定されているのかも確かめていません。

./configure 
make test/check_curl_requestheaders 

または

./configure --only-build=test/check_curl_requestheaders 
make 

ポインター:

私は一種の、このように見ていることになります何かを期待していますか?

EDITすべてのmakeの前にconfigureを実行していません。 check_curl_requestheadersに変更を加えた場合、期待通りにcheck_curl_requestheadersが再構築されます。問題は、私がライブラリのRequestHeadersの部分で作業していて、src/curl/requestheaders.ccと言って変更を加えると、すべてのテストと他のバイナリが再構築され、check_curl_requestheadersだけではありません。 そのははるかに長い時間を費やしており、それが私が避けようとしているものです。私に十数個のバイナリがある場合、それらのうちの1つだけを再構築する方法はありますか?

答えて

0

これは、これを実行する最良の方法ではありませんが、私のテストフォルダ内のプログラムは独自のmakeターゲットを持っていました。しかし、いくつかの問題がありました。

  1. 私は、srcのすべて、トップレベルで作る/と私は、テスト/レベルでSRCに変更を加える発行する場合
  2. 構築されています/テストは/
を拾ったことはありません発行する場合

  1. はSRCを入力し、それを構築:

    は、これを解決するために、私は次のことを行いシェルスクリプトを書きました。 (src /が変更された場合、src /が再構築されます)

  2. テストに入り、特定のバイナリをビルドします。 (これは、それが変更された場合に、特定のバイナリを再構築し、SRC /内のコードの再リンクします前のステップで更新された)

コードは以下の通りである:

#!/bin/sh 

TYPE="$1" 
WHICH="$2" 
OUT="`readlink -f ./buildandrun.out`" 

rm -rf $OUT 

if test ! -n "$WHICH" 
then 
    echo "Please specify which type to build" 
    exit 1 
fi 

if test ! -n "$WHICH" 
then 
    echo "Please specify which $TYPE to build" 
    exit 2 
fi 

RV=0 

echo "" >> $OUT 
echo "Building src" >> $OUT 
echo "" >> $OUT 

cd src 
make >> $OUT || RV=3 
cd .. 

if test $RV != 0; then exit $RV; fi 

echo "" >> $OUT 
echo "Building $TYPE/$WHICH" >> $OUT 
echo "" >> $OUT 

cd $TYPE 
make "$WHICH" >> $OUT || RV=4 
cd .. 

if test $RV != 0; then exit $RV; fi 

echo "" >> $OUT 
echo "Running $TYPE/$WHICH" >> $OUT 
echo "" >> $OUT 

$TYPE/$WHICH || RV=5 

exit $RV 

これは私がすることができます

./buildandrun.sh test check_curl_requestheaders 

うまくいけば、最終的には、好ましくはautoconfとautomakeのを使用して、私はこの問題へのよりエレガントな解決策を示すことができる誰かがあるでしょう:次の手順を実行します。私は、これはおそらく、これらのツールが箱から出て、まだそれを発見していないという感じです。

0

ソースファイルを変更するときに、再設定する必要はありません。もう一度makeを実行すると、実際に変更の影響を受けるバイナリのみが再構築されます。したがって、test/check_curl_requestheadersを変更したら、平文makeを実行してから、test/check_curl_requestheadersのみを再構築する必要があります。他のものが再構築された場合、あなたはmakefileにバグがあります。

もちろん、最初に設定した方がいいでしょう(そうしてはいけません)、もっと多くのものが再構築されるのは驚くべきことではありません。

編集:あなたはライブラリを変更し、だけにして、単一のテストを再構築したい場合は

make test/check_curl_requestheaders 

十分なものでなければなりません。これには、トップレベルのmakefileにtest/check_curl_requestheadersという名前のターゲットが必要です。そのターゲットはあなたがテストディレクトリにある別のメイクファイルを持っていると仮定すると、このメイクファイルは、ライブラリがすでに構築されていることを前提としていると仮定

test/%: library 
    make -C test $* 

のように見えることがあります。

+0

を行うことができます。 :)問題は、すべてのsrc/*ファイルを変更するには、すべてがsrc/*ファイルに依存しているため、すべてのテストとバイナリが再構築する必要があることです。 check_curl_requestheadersを変更すると、check_curl_requestheadersのみが再構築されます。それは期待どおりに動作します。私は混乱のためにお詫び申し上げます。 –

+0

Makefileを表示していないときや、あなたが望む以上に再ビルドする方法がわからないときは、助けが難しいです。別の推測のために私の編集を参照してください。 –

+0

問題は私がautoconfとautomakeを使用しているので自分のMakefileを自分で生成していないので、autoconfとautomakeにすべての代わりにバイナリの一部をビルドするように指示する方法を尋ねています。私はこれについて後でもっと試して書くことができますが、これは私が今持っているものです! –

2

私は混乱しています。私がこれまでに作業していたプロジェクトでは、$ {トップ_ builddir}か$ {トップ_ builddir}/tests /のいずれかからmakeを実行すると、テストは再構築も実行もされません。テストはmake checkのために構築され、実行されるだけです。 Makefile.amでcheck_PROGRAMSを使用していますか?一般的に

、条件付きコンパイルのようなAutomakeの条件文とMakefile.amスニペットで処理されます。

 
if WANT_FOO 
bin_PROGRAMS += foo 
endif 

が、私は、これはあなたが探しているものではありません確信しています。あなたがMakefile.amに偽の依存関係を指定したようで、最小限のバージョンを投稿する必要があります。

PS:あなたのシェルスクリプトで、あなただけの私がのcon​​figureを毎回やっていないよ

 
export OUT 
... 
(cd src && make >> $OUT) || exit 3 
+0

あなたのフィードバックに感謝します! 'check_PROGRAMS'を使っていなかったので、私は' TESTS'を使っていました。なぜ私は別のものを使用するのかわからない。私は様々なautotoolsetのドキュメントやチュートリアルで迷ってしまいます。 : - / –

関連する問題