web-dev-qa-db-ja.com

GNU autotools:ターゲットをデバッグ/リリースしますか?

私はしばらくこれを探していました:現在、Eclipseベースの方法(メイクファイルを使用)から来ている中規模のプログラムを自動ツールに変換しています

私はいつも、デバッグシンボルと最適化なしで、すべてのデバッグシンボルと最適化なしの「デバッグ」ビルド、およびデバッグシンボルと最適な最適化なしの「リリース」ビルドを持つことに慣れています。

今、私はautotoolsでこれを何らかの方法で複製しようとしているので、(おそらく)次のようなことができます:

./configure
make debug

デバッグシンボルはすべてあり、最適化はありません。

./configure
make

「リリース」バージョンになります(デフォルト)

PS:--enable-debug flag/featureについて読みましたが、現在の(単純な)設定では、configureによって認識されないものを使用しています

57
cpf

configure.inまたはconfigure.acファイルに句を追加します。

AC_ARG_ENABLE(debug,
AS_HELP_STRING([--enable-debug],
               [enable debugging, default: no]),
[case "${enableval}" in
             yes) debug=true ;;
             no)  debug=false ;;
             *)   AC_MSG_ERROR([bad value ${enableval} for --enable-debug]) ;;
esac],
[debug=false])

AM_CONDITIONAL(DEBUG, test x"$debug" = x"true")

Makefile.inor Makefile.am;

if DEBUG
AM_CFLAGS = -g3 -O0
AM_CXXFLAGS = -g3 -O0
else
AM_CFLAGS = -O2
AM_CXXFLAGS = -O2
endif

したがって、debugが有効になっている場合、{C/CXX}FLAGSを変更してデバッグ情報を有効にできます。

18
ismail

ismailのソリューションは一般的なアプローチですが、重大な問題がいくつかあります。ユーザーが「./configure --enable-debug」を実行してデバッグビルドを取得しようとすると、configureスクリプトはCFLAGSを「-g -O2」に設定し、Makefileは「-g3 -O0 ... -g」を使用します-O2 '実行可能ファイルをビルドする場合。その場合、gccは-O2を使用し、一部のコンパイラは-Oオプションが競合するため中断します。どちらのシナリオも予想される動作ではありません。

デバッグシンボルを使用してビルドするかどうかは、プロジェクトメンテナーが心配するべきことではありません。これはユーザーの問題です。プロジェクトがあり、デバッグビルドまたはリリースビルドを作成する場合は、構成時に異なるオプションを使用する必要があります。例えば、

 $ mkdir debug 
 $ mkdir release 
 $ cd debug &&/path/to/configure --prefix =/dbg\
 CPPFLAGS = -DDEBUG CXXFLAGS = " -g -O0 "&& make && make install 
 $ cd ../release &&/path/to/configure CPPFLAGS = -DNDEBUG && make && make install 

これにより、/ dbg/binにデバッグビルドがインストールされ、/ usr/local/binに「リリース」インストールがインストールされます。

また、CONFIG_SITEファイルを使用すると、必要な入力の手間を大幅に減らすことができます。たとえば、次のことができます。

 echo 'CPPFLAGS = -DDEBUG CFLAGS = "-g -O0"' >> /dbg/share/config.site

そして、その後の「configure --prefix =/dbg」のすべての呼び出しは、コマンドラインで指定する必要なく、CPPFLAGSとCFLAGSに設定を自動的に継承します。

パッケージメンテナーとして、ユーザーに「デバッグリリース」を構築する簡単な方法を提供したい場合、適切な引数でconfigureスクリプトを呼び出し、make && make installを呼び出すスクリプトをディストリビューションに含めることは完全に受け入れられますが、 autotoolメタファイルをこのような粗雑物で散らかす必要はまったくありません。それは単にそこに属していません。また、注意してください、多くのパッケージは--enable-debugを追加しようとしましたが、これは単に間違っています。ユーザーがconfigure CFLAGS="-g -O0"を呼び出したが、予期しないフラグを適用するビルドを取得した場合、バグがあり、パッケージはbrokenです。これは非常に一般的な経験であり、ユーザーが合理的な人が「デバッグビルド」と呼ぶものを取得できないパッケージ(現在、tmuxcurlについて考えている)を維持している場合configure CFLAGS="-g -O0"を呼び出した後、パッケージはbrokenになります。

Autotoolsでパッケージを保守する際に常に覚えておく必要がある重要な点は、ユーザーがあなたとはまったく異なるツールチェーンを使用している可能性があることです。ユーザーのツールチェーンが-DMAKE_IT_A_DEBUGまたは-DUSE_DEBUGまたは-I/usr/banana-split/debug/build/with/georges/headersを必要とする可能性は完全にあります。おそらく-O145または-Qがコンパイラーに渡されるか、-debugがリンカーに渡されるか、...などが必要になります。メンテナーとして、あなたは単に「デバッグビルド」というフレーズをすべてのユーザーにとって意味のあるものにするために必要な情報を持っていません。特定のユーザーに対してはソフトウェアをビルド不能にする可能性があるため、試さないでください。

130
William Pursell

Autotoolsで作成されたデフォルトのMakefileは、デバッグsymbosを含むバイナリを生成します。使用する make install-stripリリースターゲットを作成します。

5
crenate

Makefile.inまたはMakefile.amを編集せずにCFLAGS/CXXFLAGSを構成する別の例。このコードをconfigure.inまたはconfigure.acファイルに追加します。

test -z "$SED" && SED=sed

AC_ARG_ENABLE([debug],
  [AS_HELP_STRING([--enable-debug],
                  [whether to include debug symbols (default is no)])],
  [enable_debug=$enableval],
  [enable_debug=no]
)

if test "x$enable_debug" = xyes; then
  dnl Remove all optimization flags from CFLAGS
  changequote({,})
  CFLAGS=`echo "$CFLAGS" | $SED -e 's/-O[0-9s]*//g'`
  CXXFLAGS=`echo "$CXXFLAGS" | $SED -e 's/-O[0-9s]*//g'`

  CFLAGS=`echo "$CFLAGS" | $SED -e 's/-g[0-9]*//g'`
  CXXFLAGS=`echo "$CXXFLAGS" | $SED -e 's/-g[0-9]*//g'`
  changequote([,])

  CFLAGS="$CFLAGS -g -O0"
  CXXFLAGS="$CXXFLAGS -g -O0"
fi

echo "CFLAGS=$CFLAGS"

試して:

$ ./configure --enable-debug | grep CFLAGS
1
serghei