単純なAutotools Cプロジェクト(C++ではない)があります。
CFLAG(検査による)は_-g -O2
_のようです。
for (int i = 0; i < MAX; i++)
などを使用しているため、生成されたすべてのmakeファイルにもCFLAGに_-std=gnu99
_を追加したいと思います。
私は明らかにMakefileをハックできますが、これは_./configure
_で上書きされます。
コードに必要なCFLAGを追加(または変更)する正しい場所はどこですか(ユーザーが変更する可能性があるCFLAGとは対照的ですか)。
(これは -std = gnu99などのCFLAGを(Eclipse CDT)autotoolsプロジェクトに追加する場所 の一部が重複していることに注意してください。 )
@DevSolarの答えはまだ役に立ちません。 _configure.ac
_ファイル(下記)は、configure
スクリプト(以下も同様)を生成します。
configure.ac:
_dnl Process this file with autoconf to produce a configure script.
CFLAGS="$CFLAGS -std=gnu99"
AC_PREREQ(2.59)
AC_INIT(tuntest, 1.0)
AC_CANONICAL_SYSTEM
AM_INIT_AUTOMAKE()
AC_PROG_CC
AC_CONFIG_FILES(Makefile src/Makefile)
AC_OUTPUT
_
$ grep CFLAGS configure
_CFLAGS
CFLAGS
To assign environment variables (e.g., CC, CFLAGS...), specify them as
CFLAGS C compiler flags
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_test_CFLAGS=${CFLAGS+set}
ac_save_CFLAGS=$CFLAGS
CFLAGS="-g"
CFLAGS=""
CFLAGS="-g"
if test "$ac_test_CFLAGS" = set; then
CFLAGS=$ac_save_CFLAGS
CFLAGS="-g -O2"
CFLAGS="-g"
CFLAGS="-O2"
CFLAGS=
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
_
autoconfにはこのためのマクロがあります。
置くだけ:
AC_PROG_CC_STDC
あなたのAC_PROG_CC
の後、すべてが正しくなります。
特に、-std=gnu99
を持たないが、デフォルトでC99モードで動作する(または別のオプションhpccの-AC99
が思い浮かぶ)他のコンパイラを使用する場合。
私は[〜#〜]しない[〜#〜]そのようなことのためにCFLAGS
を使用します。
docs から:
-マクロ:AC_PROG_CC_STDC [.____。 コンパイラがC99をサポートしていない場合は、ANSI C89(ISO C90)のサポートにフォールバックします。 このマクロを呼び出した後、Cコンパイラかどうかを確認できます標準Cを受け入れるように設定されている 。そうでない場合、シェル変数 `ac_cv_prog_cc_stdc 'は` no'に設定されます。
このトピックはAutomakeのマニュアル 27.6フラグ変数の順序付け で説明されています。 _configure.ac
_と_Makefile.am
_の間には相互作用があり、暗黙のmakeルールで使用される既知のシェル変数を設定するだけではありません。
それが不足している場合は、Automakeマニュアルで説明されている_mumble_CFLAGS
_のような新しい変数に設定する必要があります。 mumble
は単にプログラムの名前であり、他の例では、多くの場合foo
またはbar
です。後でメイクファイルが作成されると、プログラムのレシピ(mumble
またはfoo
またはbar
)は$(mumble_CFLAGS) $(CFLAGS)
を使用してターゲットをビルドします。
これがどのように見えるかの例です。 mumble
またはfoo
またはbar
を使用する代わりに、アーティファクト名として_my_prog
_を使用します。
configure.ac:
_# Perform a compile test using -std=gnu99, set has_gnu99
if test "$has_gnu99" -eq "1"; then
AC_SUBST([MY_GNU99], [-std=gnu99])
fi
_
Makefile.am:
_bin_PROGRAMS = my_prog
my_prog_CFLAGS = $(MY_GNU99) $(MY_ANOTHER_FLAG) $(MY_YET_ANOTHER_FLAG) ...
_
その後、メイクファイルが生成されると、次のようなレシピが作成されます。ここで、$(MY_PROG_CFLAGS)
は、_my_prog
_を構築するすべてのオブジェクトに適用されます。
_my_prog :
$(CC) $(CPPFLAGS) $(MY_PROG_CFLAGS) $(CFLAGS) -c $< -o $@
_
_my_prog_CFLAGS
_の追加の間接参照により、異なるターゲットに複数のフラグを設定できます。たとえば、_my_prog_CFLAGS
_、_my_archive_CFLAGS
_、および_my_sharedobj_CFLAGS
_を使用できます。
そして、それは_my_prog_CFLAGS
_に限定されません。また、_my_prog_CPPFLAGS
_、_my_prog_CXXFLAGS
_、およびその他の変数をメイクファイルで暗黙的に使用することもできます。
これは Automake manual からのものです。
コンパイルフラグ変数
このセクションでは、上記のすべての質問に答えようとしています。私たちの例では主にCPPFLAGSについて説明しますが、実際にはAutomakeで使用されるすべてのコンパイルフラグ(CCASFLAGS、CFLAGS、CPPFLAGS、CXXFLAGS、FCFLAGS、FFLAGS、GCJFLAGS、LDFLAGS、LFLAGS、LIBTOOLFLAGS、OBJCFLAGS、UPJLAGSGS、OBJCAGSFL、 、YFLAGS。
CPPFLAGS、AM_CPPFLAGS、およびmumble_CPPFLAGSは、Cプリプロセッサにフラグを渡すために使用できる3つの変数です(実際、これらの変数は、C++や前処理されたFortranなどの他の言語でも使用されます)。 CPPFLAGSはユーザー変数(ユーザー変数を参照)、AM_CPPFLAGSはAutomake変数、mumble_CPPFLAGSはマンブルターゲットに固有の変数です(これをターゲットごとの変数と呼びます。プログラムとライブラリ変数を参照)。
Automakeは、Cソースファイルをコンパイルするとき、常にこれらの変数の2つを使用します。マンブルターゲットのオブジェクトファイルをコンパイルする場合、最初の変数は、定義されている場合はmumble_CPPFLAGS、そうでない場合はAM_CPPFLAGSになります。 2番目の変数は常にCPPFLAGSです。
次の例では、
_bin_PROGRAMS = foo bar foo_SOURCES = xyz.c bar_SOURCES = main.c foo_CPPFLAGS = -DFOO AM_CPPFLAGS = -DBAZ
_xyz.oは '$(foo_CPPFLAGS)$(CPPFLAGS)'でコンパイルされます(xyz.oはfooターゲットの一部であるため)、main.oは '$(AM_CPPFLAGS)$(CPPFLAGS)'でコンパイルされます(ターゲットバーにはターゲットごとの変数がないため)。
Mumble_CPPFLAGSとAM_CPPFLAGSの違いは十分に明確なので、CPPFLAGSに注目しましょう。 CPPFLAGSはユーザー変数です。つまり、ユーザーがパッケージをコンパイルするために変更することができる変数です。この変数は、他の多くの変数と同様に、「configure --help」の出力の最後に記載されています。
たとえば、Cコンパイラの検索パスに/ home/my/usr/includeを追加する必要がある人は、
_./configure CPPFLAGS='-I /home/my/usr/include'
_このフラグは、すべてのMakefileのコンパイルルールに伝達されます。