何处将CFLAG(例如-std = gnu99)添加到autotools项目中

时间:2012-07-25 09:57:56

标签: c autotools

我有一个简单的Autotools C项目(不是C ++)。

CFLAG(通过检查)似乎是-g -O2

我希望所有生成的make文件也有-std=gnu99附加到CFLAG,因为我使用for (int i = 0; i < MAX; i++)和类似的。

我显然可以破解Makefile,但这会被./configure覆盖。

添加(或更改)代码所需的CFLAG的正确位置在哪里(与用户可能想要更改的CFLAG相对)?

(注意这是Where to add a CFLAG, such as -std=gnu99, into an (Eclipse CDT) autotools project的部分重复,因为我得到了我不想要的特定于Eclipse的答案。)


@ 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'

3 个答案:

答案 0 :(得分:26)

autoconf有一个宏:

刚刚提出:

AC_PROG_CC_STDC

AC_PROG_CC之后,一切都会正确。

特别是当您使用其他没有-std=gnu99但在默认情况下以C99模式运行的编译器时(或者有一个不同的选项hpcc的-AC99可以考虑)。

我会使用CFLAGS来做这件事。

来自docs

-- Macro: AC_PROG_CC_STDC
If the C compiler cannot compile ISO Standard C (currently C99),
try to add an option to output variable `CC' to make it work.  If
the compiler does not support C99, fall back to supporting ANSI
C89 (ISO C90).

After calling this macro you can check whether the C compiler has
been set to accept Standard C; if not, the shell variable
`ac_cv_prog_cc_stdc' is set to `no'.

答案 1 :(得分:2)

尽管使用像AC_PROG_CC_STDC这样的宏比向CFLAGS添加编译器选项更可取,但autoconf目前没有支持C11编译器支持的宏 - 目前还没有AC_PROG_CC_C11,只有AC_PROG_CC_STDC为gcc添加-std=gnu99选项,而不是-std=gnu11-std=c11

只需添加

即可添加编译器标志
CFLAGS+=" -std=c11"

在configure.ac。

或者,最好首先检查编译器是否支持添加的选项,否则打印警告,告诉用户手动为CFLAGS添加一个适用于其编译器的等效选项:

AX_CHECK_COMPILE_FLAG([-std=c11],
  [AX_APPEND_FLAG([-std=c11])],
  [AC_MSG_WARN([-std=c11 not supported, you may have to set CFLAGS to enable C11 support.])
])

这会使用GNU Autoconf Archive中的AX_CHECK_COMPILE_FLAGAX_APPEND_FLAG个宏。要使用它们,请将它们放入m4子目录并将AC_CONFIG_MACRO_DIR([m4])添加到configure.ac

答案 2 :(得分:0)

Automake手册27.6 Flag Variables Ordering中介绍了此主题。 configure.acMakefile.am之间存在交互,它不仅仅是设置隐式make规则中使用的众所周知的shell变量。

缺点是,你应该将它设置在一个名为mumble_CFLAGS的新变量中,该变量在Automake手册中讨论过。 mumble只是您的计划的名称,在其他示例中通常为foobar。稍后,当您创建makefile时,程序的配方(mumblefoobar)将使用$(mumble_CFLAGS) $(CFLAGS)来构建目标。

以下是它的外观示例。它不使用mumblefoobar,而是使用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) ...

稍后,当生成makefile时,它将具有类似于以下内容的配方,其中$(MY_PROG_CFLAGS)应用于构建my_prog的所有对象:

my_prog :
    $(CC) $(CPPFLAGS) $(MY_PROG_CFLAGS) $(CFLAGS) -c $< -o $@

my_prog_CFLAGS的额外间接允许您为不同的目标设置多个标志。例如,您可以拥有my_prog_CFLAGSmy_archive_CFLAGSmy_sharedobj_CFLAGS

并不限于my_prog_CFLAGS。您还可以在makefile中隐式使用my_prog_CPPFLAGSmy_prog_CXXFLAGS和其他变量。

这来自Automake manual

  

编译标记变量

     

本节试图回答上述所有问题。我们会   在我们的例子中主要讨论CPPFLAGS,但实际上答案是成立的   对于Automake中使用的所有编译标志:CCASFLAGS,CFLAGS,   CPPFLAGS,CXXFLAGS,FCFLAGS,FFLAGS,GCJFLAGS,LDFLAGS,LFLAGS,   LIBTOOLFLAGS,OBJCFLAGS,OBJCXXFLAGS,RFLAGS,UPCFLAGS和YFLAGS。

     

CPPFLAGS,AM_CPPFLAGS和mumble_CPPFLAGS是三个变量   可用于将标志传递给C预处理器(实际上是这些   变量也用于其他语言,如C ++或preprocessed   Fortran语言)。 CPPFLAGS是用户变量(请参阅用户变量),   AM_CPPFLAGS是Automake变量,mumble_CPPFLAGS是   特定于mumble目标的变量(我们将其称为每个目标   变量,请参阅程序和库变量。)

     

Automake在编译C源时始终使用其中两个变量   文件。编译mumble目标的目标文件时,第一个   变量将是mumble_CPPFLAGS(如果已定义)或AM_CPPFLAGS   除此以外。第二个变量始终是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是用户变量,即a   用户有权修改以便编译的变量   包。与其他许多变量一样,这个变量记录在最后   'configure --help'的输出。

     

例如,需要将/ home / my / usr / include添加到C的人   编译器的搜索路径将使用

配置包
./configure CPPFLAGS='-I /home/my/usr/include'
     

并且此标志将传播到所有的编译规则   命令描述文件。