CMake

többplatformos, fordítófüggetlen build rendszer generátor From Wikipedia, the free encyclopedia

CMake
Remove ads

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.[3]

Gyors adatok

Meta-építő eszközként a CMake konfigurálja a natív[4] build-eszközöket,[5] amelyek viszont a kódbázist építik.[6] 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[5] számára.[7] A többi eszköz a közvetlenebb építésért[5] 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ő.[8]

A CMake által támogatott fontosabb natív építőeszközök[5] a következők: Make, Qt Creator(wd), Ninja(wd), Android Studio, Xcode és Visual Studio.[8]

A CMake szabad és nyílt forráskódú szoftver, amely a BSD-3 klauzula licenc alatt áll.[9]

Remove ads

Története

A kezdeti fejlesztés 1999-ben kezdődött a Kitware-nél(wd) a United States National Library of Medicine(wd) finanszírozásával a Visible Human Project[10] részeként.[8] A CMake 2000-ben jelent meg először.

A CMake-et az Insight Segmentation and Registration Toolkit (ITK[11]) több platformra történő építésének[5] 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(wd) és a libtool(wd) 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(wd) és Make fájlok Unix platformokon, valamint Visual Studio projektfájlok Windowson.[8][12]

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(wd)) építésének támogatására – a Unix Make fájlokat NMake(wd) fájlokká alakította a Windowson történő építéshez.[8] A gmake(wd) 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:[8]

  • Csak a gazdagép C++ fordítójától függ; nincs szükség más harmadik féltől származó eszközökre vagy könyvtárakra
  • Visual Studio projektfájlok (valamint Unix-fájlok) generálása
  • Támogassa az építési[5] célokat: program, statikus könyvtár, megosztott könyvtár
  • Futtasson build-idejű kódgenerátorokat
  • Támogassa a külön könyvtárfákat a forrás- és a build-fájlokhoz
  • Támogassa a gazdaszámítógép képességeinek önvizsgálatát
  • A C/C++ fejlécfájlok(wd) automatikus függőségi vizsgálatának támogatása
  • Minden funkciónak következetesen és egyformán jól kell működnie minden támogatott platformon

Különböző okokból a CMake fejlesztői úgy döntöttek, hogy a Tcl(wd) – az akkoriban népszerű építési(wd) 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.[8]

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,[13] a Brad King által hozzáadott CABLE[14] funkciókat, és a GE Corporate R&D-t(wd) a DART támogatására.[15] További funkciókat hoztak létre, amikor a VTK(wd) á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.[16] A „Modern CMake” kezdetének nevezték.[17] 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.[18] 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.

Remove ads

Név

Brad King, a CMake fejlesztője azt nyilatkozta, hogy „a 'C' a CMake-ben a »cross-platform«-ot jelenti”.[19]

Jellemzők

Generátorok

Minden egyes natív építőeszköz[5] 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 Unix Makefiles generátor fájlokat hoz létre a make számára.[8]

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.

Build targets

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(wd) is) építését. A CMake képes olyan objektumfájlokat(wd) 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.[20]

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.[18][21]

Hierarchikus konfiguráció

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.[18][21]

Különálló építési fa

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.[8]

Ez lehetővé teszi a többszörös építést[5] 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(wd) 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.

Függőségkezelés

A CMake biztosítja, hogy a downstream(wd) komponensek újraépüljenek,[22] amikor a forrásai megváltoznak vagy épülnek.[8]

Flexibilis projektstruktúra

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.[23]

IDE konfigurációs támogatás

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(wd) vagy NMake(wd) 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 fordítói funkciók felismerése

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.[24]

Compiler támogatás

A CMake számos fordítóprogramot támogat, többek között a következőket: Apple Clang, Clang, GNU GCC, MSVC(wd), Oracle Developer Studio(wd) és Intel C++ Compiler(wd).[25]

Csomagkezelés

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(wd) segítségével a fájlok csomagolhatók egy archív fájlba(wd) a célplatform által támogatott csomagkezelő vagy telepítő számára.[26](pp132,142)[27][28]

GUI

A Cmake futtatható egy ncurses programmal, mint a ccmake, amely a projektek konfigurálására használható parancssori felületen keresztül.

Előfordított fejlécek

A 3.6-os verzió óta lehetőség van előre lefordított fejlécek(wd) generálására a CMake segítségével.[29]

JSON strings

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).[30]

Remove ads

Nyelv

A CMake tartalmaz egy értelmezőt egy viszonylag egyszerű, egyéni, imperatív szkriptnyelvhez(wd), 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[5] 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.[31]

Parancs szintaxis

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.[32]

set_source_file_properties(filename ... COMPILE_FLAGS compile_flag ...)
Remove ads

Megvalósítás

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.[33]

A CMake dokumentáció (a 3.0-s kiadás óta) reStructuredText(wd) jelölést használ. A HTML oldalakat és a man oldalakat a Sphinx(wd) dokumentációgenerátor(wd) hozza létre.

Remove ads

További eszközök

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:[34][35]

  • ccmake és cmake-gui — a natív összeállítási eszközhöz szánt konfigurációs változók frissítéséhez
  • CPack — szoftverek csomagolásához Linux RPM-, deb-, és gzip- csomagok, NSIS-fájlok(wd) (Windows-hoz), és macOS csomagok[36][37]
  • CTest és CDash — szoftvertesztelésre és jelentéskészítésre
Remove ads

Adoptálás

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(wd), Netflix, Inria(wd), MySQL, Boost (C++ könyvtárak)(wd), KeePassXC(wd), KDE, KiCAD(wd), FreeCAD(wd), WebKit, Blender,[38] Biicode, ReactOS, Apache Qpid, az ATLAS experiment,[39] és a Second Life.[40]

Építési folyamat

A CMake segítségével történő építés[5] két fő szakaszból áll.[8] 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.[23][41]

Remove ads

Példák

Hello world

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.

Beépítés

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)

Lásd még

Jegyzetek

További információk

Fordítás

Loading related searches...

Wikiwand - on

Seamless Wikipedia browsing. On steroids.

Remove ads