Mikor akar tanulni, CMake nem találtam semmilyen jó bevezetés. A CMake dokumentáció meglehetősen átfogó, de nem alkalmas kezdőknek. Van néhány hasznos útmutatók kapcsolódik a CMake Wiki, de a legtöbbjük csak kiterjed nagyon konkrét problémák, vagy túl alapvető. Ezért írtam ezt a rövid CMake bevezetést desztillált változatként annak, amit a dokumentumokon végzett munka után megtudtam, majd követtem a stackoverflow kérdéseket.
Ez egy folyamatban lévő munka, és megpróbálom folyamatosan javítani.
a CMake egy meta build eszköz, amely lehetővé teszi natív build szkriptek létrehozását számos platformon:
- Unix Makefiles
- Xcode
- Visual Studio
- CodeBlocks
- Eclipse
- és még több…
lásd a CMake generátorok teljes listáját.
tegyük fel, hogy van egy egyszerű alkalmazás egyetlen .c fájl.
létrehozunk egy CMakeLists.txt
fájlt a projekt gyökerében.
cmake_minimum_required(VERSION 2.8)project(app_project)add_executable(myapp main.c)install(TARGETS myapp DESTINATION bin)
Ez minden, amire szükségünk van ahhoz, hogy alkalmazásunkat a rendelkezésre álló generátorok bármelyikével felépíthessük.
add_executable
meghatározza bináris fájljainkat az összes kapcsolt forrásfájllal.
install
mondja cmake telepíteni a bináris a bin
könyvtár az install könyvtár.
Building
a CMake támogatja az Out-of-source buildeket-így minden lefordított kódunk a forrásoktól különálló könyvtárba kerül.
kezdeni építeni hozzon létre egy új mappát:
mkdir _build
cd _build
, Majd a hívás cmake az utat, hogy a projekt root (ebben az esetben a szülő mappa):
cmake ..
Ez a generál épít parancsfájlok használata az alapértelmezett generátor — Linux/OSX ez makefile-ok.
alapértelmezés szerint a cmake telepíti az építésünket a rendszerkönyvtárakba.
egy egyéni telepítési könyvtár meghatározásához egyszerűen átadjuk a cmake-nek:
cmake .. -DCMAKE_INSTALL_PREFIX=../_install
a build szkript futtatásához egyszerűen használhatja a Makefile-t:
make
make install
most már futtathatjuk bináris fájlunkat a telepítési könyvtárból:
../_install/bin/myapp
ha más generátort akarunk használni, akkor a -G
paraméter:
cmake .. -GXcode
Ez egy könnyen konfigurált Xcode projektet eredményez az alkalmazásunk felépítéséhez.
A CMake a könyvtárakkal
egy könyvtár építéséhez hasonló szkriptet használunk:
cmake_minimum_required(VERSION 2.8)project(libtest_project)add_library(test STATIC test.c)install(TARGETS test DESTINATION lib)
install(FILES test.h DESTINATION include)
CMake a könyvtárat libtest.a
– ként építi be, majd a telepítő könyvtár lib mappájába telepíti.
mi is tartalmazza a nyilvános fejléc fájlt a telepítési lépés, és mondja cmake, hogy tegye be include
.
statikus könyvtár helyett egy megosztott lib-t is építhetünk:
add_library(test SHARED test.c)
A könyvtárak CMake
futtatható fájlokkal való összekapcsolása felülről kiterjeszthetjük a futtatható fájlunkat a könyvtár libtest.a
.
Kezdjük azzal, hogy a könyvtár könyvtárát alkönyvtárként adjuk hozzá myapp projektünkhöz.
most, tudjuk használni a könyvtár meghatározott CMakeLists.TXT a libtest_project a myapp CMakeLists.txt:
cmake_minimum_required(VERSION 2.8)project(myapp)add_subdirectory(libtest_project)add_executable(myapp main.c)target_link_libraries(myapp test)install(TARGETS myapp DESTINATION bin)
add_subdirectory
teszi a könyvtár test
meghatározott libtestproject elérhető az építmény.
In target_link_libraries
megmondjuk a CMake-nek, hogy kapcsolja össze a futtatható fájlunkkal. CMake győződjön meg róla, hogy először építeni teszt összekapcsolása előtt a myapp.
beleértve a külső könyvtárakat más build rendszerek használatával
míg a CMake növekvő érdeklődést élvez, még mindig rengeteg könyvtár van natív build rendszerekkel, mint például a Unix Makefiles. Használhatja őket a CMake projektben anélkül, hogy újra kellene írnia a build szkripteket.
csak a CMake támogatására van szükségünk külső projektekhez és importált könyvtárakhoz:
ExternalProject_Add(project_luajit
URL http://luajit.org/download/LuaJIT-2.0.1.tar.gz
PREFIX ${CMAKE_CURRENT_BINARY_DIR}/luajit-2.0.1
CONFIGURE_COMMAND ""
BUILD_COMMAND make
INSTALL_COMMAND make install
PREFIX=${CMAKE_CURRENT_BINARY_DIR}/luajit-2.0.1
)ExternalProject_Get_Property(project_luajit install_dir)add_library(luajit STATIC IMPORTED)set_property(TARGET luajit PROPERTY IMPORTED_LOCATION ${install_dir}/lib/libluajit-5.1.a)add_dependencies(luajit project_luajit)add_executable(myapp main.c)include_directories(${install_dir}/include/luajit-2.0)target_link_libraries(myapp luajit)
ExternalProject_Add
lehetővé teszi számunkra, hogy egy külső projektet célul adjunk a projektünkhöz. Ha nem ad meg olyan parancsokat, mint a BUILD_COMMAND
vagy INSTALL_COMMAND
, a CMake egy CMakeLists.txt
parancsot fog keresni a külső projektben, majd végrehajtja azt.
esetünkben a luajit könyvtárat szeretnénk használni, amely Makefile segítségével épül fel.
add_library
támogatja a már épített könyvtárak importálását is – csak be kell állítanunk a IMPORTED_LOCATION
tulajdonságát.
CallingExternalProject_Add
csak a külső projektet határozza meg célként, de nem építi meg automatikusan. Csak akkor épül fel, ha függőséget adunk hozzá. Ezért a add_dependencies
– t hívjuk, hogy az importált könyvtárunk a külső projekttől függjön.
végül összekapcsolhatjuk importált könyvtárunkat, mint egy “normál”könyvtárat target_link_libraries
.