我有一个简单的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'
答案 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_FLAG
和AX_APPEND_FLAG
个宏。要使用它们,请将它们放入m4
子目录并将AC_CONFIG_MACRO_DIR([m4])
添加到configure.ac
答案 2 :(得分:0)
Automake手册27.6 Flag Variables Ordering中介绍了此主题。 configure.ac
和Makefile.am
之间存在交互,它不仅仅是设置隐式make规则中使用的众所周知的shell变量。
缺点是,你应该将它设置在一个名为mumble_CFLAGS
的新变量中,该变量在Automake手册中讨论过。 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])
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 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'
并且此标志将传播到所有的编译规则 命令描述文件。