A megoldás
Mivel CMake nem egy deklaratív nyelv, illetve a C és C++ nyelveknek életkorukból adódóan nincs (még) rendes package manager rendszerük, így nagyon sok van nekik, és egyik se igazán jó. Főleg kezdőként.
Ez a rendszer az egész folyamatot próbálja úgy elabsztrahálni, hogy ne kelljen egyáltalán semmit ismerni a lépések, egyenként sem egyértelmű, összecsengő működéséből. Röviden elmondva, azoknak, akiket valamiért érdekel, egy CMake script egy json fájlból beolvassa az adatokat, majd a kitalálja milyen rendszeren fut, és annak megfelelően a vcpkg package manager rendszeren keresztül letölti az SDL könyvtárakat.
Két fájlra van szükség: a CMakeLists.txt-re, ami gyakorlatilag imperatív kódként készíti el a projektet. Ez egy teljesen szabványos CMake szkript, csak az vcpkg automatizmusa van beleépítve, és a project.json fájlba, ami deklaratívan kijelenti, hogy milyen bemenetekkel dolgozzon a rendszer. Utóbbival kell csupán foglalkozni, a CMake fájl elvan magában, mint alvó szörnyeteg.
project.json?
Mivel nemtriviális lépéseket hajtottam végre a CMake scriptben, ezért, hogy lehessen használni a rendszert anélkül, hogy feltétlen érteni kéne a közel 350 soros harcot CMake-kel, létrehoztam egy rövid json formátumot, amivel a projektet lehet "konfigurálni".
A konfigurációs problémát leredukáltam arra, hogy csak a legminimálisabb információt kell megadni, amire szükség van, hogy valami futtathatót lehessen készíteni. Ez pusztán három bemenet:
-
A projekt neve, ez CMake-nek kell, elvileg közel bármi lehet, de semmiképpen se legyen benne szóköz, se egyéb whitespace, de én nem mernék nem angol betűket beleírni
-
Az elkészítendő futtatható fájlok listája, azon forrásokból, amikből azt létre kell hozni. Pl. ha szeretnék egy
test
futtatható fájlt amain.c
éssys.c
fájlokból, akkor"test": ["main.c", "sys.c"]
-ként meg kell adni. -
A szükséges SDL könyvtárak. Pl.
sdl2
,sdl2-image
,sdl2-ttf
. A mindenkori SDL könyvtárak listája elérhető a példaproject.json
-fájlban, ebből lehet kitörölni a feleslegeseket.
Teljesen jól működik a rendszer, ha minden könyvtárat benne hagyunk, de az sok fölösleges munkát generál a fordítónak, amiért cserébe megvárat. (Bár ezek mind egyszerű, mint a faék C könyvárak, így gyorsan fordulnak, de miért várnánk fölöslegesen.) |
A szemléletes prezentációért nézzük meg az alapértelmezett project.json
-t, ami a bundle-ben van.
{
"project": "my-project", (1)
"exes": {
"test": ["main.c"], (2)
"test2": ["main.c"]
},
"deps": [ (3)
"sdl2",
"sdl2-net",
"sdl2-mixer",
"sdl2-ttf",
"sdl2-gfx",
"sdl2-image"
]
}
1 | A projekt tesztőleges neve. |
2 | Az elkészítendő futtatható fájlok, és azok alkotói.
Ez a fájl, jelenleg két különbőző fájlt készít (test és test2 ), ugyanabból a main.c fájból.
A valóságban ennek nyilván nem sok haszna van. |
3 | A függőségek listája: ezek azok a könyvtárak, amikre szükség van a projekt lefordításához. |
De, egy jobb példa a következő lenne, egy prog1 nagyházihoz:
{
"project": "NHF",
"exes": {
"schokoban": [
"main.c",
"level.h",
"level.c",
"player.h",
"player.c",
"render.h",
"render.c"
]
},
"deps": [
"sdl2",
"sdl2-image"
]
}
A projekt változása során, csupán a schokoban
JSON tömb értékeit kell változtatni.
Ha valami kérdés merülne fel a project.json fájl kezelésével kapcsolatban, nyugodtan lehet a [email protected] címen keresni, próbálok emberi időn belül válaszolni.
CMake inkantáció
A projekt nem módosítja a szükséges CMake hívásokat & paramétereiket, így, aki parancssoros környezetből szeretne fordítani, azt semmi meglepő nem fogja fogadni.
A szokásos cmake hívások, adott projektmappából:
$ cmake -S. -B_build (1)
$ cmake --build _build (2)
1 | Végrehajtja a konfigurációs lépést, illetve elérhetővé teszi a függőségeket. |
2 | Lefordítja a saját projektünket. |
IDE integráció
Egy hátránya van a saját megoldásoknak, hogy nincs direkt IDE támogatásuk.
Így új fájlok felvételekor saját magunkak kell beírni a project.json
fájlba őket.
Minden mást CMake kezel, így azt képesnek kell lennie értelmezni minden CMake támogató fejlesztőkörnyezetnek.
CLion
Mivel JetBrains fanboy vagyok, így most CLion-hoz tartozó lépéseket említem.
Amellett, hogy bemásoljuk a CMakeLists.txt
és project.json
fájlokat, csak arra kell figyelni, hogy minden fájlt manuálisan a project.json
fájlba írjunk be, illetve, hogy CLion ne próbálja meg magába a CMake fájlba belerakni.
Utóbbihoz a következőt kell figyelembe venni: minden fájl felvételekor a következő ablak jelenik meg.
Ezen a sárgával kijelölt mező mindenképpen legyen kikapcsolva.
Majd a fájlunkat vegyük fel a project.json
fájlba.