我有一个简单的Autotools C项目(不是C++)。
CFLAG(经检查)似乎是-g -O2。
我希望所有生成的make文件都附加到CFLAG中,因为我使用的是-std=gnu99和类似的。
我显然可以破解Makefile,但是它会在./configure上被覆盖。
代码所需的添加(或更改)CFLAG的正确位置在哪里(与用户可能希望更改的CFLAG相比)?
(注意,这是将CFLAG (如-std=gnu99 )添加到(Eclipse )自动工具项目的位置的部分复制,因为我得到的是特定于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 (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'发布于 2015-03-08 16:35:57
虽然使用像AC_PROG_CC_STDC这样的宏比向CFLAGS添加编译器选项更可取,但autoconf目前还没有支持C11编译器的宏--还没有AC_PROG_CC_C11,而AC_PROG_CC_STDC只为gcc添加了-std=gnu99选项,而不是-std=gnu11或-std=c11。
您可以简单地通过将
CFLAGS="$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.])
])这使用在AX_CHECK_COMPILE_FLAG中找到的AX_APPEND_FLAG宏和GNU Autoconf档案馆宏。要使用它们,请将它们放到m4子目录中,并将AC_CONFIG_MACRO_DIR([m4])添加到configure.ac中。
发布于 2017-11-04 15:05:41
本主题已在“自动手册”( 27.6旗变量排序 )中介绍。configure.ac和Makefile.am之间存在交互,它不仅仅是设置一个众所周知的用于隐式生成规则的shell变量。
它的缺点是,您应该将其设置在一个名为“自动手册”中讨论的mumble_CFLAGS的新变量中。mumble只是程序的名称,在其他示例中通常是foo或bar。稍后,当创建makefile时,程序的配方(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])
fiMakefile.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和其他变量。
这是来自自动手册的
编译标志变量 本节试图回答上述所有问题。我们将在我们的示例中主要讨论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是特定于目标的变量(我们称之为每个目标变量,参见Program变量)。 当编译C源文件时,Automake总是使用其中的两个变量。当为目标编译对象文件时,第一个变量将是mumble_CPPFLAGS (如果定义的话),或者AM_CPPFLAGS (否则)。第二个变量总是CPPFLAGS。 在下面的示例中, bin_PROGRAMS = foo bar foo_SOURCES = xyz.c bar_SOURCES = main.c foo_CPPFLAGS = -DFOO AM_CPPFLAGS = -DBAZ O将使用‘$(Foo_CPPFLAGS)$(CPPFLAGS)’编译(因为xyz.o是foo目标的一部分),而main.o将使用‘$(AM_CPPFLAGS)$(CPPFLAGS)’编译(因为目标条没有每个目标变量)。 mumble_CPPFLAGS和AM_CPPFLAGS之间的区别很明显,让我们来关注CPPFLAGS。CPPFLAGS是一个用户变量,即用户有权修改以编译包的变量。和许多其他变量一样,这个变量在“配置--帮助”输出的末尾被记录下来。 例如,需要将/home/my/usr/include添加到C编译器的搜索路径的人将使用 ./配置CPPFLAGS='-I /home/my/usr/include‘ 这个标志将被传播到所有Makefile的编译规则。
https://stackoverflow.com/questions/11647208
复制相似问题