web-dev-qa-db-ja.com

Autotoolsを使用したデフォルトのコンパイラフラグ

デフォルトのコンパイラ/リンカなどを設定する方法を知りたい。 Autoconf/Automakeコンボを使用する場合はフラグを立てます。

たとえば、何も設定しない場合、デフォルトのコンパイラフラグは「-O2-g」です。たとえば、デバッグしたい場合は、他の何かでオーバーライドできます。

./configure 'CXXFLAGS=-O0 -g'

しかし、最適化を有効にするとデバッグが不可能になるため、デフォルトの構成はばかげていると思います。したがって、引数なしでconfigureを実行する場合、デフォルトのフラグは「-O2」または「-O0-g」のいずれかになります。どうすればいいのですか?

編集:私は次の解決策を試しました:

  • プットprogname_CXXFLAGS=whateverMakefile.amに。フラグを置き換えるのではなく、デフォルトのフラグに追加するため、機能しません。
  • プットCXXFLAGS=whateverconfigure.acに。これは機能しますが、後でオーバーライドすることはできません。
26
petersohn

その間、私はそれを行う方法を考え出しました。これについて説明します。

基本的なことは、AutoconfがMakefile.inのシェル変数を置き換えることです。問題は、これらの変数の値をどのように取得するかです。答えは、初期化コマンドがコマンドラインで通知された変数(./configure 'CXXFLAGS=-O0 -g'など)を置き換えることです。それ以外の場合は、デフォルトを定義するコマンド(たとえば、CXXFLAGSはAC_PROG_CXXによって設定されます)に置き換えられます。それらが空でない場合。したがって、解決策は、AC_PROG_CXXの前に、コマンドラインからの置換が行われた後に新しいデフォルトを設定することです。例えば:

if test -z $CXXFLAGS; then
    CXXFLAGS='-O2'
fi
AC_PROG_CXX
6
petersohn

Autoconfマニュアルによると(約AC_PROG_CC):

GNU Cコンパイラを使用する場合は、シェル変数GCCを「yes」に設定します。出力変数CFLAGSがまだ設定されていない場合は、GNU Cコンパイラ(GCCが-gを受け入れないシステムでは-O2)、または他のコンパイラの場合は-g。パッケージがこのデフォルトを好まない場合は、行を挿入できます。

: ${CFLAGS=""}

aC_INITの後、AC_PROG_CCの前に、代わりに空のデフォルトを選択します。

同様に、autoconfマニュアルによると(約AC_PROG_CXX):

GNU C++コンパイラを使用する場合は、シェル変数GXXを「yes」に設定します。出力変数CXXFLAGSがまだ設定されていない場合は、GNU C++コンパイラ(G ++が-gを受け入れないシステムでは-O2)、または他のコンパイラの場合は-g。パッケージがこのデフォルトを好まない場合は、行を挿入できます。

: ${CXXFLAGS=""}

aC_INITの後、AC_PROG_CXXの前に、代わりに空のデフォルトを選択します。

19
malex984

Configureを実行するたびにデフォルトのフラグを自分で設定したいだけの場合は、(少なくとも)3つの良い方法があります。ご使用の環境(.loginまたは.bashrcなど)でCXXFLAGSを設定するか、CONFIG_SITE環境変数を使用して構成ファイルを指定するか、CXXFLAGSに必要な値を$ prefix/share /config.siteに設定します。パッケージのすべてのユーザーに対してデフォルトフラグを「-O2-g」以外に設定する場合は、驚き最小の原則に違反するため、必要なものを変更する必要があります。 autoconfに精通している人は、デフォルトのフラグが-O2 -gであることを期待しているので、これを変更しないでください。

上記の3番目のオプションを使用して、

 $ echo'CXXFLAGS = "-O0 -g"> /usr/local/share/config.site

(または、通常$ prefixを設定する場所($ HOME/share/config.siteなど)にリダイレクトします)追加のボーナスとして、これにより、自分だけでなく、構成するall自動没収プロジェクトのCXXFLAGSが設定されます。 (プレフィックスを適切に設定すると仮定します。プレフィックスに関係なくすべてのプロジェクトでconfig.siteを有効にする場合は、CONFIG_SITE設定を使用します)

9
William Pursell

Makefile.amでターゲット固有のデフォルトを設定するか、_configure.ac_でデフォルトを設定できます。これは、プロジェクトでビルドするすべてのものに適用されます。

autoconfマニュアル のセクション4.8.1(および5.10.4)を参照してください。

最終的なパッケージユーザーを二度と推測しないことに関する4.8.1の注釈に注意してください。ユーザーが気にしないフラグを設定する場合は、_AM_CXXFLAGS_を使用して設定します。このようなフラグは、ユーザーがオーバーライドできる必要がありますCXXFLAGSで設定する必要があります。

しかし...あなたは本当にこれをしたいですか?

  1. あなたは「デバッグが不可能になる」と言います。これを試して、何かがうまくいかないのを見たことがありますか?コンパイラー/デバッガーは、おそらくあなたがそれを信用するよりも賢いです。
  2. 開発時の適切なデフォルトは、ビルド時の最終的なユーザーにとって必ずしも適切なデフォルトではありません。開発中に最適化をオフにする必要がある場合は、説明したとおりに_./configure CXXFLAGS='-O0 -g'_を使用して開発システムを構成するだけです。 configure.acが正しく記述されている場合、yourビルドを最適化せずに構成し、(適切な)デフォルトは変更しません。

短いバージョン:あなたが今している方法は正しい方法です。

編集追加:

一般に、シェル変数が_AC_SUBST_の引数として表示される場合(明示的に、またはCXXFLAGSの場合のように、他のコマンド内で暗黙的に)、出力に代入されます。ファイル。つまり、AC_SUBST(foo)の後、_$foo_スクリプトの_./configure_変数の値が_@foo@_インスタンスに置き換えられます。

3
Norman Gray

上記の回答に基づいて、configure.acにこれを追加しました。

AC_ARG_WITH(debug, [  --with-debug            add the debugging module], [AC_DEFINE(WITH_DEBUG,1,0)
AC_SUBST(WITH_DEBUG,1)
CXXFLAGS="-O0 -ggdb"])

また、AC_CONFIG_HEADERS(config.h)でWITH_DEBUGを定義し、AC_SUBST()を使用してMakefileに追加します。

1

ユーザーを驚かせないことに関するポイントは有効ですが、一部のフラグはデフォルトでオンにするのが妥当であり(例:-Wall -Wextra)、その他のフラグはコードベース固有であり、必要になる場合があります(例:-std=gnu99)。

問題は、これを移植可能に行う方法になります。私は個人的にlibuvプロジェクトからフラグチェックマクロを盗みます。これを行うには、プロジェクトのlibuv-check-flags.m4ディレクトリにm4を追加します。次に、configure.acで次のことを実行できます。

m4_include([m4/libuv-check-flags.m4])
AM_INIT_AUTOMAKE([-Wall -Werror foreign 1.11.2])

# Checks for programs.
AC_PROG_CC
CC_CHECK_CFLAGS_APPEND([-std=gnu99])
CC_CHECK_CFLAGS_APPEND([-Wall])
CC_CHECK_CFLAGS_APPEND([-Wextra])
AC_PROG_LIBTOOL

生成された構成ファイルは、次のコンパイラコマンドラインを生成します。

gcc -g -O2 -std=gnu99 -Wall -Wextra

上記のソリューションを使用して、-g -O2のデフォルトを上書きすることはできます。例:

./configure CFLAGS='-O0 -g'

次のコマンドラインを生成します。

gcc -O0 -g -std=gnu99 -Wall -Wextra

また、gccセマンティクスを活用して、必要に応じてベースフラグを無効にすることもできます。たとえば、本当に必要な場合は、警告を無効にすることができます。

./configure CFLAGS='-Wno-all -Wno-extra'

「コンパイラがこれらのフラグをサポートしていない場合はどうなるでしょうか?」と言うかもしれません。そのため、これらのマクロはコンパイラの機能が最初にチェックされることを保証するため、非常に便利で優れています。したがって、サポートされていない場合、-Wall-Wextraは最初から追加されません。

libuvは、地球上で最もポータブルで広く使用されているCライブラリの1つであるため、それらのリードに従うことは合理的だと思います。これらのマクロは純粋なC固有のものですが、CXXFLAGSで使用するためにそれらを適合させるのは簡単です。

参照:

0
Dylan Cali

Makefile.amで、次のように定義できます。

programname_CXXFLAGS=-O0 -g

更新:20100628

AC_PROG_CXXを呼び出す前に、configure.inにCXXFLAGSを追加してみてください。私はそれをテストしませんでしたが、configure.inは次のようになります。

AC_INIT
...
CXXFLAGS=-MY -FLAGS
...
AC_PROG_CXX

私は興味があるので、これがうまくいくかどうか教えてください:-)

0
krico