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

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

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

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

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

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

(请注意,这是将一个CFLAG(例如-std = gnu99)添加到(Eclipse CDT)autotools项目中的部分副本,因为我得到了我不想要的特定于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配置

 CFLAGS CFLAGS To assign environment variables (eg, 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用于那种事情。

来自文档 :

  - 宏:AC_PROG_CC_STDC
如果C编译器无法编译ISO标准C(目前为C99),
尝试添加一个选项来输出变量`CC'以使其工作。 如果
编译器不支持C99,回退到支持ANSI
 C89(ISO C90)。

调用此宏后,您可以检查C编译器是否具有
已被设定为接受标准C; 如果没有,shell变量
 `ac_cv_prog_cc_stdc'设置为'no'。 

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

您可以通过put添加编译器标志

 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

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

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

以下是它的外观示例。 它使用my_prog作为工件名称,而不是使用my_progfoobar

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手册 :

编译标志变量

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

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

在编译C源文件时,Automake始终使用其中两个变量。 编译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是一个用户变量,即用户有权修改以编译包的变量。 与其他许多变量一样,这个变量记录在'configure --help'输出的末尾。

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

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

并且此标志将传播到所有Makefile的编译规则。