距离Qt在Windows下编译时 configure 问题一则已经过了半年了,重新看看syncqt相关的内容。
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" |
%moduleheaders |
去哪个目录下找头文件,默认是前面的模块路径(及其子目录) |
@allmoduleheadersprivate |
一般,*_p.h是私有头文件,但是对某些模块,比如V8,所有头文件都是私有的 |
%classnames |
"qdebug.h" => "QtDebug" |
%mastercontent |
"core"=>"#include <QtCore/QtCore>\n" |
%modulepris |
"QtCore"=>"$basedir/src/modules/qt_core.pri" |
%explicitheaders |
"qtbase" => "refs/heads/master" |
除此外,还有一些
@ignore_for_*