私はしばらくこれを探していました:現在、Eclipseベースの方法(メイクファイルを使用)から来ている中規模のプログラムを自動ツールに変換しています
私はいつも、デバッグシンボルと最適化なしで、すべてのデバッグシンボルと最適化なしの「デバッグ」ビルド、およびデバッグシンボルと最適な最適化なしの「リリース」ビルドを持つことに慣れています。
今、私はautotoolsでこれを何らかの方法で複製しようとしているので、(おそらく)次のようなことができます:
./configure
make debug
デバッグシンボルはすべてあり、最適化はありません。
./configure
make
「リリース」バージョンになります(デフォルト)
PS:--enable-debug flag/featureについて読みましたが、現在の(単純な)設定では、configure
によって認識されないものを使用しています
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.in
or Makefile.am
;
if DEBUG
AM_CFLAGS = -g3 -O0
AM_CXXFLAGS = -g3 -O0
else
AM_CFLAGS = -O2
AM_CXXFLAGS = -O2
endif
したがって、debug
が有効になっている場合、{C/CXX}FLAGS
を変更してデバッグ情報を有効にできます。
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です。これは非常に一般的な経験であり、ユーザーが合理的な人が「デバッグビルド」と呼ぶものを取得できないパッケージ(現在、tmux
とcurl
について考えている)を維持している場合configure CFLAGS="-g -O0"
を呼び出した後、パッケージはbrokenになります。
Autotoolsでパッケージを保守する際に常に覚えておく必要がある重要な点は、ユーザーがあなたとはまったく異なるツールチェーンを使用している可能性があることです。ユーザーのツールチェーンが-DMAKE_IT_A_DEBUG
または-DUSE_DEBUG
または-I/usr/banana-split/debug/build/with/georges/headers
を必要とする可能性は完全にあります。おそらく-O145
または-Q
がコンパイラーに渡されるか、-debug
がリンカーに渡されるか、...などが必要になります。メンテナーとして、あなたは単に「デバッグビルド」というフレーズをすべてのユーザーにとって意味のあるものにするために必要な情報を持っていません。特定のユーザーに対してはソフトウェアをビルド不能にする可能性があるため、試さないでください。
Autotoolsで作成されたデフォルトのMakefileは、デバッグsymbosを含むバイナリを生成します。使用する make install-strip
リリースターゲットを作成します。
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