QMakeからCMakeぞのScreenPlay転送のサクセスストヌリヌ

ScreenPlayは、壁玙やりィゞェットで動䜜するように蚭蚈されたWindows甚のオヌプン゜ヌスアプリケヌションですたもなくLinuxずmacOS甚にもなりたす。最新のツヌルC ++ / Qt / QMLを䜿甚しお䜜成され、2017幎前半から積極的に取り組んでいたす。プロゞェクトコヌドはGitLabプラットフォヌムに保存されたす。 本日公開する蚘事の著者は、ScreenPlayを開発しおいたす。圌は倚くの問題に盎面したしたが、それはQMakeからCMakeぞの移行によっお助けられたした。











QMakeず倧芏暡プロゞェクトの開発



▍QMakeでのコヌド共有は非垞に䞍䟿です



かなり耇雑なアプリケヌションを開発する堎合、通垞、それらを小さくお管理しやすいチャンクに分割するのが最善です。たずえば、ラむブラリが接続されおいるメむンの実行可胜ファむルずしおアプリケヌションを提瀺する必芁がある堎合、QMakeを䜿甚するず、これはテンプレヌトに基づくプロゞェクトを䜿甚しおのみ実行できたすsubdirs。これは、MyApp.pro䜿甚されるテンプレヌトの゚ントリずプロゞェクトフォルダのリストを含む、たずえば名前の付いたファむルで衚されるプロゞェクトです。



  TEMPLATE = subdirs
 
  SUBDIRS = \
            src/app \   #  
            src/lib \
            src/lib2


このアプロヌチでは、コヌドの共有を敎理する必芁があるいく぀かのサブプロゞェクトを自由に䜿甚できたす。他のプロゞェクトのどこでヘッダヌファむルや゜ヌスコヌドを含むファむルを怜玢する必芁があるかをコンパむラに通知するには、含める必芁のあるラむブラリずコンパむル枈みファむルを怜玢する堎所に関する情報をリンカヌに通知する必芁がありたす。QMakeは、プロゞェクトに含めるものを蚘述するためだけに䜿甚される巚倧な.priファむルを䜜成するこずによっおこれを行いたす。これは、通垞のC ++ビュヌ構造を䜿甚するのず䌌おいたす#include <xyz.h>。その結果、たずえば、ファむルがMyProjectName.priコンポゞションに含たれおいるこずがわかりMyProjectName.proたす。たた、盞察パスの問題を修正するには、珟圚の絶察パスを各行に远加したす。



▍倖郚䟝存関係



さたざたなオペレヌティングシステムを察象ずした倖郚䟝存関係の操䜜は、䞻に、察応する䟝存関係ぞのパスをコピヌしお.proファむルに貌り付けるこずになりたす。各OSにはこの点で独自の特性があるため、これは退屈で退屈な䜜業です。たずえば、Linuxには個別のサブフォルダdebugずがありたせんrelease。



▍CONFIG+ = orderedはコンパむルパフォヌマンスキラヌです



QMakeのもう1぀の欠点は、コンパむルの問題が断続的に発生するこずです。したがっお、プロゞェクトに他のサブプロゞェクトで䜿甚されるラむブラリである倚くのサブプロゞェクトがある堎合、コンパむルは定期的に倱敗したす。゚ラヌの理由は次のようになりたす。libAラむブラリはラむブラリlibBずに䟝存したすlibC。しかし、組み立おの時点では、libAラむブラリlibCはただ準備ができおいたせん。通垞、プロゞェクトを再コンパむルするず問題は解決したす。しかし、これがたったく起こっおいるずいう事実は、QMakeに深刻な問題があるこずを瀺しおいたす。そしお、これらの問題は、次のようなものを䜿甚しお解決するこずはできたせんlibA.depends = libB..。おそらくそしおおそらくそうですが、私は䜕か間違ったこずをしおいたすが、私も同僚も問題に察凊できたせんでした。ラむブラリのビルド順序に関する問題を解決する唯䞀の方法は、カスタマむズを䜿甚するCONFIG += orderedこずですが、このため、䞊列ビルドがないため、パフォヌマンスが倧幅に䜎䞋したす。



QBSずCMake



▍QBSがCMakeに負けるのはなぜですか



QBSQtビルドシステム、Qtビルドシステムのサポヌト終了に぀いおのメッセヌゞは、私にずっお本圓にショックでした。私はこれを倉える詊みの創始者の䞀人でさえありたした。 QBSは、QMLコヌドを曞いたこずのある人なら誰でも知っおいる玠晎らしい構文を䜿甚しおいたす。 CMakeに぀いおは同じこずは蚀えたせんが、このプロゞェクトビルドシステムを数か月䜿甚した埌、QBSからの切り替えが正しい刀断であり、CMakeを匕き続き䜿甚するこずを確信できたす。 ..。



CMakeには構文䞊の欠陥がいく぀かありたすが、確実に機胜したす。そしお、QBSの問題は技術的ずいうよりも政治的です。



これは、Qtのサむズコヌドの行数ずラむブラリのサむズの䞡方の点でに䞍満を持っおいるプログラマヌに代替案を探すこずを匷いる䞻な芁因の1぀です。さらに、倚くの人がMOCを匷く嫌っおいたす。これは、Qtを䜿甚しお蚘述されたC ++コヌドを通垞のC ++に倉換するメタオブゞェクトコンパむラです。このコンパむラのおかげで、たずえば、信号を操䜜できるような䟿利な構造を䜿甚できたす。



▍QBSの代替



QBSに加えお、build2、CMake、Meson、SConsなどのプロゞェクトビルドシステムを自由に䜿甚できたす。これらは、Qt゚コシステムの倖郚で、倚くのプロゞェクトで䜿甚されおいたす。



▍IDEでのQBSサポヌトが䞍十分



私の知る限り、QBSをサポヌトするIDEはQtCreatorだけです。



▍vcpkgずCMakeの芋事な結合



䞊蚘の倖郚䟝存関係の問題にどのように憀慚したか芚えおいたすかしたがっお、vcpkgパッケヌゞマネヌゞャヌが私にどれほど前向きな感情を䞎えたかは驚くこずではありたせん。䟝存関係をむンストヌルするには、1぀のコマンドで十分です。vcpkgはどのC ++プログラマヌにも圹立぀ず思いたす。



䞀芋魅力的でないCMake構文



Googleが芋぀けた䞊䜍10のリンクからCMakeを刀断するず、システムが非垞に魅力のない構文を䜿甚しおいるように芋える堎合がありたす。しかし、ここでの問題は、Googleが2008幎のStackOverflowから叀いCMakeのものを最初に衚瀺したこずです。CMake2.8バヌゞョンの叀いドキュメントぞのリンクもありたす。CMakeを䜿甚するずきに䜿甚される構文は、かなりきれいです。実際のずころ、CMakeの䜿甚には、䞻に以䞋に瀺す構成の䜿甚が含たれたすこれは、ScreenPlayプロゞェクトのCMakeList.txtファむルの短瞮バヌゞョンです。



#   
cmake_minimum_required(VERSION 3.16.0)

#   .       
#       ${PROJECT_NAME}
project(ScreenPlay)

#   Qt,    MOC
set(CMAKE_AUTORCC ON)
set(CMAKE_AUTOMOC ON)

#  -   .    src,
#   .       add_executable
set(src main.cpp
        app.cpp
        #  - 
        src/util.cpp
        src/create.cpp)

set(headers app.h
        src/globalvariables.h
        #   - 
        src/util.h
        src/create.h)

#  Qt     
qt5_add_big_resources(resources  resources.qrc)

#  CMake  qml  C++   release
#   !
if(CMAKE_BUILD_TYPE STREQUAL "Debug")
    set(qml qml.qrc)
else()
    qtquick_compiler_add_resources(qml qml.qrc )
endif()

#  CMake   .  ,   ,  CMAKE_TOOLCHAIN_FILE
#         !
find_package(
  Qt5
  COMPONENTS Quick
             QuickCompiler
             Widgets
             Gui
             WebEngine
  REQUIRED)

#   vcpkg
find_package(ZLIB REQUIRED)
find_package(OpenSSL REQUIRED)
find_package(libzippp CONFIG REQUIRED)
find_package(nlohmann_json CONFIG REQUIRED)

#  CMake    : 
# add_executable    
# add_library   
add_executable(${PROJECT_NAME} ${src} ${headers} ${resources} ${qml})

#        Windows
# https://stackoverflow.com/questions/8249028/how-do-i-keep-my-qt-c-program-from-opening-a-console-in-windows
set_property(TARGET ${PROJECT_NAME} PROPERTY WIN32_EXECUTABLE true)

#     .    
#     vcpkg.      
# dll/lib/so/dynlib  vcpkg/installed
#      , 
#   project(MyLib)  target_link_libraries.
#        .
target_link_libraries(${PROJECT_NAME}
    PRIVATE
    Qt5::Quick
    Qt5::Gui
    Qt5::Widgets
    Qt5::Core
    Qt5::WebEngine
    nlohmann_json::nlohmann_json
    libzippp::libzippp
    ScreenPlaySDK
    QTBreakpadplugin)

#  CMake      build   ,   .
# ${CMAKE_BINARY_DIR} -   build!
file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/bin/assets/fonts)
configure_file(assets/fonts/NotoSansCJKkr-Regular.otf ${CMAKE_BINARY_DIR}/bin/assets/fonts COPYONLY)


忍者はCMakeをスピヌドアップ



CMakeの圹割は、開発者が遞択したプロゞェクトビルドシステムの呜什を生成するこずだけです。これは、QtCreatorではなくVisualStudioを䜿甚する人々ず協力する堎合に倧きなプラスになる可胜性がありたす。CMakeを䜿甚する堎合、デフォルトのビルドシステムずしおNinjaを遞択できたす遞択する必芁がありたす。CMake + Ninjaバンドルを䜿甚しおプロゞェクトをコンパむルするのはずおも䟿利です。どちらもQtMaintenanceツヌルボックスにありたす。特に、これらのツヌルは、反埩的な開発アプロヌチで倉曎を非垞に迅速に凊理できたす。実際、すべおが非垞に高速に動䜜するため、SConsでGodotを䜿甚する堎合は、ここでもCMakeを䜿甚したいず思いたす。



VcpkgはCMakeを茝かせたす



C ++プロゞェクトの䟝存関係の管理は簡単な䜜業ではありたせん。これを解決するために、倚くのプロゞェクトでは、必芁なDLLをGitリポゞトリに配眮しおいたす。これはリポゞトリのサむズを䞍必芁に倧きくするため、これは悪いこずですここでは、Git LFSに぀いおは觊れたせん。 vcpkgの唯䞀の欠点は、このパッケヌゞマネヌゞャヌがパッケヌゞのグロヌバルバヌゞョンを1぀しかサポヌトしないこずです぀たり、異なるバヌゞョンのvcpkgを自分でむンストヌルする必芁がありたすが、これはちょっずしたハックであり、これが必芁になるこずはめったにありたせん。確かに、プロゞェクトの開発蚈画では、それが正しい方向に進んでいるこずがわかりたす。



次のコマンドを䜿甚しおパッケヌゞをむンストヌルしたす。



vcpkg install crashpad


脚本に取り組んでいる間、私たちは、単に䜜成install_dependencies_windows.batずinstall_dependencies_linux_mac.shスクリプト、vcpkgリポゞトリのクロヌンを䜜成するには、それを構築するために、すべおの私達の䟝存関係をむンストヌルしたす。Qt Creatorを䜿甚する堎合は、CMAKE_TOOLCHAIN_FILEvcpkgぞの盞察パスに曞き蟌む必芁がありたす。さらに、vcpkgには、䜿甚しおいるOSずアヌキテクチャを通知する必芁がありたす。



    #  QtCreator. Extras -> Tools -> Kits ->  -> CMake Configuration.    :
    CMAKE_TOOLCHAIN_FILE:STRING=%{CurrentProject:Path}/Common/vcpkg/scripts/buildsystems/vcpkg.CMake
    VCPKG_TARGET_TRIPLET:STRING=x64-windows


他のラむブラリをむンストヌルする必芁がありたすかこれを行うには、フォヌムのコマンドを䜿甚するだけvcpkg install myLibToInstallです。



結果



最新で最も人気のあるものを䜿甚するアプロヌチには、その利点がありたす。しかし、たずえば、QBSのような倧きな可胜性を秘めたシステムを構築するずきに、突然傍芳者になった堎合はどうすればよいでしょうか。最終的には、開発者自身がプロゞェクトで䜕を䜿甚するかを決定したす。そのため、プロゞェクトをCMakeに移すこずにしたした。そしお、私は蚀わなければなりたせん、それは正しい決断でした。今日、2020幎にCMakeはかなり良く芋えたす。



CMakeずvcpkgを䜿甚しおいたすか










All Articles