| CMake | |
| Fejlesztő | Andy Cedilnik, Bill Hoffman, Brad King, Ken Martin, Alexander Neundorf (Kitware) |
| Első kiadás | 2000. |
| Legfrissebb stabil kiadás | 4.0.0 / 2025. március |
| Programozási nyelv | C, C++ |
| Operációs rendszer | Unix-szerű operációs rendszer, Windows |
| Platform | Cross-platform+ |
| Elérhető | angol |
| Kategória | C library, Programozási eszközök, Build |
| Licenc | BSD-3-Clause |
| Kódtár | https://gitlab.kitware.com/cmake/cmake |
| [www.openhub.net/p/cmake A CMake weboldala] | |
A CMake egy ingyenes, platform-független szoftverfejlesztő eszköz, amellyel a fordítótól független utasítások segítségével készíthetünk alkalmazásokat. Automatizálni tudja a tesztelést, a csomagolást és a telepítést is. Számos platformon fut, és számos programozási nyelvet támogat.
Meta-építő eszközként a CMake konfigurálja a natív build-eszközöket, amelyek viszont a kódbázist építik. A CMake a CMake-specifikus konfigurációs fájlok alapján konfigurációs fájlokat generál más építőeszközök számára. A többi eszköz a közvetlenebb építésért felelős; a generált fájlok felhasználásával. A CMake-specifikus konfigurációs fájlok egyetlen készletével egy kódbázis több platform natív építőeszközeivel is építhető.
A CMake által támogatott fontosabb natív építőeszközök a következők: Make, Qt Creator, Ninja, Android Studio, Xcode és Visual Studio.
A CMake szabad és nyílt forráskódú szoftver, amely a BSD-3 klauzula licenc alatt áll.
A kezdeti fejlesztés 1999-ben kezdődött a Kitware-nél a United States National Library of Medicine finanszírozásával a Visible Human Project részeként. A CMake 2000-ben jelent meg először.
A CMake-et az Insight Segmentation and Registration Toolkit (ITK) több platformra történő építésének támogatására fejlesztették ki. A kitűzött célok között szerepelt a korabeli eszközök, például az autoconf és a libtool gyengeségeinek kezelése az erősségek megtartása mellett, valamint az akkori legmodernebb építési technológiához való igazodás: konfigurációs szkriptek és Make fájlok Unix platformokon, valamint Visual Studio projektfájlok Windowson.
A CMake-et több kortárs eszköz is inspirálta. A pcmaker – amelyet Ken Martin és mások fejlesztettek ki a Visualization Toolkit (VTK) építésének támogatására – a Unix Make fájlokat NMake fájlokká alakította a Windowson történő építéshez. A gmake támogatta a Unix és Windows fordítókat, de a tervezése olyan problémákhoz vezetett, amelyeket nehéz volt megoldani. Mindkét eszköz működő példája volt a Unixot és a Windowst egyaránt támogató build eszköznek, de egy komoly hiba jellemezte őket: a Windows-fejlesztők számára a parancssor használatát követelték meg, annak ellenére, hogy sokan inkább integrált fejlesztőkörnyezetet (IDE), például a Visual Studiót használják.
A CMake célja az volt, hogy hasonló keresztplatformos támogatást nyújtson, de jobban kielégítse az egyes platformok fejlesztőinek preferenciáit.
Az első verzió tervezési céljai közé tartoztak:
Különböző okokból a CMake fejlesztői úgy döntöttek, hogy a Tcl – az akkoriban népszerű építési nyelv – helyett egy szkriptnyelv kifejlesztését választják a CMake számára. A Tcl használata egy olyan függőséget jelentett volna a gépen, amely ellentétes a céllal, hogy a fordítóprogramon kívül ne legyenek függőségek. Továbbá a Tcl a kezdeti fejlesztés idején nem volt jól támogatott a Windows és néhány Unix rendszeren.
A későbbi fejlesztéseket és javításokat a CMake beépítése a fejlesztők saját rendszereibe, beleértve a VXL projektet, a Brad King által hozzáadott CABLE funkciókat, és a GE Corporate R&D-t a DART támogatására. További funkciókat hoztak létre, amikor a VTK áttért a CMake-re a build környezet és a ParaView támogatásához.
A 3.0-s verzió 2014 júniusában jelent meg. A „Modern CMake” kezdetének nevezték. A szakértők most azt tanácsolják, hogy kerüljük a változókat a célok és a tulajdonságok javára. A CMake 2 alapját képező add_compile_options, include_directories, link_directories, link_libraries parancsokat mostantól célspecifikus parancsokkal kell helyettesíteni.
Brad King, a CMake fejlesztője azt nyilatkozta, hogy „a 'C' a CMake-ben a »cross-platform«-ot jelenti”.
Minden egyes natív építőeszköz támogatása külön generatorként van megadva. A CMake alapértelmezés szerint egy adott generátort használ a gazdakörnyezethez. Alternatívaként a generátor kiválasztható a parancssori -G opcióval. Például a -G Unix Makefiles build szkripteket hoz létre a make számára.
A CMake nem támogatja az egyéni generátorokat a CMake implementáció módosítása nélkül. Ennek ellenére a CMake forráskódja módosítható, hogy tartalmazzon egy egyéni generátort.
A CMake támogatja a futtatható fájlok, könyvtárak (pl. libxyz, xyz.dll stb.), objektumfájl könyvtárak és álcélok (pseudo-targets, beleértve az aliasokat is) építését. A CMake képes olyan objektumfájlokat előállítani, amelyeket a végrehajtható binárisok/könyvtárak linkelhetnek, elkerülve a dinamikus (futásidejű) linkelést, és helyette statikus (fordításidejű) linkelést használva. Ez lehetővé teszi a különböző optimalizációk rugalmas konfigurálását.
A cél (target) generálása a cél tulajdonságain keresztül konfigurálható. A régebbi verziókban ez a CMAKE_-prefixált globális változókon keresztül történt, de ez a megközelítés elavult.
A CMake konfigurációs fájlokat a forráskód hierarchikus felépítése szerint lehet strukturálni; ez a forrásfa. A gyökér (root) forráskönyvtárban található CMakeLists.txt a konfiguráció gyökereként szolgál. Ez tartalmazhat alkönyvtárakat, amelyek mindegyike tartalmaz egy CMakeLists.txt-t. Ennek megismétlése a konfiguráció hierarchikus szerkezetét eredményezi, amely követi a forráskód szerkezetét.
A CMake képes a generált fájlokat (mind a CMake, mind a natív építőeszközök által) a forrásfától elkülönített könyvtárfában elhelyezni.
Ez lehetővé teszi a többszörös építést ugyanabból a forrásfából, mivel mindegyiknek különálló, nem átfedő fájlrendszeri helye van. Ez kihasználható különböző vagy akár inkompatibilis konfigurációk, például különböző platformok számára történő létrehozására.
Ez egyszerűsíti a fájlkezelést is, mivel lehetővé teszi a generált fájlok eltávolítását egyetlen könyvtárfa törlésével, ahelyett, hogy a forrásfában több fájlt és könyvtárat távolítana el. Ez általában megakadályozza a forrásfájlok véletlen törlését vagy a generált fájlok véletlen hozzáadását a verziókezelés során.
A CMake biztosítja, hogy a downstream komponensek újraépüljenek, amikor a forrásai megváltoznak vagy épülnek.
A CMake képes rendszerszintű és felhasználó által meghatározott futtatható állományok, fájlok és könyvtárak keresésére. Ezeket a helyeket egy gyorsítótárban tárolja, amelyek aztán testreszabhatók a cél build fájlok generálása előtt. A cache szerkeszthető egy grafikus szerkesztővel, amely a CMake-kel együtt kerül szállításra.
A bonyolult könyvtárhierarchiákat és a több könyvtárra támaszkodó alkalmazásokat a CMake jól támogatja. Például képes befogadni egy olyan projektet, amely több eszközkészletet (toolkit) vagy könyvtárat tartalmaz, amelyek mindegyike több könyvtárral rendelkezik. Ezen kívül a CMake képes olyan projektekkel is dolgozni, amelyeknél a végrehajtható fájlok létrehozása szükséges a végső alkalmazáshoz lefordítandó kód generálása előtt. Nyílt forráskódú, bővíthető felépítése lehetővé teszi, hogy a CMake-et szükség szerint hozzá lehessen igazítani az adott projektekhez.
A CMake képes projektfájlokat generálni több népszerű IDE-hez, például a Microsoft Visual Studio, az Xcode és az Eclipse CDT számára. Emellett képes build scripteket készíteni az MSBuild vagy NMake számára Windowson; a Unix Make számára Unix-szerű platformokon, mint például Linux, macOS és Cygwin; és a Ninja számára Windowson és Unix-szerű platformokon egyaránt.
A CMake lehetővé teszi azoknak a tulajdonságoknak a megadását, amelyeket a fordítónak támogatnia kell ahhoz, hogy a célprogram vagy könyvtár lefordításra kerüljön.
A CMake számos fordítóprogramot támogat, többek között a következőket: Apple Clang, Clang, GNU GCC, MSVC, Oracle Developer Studio és Intel C++ Compiler.
A CMake képes csomagokat feldolgozni és előállítani is. A CMake funkciókat biztosít a csomagok távoli szerverről való lehívására, amelyeket a build folyamat részeként lehet használni. A CPack segítségével a fájlok csomagolhatók egy archív fájlba a célplatform által támogatott csomagkezelő vagy telepítő számára.(pp132,142) A CMake függvényeket biztosít csomagok távoli szerverről történő letöltéséhez, amelyek felhasználhatók a build folyamat részeként, vagy korábban telepített cmake csomagok csatolására.
A Cmake futtatható egy ncurses programmal, mint a ccmake, amely a projektek konfigurálására használható parancssori felületen keresztül.
A 3.6-os verzió óta lehetőség van előre lefordított fejlécek generálására a CMake segítségével. A 3.28-as verziótól kezdve a CMake modulok fordítására is képes. Kísérleti támogatás van a fejlécegységekhez is.
A CMake támogatja a JSON-adat karakterláncokból történő értékek kivonását a változókba (a 3.19-es verzió óta).
A CMake tartalmaz egy értelmezőt egy viszonylag egyszerű, egyéni, imperatív szkriptnyelvhez, amely támogatja a változókat, a karakterlánc-kezelést, a tömböket, a függvény- és makródeklarációt, valamint a modulok felvételét (importálását).
Az értelmező a CMake nyelvi parancsokat a CMakeLists.txt nevű fájlokból olvassa be, amelyek megadják a forrásfájlokat és az építési beállításokat. A CMake ezeket az információkat használja a natív eszközkonfigurációs fájlok létrehozásához. Ezenkívül .cmake végződésű fájlok további szkriptek tárolására is használhatók.
A CMake nyelvi parancsok formátuma a következő:
name(argument ...)
Az argumentumok szóközzel vannak elválasztva, és tartalmazhatnak kulcsszavakat az argumentumcsoportok elválasztására. Például a következő parancsban a COMPILE_FLAGS kulcsszó a forrásfájlok listáját választja el a fordítói flagektől.
set_source_file_properties(filename ... COMPILE_FLAGS compile_flag ...)
A CMake szkriptnyelv Yacc és Lex generátorokon keresztül valósul meg.
A CMake, CPack és CTest futtatható programok C++ nyelven íródtak.
A CMake funkcionalitásának nagy része a CMake nyelven írt modulokban van implementálva.
A CMake dokumentáció (a 3.0-s kiadás óta) reStructuredText jelölést használ. A HTML oldalakat és a man oldalakat a Sphinx dokumentációgenerátor hozza létre.
A CMake számos .cmake szkriptfájlt és fejlesztői eszközt tartalmaz, amelyek megkönnyítik az olyan feladatokat, mint a függőségek keresése (beépített és külső, pl. FindXYZ modulok), az eszköztár környezetének és a futtatható állományoknak a tesztelése, a kiadások csomagolása (CPack) és a külső projektek függőségeinek kezelése (ExternalProject modul). A további fejlesztési eszközök közé tartoznak:
A CMake nagyon széles körben elterjedt a kereskedelmi, nyílt forráskódú és tudományos szoftverprojektek körében. Néhány neves felhasználó: Android NDK, Netflix, Inria, MySQL, Boost (C++ könyvtárak), KeePassXC, KDE, KiCAD, FreeCAD, WebKit, Blender, Biicode, ReactOS, Apache Qpid, az ATLAS experiment, és a Second Life.
A CMake segítségével történő építés két fő szakaszból áll. Először is, a natív építőeszköz konfigurációs fájlokat a CMake konfigurációs fájlokból generálják – a CMake szkriptnyelvén írva. A parancssori szintaxis a következő: cmake <dir>, ahol a <dir> egy könyvtár, amely egy cmake <dir> fájlt tartalmaz. Ezután a natív build-eszközöket vagy a CMake-en keresztül (cmake --build <dir>), vagy közvetlenül a natív eszköz felületén keresztül hívjuk meg. A natív build eszközök a generált fájlokat használják.
Az alábbiakban bemutatjuk a CMake konfigurálását egy C++ nyelven írt hello world program elkészítéséhez, és a CMake használatát a program elkészítéséhez.
hello.cpp:
#include <iostream>
int main() {
std::cout << "Hello, world!" << std::endl;
return 0;
}
CMakeLists.txt:
cmake_minimum_required(VERSION 3.5)
project(HelloWorld CXX)
add_executable(hello hello.cpp)
A CMake-kel való építéshez először menjünk a fenti két fájlt tartalmazó könyvtárba. Ezután generálja a natív build config fájlokat a cross-platform CMake paranccsal:
cmake -B out .
Minden generált fájl a -B out segítségével megadott out könyvtárban lesz.
Ezután építsük a CMake által támogatott natív építőeszközzel (build tool):
cmake --build out
A program ezután futtatható. A Bash segítségével a parancs olyan, mint a ./out/hello. Windowson a kimeneti fájl a .exe végződéssel végződik.
Ez a példa a preprocesszor include elérési útvonalának konfigurálását mutatja be.
hello.cpp:
#include "hello.h"
#include <iostream>
int main() {
for (int i = 0; i < Times; i++) {
std::cout << "Hello, world!" << std::endl;
}
return 0;
}
hello.h:
const int Times = 10;
CMakeLists.txt:
cmake_minimum_required(VERSION 3.5)
project(HelloWorld CXX)
include_directories(${PROJECT_SOURCE_DIR})
add_executable(hello hello.cpp)