-
距離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_*