31

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

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

./configure 'CXXFLAGS=-O0 -g'

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

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

  • Makefile.amprogname_CXXFLAGS=whateverに入れます。フラグを置き換えるのではなく、デフォルトのフラグに追加するため、機能しません。
  • configure.acに入れCXXFLAGS=whateverます。これは機能しますが、後でオーバーライドすることはできません。
4

7 に答える 7

22

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

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

: ${CFLAGS=""}

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

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

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

: ${CXXFLAGS=""}

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

于 2013-05-21T14:39:13.430 に答える
9

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など)にリダイレクトします)追加のボーナスとして、これにより、自分のプロジェクトだけでなく、構成するすべての自動圧縮プロジェクトにCXXFLAGSが設定されます。(プレフィックスを適切に設定したと仮定します。プレフィックスに関係なくすべてのプロジェクトでconfig.siteを有効にする場合は、CONFIG_SITE設定を使用します)

于 2010-06-30T07:01:14.847 に答える
7

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

基本的なことは、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
于 2010-06-25T16:12:52.573 に答える
3

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が正しく記述されている場合、(適切な)デフォルトを変更せずに、最適化せずにビルドを構成します。

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

追加するために編集:

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

于 2010-06-25T09:39:19.160 に答える
1

上記の回答に基づいて、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に追加します。

于 2018-02-03T13:10:43.950 に答える
0

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

programname_CXXFLAGS=-O0 -g

更新:20100628

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

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

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

于 2010-06-25T08:58:52.513 に答える
0

ユーザーを驚かせないことに関するポイントは有効ですが、一部のフラグはデフォルトでオンにするのが妥当であり(eg -Wall -Wextra)、他のフラグはコードベース固有であり、必要になる場合があります(eg -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で使用するためにそれらを適合させるのは簡単です。

参照:

于 2019-02-17T03:30:43.203 に答える