Wanneer het proberen om te leren CMake ik kon het niet vinden een goede inleiding. De cmake documentatie is vrij uitgebreid, maar niet geschikt voor een beginner. Er zijn een aantal handige tutorials gelinkt op de cmake Wiki maar de meeste van hen behandelen alleen zeer specifieke problemen of zijn te basic. Dus ik schreef deze korte cmake introductie als een gedistilleerde versie van wat ik ontdekte na het werken door de documenten en het volgen van stackoverflow vragen.
Het is een werk in uitvoering en Ik zal proberen om het voortdurend te verbeteren.
CMake is een meta build tool waarmee u native build scripts kunt genereren voor een reeks platforms:
- Unix Makefiles
- Xcode
- Visual Studio
- CodeBlocks
- Eclipse
- en meer…
zie de volledige lijst van cmake-generatoren.
laten we aannemen dat we een eenvoudige app met een enkele hebben .C-bestand.
We maken een CMakeLists.txt
bestand in de root van ons project.
cmake_minimum_required(VERSION 2.8)project(app_project)add_executable(myapp main.c)install(TARGETS myapp DESTINATION bin)
dat is alles wat we nodig hebben om onze app te kunnen bouwen met een van de beschikbare generatoren.
add_executable
definieert onze binary met alle gekoppelde bronbestanden.
install
vertelt cmake om onze binaire map te installeren in de bin
map van de installatiemap.
Building
CMake ondersteunt Out-of-source builds-dus al onze gecompileerde code gaat naar een map die gescheiden is van de bronnen.
om een build te starten maken we een nieuwe map:
mkdir _build
cd _build
en roepen cmake aan met het pad naar de root van het project (in dit geval de bovenliggende map):
cmake ..
Dit zal build scripts genereren met behulp van de standaard generator — op Linux/OSX zouden dit Makefiles moeten zijn.
standaard installeert cmake onze build in de systeemmappen.
Om een aangepaste installatiemap te definiëren geven we deze gewoon door aan cmake:
cmake .. -DCMAKE_INSTALL_PREFIX=../_install
om het build script uit te voeren kunt u eenvoudig het Makefile gebruiken:
make
make install
We kunnen nu onze binary uitvoeren vanuit de installatiemap:
../_install/bin/myapp
als we een andere generator willen gebruiken, geven we het door aan cmake met behulp van de -G
parameter:
cmake .. -GXcode
dit zal een gemakkelijk geconfigureerd Xcode project om onze app te bouwen.
cmake gebruiken met bibliotheken
om een bibliotheek te bouwen gebruiken we een soortgelijk script:
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 zal de bibliotheek bouwen als libtest.a
en installeren in de lib-map van de installatiemap.
We nemen ook ons publieke headerbestand op in de installatiestap en vertellen cmake om het in include
te zetten.
in plaats van een statische bibliotheek kunnen we ook een gedeelde lib bouwen:
add_library(test SHARED test.c)
linking libraries to executables with CMake
We kunnen ons uitvoerbaar bestand van bovenaf uitbreiden door het te koppelen aan onze libray libtest.a
.
laten we beginnen met het toevoegen van de map van de bibliotheek als een submap aan ons myapp project.
nu kunnen we de bibliotheek gebruiken die is gedefinieerd in CMakeLists.txt van libtest_project in de cmakelists van myapp.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
maakt de bibliotheek test
gedefinieerd in libtestproject beschikbaar voor de build.
In target_link_libraries
vertellen we CMake om het te koppelen aan ons uitvoerbaar bestand. CMake zorgt ervoor dat u eerst test bouwt voordat u deze koppelt aan myapp.
inclusief externe bibliotheken die andere bouwsystemen gebruiken
hoewel CMake steeds meer interesse heeft, zijn er nog steeds veel bibliotheken die eigen bouwsystemen gebruiken zoals Unix Makefiles. U kunt er gebruik van maken in uw cmake-project zonder dat u hun build-scripts opnieuw hoeft te schrijven.
alles wat we nodig hebben is cmake ‘ s ondersteuning voor externe projecten en geïmporteerde bibliotheken:
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
stelt ons in staat om een extern project als doel aan ons project toe te voegen. Als u geen commando ‘ s opgeeft zoals BUILD_COMMAND
of INSTALL_COMMAND
, zal CMake in het externe project naar een CMakeLists.txt
zoeken en uitvoeren.
in ons geval willen we gebruik maken van de luajit bibliotheek die is gebouwd met behulp van een Makefile.
add_library
ondersteunt ook het importeren van reeds gebouwde bibliotheken – we hoeven alleen de eigenschap IMPORTED_LOCATION
in te stellen.ExternalProject_Add
specificeert alleen het externe project als een doel, maar bouwt het niet automatisch. Het zal alleen worden opgebouwd als we er een afhankelijkheid aan toevoegen. We roepen daarom add_dependencies
aan om onze geïmporteerde bibliotheek afhankelijk te maken van het externe project.
tot slot kunnen we onze geïmporteerde bibliotheek net als een “normale” bibliotheek linken met target_link_libraries
.