6.6检查运行时行为

有时您需要了解系统在运行时的性能,例如比如一个给定的函数是否有某种功能或缺陷。如果你可以在程序运行时而不是运行时进行此类检查已配置。您的程序会自行初始化。

如果在配置时确实需要测试运行时行为,您可以编写一个测试程序来确定结果,然后编译和使用运行它AC_RUN_IFELSE公司。如果出现以下情况,请避免运行测试程序可能,因为这会阻止人们配置您的包交叉编译。

宏:AC_RUN_IFELSE公司 (输入,[行动-如果是真的],[操作-if-false],[action-if-交叉编译= ‘AC_MSG_故障])

运行编译器(和编译标志)和当前语言(请参见语言选择)在上输入,然后执行结果程序。如果程序返回退出执行时状态为0,运行shell命令行动-如果是真的.否则,运行shell命令操作-if-false.

如果输入非空使用等效于交流频率(输入)生成当前测试源文件;否则,重用已经存在的测试源文件。这个输入可以由AC_范围_程序和朋友。这个输入文本展开为未引用的here-document,因此$’, ‘`“还有一些”\的应该是反斜杠。请参见此处-文档.

ld标志伦敦银行同业拆借利率用于链接,除了当前语言的编译标志(请参见语言选择).此外,行动-如果是真的可以运行./conftest$EXEXT用于进一步测试。

操作-if-false部分,失败退出状态为在shell变量中可用'$?’. 此退出状态可能是编译失败,或者可能是程序失败执行。

如果启用交叉编译模式(如果正在使用的编译器不会生成在系统上运行的可执行文件哪里配置正在运行,或者如果选项--建造--主机均已指定,且其值不同),那么测试程序是没有运行。如果可选的shell命令action-if-交叉编译如果给定,则运行这些命令;通常这些命令提供悲观的默认值,甚至允许交叉编译如果猜测是错的。如果第四个参数为空或省略,但检测到交叉编译,然后配置打印错误消息并退出。如果您希望您的包在交叉编译场景,您应该提供非空action-if-交叉编译子句,以及包装AC_RUN_IFELSE公司内部编译AC_CACHE_检查(请参见缓存结果)它允许用户覆盖悲观默认(如果需要)。

通常报告意外故障AC_MSG_故障.

自动配置文件创建时打印警告消息配置每次遇到呼叫AC_RUN_IFELSE公司没有action-if-交叉编译论点鉴于。如果您不关心用户配置包对于交叉编译,您可以忽略该警告。一些宏与Autoconf一起发布会产生此警告消息;但如果这是一个对于您的问题,请将其报告为错误,并附上适当的用悲观的猜测代替。

要配置交叉编译,您还可以为基于规范系统名称的参数(请参见手动配置). 或者,使用设置测试结果缓存文件主机系统的正确值(请参阅缓存结果).

为的调用提供默认值AC_RUN_IFELSE公司嵌入的在其他宏中,包括Autoconf附带的一些宏,您可以测试shell变量交叉编译设置为',然后使用其他方法获取结果调用宏。

也允许临时分配给交叉编译为了强制测试像在交叉编译环境,特别是因为这提供了一种方法测试您的action-if-交叉编译即使您不使用交叉编译器。

#我们暂时设置交叉编译模式以强制AC_COMPUTE_INT#使用慢链接方法save_cross_compiling=$交叉编译交叉编译=是AC_COMPUTE_INT([…])交叉编译=$save_cross_compiling

C或C++运行时测试应该是可移植的。请参见便携式C和C++编程.

Erlang测试必须通过调用暂停/1函数:给定的状态代码用于确定测试是否成功(状态为0)或其故障(状态不同于0),作为如上所述。必须注意,数据输出通过标准输出(例如,使用io:格式/2)停止VM时可能会被截断。因此,如果测试必须输出配置信息,建议创建数据并将其输出到名为确认输出,使用模块的功能文件. Theconftest.out公司文件是由自动删除AC_RUN_IFELSE公司宏。例如Autoconf的简化实现AC_ERLANG_SUBST_LIB_DIR公司宏是:

AC_INIT([LibdirTest],[1.0][bug-libdirtest@example.org])AC_ERLANG_NEED_ERL公司AC_LANG(二郎)AC_RUN_IFELSE公司([AC_LANG_PROGRAM([],[dnl文件:write_file(“conftest.out”,代码:lib_dir()),停止(0)])],[echo“code:lib_dir()返回:`cat conftest.out`”],[AC_MSG_FAILURE([测试Erlang程序执行失败])]