5.10.8 Fortran编译器特性

Autoconf Fortran支持分为两类:传统Fortran 77宏(77楼)和现代Fortran宏(常设费用).前者用于传统的Fortran 77代码,并具有输出变量,如77楼,FFLAGS公司、和FLIBS公司.后者用于可以(或必须)在较新的Fortran标准,并具有如下输出变量常设费用,FCFLAGS(飞行警告标志)、和FCLIBS公司.

除了宏之外AC_FC_SRCEXT公司,AC_FC_FREFORM(交流_自由形式),AC_FC_FIXEDFORM(AC_FC_固定格式)、和AC_FC_LINE_长度(见下文)常设费用77楼宏的行为几乎相同,因此它们在本节中一起记录。

宏:AC_项目_F77 ([编译器搜索列表])

确定要使用的Fortran 77编译器。如果77楼还没有在环境中设置,然后检查77国集团f77表格、和然后是其他名字。设置输出变量77楼以名字命名找到编译器的。

但是,可以使用可选的第一个参数调用此宏如果指定,它必须是Fortran 77的空分隔列表要搜索的编译器。这只是让用户有机会指定Fortran 77编译器的替代搜索列表。对于例如,如果您不喜欢默认顺序,那么您可以调用AC_项目_F77像这样:

AC_PROG_F77([fl32 F77 fort77 xlf g77 f90 xlf90])

如果使用支持GNU Fortran 77的编译器,设置shell变量77国集团到'”。如果输出变量FFLAGS公司尚未在中设置环境,将其设置为-g-02号对于77国集团(或-氧气其中GNU Fortran 77编译器不接受-克),或-克用于其他编译器。

GNU测试的结果缓存在ac_cv_f77_编译器_gnu变量,接受-克在中空调_空调_程序_f77_g变量。

宏:AC_程序_FC ([编译器搜索列表],[方言])

确定要使用的Fortran编译器。如果常设费用尚未在中设置环境,然后方言是指示Fortran的提示要搜索的方言;默认情况是搜索最新可用的方言。设置输出变量常设费用编译器名称找到。

默认情况下,较新的方言优先于较旧的方言,但如果方言是指定的,则首选较旧的方言开始使用指定的方言。方言当前可以是Fortran 77、Fortran 90或Fortran 95。然而,这只是一个暗示哪个编译器名称更喜欢(例如。,f90表格表格95),并且没有试图保证特定的语言标准实际上是受支持的。因此,最好避免方言选项,并仅对与兼容的代码使用AC_PROG_FC最新的Fortran标准。

也可以使用可选的第一个参数调用此宏如果指定,它必须是一个空白的Fortran列表要搜索的编译器,就像AC_项目_F77.

如果使用支持GNU Fortran的编译器,设置shell变量全球金融中心到'”。如果输出变量FCFLAGS(飞行警告标志)尚未在中设置环境,然后将其设置为-g-02号对于GNU Fortran编译器(或-氧气编译器不接受-克),或-克用于其他编译器。

GNU测试的结果缓存在ac_cv_fc_compiler_gnu变量,接受-克在中交流控制程序变量。

宏:AC_项目_F77_C_O
宏:AC_项目_FC_C_O

测试Fortran编译器是否接受这些选项-c(c)-o个同时,并定义F77_NO_MINUS_C_MINUS_OFC_NO_MINUS_C_MINUS_O如果没有,则分别为。

测试结果缓存在ac_cv_prog_f77_c_o程序交流控制程序变量。

以下宏检查Fortran编译器的特性。要检查此处未列出的特性,请使用AC_COMPILE_IFELSE公司(请参见运行编译器)或AC_RUN_IFELSE公司(请参见检查运行时行为),确保首先设置Fortran 77或Fortran的当前语言AC_LANG([Fortran 77])AC_LANG(Fortran)(请参见语言选择).

宏:AC_F77_LIBRARY_LDFLAGS公司
宏:AC_FC_LIBRARY_LDFLAGS数据库

确定链接器标志(例如。,-L(左)-我)对于Fortran内部库和运行库需要的成功链接Fortran程序或共享库。输出变量FLIBS公司FCLIBS公司设置为这些标志(应包含在伦敦银行同业拆借利率链接时)。

此宏用于以下情况必须将C++和Fortran源代码混合在一个程序或共享库(请参见将Fortran 77与C和C混合++在里面可移植的源代码).

例如,如果C++和Fortran编译器的对象文件必须链接在一起,则必须使用C++编译器/链接器进行链接(因为需要在链接时进行特殊的C++操作,比如调用全局构造函数,实例化模板,启用异常支持等)。

然而,Fortran内部函数库和运行库必须链接到同样,但C++编译器/链接器默认情况下不知道如何添加这些Fortran 77库。因此,创建此宏是为了确定这些Fortran库。

AC_F77_汇总主AC_FC_DUMMY_MAIN公司AC_F77_主空调_FC_MAIN可能也有必要用Fortran链接C/C++;请参见下文。此外,强烈建议你使用的AC_配置_标题(请参见配置头文件)因为复合体定义了函数包装器宏创建的可能无法与C/C++编译器驱动程序一起使用。

这些宏在内部计算冗余链接所需的标志输出并缓存交流_断路器_程序_f77_v交流_视频_节目_视频变量。计算出的链接器标志缓存在ac_cv_f77_磅ac_cv文件库分别是。

宏:AC_F77_汇总主 ([已找到操作if],[非基金行动= ‘AC_MSG_故障'])
宏:AC_FC_DUMMY_MAIN公司 ([已找到操作if],[如果未找到操作= ‘AC_MSG_故障'])

对于许多编译器AC_F77_LIBRARY_LDFLAGS公司AC_FC_LIBRARY_LDFLAGS数据库提供他们自己的主要的初始化如下内容的入口函数Fortran I/O,然后调用名为(说)主要__运行用户的程序。这个AC_F77_汇总主AC_FC_DUMMY_MAIN公司AC_F77_主空调_FC_MAIN宏找出了如何处理这种相互作用。

将Fortran用于纯数值函数(无I/O等)时,通常一个人宁愿自己提供主要的跳过Fortran库初始化。然而,在这种情况下,可能仍需要提供假人主要__例程以防止链接错误在某些系统上。AC_F77_总_主AC_FC_DUMMY_MAIN公司检测是否有这样的例程必修的用于链接,以及它的名字是什么;shell变量F77_数字_主FC_DUMMY_MAIN公司持有这个名字,未知的当没有解决方案时被发现,并且没有人当不需要这样的虚拟main时。

默认情况下,如果找到操作定义F77_数字_主FC_DUMMY_MAIN公司此例程的名称(例如。,主要__)如果这是必需的。非基金行动默认为退出时出错。

为了与Fortran例程链接,用户的C/C++程序应该然后包括以下代码来定义虚拟main(如果是)需要:

#如果定义F77_DUMMY_MAIN#ifdef __cplusplus外部“C”#结尾int F77_DUMMY_MAIN(void){return 1;}#结尾

(更换77楼具有常设费用用于Fortran,而不是Fortran 77。)

请注意,此宏是从以下位置自动调用的AC_F77_抓取器AC_FC_WRAPPERS公司; 通常没有必要称之为除非想要更改默认操作。

此宏的结果缓存在ac_cv_f77_汇总_主ac _ cv _ fc_ dummy _ main公司变量。

宏:AC_F77_主
宏:空调_FC_MAIN

如上所述,许多Fortran库允许您提供一个条目点调用(say)主要__而不是通常主要的,其中然后由调用主要的Fortran库中的函数初始化Fortran I/O之类的内容AC_F77_主空调_FC_MAIN宏检测它是否可能的使用这样一个备用主功能,并定义F77_最小FC_主函数的名称。(如果没有找到备用主函数名,F77_主FC_主简单定义为主要的.)

因此,当从执行I/O等操作的C调用Fortran例程时,应该使用这个宏并像这样声明“main”函数:

#ifdef __cplusplus外部“C”#结尾int F77_MAIN(int argc,char*argv[]);

(再次,更换77楼具有常设费用用于Fortran,而不是Fortran 77。)

此宏的结果缓存在空调_f77_主ac_cv_fc_main接口变量。

宏:AC_F77_抓取器
宏:AC_FC_WRAPPERS公司

定义C宏F77_FUNC(姓名),FC_FUNC(名称、名称),F77_FUNC_(姓名)、和FC_FUNC_(姓名)正确地用下划线破坏C/C++标识符和标识符的名称,以匹配Fortran编译器。

Fortran是大小写敏感的,为了实现这一点,Fortran编译器将所有标识符转换为规范的大小写和格式。收件人从C调用Fortran子例程,或编写一个C函数可从Fortran调用,C程序必须在Fortran编译器所需的格式。为了做到这一点只需将所有C标识符包装在AC_F77_抓取器AC_FC_包装例如,假设您有以下Fortran 77子例程:

子程序foobar(x,y)双精度x,yy=3.14159*x返回结束

然后用C或C++将其原型声明为:

#定义FOOBAR_F77 F77_FUNC(FOOBAR,FOOBAR)#ifdef __cplusplusextern“C”/*防止C++名称损坏*/#结尾无效FOOBAR_F77(双*x,双*y);

请注意,我们传递的是函数名到F77_通用这样它就可以选择正确的一个。另请注意,Fortran 77例程的所有参数都作为指针(参见将Fortran 77与C和C混合++在里面GNU(全球导航单元)汽车制造).

(更换77楼具有常设费用用于Fortran,而不是Fortran 77。)

尽管Autoconf在检测Fortran编译器的命名方案,可能有Fortran它还不支持的编译器。在这种情况下,上述代码生成编译时错误,但其他一些行为(例如,禁用Fortran相关功能)可以通过检查是否F77_通用FC_FUNC公司定义。

现在,要从C程序调用该例程,我们可以这样做:

{双倍x=2.7183,y;FOOBAR_F77(&x,&y);}

如果Fortran标识符包含下划线(例如。,foo_bar(_B)),你应该使用F77_通用_函数(_FUNC)_而不是F77_通用FC_FUNC公司(使用相同的参数)。这是因为如果某些Fortran编译器包含下划线。

名称篡改方案编码在ac_cv_f77_设置ac _ cv _ fc_管理cache变量,也用于这个AC_F77_FUNC公司交流功能下面介绍的宏。

宏:AC_F77_FUNC公司 (名称,[贝壳])
宏:空调_FC_FUNC (名称,[贝壳])

给定标识符名称,设置shell变量贝壳保存损坏的版本名称根据Fortran链接器(另请参阅AC_F77_抓取器AC_FC_WRAPPERS公司).贝壳可选;如果不是的话提供的shell变量很简单名称.目的这个宏是为了给调用者提供一种访问命名的方法除了通过如上所述的C预处理器之外的信息,从C/C++以外的语言调用Fortran例程。

宏:AC_FC_SRCEXT公司 (提取,[行动-成功],[操作-故障= ‘AC_MSG_故障'])
宏:AC_FC_PP_SRCEXT(AC_FC_PP_SRCEXT) (提取,[行动-成功],[操作-故障= ‘AC_MSG_故障'])

默认情况下常设费用宏使用.f型源代码文件的扩展名。然而,某些编译器仅启用适用于适当命名文件的更新语言功能,例如Fortran 90功能仅适用于.f90文件,或仅使用预处理.F型文件或其他大写扩展名。另一方面而其他一些编译器则希望所有源文件都以.f型并需要特殊标志来支持其他文件扩展名。这个AC_FC_SRCEXT公司AC_FC_PP_SRCEXT公司宏处理这些问题。

这个AC_FC_SRCEXT公司宏试图获取常设费用编译器到接受以扩展名结尾的文件.提取(即。,提取包含点)。如果有任何特殊编译器这需要标志,它将它们存储在输出变量中FCFLAGS(飞行警告标志)_提取。然后使用此扩展和这些标志对于所有后续常设费用测试(直到AC_FC_SRCEXT语言AC_FC_PP_SRCEXT公司称为另一次)。

例如,您可以使用AC_FC_SRCEXT(f90)使用.f90型在未来的测试中扩展,它将设置FCFLAGS_f90型需要任何额外标志的输出变量编译这样的文件。

类似地AC_FC_PP_SRCEXT公司宏试图获取常设费用编译器预处理和编译带有扩展名的文件.提取。当两者同时存在时计划生育计划中央处理器风格提供预处理,前者优先,后者可能处理连续线,//代币和空白来自一些Fortran方言的期望。相反,如果你不想要预处理的文件,在文件中只使用小写字符名称扩展名。喜欢与AC_FC_SRCEXT(f90),任何需要的标志存储在FCFLAGS(飞行警告标志)_提取变量。

这个FCFLAGS(飞行警告标志)_提取旗帜可以全神贯注进入之内FCFLAGS(飞行警告标志)基于以下两个原因编译器。首先,只有一个FCFLAGS(飞行警告标志)_提取可以在时间,因此具有不同扩展名的文件必须单独编译。第二,功能标志_提取必须出现立即之前编译时的源代码文件名。所以,继续这个例子上面,您可以编译一个食品.f90使用命令:

foo.o:foo.f90$(FC)-c$(FCFLAGS)$(FCFLAGS_f90)“$(srcdir)/foo.f90”

如果AC_FC_SRCEXT公司AC_FC_PP_SRCEXT公司编译成功带有的文件提取分机,它调用行动-成功(默认为空)。如果它失败了,并且无法找到使常设费用编译器接受这样的文件,它调用操作-故障(默认情况下会退出并显示错误消息)。

这个AC_FC_SRCEXT公司AC_FC_PP_SRCEXT公司宏缓存其中的个结果ac _ cv _ fc_ srce文本_提取ac_cv_fc_pp_srcext(ac_cv _ fc_pp _强制文本)_提取变量。

宏:AC_FC_PP_定义 ([行动-成功],[操作-故障= ‘AC_MSG_故障'])

查找一个标志以指定预处理Fortran的定义。不是所有的Fortran编译器使用-D类.替代FC_定义具有结果和调用如果成功,则采取行动(默认为空)如果成功,并且操作-故障(默认为失败错误消息)。

此宏调用AC_FC_PP_SRCEXT([F])为了学习如何预处理aconftest公司。F类文件,但恢复以前使用的之后再次使用Fortran源文件扩展名。

此测试的结果缓存在ac_cv_fc_pp定义变量。

宏:AC_FC_FREFORM(交流_自由形式) ([行动-成功],[操作-故障= ‘AC_MSG_失败'])

尝试确保Fortran编译器(美元FC)允许自由格式源代码(与Fortran中较旧的固定格式样式相反77). 如有必要,它可以向FCFLAGS(飞行警告标志).

如果使用默认值.f型扩展,因为许多编译器将此扩展解释为指示固定格式源,除非提供了附加标志。如果你使用指定不同的扩展名AC_FC_SRCEXT公司,例如.f90型,然后AC_FC_FREFORM(交流_自由形式)通常没有成功修改FCFLAGS(飞行警告标志)。对于编译器没有知道吗AC_FC_SRCEXT语言宏可能允许然而,编译器默认采用Fortran 77。

如果AC_FC_FREFORM(交流_自由形式)成功编译了自由格式的源代码,它电话行动-成功(默认为空)。如果失败电话操作-故障(默认为退出时出错消息)。

测试结果,或“没有人'或'未知的',缓存在中这个ac_cv_fc_自由格式变量。

宏:AC_FC_FIXEDFORM(AC_FC_固定格式) ([行动-成功],[操作-故障= ‘AC_MSG_失败'])

尝试确保Fortran编译器(美元FC)允许老年人固定格式源代码(与自由格式风格相反)。如果必要时,它可能会向FCFLAGS(飞行警告标志).

某些编译器别名(如xlf95型默认情况下假设源代码是自由格式的使用具有扩展名的固定格式源.f90型有多少编译器默认解释为自由形式。如果指定不同的带有的扩展AC_FC_SRCEXT公司,例如.f型,然后AC_FC_FIXEDFORM(AC_FC_固定格式)通常不修改就成功了功能标志.

如果AC_FC_FIXEDFORM(AC_FC_固定格式)成功编译了固定格式的源代码,它电话行动-成功(默认为空)。如果失败电话操作-故障(默认为出现错误而退出消息)。

测试结果,或“没有人'或'未知的',缓存在中这个ac_cv固定格式变量。

宏:AC_FC_LINE_长度 ([长度],[行动-成功],[操作-故障= ‘AC_MSG_故障'])

尝试确保Fortran编译器($FC美元)接受长源代码行。这个长度参数可以是80、132或无限制,默认为132。请注意,线路长度超过250列是不可移植的,有些编译器不接受超过132个列(至少用于固定格式源)。如有必要,可以添加一些附加标志到FCFLAGS(飞行警告标志).

如果AC_FC_LINE_长度成功编译了固定格式的源代码,它电话行动-成功(默认为空)。如果失败电话操作-故障(默认为退出时出错消息)。

测试结果,或“没有人'或'未知的',缓存在这个ac_cv_fc_line_长度变量。

宏:AC_FC_CHECK_BOUNDS(空调_检查_车身) ([行动-成功],[操作-故障= ‘AC_MSG_故障'])

这个AC_FC_CHECK_BOUNDS(AC_FC_CHECK_BOUNDS)宏尝试启用数组边界检查在Fortran编译器中。如果成功行动-成功调用并将任何所需的标志添加到FCFLAGS(飞行警告标志)。否则,操作-故障被调用,默认为失败并出现错误消息。宏当前需要Fortran 90或更新的方言。

宏的结果缓存在ac_cv_fc_check边界变量。

宏:AC_F77_强制_无 ([行动-成功],[操作-故障= ‘AC_MSG_故障'])
宏:AC_FC_隐含_无 ([行动-成功],[操作-故障= ‘AC_MSG_故障'])

尝试在Fortran编译器中禁止隐式声明。如果成功,行动-成功被调用,以及任何需要的标志已添加到FFLAGS公司FCFLAGS(飞行警告标志)分别是。否则,操作-故障被调用,默认为失败并出现错误消息。

这些宏的结果缓存在ac _ cv _ f77 _导入_无ac _ cv _ fc_隐式_无变量。

宏:AC_FC_模块_延伸

查找Fortran 90模块的文件扩展名。大多数Fortran 90编译器将模块信息存储在独立于对象的文件中文件夹。模块文件通常以模块名称命名而不是源文件名,字符可能会变成大写,加上一个扩展,通常.mod(修改).

并非所有编译器都使用模块文件,或者默认情况下使用模块文件。克雷Fortran编译器需要-电子显微镜为了存储和搜索中的模块信息.mod(修改)文件而不是在对象文件中。同样,Fujitsu Fortran编译器使用-美国选择指示如何存储模块信息。

这个AC_FC_模块_延伸宏计算模块扩展没有前导点,并将其存储在FC_模式变量。如果编译器不生成模块文件,或无法确定扩展,FC_模式为空。通常,此宏的结果可以用于清理制作规则为跟随:

清洁模块:-test-z“$(FC_MODEXT)”||rm-f*$(FC_MODEXT)

扩展名,或“未知的',缓存在ac_cv _ fc_模块_文本变量。

宏:AC_FC_MODULE_FLAG(空调_模块_故障) ([如果成功,则采取行动],[操作-故障= ‘AC_MSG_故障'])

查找包含Fortran 90模块信息的编译器标志另一个目录,并将其存储在FC_MODINC公司变量。呼叫如果成功,则采取行动(默认为空)如果成功,并且设置FC_MODINC公司清空并呼叫操作-故障(默认值退出并显示错误消息)。

大多数Fortran 90编译器都提供了指定模块目录的方法。一些具有单独的标记,用于将模块文件写入到的目录,和目录中进行搜索,而其他目录只允许写入当前目录或包含中指定的第一个目录路径。此外,对于一些编译器,模块搜索路径和只能使用相同的标志修改预处理器搜索路径。因此,为了便于移植,只将模块文件写入当前目录,并将其作为搜索路径中的第一个目录列出。

之间可能没有空格FC_MODINC公司以及以下内容目录名,但FC_MODINC公司可能包含尾随空格。例如,如果您使用Automake并希望搜索../lib(库)对于模块文件,可以使用以下命令:

AM_FCFLAGS=$(FC_MODINC)$(FC_MODINC)/图书馆

内部配置测试,您可以使用:

如果测试-n“$FC_MODINC”;然后FCFLAGS=“$FCFLAGS$FC_MODINC.$FC_MODINC../lib”fi(菲涅耳)

标志缓存在ac_cv_fc_module模块滞后变量。的替代值FC_MODINC公司可以参考空(_E)虚拟占位符为空变量,以避免丢失中的重要尾随空白生成文件.

宏:AC_FC_MODULE_OUTPUT_FLAG(AC_FC_MODULE_OUTPUT_FLAG) ([行动-成功],[操作-故障= ‘AC_MSG_故障'])

查找要将Fortran 90模块信息写入的编译器标志另一个目录,并将其存储在FC_输出变量。呼叫行动-成功(默认为空)如果成功,并且设置FC_输出清空并呼叫操作-故障(默认值退出并显示错误消息)。

并非所有Fortran 90编译器都编写模块文件,并非所有目录都允许写入当前目录以外的目录,也不是都有单独的写和读标志吗;参见说明属于AC_FC_MODULE_FLAG(空调_模块_故障)以上。如果您需要能够写信给另一个目录,用于最大限度地使用可移植性FC_输出之前任何FC_MODINC公司并包括当前目录和在搜索路径中写入:

AM_FCFLAGS=$(FC_MODOUT)/mod$(FC_MODINC)/mod$(FC_MODINC)…

标志缓存在ac_cv_fc_module输出延迟变量。的替代值FC_输出可以参考空(_E)虚拟占位符为空变量,以避免丢失中的重要尾随空白生成文件.

宏:AC_F77_射线指示器 ([行动-成功],[操作-故障= ‘AC_MSG_故障'])
宏:AC_FC_CRAY_指针 ([行动-成功],[操作-故障= ‘AC_MSG_故障'])

尝试确保Fortran编译器(F77美元美元FC)接受Cray指针。如果成功行动-成功调用并将任何所需的标志添加到FFLAGS公司FCFLAGS(飞行警告标志)。否则,操作-故障被称为,其中默认为失败并显示错误消息。

Cray指针是许多Fortran支持的非标准扩展允许将整数声明为类C指针的编译器目标变量。

测试结果,或“没有人'或'未知的',缓存在中这个空调_f77_光线_ptr交流断路器变量。