Kompreni CMakeLists
CMake
En nia enkonduka lernilo, ni uzis CMake kiel la konstrusistemon por nia aplikaĵo, sed ni nur tre atentis unu el niaj CMakeLists.txt
dosieroj. Ĉi tie, ni iom pli detale trarigardos kiel ĝi funkcias.
CMake estas utila ĉar ĝi permesas al ni aŭtomatigi grandan parton de la aĵoj kiuj devas esti faritaj antaŭ kompilo.
La radika CMakeLists.txt
Vi eble memoras ĉi tiun CMakeLists.txt
dosieron de la unua lernilo:
|
|
La unua linio, cmake_minimum_required()
fiksas la version de CMake, kiun ni vokos.
Post tio, project(kirigami-tutorial)
difinas la nomon de la projekto.
Poste ni atingas sekcion, kie ni inkluzivas kelkajn necesajn agordojn de CMake kaj KDE uzante extra-cmake-modules. Ili provizas aron de valoraj utilaĵoj:
- KDEInstallDirs provizas oportunajn variablojn kiel
${KDE_INSTALL_TARGETS_DEFAULT_ARGS}
,${KDE_INSTALL_QMLDIR}
,${KDE_INSTALL_INSTALL] kaj
${BIND_INS} - KDECMakeSettings provizas aferojn kiel
CMAKE_AUTORCC ON
, celonmalinstali
kiu povas esti uzata kuncmake --build build/ - -target uninstall
, kajENABLE_CLAZY
. - KDECompilerSettings provizas minimuman C++-normon, kompililajn flagojn kiel
-pedantic
, kaj plej bonajn praktikajn makroojn kiel-DQT_NO_CAST_FROM_ASCII
por postuli eksplicitaj konvertiĝoj kielQStringLiteral()
. - ECMFindQmlModule provizas manieron certigi rultempan QML-dependecon trovigxas je kompiltempo.
- ECMQmlModule provizas CMake-komandojn kiel
ecm_add_qml_module()
kajecm_target_qml_sources()
.
La sekva sekcio estas grava, ĉar ĝi specifas kiujn dependecojn ni alportos je kompilo. Ni rigardu la unuan:
|
|
- find_package() trovas kaj ŝargas la eksteran bibliotekon kaj siajn komponantojn.
REQUIRED
diras al CMake eliri kun eraro se la pakaĵo ne troveblas.- `COMPONENTS' estas parametro, kiu antaŭas la specifajn komponantojn de la kadro, kiun ni inkludos.
- Ĉiu vorto post `COMPONENTS' rilatas al specifa komponanto de la biblioteko.
Noto
Se vi celas aldoni iujn ajn komponantojn listigitajn en la KDE-API-dokumentado al via aplikaĵo, vi povas kontroli la dekstran flankan stangon kiel aldoni la komponanton kun CMake. Ekzemple, por Kirigami2, vi trovos ion kiel find_package(KF6Kirigami)
, kiu kun la aldono de ECM fariĝas:
find_package(KF6 COMPONENTS Kirigami)
Atentu viajn inkluzivitajn komponantojn, ĉar preterlasi tiujn uzatajn en nia kodo ĉesos nian aplikaĵon kompili.
La installinio instrukcias CMake instali la labortablan dosieron en ${KDE_INSTALL_APPDIR}
, kiu en Linukso tradukiĝas al $XDG_DATA_DIRS/applications
, kutime /usr/share/applications
, kaj en Vindozo tradukiĝas al C:/Program Dosieroj/${PROJECT_NAME}/bin/data/applications
:
|
|
La fina linio lasas CMake presi kiujn pakaĵojn ĝi trovis, kaj ĝi igas kompiladon tuj malsukesi se ĝi renkontas eraron:
|
|
Kaj super tio, add_subdirectory(src)indikas CMake en la dosierujon
src/, kie ĝi trovas alian
CMakeLists.txt` dosieron.
src/CMakeLists.txt
|
|
Dum la unua dosiero pritraktis metadatenojn kaj trovi bibliotekojn, ĉi tiu konsistos el pritraktado de dependecoj kaj instalo de la aplikaĵo. Ĝi havas la sekvajn CMake-vokojn:
- add_executable() kreas la ruleblan celon kiun ni uzos por efektivigi nian projekton.
ecm_add_qml_module()
kreas celon de QML-modulo kiu estos alirebla per la importo "org.kde.tutorial".- target_sources() aldonas C++ fontdosierojn al la rulebla celo.
ecm_target_qml_sources()
aldonas QML-dosierojn al la modulo.- target_link_libraries() ligas la C++-bibliotekojn uzatajn en nia kodo al nia rulebla. Kirigami ne estas inkluzivita ĉi tie ĉar ni uzas nur ĝian QML-modulon.
- install() instalas la plenumeblan al la sistemo.
La dokumentaro por la du ECM-komandoj troviĝas en la extra-cmake-modules API for ECMQmlModule.
La alvoko al ecm_add_qml_module()
estis uzata ĉi tie por modifi la tradician C++-fontkodon plenumeblan celon kaj igi ĝin io kiu povas akcepti QML-dosierojn kaj C++-fontkodon kiu estas alirebla de QML en kio estas nomita uzante la ruleblan kiel subtenan celon. por QML-modulo. Ĉi tio signifas, ke la QML-dosieroj estas rulitaj rekte kiel parto de la aplikaĵo, kio ofte okazas por aplikoj.
Vi ankaŭ povas krei apartan QML-modulon, kiu ne uzas la plenumeblan kiel subtenan celon uzante ecm_add_qml_module()
. En ĉi tiu kazo, vi kreus bibliotekan celon uzante add_library(), ligus ĝin al ekzistanta plenumebla celo uzante target_link_libraries( )
, kaj krom instali la bibliotekon per install()
vi devos fini la QML-modulon per ecm_finalize_qml_module() do ĝi povas generi du dosierojn: qmldir
kaj qmltypes
. Ĉi tiuj dosieroj estas uzataj de QtQuick-aplikoj por trovi apartajn QML-modulojn.
La metodo por krei apartan QML-modulon estas pli bone ekzempligita en Uzante apartajn dosierojn.
Ĉi tiuj estas aldonoj provizitaj de ekstra-cmake-moduloj por uzi Qt-deklara registrado (la anstataŭaĵo al Qt-resursaj dosieroj) pli facile.
Noto
Ĉi tiuj bibliotekoj devus kongrui kun la komponantoj kiujn ni inkludis en nia antaŭaCMakeLists.txt
dosiero, alie ĉi tiuj komponantoj ne estos inkluzivitaj kaj nia aplikaĵo ne kompiliĝos.La dokumentaro por ĉiuj tri komandoj troviĝas en la extra-cmake-modules API for ECMQmlModule.
src/components/CMakeLists.txt
En la lernilo pri kiel dividi vian kodon en apartajn dosierojn, nova CMake-dosiero estis lanĉita por permesi apartaj QML-moduloj:
|
|
La postulo por ke ĉi tiu dosiero estu legita de CMake estas aldoni alvokon al add_subdirectory()
en la src/CMakeLists.txt
indikanta ĝin.
Ni kreas novan celon nomitan kirigami-hello-components
kaj poste turnas ĝin en QML-modulon uzante ecm_add_qml_module() sub la importnomo. org.kde.tutorial.components
kaj aldonu la koncernajn QML-dosierojn.
La voko al add_library() generas novan celon nomitan kirigami-hello-components
. Ĉi tiu celo havos sian propran aron de fontkodaj dosieroj, QML-dosieroj, ligos siajn proprajn bibliotekojn kaj tiel plu, sed ĝi devas esti ligita al la plenumebla, sed post kiam ĝi estas kompilita ĝi devas esti ligita al la plenumebla kreita en la src/CMakeLists.txt
. Ĉi tio estas farita aldonante la celnomon al la listo de bibliotekoj kiuj estos ligitaj al la plenumebla en target_link_libraries()
.
La alvoko al ecm_add_qml_module()
ŝanĝas la bibliotekon por permesi al ĝi akcepti QML-dosierojn kiel antaŭe, sed ĉi-foje ni devas uzi GENERATE_PLUGIN_SOURCE . Kiam la plenumebla estas uzata kiel subtena celo (kiel kun kirigami-hello
) ĝi ne bezonas generi kromprogramon ĉar ĝi estas enkonstruita en la rulebla; kun apartaj QML-moduloj kiel kirigami-hello-components
la aldonkodo estas necesa.
La [qt_add_qml_module()] de Qt kontraŭflue (https://doc.qt.io/qt-6/qt-add-qml-module.html#targets-and-plugin-targets) defaŭlte generas kromprogramon kune kun la QML-modulo , sed ecm_add_qml_module()
de KDE defaŭlte ne por malantaŭen kongruo.
Alia afero necesa por apartaj QML-moduloj estas fini la celon. Ĉi tio ĉefe signifas ke CMake generas du dosierojn, qmldir kaj qmltypes, kiuj priskribas la QML-modulojn kiujn ni havas kaj eksportas iliajn simbolojn por uzo. en la biblioteko. Ili estas gravaj kiam vi instalas vian aplikaĵon, por ke la rulebla programo povu trovi kie estas la QML-dosieroj por ĉiu modulo, do ili estas aŭtomate aldonitaj al la celo.
Vi povas tiam simple instali la celon kiel antaŭe.
Venontfoje vi bezonos aldoni pliajn QML-dosierojn, memoru inkluzivi ilin en ĉi tiu dosiero. C++-dosieroj, kiuj uzas la ŝlosilvorton QML_ELEMENT, kiun ni vidos multe pli poste en la lernilo, ankaŭ povas esti aldonitaj ĉi tie uzante target_sources( )
. Vi povas logike apartigi vian kodon kreante pli da QML-moduloj kun malsamaj enportoj laŭbezone.
Ĉi tiu aranĝo estos utila dum disvolvado de plej multaj Kirigami-aplikoj.