Qt辅助脚本工具syncqt

时间:2021-08-21 12:42:46

include目录

  • 安装好Qt后,我们会有
    • bin\
    • src\
    • lib\
    • include\
    • ...

可是,如果下载Qt源码的话,里面并没有include这个目录

那么,它是怎么来的:

syncqt

include目录中的东西是由syncqt这个perl脚本生成的,这是是syncqt主要的功能吧。

运行

./bin/syncqt -help

可看到用法及其参数介绍

./bin/syncqt usage:
<module directory> Specifies which module to sync header files for (required for shadow builds!)

-copy Copy headers instead of include-fwd(default: no)
...

如何调用

下载源码,编译Qt的第一步是: configure

  • posix下是 shell脚本 configure
  • windows下是可执行程序 configure.exe

sync 这个脚本就是被configure所调用了。似乎不值得惊奇,编译时调用一次似乎也足够了

Qt5的变化

伴随着模块化,Qt分拆成几个子仓库,每个里面都有一个

sync.profile

一直以来不清楚这里面用的是一种什么语法,弄了半天原来也是Perl,是由 syncqt 调用的。

用来控制该仓库内的各个模块的头文件如何同步到include目录中

syncqt方式调用也发生了变化,除了在configure的时候被调用外,当源码更新后,执行make的时候,也会发现它被调用。

  • 刚开始以为是Makefile中有直接的规则,后来发现没有
  • 原来是qmake是执行时被调用的,(当pro/pri/prf变化时,make调用了qmake),详见文件

mkspecs/features/default_pre.prf

关键代码:

!build_pass:exists($$_PRO_FILE_PWD_/sync.profile) {
qtPrepareTool(QMAKE_SYNCQT, syncqt)

$$QMAKE_SYNCQT $$QTFWD -generator $$MAKEFILE_GENERATOR -outdir $$QMAKE_SYNCQT_OUTDIR $$_PRO_FILE_PWD_)
}

sync.profile

该文件内定义了

%modules

"QtGui" => "$basedir/src/gui"
键和值:模块和模块路径
$basedir由sync.profile所在目录确定

%moduleheaders

去哪个目录下找头文件,默认是前面的模块路径(及其子目录)

@allmoduleheadersprivate

一般,*_p.h是私有头文件,但是对某些模块,比如V8,所有头文件都是私有的

%classnames

"qdebug.h" => "QtDebug"
一般从公有头文件中提取类名,创建不包含.h后缀的头文件。但有时,我们需要QtDebug这样的头文件,尽管不对应任何类。

%mastercontent

"core"=>"#include <QtCore/QtCore>\n"

%modulepris

"QtCore"=>"$basedir/src/modules/qt_core.pri"

%explicitheaders

"qtbase" => "refs/heads/master"

除此外,还有一些

@ignore_for_*