2020年10月12日(星期一)約爾格·博内曼 | 評論意見
Cmake是qt 6的建構系統。
用于建構Qt6的工具是CMake。
科馬克
-
廣泛改編和提供。
這些天它甚至随VisualStudio一起釋出。
-
由一個繁榮的社群支撐。
許多第三方庫的包是可用的。
-
穩定成熟。
明年,它将獲準在美國飲用酒精飲料。
CMake3.18.4最近釋出。請用那個來建造QT。
使用配置或普通CMake
我們親愛的
configure
劇本仍然存在。它接受您習慣使用的Qt 5中的大多數選項。
目前,qmake建構系統還在。您可以在使用qmake或cmake建立QT之間進行選擇。經過
-cmake
配置為使用基于CMake的建構。
對于最終版本,預期qmake建構系統将随着傳遞的需要一起消失。
-cmake
.
例如,下面的調用将Qt配置為~/QT/6.0.0,并關閉對
QLCDNumber
小部件并跳過Qtsvg儲存庫:
configure -cmake -prefix /opt/Qt/6.0.0 -no-feature-lcdnumber -skip qtsvg
配置腳本将這些參數轉換為以下CMake調用:
cmake -GNinja -DCMAKE_INSTALL_PREFIX=/opt/Qt/6.0.0 -DFEATURE_lcdnumber=OFF -DBUILD_qtsvg=OFF /path/to/qt/sources
這是一個相當大的嘴巴,并說明了我們的配置腳本的有用性。
通過配置,我們可以在
--
争論。上面的配置調用相當于以下内容:
configure -cmake -prefix ~/Qt/6.0.0 -no-feature-lcdnumber -- -DBUILD_qttools=OFF
配置後,使用
cmake --build .
或
ninja
來建造這個項目。
我們建議使用CMake的忍者發生器。這也是配置的預設設定。
您可以通過傳遞來指定cmake生成器。
-cmake-generator <name>
使用另一個生成器
-cmake-use-default-generator
使用CMake的預設生成器,即否
-G <generator>
論點通過了。
使用
cmake --install .
安裝QT。
交叉編譯qt
要用CMake交叉編譯一個項目,必須指定一個工具鍊檔案。這個CMake語言檔案為平台名稱、使用的編譯器/連結器和其他一系列特定于工具鍊的東西設定了正确的值。
工具鍊檔案的概念類似于qmake的mkspecs。
閱讀有關工具鍊檔案的更多資訊。CMake交叉編譯文檔.
讓我們來看看如何在Linux上建構一個Qt。
configure -cmake -prefix /opt/Qt/6.0.0-android \
-qt-host-path /opt/Qt/6.0.0 \
-xplatform android-clang \
-android-ndk ~/Android/android-sdk-tools/ndk-bundle \
-android-sdk ~/Android/android-sdk-tools \
-android-abis armeabi-v7a
最顯著的差別是
-qt-host-path
選擇。要跨建構Qt,您需要指向已經存在的本地建構宿主平台。這叫做宿主QT.
所有本地主機工具,如MOC、RCC和UIC都是從那裡運作的。
在Qt 5中,我們為每一個交叉建構重新建構了主機工具。重新使用現有主機Qt安裝中的主機工具,可以避免一次又一次地為每次交叉建構建構主機工具,并極大地簡化了Qt的建構系統。
跨建構的qt不為目标平台建構主機工具,除非設定cmake變量。
QT_BUILD_TOOLS_WHEN_CROSS_COMPILING
到
ON
。這樣做在嵌入式Linux環境中很有用。
這個
-xplatform android-clang
參數隻會影響為該跨建構提供qmake支援而生成的配套檔案。
這個
-android-ndk
參數指向NDK并選擇位于其中的CMake工具鍊檔案。
這個
-android-sdk
參數指向SDK。
這個
-android-abis
參數選擇我們将要建構的ABI。注意,還沒有實作多個ABI建構。
為了将所有内容組合在一起,上面的配置調用被轉換為以下CMake調用:
cmake -DQT_HOST_PATH=/opt/Qt/6.0.0 \
-DQT_QMAKE_TARGET_MKSPEC=android-clang \
-DANDROID_SDK_ROOT=/home/jobor/Android/android-sdk-tools \
-DCMAKE_TOOLCHAIN_FILE=/home/jobor/Android/android-sdk-tools/ndk-bundle/build/cmake/android.toolchain.cmake \
-DANDROID_ABI=armeabi-v7a \
-DCMAKE_INSTALL_PREFIX=/opt/Qt/6.0.0-android \
-G Ninja \
/path/to/qt/source
再一次,用
cmake --build .
或者隻是
ninja
.
使用
cmake --install .
安裝QT。
建構基于QT的項目
一旦安裝了Qt,就可以使用CMake或qmake建構項目。
與qmake的一切照舊:
mkdir ~/my-project-build
cd ~/my-project-build
/opt/Qt/6.0.0/bin/qmake
make
注意:這也适用于交叉建構。在這裡,qmake是一個包裝腳本,它使用生成的qt.conf來調用主機Qt的qmake可執行檔案,該腳本設定正确的路徑和mkspec。
Qt附帶了一個名為qt-cmake的包裝腳本,以提供類似的CMake體驗:
mkdir ~/my-project-build
cd ~/my-project-build
/opt/Qt/6.0.0/bin/qt-cmake
cmake --build .
Qt-cmake調用cmake
CMAKE_TOOLCHAIN_FILE
變量設定為Qt内部工具鍊檔案,該檔案設定正确的編譯器,并在交叉編譯情況下連結加載“真實”工具鍊檔案。
注意:如果您發現自己需要連結一個不同的工具鍊檔案,請傳遞
-DQT_CHAINLOAD_TOOLCHAIN_FILE=<file-path>
去qt-cmake。
Qt-cmake不設定CMake發生器。如果您總是想使用忍者-我們推薦的-設定環境變量
CMAKE_GENERATOR
到
Ninja
.
建構QT子產品
qt-configure-module
是在針對已安裝的QT單獨建構Qt子產品時所選擇的工具。這個
qt-configure-module
腳本采用相同的參數,頂級Qt配置調用将限制于應用于我們目前配置的子產品的參數。
在下面的示例中,我們首先建構和安裝qtbase,然後關閉qml網絡特性的qt聲明性。
mkdir ~/dev/qt/qtbase-build
cd ~/dev/qt/qtbase-build
../qtbase/configure -prefix /opt/Qt/6.0.0
cmake --build .
cmake --install .
mkdir ~/dev/qt/qtdeclarative-build
cd ~/dev/qt/qtdeclarative-build
/opt/Qt/6.0.0/bin/qt-configure-module ../qtdeclarative -no-qml-network
cmake --build .
cmake --install .
建築獨立測試與執行個體
如果您是Qt貢獻者,侵入了Qt的某些部分,您可能希望擴充并運作覆寫該領域的自動測試。但是大多數人總是用-ameake測試來配置Qt,因為配置和建構測試需要一些時間。
有兩個好消息:
- 現在不建構所有測試是預設的!不需要通過
更多。同樣的也适用于-nomake tests
-nomake examples
.
如果你真的想建造全測試和示例,通過
争論。我們相信,新的預設設定将導緻更少類型的指令行字元,進而為更有趣的調用節省這一稀缺資源。-make tests -make examples
- 配置和建構單個自動測試或示例很容易。
這就是如何建構和運作QProcess的自動測試:
mkdir ~/dev/qt/tst_qprocess
cd ~/dev/qt/tst_qprocess
/opt/Qt/6.0.0/bin/qt-cmake-standalone-test ../qtbase/tests/auto/corelib/io/qprocess
cmake --build .
ctest -V
這使用了CMake附帶的ctest工具,當然,您也可以直接運作可執行檔案。
建構一個示例以類似的方式工作:
mkdir ~/dev/qt/wiggly
cd ~/dev/qt/wiggly
/opt/Qt/6.0.0/bin/qt-cmake ../qtbase/examples/widgets/widgets/wiggly
cmake --build .
./wiggly
将基于qmake的項目移植到cmake
如果您正在尋找一種方法來輕松地将您基于qmake的項目移植到CMake,我有好消息和壞消息給您。
好消息
沒有立即需要将您的項目移植到CMake。
QMake繼續在Qt6工作。
壞消息
沒有好的移植工具可用。
Qt本身(在某種程度上仍然是如此)使用一個名為Python的腳本移植到CMake前2c.
該腳本是根據Qt子產品項目檔案的結構定制的,雖然它可能有助于為使用者項目建立一個起點,但這與我們重新推薦的内容相去甚遠。
如果遇到一些聰明的qmake結構,它可能就會突然消失。
但是如果你是喜歡冒險的人,可以自由地嘗試一下,并確定通過
--is-example
争論。
結語
我們希望向CMake的轉換對您來說是盡可能順利的,Qt和CMake社群将從中受益。