CMake

Versiunea actuală a paginii nu a fost încă examinată de colaboratori experimentați și poate diferi semnificativ de versiunea revizuită pe 12 octombrie 2020; verificările necesită 54 de modificări .
CMake
Tip de Creați automatizare , software gratuit și open source și utilitare
Autor Kitware Inc. [d]
Dezvoltator Kitware Inc. [d] , Alexander Neundorf [d] , Ken Martin [d] , Andrey Sedilnik [d] , William Hoffman [d] și Brad King [d]
Scris in C++ și C [2]
Interfață Qt [3] [4] [5]
Sistem de operare Sistem de operare asemănător Unix [6] și Microsoft Windows [6]
Limbi de interfață Engleză
Prima editie 2000
Platformă hardware multiplatformă [7]
ultima versiune
Stat activ
Licență licență BSD modificată [d] [8][9][10]
Site-ul web cmake.org
 Fișiere media la Wikimedia Commons

CMake ( MFA [ ˈ s i ː m e ɪ k ]; din engleză.  Cross -platform Make - „ Cross- platform Make” [11] ) este un utilitar multiplatformă care are capacitatea de a automatiza asamblarea software-ului din cod sursă . CMake în sine nu construiește direct, ci generează doar fișiere de compilare dintr-un fișier script pre-scris „ CMakeLists.txt ” și oferă o interfață de management simplă și unificată. În plus, CMake este capabil să automatizeze procesul de instalare și ambalare .

Este considerată o alternativă la sistemul Autotools bazat pe Perl și M4 , comun în comunitatea GNU , care necesită anumite abilități pentru utilizare practică, iar versiunile existente sunt în unele cazuri incompatibile între ele.

În comparație cu alternativa Autotools introdusă în 2008, SCons bazat pe Python este mai rapid deoarece este scris în C și folosește un limbaj macro extrem de simplu , dar SCons este foarte extensibil.

Istorie

Dezvoltarea CMake a început în 1999 ca răspuns la necesitatea unui sistem de construcție multiplatformă pentru ITK [12] . Un proiect finanțat de Biblioteca Națională de Medicină din SUA ca parte a „ Visible Human Project ”. Sarcina de dezvoltare a fost încredințată unei mici companii numite Kitware . A fost influențat de un sistem anterior numit „pcmaker” creat de Ken Martin și alții pentru a sprijini Visualization Toolkit (VTK) [13] .

La acea vreme, era obișnuit să se folosească scripturi de configurare și să creeze fișiere pentru a construi proiecte software pe platformele Unix și fișiere de proiect Visual Studio pe Windows . Această abordare a dezvoltării a cauzat mari inconveniente, deoarece, de exemplu, adăugarea unui fișier cod sursă obișnuit la un proiect a dus la mari dificultăți, deoarece trebuia făcută separat pentru fiecare platformă și în moduri complet diferite. În mod evident, dezvoltatorii doreau să aibă un singur sistem de construcție unificat, care să nu consume timp și să aibă toate avantajele sistemelor de construcție existente, dar fără dezavantajele acestora [14] [15] .

Caracteristici

Caracteristica cheie este capacitatea de a plasa (opțional) rezultatul compilatorului (cum ar fi fișierele obiect) în afara arborelui sursă . Acest lucru permite mai multe variante de versiuni din același cod sursă, precum și compilarea încrucișată . Această abordare de separare a fișierelor sursă și de compilare asigură că ștergerea directorului de compilare nu elimină codul sursă. Cu toate acestea, utilizatorii înșiși nu sunt protejați de ștergerea accidentală a directorului sursă [16] .

Structură personalizată a proiectului

CMake poate găsi directoare la nivel de sistem și de utilizator pentru executabile, fișiere de configurare și biblioteci. Aceste locații sunt stocate într-un cache care poate fi configurat înainte ca fișierele de compilare țintă să fie generate. Cache-ul CMake poate fi editat folosind editorul grafic care vine cu CMake sau manual prin shell-ul liniei de comandă folosind comenzile CMake.

Ierarhiile complexe de directoare de proiect concepute pentru diferite configurații, construirea cu biblioteci și instrumente diferite sunt, de asemenea, bine susținute de CMake. În esență, CMake oferă capacitatea de a crea subproiecte care sunt construite înainte de a construi proiectul principal, ceea ce vă permite să creați lanțuri de dependențe care sunt construite în secvența corectă necesară dezvoltatorului.

Suport pentru diferite medii de dezvoltare

CMake poate genera fișiere de proiect pentru mai multe IDE -uri populare, cum ar fi Microsoft Visual Studio , Xcode și Eclipse CDT .

De asemenea, poate crea scripturi de compilare pentru:

Pentru a simplifica introducerea suportului CMake în noile IDE-uri, se recomandă utilizarea fișierelor presetate „ CMakePresets.json ” [17] , pentru o configurare mai convenabilă a procesului de construire, precum și „ Fișier API[18] , care conține toate informațiile necesare pentru IDE.

Următoarele IDE-uri suportă CMake nativ [19] :

Suport pentru compilator

CMake vă permite să definiți proprietățile pe care compilatorul trebuie să le suporte pentru a compila programul sau biblioteca țintă [20] .

CMake menține o listă extinsă de compilatoare [21] care include:

Procesul de asamblare

Construirea unui program sau a unei biblioteci cu CMake este un proces în doi pași. În primul rând, fișierele de compilare standard sunt create (generate) din fișierele de configurare ( CMakeLists.txt ), care sunt scrise în limbajul CMake. Apoi instrumentele de construire a sistemului (Make, Ninja, etc.) sunt folosite pentru a construi efectiv programe [16] [22] .

Fișierele de compilare sunt configurate în funcție de generatorul utilizat (de exemplu, generatorul „Unix Makefiles” este pentru Makefiles). Utilizatorii avansați își pot crea și include propriile generatoare de fișiere Make pentru a suporta noi compilatoare și sisteme de operare. Fișierele generate sunt de obicei plasate (folosind un flag CMake) într-un director extern, în afara fișierelor sursă, cum ar fi în directorul „ build ”.

Fiecare proiect după construcție, în subdirectoare conține „ CMakeCache.txt ” și un director de fișiere Make, care ajută la evitarea sau accelerarea pasului de „regenerare”, după repornirea build-ului [23] .

Construiți tipuri de țintă

În funcție de configurația CMakeLists.txt și de ținta aleasă, fișierele de compilare pot crea:

CMake poate crea fișiere obiect care pot fi legate la binare/biblioteci executabile, evitând legăturile dinamice (de execuție) și folosind în schimb legăturile statice (timpul de compilare). Acest lucru oferă flexibilitate în configurarea diferitelor optimizări (dependențele de construire pot fi determinate automat) [24] .

Fișiere antet precompilate

Începând cu CMake 3.6, puteți crea fișiere de antet precompilate [25] .

Limba

CMake are un limbaj de scripting imperativ interpretat relativ simplu . Suportă variabile , metode de manipulare a șirurilor de caractere , matrice , declarații de funcții și macro , includerea modulelor (import). Comenzile (sau directivele) limbajului CMake sunt citite de CMake din fișierul CMakeLists.txt . Acest fișier specifică fișierele sursă și opțiunile de compilare pe care CMake le plasează în specificația de construcție a proiectului (de exemplu, într-un fișier Make). În plus, fișierele prefixate cu .cmake pot conține scripturi utilizate de CMake [26] .

Sintaxa comenzii

Argumentele comenzii sunt separate prin spații și pot conține cuvinte cheie pentru a separa grupuri de argumente. De exemplu, în comandă

# Instalare comanda de instalare ( ȚINTE ... # ȚINTE CONFIGURAȚII ... # CONFIGURAȚII (Depanare, Lansare...) RUNTIME DESTINATION ... ) # (Executabil, MACOSX_BUNDLE, DLL) DESTINAȚIE

cuvintele cheie sunt TARGETS, CONFIGURATIONSși RUNTIME DESTINATION. În acest caz TARGETS, ele CONFIGURATIONSservesc ca separatori între „obiective” și „configurații” [27] .

Exemple de comenzi CMake care definesc ținte și dependențele acestora [28] [29] [30] :

  • add_executable(...)- definește ținta (fișierul executabil, de exemplu .exe , depinde de platforma țintă);
  • add_library(...)- definește ținta (biblioteca, de exemplu .so sau .dll );
  • target_link_libraries(...)— determină dependențele țintei specificate.

Suport JSON

CMake acceptă extragerea valorilor datelor în variabile din șiruri JSON (începând cu versiunea 3.19) [31] .

Module și instrumente

CMake vine cu o mulțime de module și instrumente „ .cmake ”. Ele ușurează să faci lucruri precum căutarea dependențelor (atât încorporate, cât și externe, cum ar fi modulele FindXYZ ), instrumente pentru testarea executabilelor, ambalarea ( modulul CPack și comanda cpack ) și gestionarea dependențelor din proiecte externe ( ExternalProject ). modul ) [32] [ 33] :

  • ctest - folosit pentru a testa obiectivele specificate în CMakeLists.txt ;
  • ccmake și cmake-gui - setează și actualizează variabilele de configurare destinate sistemului de construcție țintă;
  • cpack - Ajută la pachetul și instalarea software-ului.

CPack

Începând cu versiunea 2.4.2 [34] , CMake include sistemul de construcție automată CPack pentru pachetele software și modulul CMake pentru interacțiunea cu acesta. Sistemul vă permite să creați pachete software pentru managerii de pachete populari ( DEB , RPM , DMG ), instalator de software ( NSIS pentru Microsoft Windows ), precum și să construiți arhive ( TGZ , TBZ2 , ZIP , TGZ autoextractabil ) [35] .

Proiecte software care folosesc CMake

CMake a devenit foarte răspândit printre proiectele open source, precum și printre proiectele software comerciale și academice.

Proiecte open source

Proiecte de cercetare științifică

Software-ul folosit în experimentul ATLAS este construit folosind CMake. Software-ul în sine este scris în C/C++ și Python [38] .

Un institut de cercetare din Franța, INRIA , a aplicat CMake cercetării medicale în cadrul proiectului SOFA [39] .

Companii și proiecte cu sursă închisă

Exemplu

Un exemplu de simplu Hello, World! » proiect în CMake.

# Fișier - „CMakeLists.txt” cmake_minimum_required ( VERSIUNEA 3.16 ) # Selectați versiunea minimă necesară de cmake proiect ( my_project ) # Dați un nume proiectului add_executable ( # Creați o țintă (executable) ${ PROJECT_NAME } # Nume fișier main.cpp # Lista fișierelor de cod sursă ) # Nu este nevoie să adăugați fișiere de antet install ( # Specificați ținta și calea de instalare ȚINTE ${ PROJECT_NAME } # Cale atașată la prefix RUNTIME DESTINATION bin # bin - binar (calea către fișierele executabile) ) # Prefix standard pentru sistemele UNIX # "/usr/local" + "/bin" // fișier - "main.cpp" # include <iostream> int main () { std :: cout << "Bună ziua, lume!" << std :: endl ; returnează 0 ; }

Asamblarea se realizează folosind următoarele comenzi în directorul cu fișierele:

$ cmake . # Apelați pentru a genera fișiere de compilare $ cmake --build . # Colectăm ținta, rezultatul este un fișier executabil $ cmake --install . # Dacă este necesar, instalați

În același timp, este posibil să obțineți informații de ajutor despre un element separat al limbajului CMake și comenzile acestuia.

$ cmake --help $ cmake --help-command-list $ cmake --help-command install

Vezi și

Note

  1. CMake 3.24.3 este disponibil pentru descărcare
  2. Proiectul cmake Open Source pe Open Hub: Pagina de limbi - 2006.
  3. https://cmake.org/cmake/help/latest/manual/cmake-gui.1.html
  4. https://cmake.org/runningcmake
  5. https://gitlab.kitware.com/cmake/cmake
  6. 1 2 https://cmake.org/download/
  7. https://cmake.org/
  8. https://gitlab.kitware.com/cmake/cmake/blob/master/Copyright.txt
  9. Proiectul cmake Open Source pe Open Hub: Pagina de licențe - 2006.
  10. https://cmake.org/licensing/
  11. Embracing Modern CMake Cum să recunoașteți și să utilizați interfețele moderne CMake  ( PDF). Preluat la 4 aprilie 2022. Arhivat din original la 20 ianuarie 2022.
  12. FLOSS Săptămânal 111:  CMake . podcast. Rețeaua TWIT. . Preluat la 19 ianuarie 2022. Arhivat din original la 6 octombrie 2014.
  13. Despre CMake  . cmake.org . Preluat la 15 martie 2022. Arhivat din original la 14 martie 2022.
  14. Traducerea capitolului despre CMake din The Architecture of Open Source Applications . rus-linux.net (28 august 2012). Preluat la 19 ianuarie 2022. Arhivat din original la 7 mai 2021.
  15. ↑ Capitolul CMake din Arhitectura aplicațiilor cu sursă deschisă  . aosabook.org (2012). Data accesului: 19 ianuarie 2022. Arhivat din original pe 7 aprilie 2022.
  16. 1 2 Alexander Neundorf. De ce proiectul KDE a trecut la CMake - și cum  . lwn.net (21 iunie 2006). Preluat la 19 ianuarie 2022. Arhivat din original la 20 noiembrie 2021.
  17. ↑ Documentația CMake : Ghid de integrare IDE  . cmake.org . Preluat la 26 ianuarie 2022. Arhivat din original la 26 ianuarie 2022.
  18. Documentația CMake: cmake-file-api(7  ) . cmake.org . Preluat la 26 ianuarie 2022. Arhivat din original la 26 ianuarie 2022.
  19. ↑ Documentația CMake : IDE-uri cu integrare CMake . cmake.org . Preluat: 11 iulie 2022.  
  20. Detectarea caracteristicii compilatorului  CMake . scivision.dev (15 noiembrie 2020). Consultat la 4 aprilie 2022. Arhivat din original pe 22 ianuarie 2022.
  21. Compilatoare  acceptate . CMake.org . Consultat la 4 aprilie 2022. Arhivat din original pe 21 februarie 2022.
  22. Documentația CMake: cmake-toolchains(7  ) . cmake.org . Preluat la 19 ianuarie 2022. Arhivat din original la 19 ianuarie 2022.
  23. Daniel Pfeifer. CMake efectiv  (engleză) (PDF). GitHub (19 mai 2017). Preluat la 19 ianuarie 2022. Arhivat din original la 19 ianuarie 2022.
  24. ↑ Documentația CMake : cmake-buildsystem(7) - Biblioteci de obiecte  . cmake.org . Preluat la 19 ianuarie 2022. Arhivat din original la 19 ianuarie 2022.
  25. ↑ Documentația CMake : antete de precompilare țintă  . cmake.org . Preluat la 19 ianuarie 2022. Arhivat din original la 19 ianuarie 2022.
  26. Documentația CMake: cmake-language(7  ) . cmake.org . Preluat la 19 ianuarie 2022. Arhivat din original la 21 februarie 2022.
  27. Andrei Sedilnik. Dezvoltare software multiplatformă folosind CMake  . linuxjournal (3 octombrie 2003). Preluat la 19 ianuarie 2022. Arhivat din original la 19 ianuarie 2022.
  28. ↑ Documentația CMake : cmake-commands(7) - add_executable  . cmake.org . Preluat la 19 ianuarie 2022. Arhivat din original la 19 ianuarie 2022.
  29. ↑ Documentația CMake : cmake-commands(7) - add_library  . cmake.org . Preluat la 19 ianuarie 2022. Arhivat din original la 19 ianuarie 2022.
  30. ↑ Documentația CMake : cmake-commands(7) - target_link_libraries  . cmake.org . Preluat la 19 ianuarie 2022. Arhivat din original la 19 ianuarie 2022.
  31. ↑ Documentația CMake : Note de lansare CMake 3.19  . cmake.org . Preluat la 19 ianuarie 2022. Arhivat din original la 29 aprilie 2022.
  32. Documentația CMake: cmake-modules(7  ) . cmake.org . Preluat la 19 ianuarie 2022. Arhivat din original la 9 decembrie 2021.
  33. ↑ Documentația CMake : cmake-modules(7) - ExternalProject  . cmake.org . Preluat la 19 ianuarie 2022. Arhivat din original la 21 februarie 2022.
  34. CMake:Ambalare cu CPack -  KitwarePublic . gitlab . Preluat la 19 ianuarie 2022. Arhivat din original la 19 ianuarie 2022.
  35. CMake:CPackPackageGenerators -  KitwarePublic . gitlab . Preluat la 19 ianuarie 2022. Arhivat din original la 19 ianuarie 2022.
  36. Blender wiki - Construirea  Blenderului . blender.org . Data accesului: 19 ianuarie 2022. Arhivat din original pe 24 ianuarie 2022.
  37. ↑ KDE adoptă CMake  . kitware.com . Preluat la 15 martie 2022. Arhivat din original la 14 martie 2022.
  38. J. Elmsheuser, A. Krasznahorkay, E. Obreshkov, A. Undrus. Creare software la scară largă cu CMake în ATLAS  ( PDF). CERN . Preluat la 19 ianuarie 2022. Arhivat din original la 10 noiembrie 2021.
  39. ↑ Convertirea SOFA în CMake  . kitware.com . Preluat la 15 martie 2022. Arhivat din original la 14 martie 2022.
  40. ↑ CMake, CTest și CDash la Netflix  . kitware.com . Preluat la 15 martie 2022. Arhivat din original la 14 martie 2022.
  41. Second Life alege CMake ca  sistem de construcție . kitware.com . Preluat la 15 martie 2022. Arhivat din original la 14 martie 2022.

Link -uri