Ero sivun ”CMake syvemmin” versioiden välillä

Siirry navigaatioon Siirry hakuun
Peran (keskustelu | muokkaukset)
Peran (keskustelu | muokkaukset)
 
(7 välissä olevaa versiota samalta käyttäjältä ei näytetä)
Rivi 1: Rivi 1:
{{ Ohjelma | nimi=CMake  | kuva= |  kuvateksti= | lisenssi=cmake | käyttöliittymä=teksti | kotisivu=[http://cmake.org cmake.org] }}
{{ Ohjelma | nimi=CMake  | kuva= |  kuvateksti= | lisenssi= https://github.com/retifrav/cmake-cpack-example?tab=GPL-3.0-1-ov-file | käyttöliittymä=teksti | kotisivu=[http://cmake.org cmake.org] }}


=CMaken käytön kuvaus=
=CMaken käytön kuvaus=


'''[[CMake]]''' on työkalu, jolla voidaan tehdä '''Makefile'''jä tai valmiita ohjelmistopaketteja. Se on siis [[Make]]-käskyä nähden pykälän verran abstraktimpi taso ylöspäin. Cmake:lla voidaan mm. tehdä deb- ja rpm-paketteja cpack-apuohjelman avulla. Lisäksi sen avulla voidaan hallita C/C++ kirjastoja joko valmiiksi käännettyjä moduleita tai luoda omia dynaamisia moduleita.  
== Yleisesti ==
<span style = "font-family:monospace; background-color:lightgray;" >'''[[CMake]]'''</span> on työkalu, jolla voidaan tehdä <span style = "font-family:monospace; background-color:lightgray;" >'''Makefile'''</span>jä tai valmiita ohjelmistopaketteja. Se on siis <span style = "font-family:monospace; background-color:lightgray;" >[[Make]]</span>-käskyä nähden pykälän verran abstraktimpi taso ylöspäin. Cmake:lla voidaan mm. tehdä <span style = "font-family:monospace; background-color:lightgray;" >deb</span>- ja <span style = "font-family:monospace; background-color:lightgray;" >rpm</span>-paketteja <span style = "font-family:monospace; background-color:lightgray;" >cpack</span>-apuohjelman avulla. Lisäksi sen avulla voidaan hallita <span style = "font-family:monospace; background-color:lightgray;" >C/C++</span> kirjastoja joko valmiiksi käännettyjä moduleita tai luoda omia dynaamisia moduleita.  


'''CMakeLists.txt''' on tiedosto, jonka perusteella cmake prosessoi ohjelmaprojektin. Ohjelmaprojekti voi olla esimerkiksi:testaus, ohjelman kääntäminen tai ohjelmapaketin luominen. CMakeLists.txt-tiedosto on siis yksi abstraktiotaso Makefile:stä abstraktimpaanpäin. CMakeLists.txt-tiedostot ovat käteviä erityisesti ohjelmoijille, jotka voivat niiden avulla automatisoida projektin Makefilejen ja ohjelmapakettien avulla.
<span style = "font-family:monospace; background-color:lightgray;" >'''CMakeLists.txt'''</span> on tiedosto, jonka perusteella cmake prosessoi ohjelmaprojektin. Ohjelmaprojekti voi olla esimerkiksi:testaus, ohjelman kääntäminen tai ohjelmapaketin luominen. <span style = "font-family:monospace; background-color:lightgray;" >CMakeLists.txt</span>-tiedosto on siis yksi abstraktiotaso <span style = "font-family:monospace; background-color:lightgray;" >Makefile</span>:stä abstraktimpaanpäin. <span style = "font-family:monospace; background-color:lightgray;" >CMakeLists.txt</span>-tiedostot ovat käteviä erityisesti ohjelmoijille, jotka voivat niiden avulla automatisoida projektin <span style = "font-family:monospace; background-color:lightgray;" >Makefile</span>jen ja ohjelmapakettien avulla.


CMakeLists.txt-tiedostossa voi olla monia käskyjä seka erittäin suuri määrä muuttuja-arvoja ja niitä voi itse lisätä. Tärkeimpiä käskyjä ovat esimerkiksi: cmake_minimum_required, project,set, install, include, if/else/elseif/endif, add_subdirectory, add_library, add_executable, target_link_libraries, configure_file, message, foreach, while/endwhile, function.
<span style = "font-family:monospace; background-color:lightgray;" >CMakeLists.txt</span>-tiedostossa voi olla monia käskyjä seka erittäin suuri määrä muuttuja-arvoja ja niitä voi itse lisätä. Tärkeimpiä '''käskyjä''' ovat esimerkiksi: <span style = "font-family:monospace; background-color:lightgray;" >cmake_minimum_required, project,set, install, include, if/else/elseif/endif, add_subdirectory, add_library, add_executable, target_link_libraries, configure_file, message, foreach, while/endwhile, function</span>.


Kuten käskyistäkin voi päätellä, niin cmake on ohjelmointikieli. Koska siinä pystytään asettamaan muuttujia ja ehdollisia silmukoita, se täyttää kirkkaasti turingkoneen määritelmän. Tämä ohjelmointikieli on erikoistunut ohjelmien käännösten ja pakettien hallintaan. Kieli on case insensitive eli isolla ja pienellä kirjaimella ei ole eroa ohjelman prosessoinnissa. Varatut sanat saa selville käskyillä: cmake --help-command-list, cmake --help-variable-list ja cmake --help-property-list. Jos ajat käskyt, niin huomaat, että varattuja sanoja on todella monta. Esimerksiksi 3.28.3 versiossa on 1389-varattua sanaa. Onneksi kourallisella käskykannalla pääsee hyvin alkuun.
Kuten käskyistäkin voi päätellä, niin <span style = "font-family:monospace; background-color:lightgray;" >'''cmake'''</span> '''on ohjelmointikieli'''. Koska siinä pystytään asettamaan muuttujia ja ehdollisia silmukoita, se täyttää kirkkaasti turingkoneen määritelmän. Tämä ohjelmointikieli on erikoistunut ohjelmien käännösten ja pakettien hallintaan. Kieli on case insensitive eli isolla ja pienellä kirjaimella ei ole eroa ohjelman prosessoinnissa. Varatut sanat saa selville käskyillä: <span style = "font-family:monospace; background-color:lightgray;" >cmake --help-command-list, cmake --help-variable-list ja cmake --help-property-list</span>. Jos ajat käskyt, niin huomaat, että varattuja sanoja on todella monta. Esimerksiksi 3.28.3 versiossa on 1389-varattua sanaa. Onneksi kourallisella käskykannalla pääsee hyvin alkuun.


Cmake:n kotisivu on https://cmake.org/, josta löytyvät myös cmake-dokumentaatio. Cmake:n avulla käytetään myös erilaisia testaus-/paketoimis-ja käännösjärjestelmiä, kuten ctest, cpack, make, ninja jne. (joita muita kuin ctest:iä käytetään tässä esittelyssä).
<span style = "font-family:monospace; background-color:lightgray;" >Cmake</span>:n kotisivu on https://cmake.org/, josta löytyvät myös <span style = "font-family:monospace; background-color:lightgray;" >cmake</span>-dokumentaatio. Cmake:n avulla käytetään myös erilaisia testaus-/paketoimis-ja käännösjärjestelmiä, kuten <span style = "font-family:monospace; background-color:lightgray;" >ctest, cpack, make, ninja</span> jne. (joita muita kuin <span style = "font-family:monospace; background-color:lightgray;" >ctest</span>:iä käytetään tässä esittelyssä).


== Ensimmäinen cmake-projekti ==
== Ensimmäinen cmake-projekti ==
make:n avulla pienen projektin kääntäminen:  
make:n avulla pienen projektin kääntäminen:  
Luo kansio cmakeprojekti, ja sinne tiedosto: '''CMakeLists.txt'''
Luo kansio cmakeprojekti, ja sinne tiedosto: <span style = "font-family:monospace; background-color:lightgray;" >CMakeLists.txt</span>
Esim. päätteellä:
Esim. päätteellä:
<syntaxhighlight lang="bash" line>
<syntaxhighlight lang="bash" line>
Rivi 46: Rivi 47:
</syntaxhighlight>
</syntaxhighlight>


Ensimmäinen rivi määrittelee, mikä cmake:n versio vähintään vaaditaan CMakeLists.txt:n suoritukseen. Project-käskyllä määritellään projektin nimi, versio, kuvaus,kotisivu ja ohjelmointikielet. Message-käskyllä tulostetaan käännösjonoon tekstiä. Tämän avulla voimme siis tulostaa projektimme tiedot. Rivillä 11 tulostamme käännösjonoon projektimme nimen, joka on nimeltään ”eka-projekti”. Projektin nimessä tulee olla vähintään yksi miinus (’-’)merkki. Seuraavasssa rivissä tulostamme projektin täyden version, joka siis on 0.1.0.2, kuten olimme project-käskyssä sen määritelleet. Seuraavat kolme message-käskyä kirjoittaa parsitun (järjestyksessä: MAJOR.MINOR.PATCH.TWEAK)versionumeron. Niiden jälkeen kirjoitetaan projektin kuvaus (PROJECT_DESCRIPTION). Viimeisessä message-rivissä tulostuu projektin kotisivu (PROJECT_HOMEPAGE_URL).
Ensimmäinen rivi määrittelee, mikä <span style = "font-family:monospace; background-color:lightgray;" >cmake</span>:n versio vähintään vaaditaan <span style = "font-family:monospace; background-color:lightgray;" >CMakeLists.txt</span>:n suoritukseen. <span style = "font-family:monospace; background-color:lightgray;" >Project</span>-käskyllä määritellään projektin nimi, versio, kuvaus,kotisivu ja ohjelmointikielet. <span style = "font-family:monospace; background-color:lightgray;" >Message</span>-käskyllä tulostetaan käännösjonoon tekstiä. Tämän avulla voimme siis tulostaa projektimme tiedot. Rivillä 11 tulostamme käännösjonoon projektimme nimen, joka on nimeltään ”eka-projekti”. Projektin nimessä tulee olla vähintään yksi miinus (’-’)merkki. Seuraavasssa rivissä tulostamme projektin täyden version, joka siis on 0.1.0.2, kuten olimme project-käskyssä sen määritelleet. Seuraavat kolme message-käskyä kirjoittaa parsitun (järjestyksessä: <span style = "font-family:monospace; background-color:lightgray;" >MAJOR.MINOR.PATCH.TWEAK</span>)versionumeron. Niiden jälkeen kirjoitetaan projektin kuvaus (<span style = "font-family:monospace; background-color:lightgray;" >PROJECT_DESCRIPTION</span>). Viimeisessä message-rivissä tulostuu projektin kotisivu (<span style = "font-family:monospace; background-color:lightgray;" >PROJECT_HOMEPAGE_URL</span>).


Nyt voimme ”kääntää” projektimme, joten luomme projektin juureen kansion build, ja ajamme cmake-ohjelman sieltä osoitettuna alempaan kansioon. (HUOM: ainakin cmake-paketti pitää olla asennettuna ennen ohjelman onnistunutta ajoa.)
Nyt voimme ”kääntää” projektimme, joten luomme projektin juureen kansion build, ja ajamme cmake-ohjelman sieltä osoitettuna alempaan kansioon. ('''HUOM''': ainakin <span style = "font-family:monospace; background-color:lightgray;" >cmake</span>-paketti pitää olla asennettuna ennen ohjelman onnistunutta ajoa.)


<syntaxhighlight lang="bash" line>
<syntaxhighlight lang="bash" line>
Rivi 70: Rivi 71:
  -- Generating done (0.0s)
  -- Generating done (0.0s)
  -- Build files have been written to: /home/.../cmakeprojekti/build
  -- Build files have been written to: /home/.../cmakeprojekti/build
Huomioitavaa on, ettei make all-käsky kirjoita mitään, eikä se luo ajettavia tiedostoja. Toisaalta cmake-ohjelma ei myöskään anna mitään virheilmoituksia, niin siksi voimme määritellä tämän testin onnistuneeksi. Lisäksi on huomoitavaa, että muuttujien nimet (VERSION, DESCRIPTION, HOMEPAGE_URL ja LANGUAGES) on kirjoitettava suurilla kirjaimilla, jotta ne toimivat.
Huomioitavaa on, ettei <span style = "font-family:monospace; background-color:lightgray;" >make all</span>-käsky kirjoita mitään, eikä se luo ajettavia tiedostoja. Toisaalta cmake-ohjelma ei myöskään anna mitään virheilmoituksia, niin siksi voimme määritellä tämän testin onnistuneeksi. Lisäksi on huomoitavaa, että muuttujien nimet (<span style = "font-family:monospace; background-color:lightgray;" >VERSION, DESCRIPTION, HOMEPAGE_URL</span> ja <span style = "font-family:monospace; background-color:lightgray;" >LANGUAGES</span>) on kirjoitettava suurilla kirjaimilla, jotta ne toimivat.


== Ensimmäinen C/C++ ohjelma ==
== Ensimmäinen C/C++ ohjelma ==
Rivi 695: Rivi 696:
cpack -G RPM
cpack -G RPM
</syntaxhighlight>
</syntaxhighlight>
== Debian-paketin luominen riippuvuuksien kanssa ==
Aluksi luodaan projektille lisenssin sisältävän tiedoston (LICENSE) lisenssitieksti ja README.md-tiedosto. Ne tiedostot listään projektin juureen.
<syntaxhighlight lang=bash>
touch LICENSE
touch README.md
</syntaxhighlight>
Lisäksi luomme uuden tiedoston: Packing.cmake, projektin cmake-alikansioon:
<syntaxhighlight lang=bash>
touch cmake/Packing.cmake
</syntaxhighlight>
Tähän sisällöksi:
(Huom! kts. lähde: https://decovar.dev/blog/2021/09/23/cmake-cpack-package-deb-apt/#what-is-needed-to-enable-packing )
<syntaxhighlight lang=Cmake line>
# -----------------------------------------------
# |                          OSUUS CPACK:IA VARTEN
# | Osuus kopioitu pitkälti:
# |  https://decovar.dev/blog/2021/09/23/cmake-cpack-package-deb-apt/
#
# Tarvittavat lisäykset Debian pakkausta ja normaalia pakkausta varten...
# Tähän on haettu/käännetty apuja https://karthikkalyanaraman.medium.com/creating-debian-packages-cmake-e519a0186e87
# ja varsinkin https://decovar.dev/blog/2021/09/23/cmake-cpack-package-deb-apt/
# Tästä on tiputettu pois oman apt-pakettilähteiden perustamisen osuus.
# Aluksi määritellään CPACK:lle vietävät muuttujat set-käskyillä.
set(CPACK_PACKAGE_NAME ${PROJECT_NAME}
    CACHE STRING "The resulting package name"
)
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY ${PROJECT_DESCRIPTION}
    CACHE STRING "Package description for the package metadata"
)
set(CPACK_PACKAGE_VENDOR "Joku Yritys")
set(CPACK_VERBATIM_VARIABLES YES)
set(CPACK_PACKAGE_INSTALL_DIRECTORY ${CPACK_PACKAGE_NAME})
SET(CPACK_OUTPUT_FILE_PREFIX "${CMAKE_SOURCE_DIR}/_packages")
# https://unix.stackexchange.com/a/11552/254512
#set(CPACK_PACKAGING_INSTALL_PREFIX "/opt/some")#/${CMAKE_PROJECT_VERSION}")
# Tämä kommentoitiin, jotta paketti asennetaan
# oikeisiin hakemistoihin eikä:
# /opt/some-alikansioon.
set(CPACK_PACKAGE_VERSION_MAJOR ${PROJECT_VERSION_MAJOR})
set(CPACK_PACKAGE_VERSION_MINOR ${PROJECT_VERSION_MINOR})
set(CPACK_PACKAGE_VERSION_PATCH ${PROJECT_VERSION_PATCH})
set(CPACK_PACKAGE_CONTACT "YOUR@E-MAIL.net")
set(CPACK_DEBIAN_PACKAGE_MAINTAINER "YOUR NAME")
set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/LICENSE")
set(CPACK_RESOURCE_FILE_README "${CMAKE_CURRENT_SOURCE_DIR}/README.md")
# package name for deb. If set, then instead of
# some-application-0.9.2-Linux.deb
# you'll get some-application_0.9.2_amd64.deb
# (note the underscores too)
set(CPACK_DEBIAN_FILE_NAME DEB-DEFAULT)
# that is if you want every group to have its own package,
# although the same will happen if this is not set
# (so it defaults to ONE_PER_GROUP)
# and CPACK_DEB_COMPONENT_INSTALL is set to YES
set(CPACK_COMPONENTS_GROUPING ALL_COMPONENTS_IN_ONE) #ONE_PER_GROUP)
# without this you won't be able to pack only specified component
set(CPACK_DEB_COMPONENT_INSTALL YES)
set( CPACK_INSTALL_DEFAULT_DIRECTORY_PERMISSIONS
    OWNER_READ OWNER_WRITE OWNER_EXECUTE
    GROUP_READ  GROUP_EXECUTE
    WORLD_READ WORLD_EXECUTE
)
#Määritellään debian-paketin riippuvuudet.
set(CPACK_DEBIAN_PACKAGE_DEPENDS "libc6 (>= 2.7-18), libboost-all-dev (>= 1.83)")
#Määritellään riippuvuudet automaattisesti !!!
set(CPACK_DEBIAN_PACKAGE_SHLIBDEPS YES)
#Määritellään rpm-paketin riippuvuudet.
#set(CPACK_RPM_PACKAGE_REQUIRES "libboost_date_time_legacy >= 1.65")
set(CPACK_RPM_PACKAGE_REQUIRES "libboost_date_time_legacy >= 1.65")
set(CPACK_RPM_PACKAGE_AUTOREQ YES)
</syntaxhighlight>
Tässä siis kirjoitetiin cpack-ohjelmalle tarvitsemansa muuttujien arvot.
Lisää vielä include -rivi projektin juuren CMakeLists.txt-tiedoston loppupuolelle ennen include(CPack)-käskyä:
<syntaxhighlight lang=Cmake line start=44>
include ("cmake/Packing.cmake")
</syntaxhighlight>
Tiedosto CMakeLists.txt-tiedosto näyttää tältä:
<syntaxhighlight lang=Cmake line>
cmake_minimum_required(VERSION 3.21)
project(
    "eka-projekti"
    VERSION 0.1.0.2
    DESCRIPTION "Ensimmainen cmake-projektini"
    HOMEPAGE_URL "https://linux.fi"
    LANGUAGES "C" "CXX"
)
message("${PROJECT_NAME} on ensimmäinen projektimme, ja tässä on sen tiedot:")
message("Projektin versio on ${PROJECT_VERSION}")
message("Se koostuu neljästä osasta:")
message(${PROJECT_VERSION_MAJOR})
message(${PROJECT_VERSION_MINOR})
message(${PROJECT_VERSION_PATCH})
message(${PROJECT_VERSION_TWEAK})
message("Projektimme kuvaus on:${PROJECT_DESCRIPTION}")
message("Kotisivuksi olemme määritelleet tutun ${PROJECT_HOMEPAGE_URL}.")
find_package(boost_date_time REQUIRED)
configure_file(${CMAKE_SOURCE_DIR}/cmake/config.h.cmake ${CMAKE_SOURCE_DIR}/src/config.h)
add_library(mylib lib/mylib.cpp)
target_include_directories(mylib PUBLIC include)
add_executable("hello" "src/hello.cpp")
target_link_libraries(hello mylib boost_date_time)
# CPACK:n tarvitsemat käskyt
install(TARGETS hello )
# Deb-paketin ylläpitäjä eli paketin tekijä.
set(CPACK_DEBIAN_PACKAGE_MAINTAINER "Peran")
# Rpm-paketin myyjä. Laitoin samaksi, kuin Debian-paketin ylläpitäjä.
set(CPACK_RPM_PACKAGE_VENDOR ${CPACK_DEBIAN_PACKAGE_MAINTAINER})
set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
include("cmake/Packing.cmake")
include(CPack)
</syntaxhighlight>


==Käyttö==
==Käyttö==