那么 "is" AM_(F)CFLAGS 是什么?
So what "is" AM_(F)CFLAGS?
autotools 文档非常混乱。我正在写 Fortran,所以 AM_CFLAGS 等价于 AM_FCFLAGS。两者的工作方式完全相同(大概)。
首先,概念上 "is" AM_CFLAGS 究竟是什么?显然,"CFLAGS" 位与设置编译器标志有关。但是 "AM_" 部分是什么意思?
关于如何使用它似乎存在相互矛盾的建议。有的说不要放在Makefile.am,有的说不要放在configure.ac。谁是对的?
这是我现在的 Makefile.am:
AM_FCFLAGS = -Wall -O0 -C -fbacktrace
.f90.o:
$(FC) -c $(AM_FCFLAGS) $<
如果我使用 gfortran 进行编译,我希望默认使用“-Wall -O0 -C -fbacktrace”进行编译。但是,用户可能想使用不同的编译器,例如 FC=ifort,在这种情况下,他们可能必须传入 FCFLAGS="whatever" 并完全废弃 AM_FCFLAGS
如果用户仍在使用 gfortran,他们还可以覆盖配置选项中的默认 AM_FCFLAGS 吗?
基本上,WTF?
AM_FCFLAGS
(以及类似的 AM_CFLAGS
和类似的)被设计成不可被用户覆盖,所以你不应该把这些选项放在那里,除非你希望它们总是存在。
用户可以传递他们自己的 FCFLAGS
作为他们 ./configure
调用的一部分——如果你想默认为那些而不是 autoconf 自己默认的,你可以做的是改变configure.ac
并将默认标志(老实说我不知道 Fortran 的默认标志)与当前的 FCFLAGS
进行比较,如果它们匹配,则将 FCFLAGS
替换为您的默认值。
在Makefile.am我有
AM_CFCFLAGS = -Wall -O0 -C -fbacktrace
坏主意!它假设人们正在使用 gfortran and/or 不想覆盖这些默认值。所以我删除了那行。
相反,我现在在 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 但没有设置 FCFLAGS,则最后 3 行设置合理的默认值。
我在查看 config.log 时发现了大约 ac_cv_env_FCFLAGS_set。如果用户设置自己的 FCFLAGS,则设置为 "set"。
在 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
现在开始明白了。
autotools 文档非常混乱。我正在写 Fortran,所以 AM_CFLAGS 等价于 AM_FCFLAGS。两者的工作方式完全相同(大概)。
首先,概念上 "is" AM_CFLAGS 究竟是什么?显然,"CFLAGS" 位与设置编译器标志有关。但是 "AM_" 部分是什么意思?
关于如何使用它似乎存在相互矛盾的建议。有的说不要放在Makefile.am,有的说不要放在configure.ac。谁是对的?
这是我现在的 Makefile.am:
AM_FCFLAGS = -Wall -O0 -C -fbacktrace
.f90.o:
$(FC) -c $(AM_FCFLAGS) $<
如果我使用 gfortran 进行编译,我希望默认使用“-Wall -O0 -C -fbacktrace”进行编译。但是,用户可能想使用不同的编译器,例如 FC=ifort,在这种情况下,他们可能必须传入 FCFLAGS="whatever" 并完全废弃 AM_FCFLAGS
如果用户仍在使用 gfortran,他们还可以覆盖配置选项中的默认 AM_FCFLAGS 吗?
基本上,WTF?
AM_FCFLAGS
(以及类似的 AM_CFLAGS
和类似的)被设计成不可被用户覆盖,所以你不应该把这些选项放在那里,除非你希望它们总是存在。
用户可以传递他们自己的 FCFLAGS
作为他们 ./configure
调用的一部分——如果你想默认为那些而不是 autoconf 自己默认的,你可以做的是改变configure.ac
并将默认标志(老实说我不知道 Fortran 的默认标志)与当前的 FCFLAGS
进行比较,如果它们匹配,则将 FCFLAGS
替换为您的默认值。
在Makefile.am我有
AM_CFCFLAGS = -Wall -O0 -C -fbacktrace
坏主意!它假设人们正在使用 gfortran and/or 不想覆盖这些默认值。所以我删除了那行。
相反,我现在在 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 但没有设置 FCFLAGS,则最后 3 行设置合理的默认值。
我在查看 config.log 时发现了大约 ac_cv_env_FCFLAGS_set。如果用户设置自己的 FCFLAGS,则设置为 "set"。
在 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
现在开始明白了。