关于kylin系统鲲鹏芯片编译qt5.9.9源码中fontconfig包的处理

时间:2021-08-01 01:17:16


软件适配,需要qt最小版本是5.9.9,但是鲲鹏机器上qt最大版本是5.6.1,需要在鲲鹏机器上使用源码编译安装5.9.9

鲲鹏机器信息

arch=arm64
milestone=V10-Release-Build1-20200710

问题

在编译webengine模块时,系统中安装了已经安装了fontconfig,但是就是找不到,各种方法都尝试了,仍无法解决,决定从qt源码来看看究竟有什么猫腻。

定位问题报错处

编译webengine时,报错Unmet dependency: fontconfig,找到改报错出处,在文件.\qtwebengine\mkspecs\features\configure.prf中74行,找到了相关上下文,内容如下:

...
        REQUIRED_PACKAGES = dbus-1 fontconfig
        !contains(WEBENGINE_CONFIG, embedded_build): qtConfig(xcb): REQUIRED_PACKAGES += libdrm xcomposite xcursor xi xrandr xtst
        qtConfig(pulseaudio): REQUIRED_PACKAGES += libpulse
        qtConfig(system-png): REQUIRED_PACKAGES += libpng
        qtConfig(system-harfbuzz) {
             packagesExist("\'harfbuzz >= 1.2.0\'"): WEBENGINE_CONFIG += use_system_harfbuzz
             else: log("System harfbuzz is too old (min. version 1.2). Using Chromium's copy.$${EOL}")
        }
        qtConfig(glib) {
             packagesExist("\'glib-2.0 >= 2.32.0\'"): WEBENGINE_CONFIG += use_glib
        }

        for(package, $$list($$REQUIRED_PACKAGES)) {
            !packagesExist($$package):skipBuild("Unmet dependency: $$package")
        }
...

可以看到,判断包是否存在是packagesExist函数,下面来看packagesExist函数是如何实现的

packagesExist实现

.\qtbase\mkspecs\features\qt_functions.prf文件中实现如下:

defineTest(packagesExist) {
    # this can't be done in global scope here because qt_functions is loaded
    # before the .pro is parsed, so if the .pro set PKG_CONFIG, we wouldn't know it
    # yet. oops.
    pkg_config = $$pkgConfigExecutable()

    for(package, ARGS) {
        !system($$pkg_config --exists $$package):return(false)
    }

    return(true)
}

defineTest是qmake的内建函数,其介绍可以参考qmake language 内建函数 内置函数 自定义函数 defineTest(testfunctionname) defineReplace(repacefunctionname)

通过packagesExist的定义可以看到,检查软件包使用pkg-config--exists来实现,所以,我们在系统外的命令行中使用该命令来查看一下是否能找到fontconfig软件包。

执行:

root@DESKTOP-HHG8HED:qt-everywhere-opensource-src-5.9.9# pkg-config --exists dbus-1
root@DESKTOP-HHG8HED:qt-everywhere-opensource-src-5.9.9# echo $?
0
root@DESKTOP-HHG8HED:qt-everywhere-opensource-src-5.9.9# pkg-config --exists fontconfig
root@DESKTOP-HHG8HED:qt-everywhere-opensource-src-5.9.9# echo $?
1

在鲲鹏系统上,可以看到pkg-config --exists fontconfig返回值为1,表示执行失败,也就是fontconfig没有正确找到,我在其他系统上执行该命令,返回值为0。

system函数的使用参考C中SYSTEM()的返回值 ,C system()的返回值

摘自上面参考文件内容:

比如如果system执行grep但是没抓住字符,它的返回值就是256,WEXITSTATUS(rc)就是1

system()返回您启动的进程的退出代码。

退出代码通常仅具有以下约定:退出代码0表示成功而非零表示失败。

探索到pkg-config --exists fontconfig执行失败原因

查询pkg-config的使用方法参考pkg-config命令使用,使用pkg-config --exists --print-errors fontconfig查看报错信息,报错信息提示:

package 'fontconfig',required by 'world',not found

显示改提示原因是没有安装fontconfig的开发库,所以去查看系统中库的安装情况,显示libfontconfig1-dev库没有安装,遂安装,安装之后再执行pkg-config --exists --print-errors fontconfig,没有报错信息。

诡异

使用pkg-config --exists fontconfig也查看了,系统中确实安装了这个库,但是就是qt找不到,怎么办?

终极方法,在终端显示的指定PKG_CONFIG_PATH,如下:

export PKG_CONFIG_PATH=/usr/lib/pkgconfig:/usr/share/pkgconfig:/usr/lib/aarch64-linux-gnu/pkgconfig

这个时候在去查看,qt就能够找到了那个找不到的fontconfig了。