CMake

Den aktuelle version af siden er endnu ikke blevet gennemgået af erfarne bidragydere og kan afvige væsentligt fra den version , der blev gennemgået den 12. oktober 2020; checks kræver 54 redigeringer .
CMake
Type Byg automatisering , gratis og open source software og hjælpeprogram
Forfatter Kitware Inc. [d]
Udvikler Kitware Inc. [d] , Alexander Neundorf [d] , Ken Martin [d] , Andrey Sedilnik [d] , William Hoffman [d] og Brad King [d]
Skrevet i C++ og C [2]
Interface Qt [3] [4] [5]
Operativ system Unix-lignende operativsystem [6] og Microsoft Windows [6]
Interface sprog engelsk
Første udgave 2000
Hardware platform tværplatform [7]
nyeste version
Stat aktiv
Licens modificeret BSD-licens [d] [8][9][10]
Internet side cmake.org
 Mediefiler på Wikimedia Commons

CMake ( MFA [ ˈ s i ː m e ɪ k ]; fra engelsk.  C ross-platform Make - " Cross- platform Make " [11] ) er et værktøj på tværs af platforme , der har evnen til at automatisere samlingen af ​​software fra kildekode . CMake selv bygger ikke direkte, men genererer kun build-filer fra en forudskrevet scriptfil " CMakeLists.txt " og giver en enkel, samlet administrationsgrænseflade. Derudover er CMake i stand til at automatisere processen med installation og emballering .

Det betragtes som et alternativ til det Perl- og M4 -baserede Autotools -system, der er almindeligt i GNU -fællesskabet , som kræver visse færdigheder til praktisk brug, og eksisterende versioner er i nogle tilfælde inkompatible med hinanden.

Sammenlignet med Autotools-alternativet, der blev introduceret i 2008, er de Python - baserede SCons hurtigere, fordi de er skrevet i C og bruger et ekstremt simpelt makrosprog , men SCons er meget udvidelsesdygtige.

Historie

Udviklingen af ​​CMake begyndte i 1999 som svar på et behov for et byggesystem på tværs af platforme til ITK [12] . Et projekt finansieret af US National Library of Medicine som en del af " Visible Human Project ". Udviklingsopgaven blev overdraget til et lille firma kaldet Kitware . Det var påvirket af et tidligere system kaldet "pcmaker" skabt af Ken Martin og andre for at understøtte Visualization Toolkit (VTK) [13] .

På det tidspunkt var det almindeligt at bruge konfigurationsscripts og lave filer til at bygge softwareprojekter på Unix-platforme og Visual Studio -projektfiler på Windows . Denne tilgang til udvikling medførte store besvær, da f.eks. tilføjelse af en almindelig kildekodefil til et projekt medførte store vanskeligheder, da det skulle gøres separat for hver platform og på helt forskellige måder. Det er klart, at udviklerne ønskede at have et enkelt, samlet byggesystem, der ikke var tidskrævende og havde alle fordelene ved eksisterende byggesystemer, men uden deres ulemper [14] [15] .

Funktioner

Nøglefunktionen er muligheden for (valgfrit) at placere compileroutput (såsom objektfiler) uden for kildetræet . Dette tillader flere variationer af builds fra den samme kildekode, såvel som krydskompilering . Denne tilgang til at adskille kilde- og build-filer sikrer, at sletning af build-mappen ikke fjerner kildekoden. Brugerne selv er dog ikke beskyttet mod utilsigtet sletning af kildebiblioteket [16] .

Tilpasset projektstruktur

CMake kan finde system- og brugermapper til eksekverbare filer, konfigurationsfiler og biblioteker. Disse placeringer gemmes i en cache , der kan konfigureres, før målbyggefilerne genereres. CMake-cachen kan redigeres ved hjælp af den grafiske editor, der følger med CMake, eller manuelt gennem kommandolinjeskallen ved hjælp af CMake-kommandoer.

Komplekse projektkataloghierarkier designet til forskellige konfigurationer, bygning med forskellige biblioteker og værktøjer er også godt understøttet af CMake. I det væsentlige giver CMake muligheden for at oprette delprojekter, der er bygget før opbygningen af ​​hovedprojektet, hvilket giver dig mulighed for at oprette afhængighedskæder, der er bygget i den korrekte rækkefølge, som udvikleren har brug for.

Understøttelse af forskellige udviklingsmiljøer

CMake kan generere projektfiler til flere populære IDE'er såsom Microsoft Visual Studio , Xcode og Eclipse CDT .

Det kan også oprette build-scripts til:

For at forenkle introduktionen af ​​CMake-understøttelse i nye IDE'er, anbefales det at bruge de forudindstillede filer " CMakePresets.json " [17] , for mere bekvem konfiguration af byggeprocessen, samt " File API " [18] , som indeholder alle nødvendige oplysninger til IDE.

Følgende IDE'er understøtter CMake indbygget [19] :

Kompilerunderstøttelse

CMake giver dig mulighed for at definere egenskaber, som compileren skal understøtte for at kompilere målprogrammet eller -biblioteket [20] .

CMake vedligeholder en omfattende liste over compilere [21] , som inkluderer:

Monteringsproces

Opbygning af et program eller bibliotek med CMake er en to-trins proces. Først oprettes (genereres) standard build-filer fra konfigurationsfiler ( CMakeLists.txt ), som er skrevet på CMake-sproget. Derefter bruges systembyggeværktøjerne (Make, Ninja osv.) til faktisk at bygge programmer [16] [22] .

Byggefilerne er konfigureret afhængigt af den anvendte generator (f.eks. er "Unix Makefiles"-generatoren til Makefiles). Avancerede brugere kan oprette og inkludere deres egne Make-filgeneratorer for at understøtte nye compilere og operativsystemer. De genererede filer placeres normalt (ved hjælp af et CMake-flag) i en ekstern mappe, uden for kildefilerne, såsom i " build "-mappen.

Hvert projekt efter bygning, i undermapper, indeholder " CMakeCache.txt " og en mappe med Make-filer, som hjælper med at undgå eller fremskynde "regenerering"-trinnet efter genstart af build [23] .

Byg måltyper

Afhængigt af konfigurationen af ​​CMakeLists.txt og det valgte mål, kan build-filer oprette:

CMake kan oprette objektfiler, der kan linkes til eksekverbare binære filer/biblioteker ved at undgå dynamisk (runtime) linking og bruge statisk (kompileringstid) linking i stedet. Dette giver fleksibilitet ved opsætning af forskellige optimeringer (build-afhængigheder kan bestemmes automatisk) [24] .

Forkompilerede header-filer

Siden CMake 3.6 kan du oprette prækompilerede header-filer [25] .

Sprog

CMake har et relativt simpelt fortolket imperativt scriptsprog . Det understøtter variabler , strengmanipulationsmetoder , arrays , funktions- og makrodeklarationer , modulinkludering (import). CMake sprogkommandoer (eller direktiver) læses af CMake fra filen CMakeLists.txt . Denne fil specificerer de kildefiler og build-indstillinger, som CMake placerer i projektets build-specifikation (f.eks. i en Make-fil). Derudover kan filer med præfiks med .cmake indeholde scripts brugt af CMake [26] .

Kommandosyntaks

Kommandoargumenter er adskilt af mellemrum og kan indeholde nøgleord til adskille grupper af argumenter. For eksempel i kommandoen

# Installer kommando installer ( TARGETS ... # TARGETS CONFIGURATIONS ... # CONFIGURATIONS (Debug, Release...) RUNTIME DESTINATION ... ) # (Eksekverbar, MACOSX_BUNDLE, DLL) DESTINATION

nøgleordene er TARGETS, CONFIGURATIONSog RUNTIME DESTINATION. I dette tilfælde tjener TARGETSde CONFIGURATIONSsom adskillere mellem "mål" og "konfigurationer" [27] .

Eksempler på CMake-kommandoer, der definerer mål og deres afhængigheder [28] [29] [30] :

  • add_executable(...)- definerer målet (den eksekverbare fil, for eksempel .exe , afhænger af målplatformen);
  • add_library(...)- definerer målet (bibliotek, for eksempel .so eller .dll );
  • target_link_libraries(...)— bestemmer afhængighederne af det specificerede mål.

JSON-understøttelse

CMake understøtter udtrækning af dataværdier til variabler fra JSON -strenge (siden version 3.19) [31] .

Moduler og værktøjer

CMake kommer med en masse " .cmake " moduler og værktøjer. De gør det nemt at gøre ting som at finde afhængigheder (både indbyggede og eksterne, såsom FindXYZ- moduler), værktøjer til at teste eksekverbare filer, pakke ( CPack- modulet og cpack- kommandoen ) og administrere afhængigheder fra eksterne projekter (det eksterne projekt modul ) [32] [ 33] :

  • ctest - bruges til at teste målene specificeret i CMakeLists.txt ;
  • ccmake og cmake -gui - opsætter og opdaterer konfigurationsvariabler beregnet til målbyggesystemet;
  • cpack - Hjælper med at pakke og installere software.

CPak

Fra og med version 2.4.2 [34] inkluderer CMake det automatiserede CPack -byggesystem til softwarepakker og CMake-modulet til at interagere med det. Systemet giver dig mulighed for at oprette softwarepakker til populære pakkeadministratorer ( DEB , RPM , DMG ), softwareinstallationsprogram ( NSIS til Microsoft Windows ), samt bygge arkiver ( TGZ , TBZ2 , ZIP , selvudpakkende TGZ ) [35] .

Softwareprojekter ved hjælp af CMake

CMake er blevet meget udbredt blandt open source-projekter, såvel som blandt kommercielle og akademiske softwareprojekter.

Open source-projekter

Videnskabelige forskningsprojekter

Softwaren brugt i ATLAS-eksperimentet er bygget ved hjælp af CMake. Selve softwaren er skrevet i C/C++ og Python [38] .

Et forskningsinstitut i Frankrig, INRIA , har anvendt CMake til medicinsk forskning i SOFA [39] projektet .

Lukket kilde-virksomheder og -projekter

Eksempel

Et eksempel på et simpelt Hej, verden! » projekt i CMake.

# Fil - "CMakeLists.txt" cmake_minimum_required ( VERSION 3.16 ) # Vælg den mindst nødvendige version af cmake project ( my_project ) # Giv projektet et navn add_executable ( # Opret et mål (eksekverbar) ${ PROJECT_NAME } # Filnavn main.cpp # Liste over kildekodefiler ) # Ingen grund til at tilføje header-filer installer ( # Angiv målet og installationsstien MÅL ${ PROJECT_NAME } # Sti tilføjet til præfikset RUNTIME DESTINATION bin # bin - binær (sti til eksekverbare filer) ) # Standardpræfiks for UNIX-systemer # "/usr/local" + "/bin" // fil - "main.cpp" # inkluderer <iostream> int main () { std :: cout << "Hej, verden!" << std :: endl ; returnere 0 ; }

Samlingen udføres ved hjælp af følgende kommandoer i mappen med filerne:

$ cmake . # Kald for at generere build-filer $ cmake --build. # Vi indsamler målet, outputtet er en eksekverbar fil $ cmake --install . # Installer om nødvendigt

Samtidig er det muligt at få hjælpeoplysninger om et separat element i CMake-sproget og dets kommandoer.

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

Se også

Noter

  1. CMake 3.24.3 er tilgængelig til download
  2. cmake Open Source-projektet på Open Hub: Languages-side - 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. cmake Open Source-projektet på Open Hub: Licensside - 2006.
  10. https://cmake.org/licensing/
  11. Omfavnelse af moderne CMake Sådan genkender og bruger moderne CMake-grænseflader  ( PDF). Hentet 4. april 2022. Arkiveret fra originalen 20. januar 2022.
  12. FLOSS Weekly 111:  CMake . podcast. TWIT netværk. . Hentet 19. januar 2022. Arkiveret fra originalen 6. oktober 2014.
  13. Om CMake  . cmake.org . Hentet 15. marts 2022. Arkiveret fra originalen 14. marts 2022.
  14. Oversættelse af kapitlet om CMake fra The Architecture of Open Source Applications . rus-linux.net (28. august 2012). Hentet 19. januar 2022. Arkiveret fra originalen 7. maj 2021.
  15. ↑ CMake-kapitlet fra The Architecture of Open Source Applications  . aosabook.org (2012). Dato for adgang: 19. januar 2022. Arkiveret fra originalen den 7. april 2022.
  16. 1 2 Alexander Neundorf. Hvorfor KDE- projektet skiftede til CMake - og hvordan  . lwn.net (21. juni 2006). Hentet 19. januar 2022. Arkiveret fra originalen 20. november 2021.
  17. ↑ CMake dokumentation : IDE Integration Guide  . cmake.org . Hentet 26. januar 2022. Arkiveret fra originalen 26. januar 2022.
  18. CMake-dokumentation: cmake-file-api(7  ) . cmake.org . Hentet 26. januar 2022. Arkiveret fra originalen 26. januar 2022.
  19. ↑ CMake-dokumentation : IDE'er med CMake-integration . cmake.org . Hentet: 11. juli 2022.  
  20. CMør kompileringsfunktionen til at detektere  . scivision.dev (15. november 2020). Hentet 4. april 2022. Arkiveret fra originalen 22. januar 2022.
  21. Understøttede kompilatorer  . CMake.org . Hentet 4. april 2022. Arkiveret fra originalen 21. februar 2022.
  22. CMake-dokumentation: cmake-toolchains(7  ) . cmake.org . Hentet 19. januar 2022. Arkiveret fra originalen 19. januar 2022.
  23. Daniel Pfeifer. Effektiv CMake  (engelsk) (PDF). GitHub (19. maj 2017). Hentet 19. januar 2022. Arkiveret fra originalen 19. januar 2022.
  24. ↑ CMake-dokumentation : cmake-buildsystem(7) - Objektbiblioteker  . cmake.org . Hentet 19. januar 2022. Arkiveret fra originalen 19. januar 2022.
  25. ↑ CMake-dokumentation : målprækompilere overskrifter  . cmake.org . Hentet 19. januar 2022. Arkiveret fra originalen 19. januar 2022.
  26. CMake-dokumentation: cmake-language(7  ) . cmake.org . Hentet 19. januar 2022. Arkiveret fra originalen 21. februar 2022.
  27. Andrey Sedilnik. Softwareudvikling på tværs af platforme ved hjælp af CMake  . linuxjournal (3. oktober 2003). Hentet 19. januar 2022. Arkiveret fra originalen 19. januar 2022.
  28. ↑ CMake-dokumentation : cmake-commands(7) - add_executable  . cmake.org . Hentet 19. januar 2022. Arkiveret fra originalen 19. januar 2022.
  29. ↑ CMake-dokumentation : cmake-commands(7) - add_library  . cmake.org . Hentet 19. januar 2022. Arkiveret fra originalen 19. januar 2022.
  30. ↑ CMake-dokumentation : cmake-commands(7) - target_link_libraries  . cmake.org . Hentet 19. januar 2022. Arkiveret fra originalen 19. januar 2022.
  31. ↑ CMake-dokumentation : CMake 3.19 Release Notes  . cmake.org . Hentet 19. januar 2022. Arkiveret fra originalen 29. april 2022.
  32. CMake-dokumentation: cmake-modules(7  ) . cmake.org . Hentet 19. januar 2022. Arkiveret fra originalen 9. december 2021.
  33. ↑ CMake-dokumentation : cmake-modules(7) - ExternalProject  . cmake.org . Hentet 19. januar 2022. Arkiveret fra originalen 21. februar 2022.
  34. CMake:Packaging With CPack -  KitwarePublic . gitlab . Hentet 19. januar 2022. Arkiveret fra originalen 19. januar 2022.
  35. CMake:CPackPackageGenerators -  KitwarePublic . gitlab . Hentet 19. januar 2022. Arkiveret fra originalen 19. januar 2022.
  36. Blender wiki - Building  Blender . blender.org . Dato for adgang: 19. januar 2022. Arkiveret fra originalen 24. januar 2022.
  37. ↑ KDE anvender CMake  . kitware.com . Hentet 15. marts 2022. Arkiveret fra originalen 14. marts 2022.
  38. J. Elmsheuser, A. Krasznahorkay, E. Obreshkov, A. Undrus. Softwarebygning i stor skala med CMake i ATLAS  ( PDF). CERN . Hentet 19. januar 2022. Arkiveret fra originalen 10. november 2021.
  39. ↑ Konvertering af SOFA til CMake  . kitware.com . Hentet 15. marts 2022. Arkiveret fra originalen 14. marts 2022.
  40. ↑ CMake, CTest og CDash på Netflix  . kitware.com . Hentet 15. marts 2022. Arkiveret fra originalen 14. marts 2022.
  41. Second Life vælger CMake som sit  byggesystem . kitware.com . Hentet 15. marts 2022. Arkiveret fra originalen 14. marts 2022.

Links