CMake | |
---|---|
Sorts | Bygg automation , gratis och öppen källkodsprogram och verktyg |
Författare | Kitware Inc. [d] |
Utvecklaren | Kitware Inc. [d] , Alexander Neundorf [d] , Ken Martin [d] , Andrey Sedilnik [d] , William Hoffman [d] och Brad King [d] |
Skrivet i | C++ och C [2] |
Gränssnitt | Qt [3] [4] [5] |
Operativ system | Unix-liknande operativsystem [6] och Microsoft Windows [6] |
Gränssnittsspråk | engelsk |
Första upplagan | 2000 |
Hårdvaruplattform | plattformsoberoende [7] |
senaste versionen |
|
stat | aktiva |
Licens | modifierad BSD-licens [d] [8][9][10] |
Hemsida | cmake.org _ |
Mediafiler på Wikimedia Commons |
CMake ( MFA [ ˈ s i ː m e ɪ k ]; från engelska. C ross-platform Make - " Cross- platform Make " [11] ) är ett plattformsoberoende verktyg som har förmågan att automatisera sammansättningen av programvara från källkod . CMake själv bygger inte direkt, utan genererar bara byggfiler från en förskriven skriptfil " CMakeLists.txt " och ger ett enkelt, enhetligt hanteringsgränssnitt. Dessutom kan CMake automatisera processen för installation och förpackning .
Det anses vara ett alternativ till det Perl- och M4 -baserade Autotools- systemet som är vanligt i GNU -gemenskapen , vilket kräver vissa färdigheter för praktisk användning, och befintliga versioner är i vissa fall inkompatibla med varandra.
Jämfört med Autotools-alternativet som introducerades 2008, är de Python - baserade SCons snabbare eftersom det är skrivet i C och använder ett extremt enkelt makrospråk , men SCons är mycket utbyggbart.
Utvecklingen av CMake började 1999 som svar på ett behov av ett plattformsoberoende byggsystem för ITK [12] . Ett projekt finansierat av US National Library of Medicine som en del av " Visible Human Project ". Utvecklingsuppdraget anförtroddes till ett litet företag som heter Kitware . Det var influerat av ett tidigare system kallat "pcmaker" skapat av Ken Martin och andra för att stödja Visualization Toolkit (VTK) [13] .
På den tiden var det vanligt att använda konfigurationsskript och skapa filer för att bygga programvaruprojekt på Unix-plattformar och Visual Studio- projektfiler på Windows . Detta förhållningssätt till utveckling medförde stora besvär, eftersom att till exempel lägga till en vanlig källkodsfil i ett projekt ledde till stora svårigheter, eftersom det måste göras separat för varje plattform och på helt olika sätt. Uppenbarligen ville utvecklarna ha ett enda enhetligt byggsystem som inte var tidskrävande och som hade alla fördelar med befintliga byggsystem, men utan deras nackdelar [14] [15] .
Nyckelfunktionen är möjligheten att (valfritt) placera kompilatorns utdata (som objektfiler) utanför källträdet . Detta tillåter flera varianter av builds från samma källkod, såväl som korskompilering . Detta tillvägagångssätt att separera käll- och byggfiler säkerställer att borttagning av byggkatalogen inte tar bort källkoden. Användarna själva är dock inte skyddade från oavsiktlig radering av källkatalogen [16] .
CMake kan hitta systemomfattande och användarkataloger för körbara filer, konfigurationsfiler och bibliotek. Dessa platser lagras i en cache som kan konfigureras innan målbyggefilerna genereras. CMake-cachen kan redigeras med den grafiska editorn som följer med CMake, eller manuellt genom kommandoradsskalet med CMake-kommandon.
Komplexa projektkataloghierarkier designade för olika konfigurationer, byggnad med olika bibliotek och verktyg stöds också väl av CMake. I huvudsak ger CMake möjligheten att skapa delprojekt som byggs innan huvudprojektet byggs, vilket gör att du kan skapa beroendekedjor som är byggda i rätt ordning som utvecklaren behöver.
CMake kan generera projektfiler för flera populära IDE:er som Microsoft Visual Studio , Xcode och Eclipse CDT .
Det kan också skapa byggskript för:
För att förenkla introduktionen av CMake-stöd i nya IDE:er rekommenderas att använda de förinställda filerna " CMakePresets.json " [17] , för mer bekväm konfiguration av byggprocessen, samt " File API " [18] , som innehåller all information som behövs för IDE.
Följande IDE:er stöder CMake inbyggt [19] :
CMake låter dig definiera egenskaper som kompilatorn måste stödja för att kompilera målprogrammet eller biblioteket [20] .
CMake har en omfattande lista över kompilatorer [21] som inkluderar:
Att bygga ett program eller bibliotek med CMake är en process i två steg. Först skapas (genereras) standardfiler från konfigurationsfiler ( CMakeLists.txt ), som är skrivna på CMake-språket. Sedan används systembyggverktygen (Make, Ninja, etc.) för att faktiskt bygga program [16] [22] .
Byggfilerna konfigureras beroende på vilken generator som används (till exempel är "Unix Makefiles"-generatorn för Makefiles). Avancerade användare kan skapa och inkludera sina egna Make-filgeneratorer för att stödja nya kompilatorer och operativsystem. De genererade filerna placeras vanligtvis (med en CMake-flagga) i en extern katalog, utanför källfilerna, till exempel i katalogen " bygg ".
Varje projekt efter byggnad, i underkataloger innehåller " CMakeCache.txt " och en katalog med Make-filer, vilket hjälper till att undvika eller påskynda "regenereringssteget", efter omstart av bygget [23] .
Beroende på konfigurationen av CMakeLists.txt och det valda målet, kan byggfiler skapa:
CMake kan skapa objektfiler som kan länkas till körbara binärer/bibliotek genom att undvika dynamisk (runtime) länkning och använda statisk (kompileringstid) länkning istället. Detta ger flexibilitet vid inställning av olika optimeringar (byggberoenden kan bestämmas automatiskt) [24] .
Sedan CMake 3.6 kan du skapa förkompilerade header-filer [25] .
CMake har ett relativt enkelt , tolkat imperativt skriptspråk . Den stöder variabler , metoder för strängmanipulering , arrayer , funktions- och makrodeklarationer , modulinkludering (import). CMake språkkommandon (eller direktiv) läses av CMake från filen CMakeLists.txt . Den här filen anger källfilerna och byggalternativen som CMake placerar i projektets byggspecifikation (till exempel i en Make-fil). Dessutom kan filer med prefixet .cmake innehålla skript som används av CMake [26] .
Kommandoargument separeras med mellanslag och kan innehålla nyckelord för att separera grupper av argument. Till exempel i kommandot
# Installera kommandot install ( TARGETS ... # TARGETS CONFIGURATIONS ... # CONFIGURATIONS (Debug, Release...) RUNTIME DESTINATION ... ) # (Executable, MACOSX_BUNDLE, DLL) DESTINATIONnyckelorden är TARGETS, CONFIGURATIONSoch RUNTIME DESTINATION. I det här fallet fungerar TARGETSde som separatorer mellan "mål" och "konfigurationer" [27] . CONFIGURATIONS
Exempel på CMake-kommandon som definierar mål och deras beroenden [28] [29] [30] :
CMake stöder extrahering av datavärden till variabler från JSON- strängar (sedan version 3.19) [31] .
CMake kommer med många " .cmake "-moduler och verktyg. De gör det enkelt att göra saker som att leta upp beroenden (både inbyggda och externa, som FindXYZ- moduler), verktyg för att testa körbara filer, paketera ( CPack- modulen och cpack- kommandot ) och hantera beroenden från externa projekt ( ExternalProject modul ) [32] [ 33] :
Från och med version 2.4.2 [34] inkluderar CMake det automatiska byggsystemet CPack för mjukvarupaket och CMake-modulen för att interagera med det. Systemet låter dig skapa mjukvarupaket för populära pakethanterare ( DEB , RPM , DMG ), programvaruinstallerare ( NSIS för Microsoft Windows ), samt bygga arkiv ( TGZ , TBZ2 , ZIP , självextraherande TGZ ) [35] .
CMake har blivit mycket utbrett bland projekt med öppen källkod, såväl som bland kommersiella och akademiska programvaruprojekt.
Mjukvaran som används i ATLAS-experimentet är byggd med CMake. Själva programvaran är skriven i C/C++ och Python [38] .
Ett forskningsinstitut i Frankrike, INRIA , har tillämpat CMake på medicinsk forskning i SOFA [39] -projektet .
Ett exempel på en enkel Hello, World! » projekt i CMake.
# Fil - "CMakeLists.txt" cmake_minimum_required ( VERSION 3.16 ) # Välj den minsta nödvändiga versionen av cmake project ( my_project ) # Ge projektet ett namn add_executable ( # Skapa ett mål (körbar) ${ PROJECT_NAME } # Filnamn main.cpp # Lista över källkodsfiler ) # Inget behov av att lägga till rubrikfiler installera ( # Ange målet och installationssökvägen MÅL ${ PROJECT_NAME } # Sökväg läggs till prefix RUNTIME DESTINATION bin # bin - binär (sökväg till körbara filer) ) # Standardprefix för UNIX-system # "/usr/local" + "/bin" // fil - "main.cpp" # inkluderar <iostream> int main () { std :: cout << "Hej världen!" << std :: endl ; returnera 0 ; }Sammansättningen utförs med hjälp av följande kommandon i katalogen med filerna:
$ cmmake . # Anrop för att generera byggfiler $ cmake --build. # Vi samlar in målet, utdata är en körbar fil $ cmake --install . # Installera om det behövsSamtidigt är det möjligt att få hjälpinformation om ett separat element i CMake-språket och dess kommandon.
$ cmake --help $ cmake --help-command-list $ cmake --help-command installeraMonteringsautomationssystem | |
---|---|