2016-01-31 87 views
2

autotools文檔非常混亂。我正在編寫Fortran,所以AM_CFLAGS等價物是AM_FCFLAGS。兩者的工作方式完全相同(推測)。那麼AM_(F)CFLAGS是什麼?

首先,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

用戶是否也可以覆蓋默認的AM_FCFLAGS配置選項,如果他們仍然使用gfortran?

基本上,WTF?

+1

'AM' == automake。有關[程序變量](https://www.gnu.org/software/automake/manual/html_node/Program-Variables.html),[標誌變量排序](https://www.gnu.org/software /automake/manual/html_node/Flag-Variables-Ordering.html)和[Fortran 9x支持](https://www.gnu。org/software/automake/manual/html_node/Fortran-9x-Support.html#index-AM_005fFCFLAGS)手冊頁的部分可能在這裏最常用(從快速搜索中)。 –

+1

使用autotools有一個[walk-through tutorial](https://autotools.io/index.html)是很好的。手冊實際上僅用於參考目的。 –

回答

2

AM_FCFLAGS(以及類似的AM_CFLAGS和類似的)被設計爲不能被用戶覆蓋,所以你不應該把那些選項放在那裏,除非你希望它們總是存在。

用戶可以通過自己的FCFLAGS作爲其./configure調用的一部分 - 你可以做什麼,如果你想默認爲這些而不是什麼autoconf的會自行違約,是要改變configure.ac和比較默認標誌(其中老實說我不知道​​Fortran)到目前的FCFLAGS,如果他們匹配,用您的默認值替換FCFLAGS

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的標準滿足,並自動設置FC和FCFLAGS gfortran。

如果用戶使用gfortran,但尚未設置FCFLAGS,最後3行設置合理的默認值。

我發現了關於ac_cv_env_FCFLAGS_set當我看着config.log。如果用戶設置自己的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 

它開始變得有意義了。