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?
答案 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
现在开始变得有意义了。