那么“是”AM_(F)CFLAGS是什么?

时间:2016-01-31 18:04:13

标签: makefile autotools

autotools文档非常混乱。我写的是Fortran,所以AM_CFLAGS的等价物是AM_FCFLAGS。两者的工作方式完全相同(大概)。

首先,从概念上讲,实际上“是”AM_CFLAGS是什么?显然,“CFLAGS”位与设置编译器标志有关。但是“AM_”部分是什么意思?

关于如何使用它似乎存在冲突的建议。有人说不要把它放在Makefile.am中,有人说不要把它放在configure.ac中。谁是对的?

这是我目前的Makefile.am:

AM_FCFLAGS = -Wall -O0 -C -fbacktrace

.f90.o:
    $(FC) -c $(AM_FCFLAGS) $<

我想要发生的是默认情况下使用“-Wall -O0 -C -fbacktrace”进行编译,如果我正在使用gfortran编译的话。但是,用户可能想要使用不同的编译器,例如FC = ifort,在这种情况下,他们可能必须传入FCFLAGS =“whatever”并完全废弃AM_FCFLAGS

如果用户仍在使用gfortran,用户是否也可以覆盖配置选项中的默认AM_FCFLAGS?

基本上,WTF?

2 个答案:

答案 0 :(得分:2)

AM_FCFLAGS(类似地AM_CFLAGS和类似的)被设计为不能被用户覆盖,因此除非您希望它们始终存在,否则不应将这些选项放在那里。

用户可以将自己的FCFLAGS作为./configure调用的一部分进行传递 - 如果您想要默认使用这些内容而不是autoconf默认调用,那么您可以做的就是更改{{ 1}}并将默认标记(对于Fortran我不熟悉)与当前configure.ac进行比较,如果匹配,则将FCFLAGS替换为默认值。

答案 1 :(得分:0)

在Makefile.am我有

AM_CFCFLAGS = -Wall -O0 -C -fbacktrace

糟糕的主意!它假定人们正在使用gfortran和/或不想要覆盖这些默认值。所以我删除了那一行。

相反,我现在在configure.ac中有以下几行:

AC_PROG_FC([gfortran], [Fortran 90]) # we need a Fortran 90 compiler
AS_IF([test x$FC = xgfortran -a x$ac_cv_env_FCFLAGS_set = x],
   AC_SUBST([FCFLAGS], ["-Wall -O0 -C -fbacktrace"])
   [Set some flags automatically if using gfortran])

AC_PROG_FC检查符合Fortran 90标准的gfortran,并自动设置FC和FCFLAGS。

如果用户使用gfortran,则最后3行设置合理默认值,但未设置FCFLAGS。

当我查看config.log时,我发现了ac_cv_env_FCFLAGS_set。它被设置为&#34; set&#34;如果用户设置了自己的FCFLAGS。

在Makefile.am中,我现在有以下规则:

.f90.o:
        $(FC) -c $(FCFLAGS) $<


datetime_module.mod : datetime.o
datetime.o :      datetime.f90 mod_clock.o mod_datetime.o mod_strftime.o mod_timedelta.o
mod_clock.o:     mod_clock.f90 mod_datetime.o mod_timedelta.o
mod_datetime.o:  mod_datetime.f90 mod_constants.o mod_strftime.o mod_timedelta.o
mod_timedelta.o: mod_timedelta.f90

现在开始变得有意义了。