2

現在、autotoolset プロジェクトには 10 個のテストがあります。src/ ファイルの 1 つに変更を加えて再コンパイルするたびに、各テストが再構築されてリンクされます。これは私の開発時間にかなりの影響を及ぼし始めています。

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

ポインタ?

編集私はすべてのメイクの前に構成を行っていません。に変更を加えると、期待どおりcheck_curl_requestheadersにのみが再構築されます。check_curl_requestheaders問題は、ライブラリの RequestHeaders 部分に取り組んでいて、src/curl/requestheaders.cc のように変更すると、check_curl_requestheaders. それには時間がかかりすぎます。それは私が避けようとしていることです。多数のバイナリがある場合、そのうちの 1 つだけを再構築する方法はありますか?

4

3 に答える 3

2

よくわかりません。私がこれまでに取り組んだプロジェクトでは、${top_builddir}または${top_builddir} / tests/から'make'を実行しても、テストは再構築または実行されません。テストは、「makecheck」に対してのみビルドおよび実行されます。Makefile.amでcheck_PROGRAMSを使用していますか?

一般に、条件付きコンパイルは、automake条件付きおよびMakefile.amスニペットで次のように処理されます。

WANT_FOOの場合
bin_PROGRAMS + = foo
endif

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

PS:シェルスクリプトでは、次のことができます

エクスポートOUT
..。
(cd src && make >> $ OUT)|| 出口3
于 2009-07-22T09:54:18.203 に答える
0

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

もちろん、最初に構成を行うと (そうすべきではありません)、より多くのものが再構築されることは驚くべきことではありません。

編集:ライブラリを変更してから、単一のテストのみを再構築したい場合は、

make test/check_curl_requestheaders

十分なはずです。test/check_curl_requestheadersこれには、トップレベルのメイクファイルで指定されたターゲットが必要です。そのターゲットは次のように見えるかもしれません

test/%:    library
    make -C test $*

test ディレクトリに別の makefile があると仮定し、この makefile はライブラリが既にビルドされていることを前提としています。

于 2009-07-17T02:47:39.967 に答える
0

これが最善の方法かどうかはわかりませんが、テスト フォルダー内のプログラムには固有の make ターゲットがあることがわかりました。ただし、いくつかの問題がありました。

  1. 最上位で make を発行すると、src/ と test/ のすべてがビルドされます
  2. test/ レベルで make を発行すると、src/ への変更が反映されない

これを解決するために、次のことを行うシェル スクリプトを作成しました。

  1. src と入力してビルドします。(src/ に変更があった場合、src/ は再構築されます)
  2. test に入り、特定のバイナリをビルドします。(これにより、特定のバイナリが変更されている場合は再構築され、前の手順で更新された 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 を使用して、この問題に対するより洗練された解決策を教えてくれる人が最終的に現れることを願っています。これはおそらくこれらのツールがすぐに実行できることであり、まだ発見していないだけだと思います。

于 2009-07-18T00:49:24.110 に答える