web-dev-qa-db-ja.com

-std = gnu99などのCFLAGをautotoolsプロジェクトに追加する場所

単純な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'
_
25
fadedbee

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'に設定されます。
25
hroptatyr

このトピックは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のコンパイルルールに伝達されます。

0
jww