编译测试程序

相关人员在设计测试框架时考虑到了可移植性。仅有的强制性要求是针对 I/O、线程和套接字的全面 C++ 支持和标准系统库。

CMake 编译系统

deqp 来源具有适用于 CMake 的编译脚本,这是编译测试程序的首选工具。

CMake 是一个开放源代码编译系统,支持多种平台和工具链。CMake 从与目标无关的配置文件生成原生 Makefile 或 IDE 项目文件。要详细了解 CMake,请参阅 CMake 文档。

CMake 支持且建议在源代码树之外进行编译,也就是说,您应该始终在源代码树之外的独立编译目录中创建 Makefile 或项目文件。CMake 没有任何类型的“distclean”目标,因此,您必须手动移除 CMake 生成的所有文件。

您可以使用 -DOPTION_NAME=VALUE 语法为 CMake 提供配置选项。deqp 的一些常用选项如下所示。

配置选项 说明
DEQP_TARGET

目标名称,例如“android”

deqp CMake 脚本将包含文件 targets/DEQP_TARGET/DEQP_TARGET.cmake,而且在此文件中应该可以找到针对特定目标的编译选项。

CMAKE_TOOLCHAIN_FILE

CMake 的工具链文件路径。用于交叉编译。

CMAKE_BUILD_TYPE

Makefile 目标的编译类型。有效值为“Debug”和“Release”

注意,解释和默认类型取决于目标编译系统。如需了解详情,请参阅 CMake 文档。

创建目标编译文件

针对新目标的 deqp 编译系统使用目标编译文件进行配置。目标编译文件可定义平台支持哪些功能以及需要哪些库或其他包含路径。目标文件名采用 targets/NAME/NAME.cmake 格式,并且目标是使用 DEQP_TARGET 编译参数选择的。

目标文件中的文件路径是相对于基本 deqp 目录(而非 targets/NAME 目录)的路径。目标编译文件可以设置以下标准变量。

变量 说明
DEQP_TARGET_NAME

目标名称(将包含在测试日志中)

DEQP_SUPPORT_GLES2

是否支持 GLES2(默认值:OFF)

DEQP_GLES2_LIBRARIES

GLES2 库(如果不受支持或使用的是动态加载,则留空)

DEQP_SUPPORT_GLES3

是否支持 GLES3.x(默认值:OFF)

DEQP_GLES3_LIBRARIES

GLES3.x 库(如果不受支持或使用的是动态加载,则留空)

DEQP_SUPPORT_VG

是否支持 OpenVG(默认值:OFF)

DEQP_OPENVG_LIBRARIES

OpenVG 库(如果不受支持或使用的是动态加载,则留空)

DEQP_SUPPORT_EGL

是否支持 EGL(默认值:OFF)

DEQP_EGL_LIBRARIES

EGL 库(如果不受支持或使用的是动态加载,则留空)

DEQP_PLATFORM_LIBRARIES

进行链接所需的特定于平台的附加库

DEQP_PLATFORM_COPY_LIBRARIES

复制到每个测试二进制文件编译目录的库列表。可用于复制运行测试所需但不在默认搜索路径中的库。

TCUTIL_PLATFORM_SRCS

平台端口来源列表。默认来源取决于功能和操作系统。

注意:路径是相对于 framework/platform 的路径

目标编译文件可以使用 include_directories()link_directories() CMake 函数添加其他包含或链接路径。

Win32 编译

为 Windows 编译 deqp 模块最简单的方法是使用 CMake 编译系统。您需要使用 CMake 2.6.12 或更高版本以及 Microsoft Visual C/C++ 编译器。deqp 已通过 Visual Studio 2013 测试。

可以使用以下命令生成 Visual Studio 项目文件:

cmake path\to\src\deqp -G "Visual Studio 12"

选择“Visual Studio VERSION Win64”作为编译生成器可制作 64 位版本:

cmake path\to\src\deqp -G "Visual Studio 12 Win64"

您还可以通过 -G "NMake Makefiles" 选项和编译类型(-DCMAKE_BUILD_TYPE="Debug""Release")生成 NMake Makefile。

渲染上下文的创建

渲染上下文可通过 WGL 或 Windows 上的 EGL 进行创建。

WGL 支持

所有 Win32 二进制文件都支持使用 WGL 创建 GL 上下文,因为它只需要标准库。使用 --deqp-gl-context-type=wgl 命令行参数可选择 WGL 上下文。在 WGL 模式下,deqp 使用 WGL_EXT_create_context_es_profile 扩展程序创建 OpenGL ES 上下文。经过测试,该程序可与 NVIDIA 和 Intel 的最新驱动程序配合使用。AMD 驱动程序不支持所需的扩展程序。

EGL 支持

如果 DEQP_SUPPORT_EGL 的状态为“ON”(这是大多数目标中的默认状态),则通过动态加载为 Windows 上的 EGL 构建 deqp。接下来,如果主机有可用的 EGL 库,则可以通过命令行参数 --deqp-gl-context-type=egl 对其运行测试。

Android 编译

Android 编译使用 CMake 编译脚本来编译原生测试代码。Java 部分(即测试执行服务器和测试应用存根)使用标准的 Android 编译工具进行编译。

要使用提供的编译脚本编译 Android 的 deqp 测试程序,您需要:

  • 最新版本的 Android NDKandroid/scripts/common.py 文件中列出了所需的版本
  • Android 独立 SDK(已安装 API 13、SDK 工具、SDK 平台工具和 SDK 编译工具软件包
  • Apache Ant 1.9.4(Java 代码编译所需)
  • CMake 2.8.12 或更高版本
  • Python 2.6 或更高版本(2.x 系列);不支持 Python 3.x
  • 对于 Windows:PATH 中的 NMake 或 JOM
    • JOM 的编译速度更快
  • 可选:Linux 上还支持 Ninja make

Ant 和 SDK 二进制文件的位置取决于具有特定覆盖默认值的 PATH 环境变量。具体逻辑由 android/scripts/common.py 控制。

NDK 目录必须为 ~/android-ndk-VERSIONC:/android/android-ndk-VERSION,或者通过 ANDROID_NDK_PATH 环境变量进行定义。

Deqp 设备组件、测试执行服务和测试程序都是通过执行 android/scripts/build.py 脚本进行编译的。最终 .apk 在 android/package/bin 中创建,并可通过 install.py 脚本进行安装。如果使用命令行执行程序,则可以在设备上通过 ADB 使用 launch.py 脚本启动 ExecService。可以从任何目录执行这些脚本。

Linux 编译

通过使用 CMake 生成 Makefile,可以编译适用于 Linux 的测试二进制文件和命令行实用工具。其中有多个预定义的编译目标对 Linux 编译很有帮助。

编译目标 说明
default

默认目标;使用 CMake 平台自省来确定是否支持各种 API。

x11_glx

使用 GLX 创建 OpenGL (ES) 上下文。

x11_egl

使用 EGL 创建 OpenGL (ES) 上下文。

x11_egl_glx

同时支持带有 X11 的 GLX 和 EGL。

始终使用 -DCMAKE_BUILD_TYPE=<Debug|Release> 来定义编译类型。Release 是一个很实用的默认值。如果没有该值,则默认创建未优化的编译版本。

-DCMAKE_C_FLAGS-DCMAKE_CXX_FLAGS 命令行参数可用于将额外的参数传递给编译器。例如,可以通过分别设置 -DCMAKE_C(XX)_FLAGS="-m32""-m64" 来实现 32 位 或 64 位编译。如果未指定,则使用工具链原生架构(通常会为 64 位工具链生成 64 位版本)。

-DCMAKE_LIBRARY_PATH-DCMAKE_INCLUDE_PATH 参数可用于 CMake,为 CMake 提供额外的库或包含搜索路径。

用于针对自定义位置中的驱动程序头文件和库执行 32 位调试编译的完整命令行示例如下:

cmake <path to src>/deqp -DDEQP_TARGET=x11_egl -DCMAKE_C_FLAGS="-m32"
-DCMAKE_CXX_FLAGS="-m32" -DCMAKE_BUILD_TYPE=Debug
-DCMAKE_LIBRARY_PATH="PATH_TO_DRIVER/lib"
-DCMAKE_INCLUDE_PATH="PATH_TO_DRIVER/inc"
make -j4

交叉编译

使用 CMake 工具链文件可实现交叉编译。工具链文件可指定要使用的编译器,以及用于库和标头的自定义搜索路径。一些适用于常见场景的工具链文件包含在 framework/delibs/cmake 目录下的发布包中。

除了标准的 CMake 变量之外,工具链文件还可以设置以下特定于 deqp 的变量。CMake 通常可以正确检测 DE_OSDE_COMPILERDE_PTR_SIZE,但 DE_CPU 必须由工具链文件设置。

变量 说明
DE_OS

操作系统。支持的值包括:DE_OS_WIN32, DE_OS_UNIX, DE_OS_WINCE, DE_OS_OSX, DE_OS_ANDROID, DE_OS_SYMBIAN, DE_OS_IOS

DE_COMPILER

编译器类型。支持的值包括:DE_COMPILER_GCC, DE_COMPILER_MSC, DE_COMPILER_CLANG

DE_CPU

CPU 类型。支持的值包括:DE_CPU_ARM, DE_CPU_X86

DE_PTR_SIZE

平台上的 sizeof(void*)。支持的值包括:4 和 8

使用 CMAKE_TOOLCHAIN_FILE 编译参数可选择工具链文件。例如,以下代码将使用适用于 ARM/Linux 的 CodeSourcery 交叉编译器为编译创建 Makefile:

cmake PATH_TO_SRC/deqp –DDEQP_BUILD_TYPE="Release"
–DCMAKE_TOOLCHAIN_FILE=PATH_TO_SRC/delibs/cmake/toolchain-arm-cs.cmake
–DARM_CC_BASE=PATH_TO_CC_DIRECTORY

GLES 和 EGL 库的运行时链接

deqp 在链接时期间不需要正在测试的 API 接入点。测试代码始终通过函数指针访问 API。这样接入点便可以在运行时动态加载,或者平台端口也可以在链接时提供接入点。

如果在编译设置中启用了对 API 的支持且未提供链接库,则 deqp 将在运行时加载所需的接入点。如果需要使用静态链接,请在 DEQP_<API>_LIBRARIES 编译配置变量中提供所需的链接库。