Qt輔助腳本工具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"
鍵和值:模塊和模塊路徑
$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_*

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章