天天看點

Qt6 建構系統

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,因為配置和建構測試需要一些時間。

有兩個好消息:

  1. 現在不建構所有測試是預設的!不需要通過

    -nomake tests

    更多。同樣的也适用于

    -nomake examples

    如果你真的想建造全測試和示例,通過

    -make tests -make examples

    争論。我們相信,新的預設設定将導緻更少類型的指令行字元,進而為更有趣的調用節省這一稀缺資源。
  2. 配置和建構單個自動測試或示例很容易。

這就是如何建構和運作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社群将從中受益。