glmark2代码分析1(构建方式)

glmark2代码分析

glmark2是一个GPU测试bench,来自glcompbench,早前的版本glmark1是用makefile构建的。

构建方式

glmark2的构建使用的是waf

waf介绍

Waf的构建文件是wscript。wscript中一个project一般包含6个步骤构成:
configure:
build: transform the source files into build files
install
uninstall
dist: 源文件打包
clean: remove the build files
每一个步骤在wscript文件中定义成一个python函数,后台会把这几个函数作为参数实例化一个 waflib.Context.Context。每个步骤的定义模板如下:

def configure(conf):
        print("configure!")

def build(bld):
        print("build!")

使用的时候要下载waf,放到根目录下,按照过程执行:

$ cd /tmp/myproject
$ wget https://waf.io/waf-2.0.0
$ python ./waf-2.0.0 configure build
configure!
build!

waf编译中主要是def build(bld),调用bld函数创建一个task generator对象,创建tasks。waf先读取所有的bld,判断文件和target的依赖顺序,然后再按照bld的顺序执行其中的rule。rule是生成target时需要执行的命令。

def build(bld):
        tg = bld(rule='cp ${SRC} ${TGT}', source='wscript', target='foo.txt')
        bld(rule='cp ${SRC} ${TGT}', source='foo.txt', target='bar.txt')

默认的一些语言不用指定rule,指定编译器,waf tool会调用对应的方法,同时可以为指定相关的编译参数。

def options(opt):
        opt.load('compiler_c compiler_cxx')
def configure(cnf):
        cnf.load('compiler_c compiler_cxx')
        cnf.check(features='cxx cxxprogram', lib=['m'], cflags=['-Wall'], defines=['var=foo'], uselib_store='M')
def build(bld):
        bld(features='c cshlib', source='b.c', target='mylib')
        bld(features='c cxx cxxprogram', source='a.c main.cpp', target='app', use=['M','mylib'], lib=['dl'])

相当于定义了下面的三个变量:

conf.env.LIB_M = ['m']
conf.env.CFLAGS_M = ['-Wall']
conf.env.DEFINES_M = ['var=foo']

内置变量的引用用“${}”

def build(bld):
        bld.env.MESSAGE = 'Hello, world!'
        bld(rule='echo ${MESSAGE}', always=True)

调用子目录的waf脚本:

def build(bld):
        bld.recurse('src')

Waf的核心是13个module构成,其流程图如下:

Scripting
Configure
Build
Options
Context
Node
Utils
Runner
Task
TaskGen
ConfigSet
Logs
Errors

使用waf的主要函数和特性有:
feature: 指定编译器
configure:包含一些method设置功用参数和配置的方法
build:bld方法中一些参数配置的方法

glmark2 waf

编译方法:
$ ./waf configure --with-flavors=<drm-gl,drm-glesv2,mir-gl,mir-glesv2,wayland-gl,wayland-glesv2,x11-gl,x11-glesv2> [--data-path=DATA_PATH --prefix=PREFIX]
$ ./waf
$ ./waf install --destdir=DESTDIR
顶层wscript文件

编译文件为顶层wscript文件,流程如下:

  • def options(opt):
  1. 配置编译器:
     opt.load('gnu_dirs')  使用标准的gnu库路径
    opt.load('compiler_c')
    opt.load('compiler_cxx')
  1. add_option添加编译配置参数,包括:
    –with-flavors:配置编译的操作系统平台 + api版本gl/es2 + 窗口系统drm/wayland/dispmanx/mir
    –version-suffix:添加版本后缀
    –no-debug:disable compiler debug information’
    –no-opt:disable compiler optimizations
    –data-path:path to main data (also see --data(root)dir)
    –extras-path:path to additional data (models, shaders, textures)
  • def configure(ctx):
  1. 解析flavors参数,区分linux和win,两者只能一个不同能同时存在。
    flavors用键值对保存,
FLAVORS = {
    'dispmanx-glesv2' : 'glmark2-es2-dispmanx',
    'drm-gl' : 'glmark2-drm',
    'drm-glesv2' : 'glmark2-es2-drm',
    'mir-gl' : 'glmark2-mir',
    'mir-glesv2' : 'glmark2-es2-mir',
    'wayland-gl' : 'glmark2-wayland',
    'wayland-glesv2' : 'glmark2-es2-wayland',
    'win32-gl': 'glmark2-win32',
    'win32-glesv2': 'glmark2-es2',
    'x11-gl' : 'glmark2',
    'x11-glesv2' : 'glmark2-es2',
}

生成FLAVOR_%s的环境变量参数,后面的build中根据这个flavor取对应的库、源文件、头文件、defines、依赖等配置。这些配置也是用键值对定义好数组。

  ctx.env["FLAVOR_%s" % flavor.upper().replace('-','_')] = FLAVORS[flavor]
  for name in bld.env.keys():
    if name.startswith('FLAVOR_') and bld.env[name]:
        flavor = name.replace('FLAVOR_', '').lower().replace('_', '-')
        egl_platform = flavor.split('-')[0]
        target = bld.env[name]
        node = bld(
            features     = ['cxx', 'cprogram'],
            source       = flavor_sources[flavor],
            target       = target,
            use          = platform_uselibs + flavor_uselibs[flavor],
            lib          = platform_libs + flavor_libs[flavor],
            includes     = ['.'] + platform_includes,
            defines      = common_defines + flavor_defines[flavor] +
                           egl_platform_defines[egl_platform],
            depends_on   = flavor_depends_on[flavor]
            )
        if flavor_sources_gen[flavor]:
            node.source.extend(flavor_sources_gen[flavor])
        all_uselibs |= set(flavor_uselibs[flavor] + platform_uselibs)
  1. load前面的配置:
  ctx.load('gnu_dirs')
   ctx.load('compiler_c')
   ctx.load('compiler_cxx')

根据是win还是linux进行配置

if is_win:
    configure_win32(ctx)
else:
    configure_linux(ctx)
  1. 添加定义versionsuffix和信息打印,这些打印在运行 waf configure 时打印出来。
  • def configure_linux(ctx):
    用 check_cc 和 check_cfg 查找依赖库和头文件和编译参数CXXFLAGS和资源路径宏,包含标准头文件和库、gl相关库、flovar中指定的驱动库、libjpeg和libpng。

  • def build(ctx):
    调用子目录的wscript_build

ctx.recurse('src')
ctx.recurse('data')
ctx.recurse('doc')
  • class Glmark2Dist(Context.Context):
    定义 waf dist 命令,将根目录下的源文件和资源文件打包成一个压缩包,名为glmark2-2020.04.tar.gz。不包含的文件:
    excludes = [’.bzr’, '.git’, ‘~’, ‘./.waf’, './build’, ‘.swp’, '.pyc’, ‘glmark2-.tar.gz’]
    压缩方法,使用python tarfile
      def archive(self):
        import tarfile
        tar = tarfile.open(APPNAME + '-' + VERSION + '.tar.gz', 'w:gz')
        for f in self.get_files():
            tar.add(f, arcname = APPNAME + '-' + VERSION + '/' + f, recursive = False)
        tar.close()
src下wscript_build

src下wscript_build的流程如下:

  • 获取所有源文件all_sources,对源文件进行分类:
    common_sources:非平台相关的代码,src目录下的cpp,scene-ideas下的cc文件 和 scene-terrain下的cc文件。不包含以下前缀的文件:canvas-、android、native-state-、gl-state-、main.cpp。
    libmatrix_sources:libmatrix/*.cc不含test目录下文件
    common_flavor_sources:‘main.cpp’, ‘canvas-generic.cpp’
    libpng_local_sources:libpng目录下的c文件
    zlib_local_sources = zlib目录下的c文件
    libjpeg_turbo_local_sources:libjpeg-turbo目录下的c文件
  • 判断是不是win32和msvc环境,win32使用的platform_uselibs和platform_libs为local的,主要是png、jpeg和z库。
  • 如果是WAYLAND_SCANNER_wayland_scanner,要在系统指定pkg目录下扫描生成xdg-shell-client-protocol.h和xdg-shell-protocol.c文件
  • 按照flavor参数设置flavor_sources、flavor_uselibs、flavor_defines、flavor_libs、flavor_depends_on、flavor_sources_gen、egl_platform_defines,都是定义成list组
  • 根据flavor名称,创建bld,生成target
for name in bld.env.keys():
    if name.startswith('FLAVOR_') and bld.env[name]:
        flavor = name.replace('FLAVOR_', '').lower().replace('_', '-')
        egl_platform = flavor.split('-')[0]
        target = bld.env[name]
        node = bld(
            features     = ['cxx', 'cprogram'],
            source       = flavor_sources[flavor],
            target       = target,
            use          = platform_uselibs + flavor_uselibs[flavor],
            lib          = platform_libs + flavor_libs[flavor],
            includes     = ['.'] + platform_includes,
            defines      = common_defines + flavor_defines[flavor] +
                           egl_platform_defines[egl_platform],
            depends_on   = flavor_depends_on[flavor]
            )
        if flavor_sources_gen[flavor]:
            node.source.extend(flavor_sources_gen[flavor])
        all_uselibs |= set(flavor_uselibs[flavor] + platform_uselibs)
        
for egl_target in (v for v in all_uselibs if v.startswith('glad-egl')):
    egl_platform = egl_target.split('-')[2]
    bld(
        features = ['c'],
        source   = ['glad/src/egl.c'],
        target   = egl_target,
        includes = ['glad/include'],
        export_includes = 'glad/include',
        defines = egl_platform_defines[egl_platform]
        )
  • 后面判断all_uselibs里如果包含下面的库,创建相关的依赖库的生成命令bld:
    glad-glx/gl/wgl/glesv2
    matrix-gl/glesv2
    libpng-local
    zlib-local
    libjpeg-turbo-local
    common-gl
    common-glesv2
  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要安装和使用glmark2,您可以按照以下步骤进行操作: 1. 安装所需的开发工具和程序库。您可以使用以下命令安装所需的依赖项: ``` apt-get -y install git g++ build-essential pkg-config apt-get -y install libx11-dev libgl1-mesa-dev apt-get -y install libjpeg-dev libpng-dev ``` 2. 获取glmark2源代码。您可以使用以下命令将源代码克隆到当前目录: ``` git clone https://github.com/glmark2/glmark2.git glmark2-test ``` 3. 编译glmark2。进入glmark2-test目录,并执行以下命令: ``` cd glmark2-test ./waf configure --with-flavors=x11-gl --prefix=/opt/glmark2 --data-path=/opt/glmark2/data ./waf build -j 4 ``` 4. 安装glmark2。执行以下命令将编译好的文件安装到Release目录: ``` ./waf install --destdir=$PWD/Release ``` 5. 安装glmark2。执行以下命令将安装glmark2: ``` cp -RP ./Release/opt / ``` 6. 运行glmark2。您可以使用以下命令运行glmark2: ``` /opt/glmark2/bin/glmark2 ``` 请注意,这些步骤是在Linux环境下进行的。如果您在其他操作系统上使用glmark2,可能需要进行适当的调整。引用\[1\]提供了详细的安装和运行glmark2的步骤,引用\[2\]提供了在Linux X86虚拟机环境上安装glmark2的示例,引用\[3\]提供了不同的FLAVORS选项,您可以根据需要选择适合您的环境的选项。 #### 引用[.reference_title] - *1* [Ubuntu使用Glmark2进行跑分](https://blog.csdn.net/YV_LING/article/details/127711198)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [glmark2 GPU 跑分工具移植到arm实机上运行](https://blog.csdn.net/u010312436/article/details/105950919)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值