何处将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_FLAG
和AX_APPEND_FLAG
宏。 要使用它们,请将它们放入m4
子目录并将AC_CONFIG_MACRO_DIR([m4])
到configure.ac
Automake手册, 27.6标志变量排序中介绍了该主题。 configure.ac
和Makefile.am
之间存在交互,它不仅仅是设置隐式make规则中使用的众所周知的shell变量。
缺点是,你应该在一个名为mumble_CFLAGS
的新变量中设置它,比如Automake手册中讨论的那样。 mumble
只是程序的名称,在其他示例中通常是foo
或bar
。 稍后,当您创建makefile时,程序的配方$(mumble_CFLAGS) $(CFLAGS)
或foo
或bar
)将使用$(mumble_CFLAGS) $(CFLAGS)
来构建目标。
以下是它的外观示例。 它使用my_prog
作为工件名称,而不是使用my_prog
或foo
或bar
。
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_CFLAGS
, my_archive_CFLAGS
和my_sharedobj_CFLAGS
。
它不仅限于my_prog_CFLAGS
。 您还可以在makefile中隐式使用my_prog_CPPFLAGS
, my_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的编译规则。