Next: , Previous: profopt Testing, Up: Testsuites


7.9 对二进制兼容性测试的支持

文件compat.exp提供了对二进制兼容性测试的语言无关的支持。 它支持测试遵循相同ABI的两个编译器,或者编译器选项的多个集合, 在一起工作时不影响二进制兼容性。它是打算用来补充ABI测试包的。

该框架支持的测试具有三部分,分别在不同的源文件中:主程序, 和两个相互作用来拆分要测试的功能的部分。

testname_main.suffix
包含了主程序,其调用了文件testname_x.suffix中的函数。
testname_x.suffix
包含了至少一个对testname_y.suffix中的函数的调用。
testname_y.suffix
testname_x.suffix共享数据,或者从中获得参数。

每个测试中,主程序和一个功能部分由测试GCC编译。 另一部分可以由一个候选编译器来编译。如果没有指定候选编译器, 则所有的这三个源文件都由测试 GCC编译。你可以指定一个编译器选项对。 每一对中第一个元素指定了测试GCC使用的选项,第二个元素用于候选编译器。 每个测试都是用这些选项来编译。

compat.exp定义了缺省的一对编译器选项。 这些可以通过定义环境变量COMPAT_OPTIONS来取代,如:

     COMPAT_OPTIONS="[list [list {tst1} {alt1}]
       ...[list {tstn} {altn}]]"

其中tstialti是选项列表,要测试的编译器使用tsti, 候选的编译器使用alti。例如, 对于[list [list {-g -O0} {-O3}] [list {-fpic} {-fPIC -O2}]], 测试会首先被要测试的编译器使用-g -O0来编译, 并且被候选编译器使用-O3来编译。测试在第二次的时候, 测试编译器会使用-fpic,候选编译器会使用-fPIC -O2

候选编译器通过将环境变量定义为安装的编译的全路径名来指定;对于C, 定义ALT_CC_UNDER_TEST,对于C++,定义ALT_CXX_UNDER_TEST。 这些将被写入DejaGnu使用的site.exp文件中。缺省情况,是由要测试的编译器, 使用COMPAT_OPTIONS中每个编译选项对的第一个,来构建每个测试。 当ALT_CC_UNDER_TESTALT_CXX_UNDER_TESTsame时, 每个测试将使用测试编译来构建,但是使用COMPAT_OPTIONS中的选项组合。

若要对要测试的编译器和另一版本的使用指定编译选项的GCC, 只运行C++兼容性测试包,则在objdir/gcc下执行下列命令:

     rm site.exp
     make -k \
       ALT_CXX_UNDER_TEST=${alt_prefix}/bin/g++ \
       COMPAT_OPTIONS="lists as shown above" \
       check-c++ \
       RUNTESTFLAGS="compat.exp"

如果一个测试当源文件由不同编译器编译的时候执行失败, 而当文件由同一编译器编译的时候执行成功,则表明生成代码或运行时支持不兼容。 如果一个测试对于候选编译器执行失败,但对于测试编译器却执行成功, 则可能是因为一个bug在测试编译器中已经被修改好,但还存在于候选编译器中。

二进制兼容性测试支持少数在测试文件的注释中出现的测试框架命令。

dg-require-*
这些命令可以用于testname_main.suffix中, 使得当目标机上没有特定支持的时候跳过测试。
dg-options
指定选项用于编译该特定的源文件,将选项添加到COMPAT_OPTIONS中。 当该命令出现在testname_main.suffix中时, 选项还用于链接测试程序的时候。
dg-xfail-if
该命令可以用在第二个源文件中,来指定在特定目标机上对于特定选项,编译将会失败。