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 a main.c és sys.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élda project.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.

add file

Ezen a sárgával kijelölt mező mindenképpen legyen kikapcsolva. Majd a fájlunkat vegyük fel a project.json fájlba.

Fájlok

Maga a legfrissebb bundle (CMakeLists.txt, project.json, és egy teszt main.c Info C-ről) elérhető a következő linkeken:

Fájl SHA3-256

ZIP v1.0

d406b0ab7022d38104f54ee659618721f62d5261ae0073c12bcc2f3d5b5e179d

TGZ v1.0

05633e5928b4131875c22d949f32df880c118a1007d7a22de140a82754fb5608