本身很是喜歡 QT 這個框架, 使用 QT 這幾年, IDE 一直是使用的 QT 自帶的 Qt Creator, 這個 IDE 自己比較輕巧, 同事相關的語法提示之類的也算夠用, 可是 qmake 有的時候就顯得不那麼只能了, 有時非得手動qmake一下才行, 有時須要清除再構建, 有時這二者合一塊兒也不必定解決問題. 須要刪除構建目錄才行. 不少新手學習的時候, 常常會再論壇或羣裏問, 爲何個人代碼和書上的如出一轍, 怎麼構建時就出錯呢? 這種狀況, 大可能是 qmake 「抽風」了. 其實 QBS 剛出來的時候就想試試, 可是被那個自帶文檔嚇住了. 這個春節, 無心中打開 QBS 的文檔, 仔細看了下. 同時實踐了下, 原來這個東西仍是很簡單的. 鑑於目前網上對 QBS 的中文資料好像一篇都沒有, 特地整理了下本身學習過程當中的心得分享出來. 一來可讓本身對 QBS 的認識更加系統, 二來也給有須要的人一個參考.linux
QBS 即 Qt Build Suite. 同 qmake, cmake 之類同樣, 都是構建工具. QBS 號稱是下一代的構建工具(個人理解是上一代是基於 makefile 的構建工具?). 不過我的認爲, 至少和 qmake 比, 仍是要好用不少. 首先文檔就比qmake好些, 其次 QBS 的可擴展性真的很強大且易於使用.編程
QBS 項目文件使用一種類 QML 語言編寫的, 其實就是 QML 的簡化版, 對於已經學會 QML 的人理解 QBS 應該會更簡單(惋惜我就不會QML). 對了這是一種聲明式語言, 對於習慣了命令式編程語言的, 須要轉變下思惟, 其實會發現聲明式其實更簡單.windows
按 QBS 的自帶文檔, QBS 的知識能夠分 3 大塊, 即語言項(Language Item), 模塊(Module), 以及其它如 QBS 內建提供的服務之類的. 其中最後一塊的知識比較簡單, 通常查下文檔就會用了. 而模塊又是由一系列的語言項組成的. 因此最重要的就是語言項了. 語言項和模塊的關係就像 C++ 和 庫(例如STL, Qt 等的關係). 對於這些預約義的模塊, 基本上在用的時候查下模塊相應屬性的用法便可.markdown
本系列文章, 沒有說明 QBS 命令行的用法, 由於我本人是直接使用 Qt Creator 中自帶集成的 QBS. 本系列文章, 是面向寫 Qt 程序的, 對於平臺 Windows 和 Linux 下基本是一致的, 但對於 Mac/IOS, Andorid 的相關語言項是忽略掉的(由於我不會). 還有關於編譯 JAVA 語言的語言項也會忽略.app
上面講到 QBS 的基礎是語言項, QBS 文檔列出的語言項共有 30 個, 看起來挺多, 可是之後你會知道, 實際使用到的僅有十多個. 下面是我加單的分了下類, 列出了全部的語言項.框架
注: 本篇文章, 只是對 QBS 有個大概的介紹, 無需記住或拼命的理解什麼.編程語言
Project
和 SubProject
函數
Project 項在結構上是全部語言項的最頂層的(最外圍的)那個語言項, 一個 Project 項包含了一個或多個 Product 項. 同時 Project 項中還能嵌套包含 Project 項.工具
SubProject 項用來將一個 Project 項加入到當前的 Project項中, 將其做爲當前項目的一個子項目.學習
Project/SubProject 項做用相似與 qmake 項目文件中(pro文件) 定義 TEMPLATE = subdirs
.
Product
Application
CppApplication
QtApplication
QtGuiApplication
XPCService
ApplicationExtension
DynamicLibrary
StaticLibrary
JavaClassCollection
JavaJarCollection
AndroidApk
LoadableModule
一個 Product 項就是在構件過程最終生產的結果, 好比能夠是一個: 可執行的應用程序, 動態庫, 或是靜態庫等等. 如上列出所示, 從 Product 項又派生出了 Application, DynamicLibrary, StaticLibrary 等項. 但其本質仍是 Product 項, 只是爲了使用上更方便, 在 Product 項上預設了一些屬性和依賴. 例如: Application 項, 也能夠以下 Product 項來表示
Product {
type: "application"
// ...
}
Product 項及其派生的各類項做用相似與定義了 TEMPLATE = app
, TEMPLATE = lib
等的 qmake 項目文件.
FileTagger
, Group
和 Properties
FileTagger 項用來標記(源)文件的類別, 即標記出哪些文件是 C++ 源碼, 哪些文件是資源文件等等, 有點相似於 Windows 系統上的文件擴展名的做用, 可是比擴展名強大的多.
Group 項用來分組(源)文件, 好比在 Windows 平臺和 Linux 平臺上須要包含不一樣的文件時就能夠用 Group 項來分組. 以下:
Application {
Group {
name: "Windows files"
condition: targetOS.contains("windows")
files: "myclass_win_impl.cpp"
}
Group {
name: "Linux files"
condition: targetOS.contains("linux")
files: "myclass_linux_impl.cpp"
}
}
Properties 項則是用來分組屬性的. 用法相似於 Group, 只是一個做用於文件, 一個做用於屬性.
Depends
, Module
和 Export
Depends 項用來引入功能模塊(Module).
Module 項用來定義一個模塊, 模塊可能包含一系列屬性, 規則, 變換等等.
Export 項能夠將 Product 中的一系列屬性導出, 使得這個 Product 可以像 Module 同樣由 Depends 引入使用.
Artifact
, Rule
和 Transformer
Artifact 項, 即工件, 構建過程以及構建最終產生的文件都稱之爲工件. 工件由規則(Rule) 和 變換 (Transformer)產生.
Rule/Transformer 項, 將輸入文件生成一個或多個工件.
其它項: AutotestRunner, InstallPackage, Probe, PropertyOptions, Scanner
略
爲了對 QBS 對上述語言項更好的理解. 能夠用一個 C++ 項目來類比:
Project 和 SubProject 就項就像項目的工程文件同樣, 對於簡單的項目, 好比 Hello World 程序, 就一個源文件, 不要工程文件也是能夠的. 可是對於有不少源文件的, 還包含各類資源文件時, 仍是有必要經過工程文件來管理的.
Product 項及其派生項, 有點項 main, WinMain, DllMain, 之類的入口函數, 決定了最後生成的是什麼東西(控制檯程序, windows程序, 動態庫).
FileTagger, Group 和 Properties 項有點項 C/C++ 中哪些用來條件編譯的預處理指令.
Depends, Module 和 Export 有點像引入/定義庫文件.
Artifact, Rule 和 Transformer 則項最後開始編譯程序的編譯命令行, 以及生成的中間文件和最終的程.
爲了怕嚇住你們, 再次告訴你們 QBS 雖然很強大, 可是也是很簡單的. 好比上面看到列出那麼多語言項, 其實不少功能上是重複/類似的, 能夠不用的, 還有不少是用不到的. 好比上面第 2 類中的 Product 系總共有13個, 我只用到了CppApplication
, DynamicLibrary
和 StaticLibrary
三個. 即便你真的都能用到, 那麼它們的用法也是同樣的, 換個名字而已.
下一篇文章開始正式開始使用 QBS 來構建項目, 並講解其中出現的語言項.
轉載請加上原文連接, 並保證文章的完整性. 鑑於本身的能力可能有表達失當或者錯誤的地方, 但願你們包含. 如您能提出意見或建議, 本人不甚感激.
li_wey AT 163.com