atunci când încearcă să învețe cmake nu am putut găsi nici o introducere bun. Documentația CMake este destul de cuprinzătoare, dar nu este potrivită pentru un începător. Există câteva tutoriale utile legate de CMake Wiki, dar cele mai multe dintre ele acoperă doar probleme foarte specifice sau sunt prea de bază. Așa că am scris această scurtă introducere CMake ca o versiune distilată a ceea ce am aflat după ce am lucrat prin documente și după întrebările stackoverflow.
este o lucrare în desfășurare și voi încerca să o îmbunătățesc continuu.
CMake este un instrument construi meta care vă permite să genereze script-uri native construi pentru o serie de platforme:
- Unix Makefiles
- Xcode
- Visual Studio
- CodeBlocks
- Eclipse
- și mai mult…
a se vedea lista completă a generatoarelor CMake.
Să presupunem că avem o aplicație simplă cu un singur .fișier C.
noi prin crearea unuiCMakeLists.txt
fișier în rădăcina proiectului nostru.
cmake_minimum_required(VERSION 2.8)project(app_project)add_executable(myapp main.c)install(TARGETS myapp DESTINATION bin)
asta e tot ce avem nevoie pentru a putea construi aplicația noastră cu oricare dintre generatoarele disponibile.
add_executable
definește binarul nostru cu toate fișierele sursă legate.
install
îi spune lui cmake să instaleze binarul nostru în directorulbin
al directorului de instalare.
clădire
CMake acceptă out-of-source construiește — astfel încât toate codul nostru compilat merge într-un director separat de sursele.
pentru a începe o construcție, creăm un nou folder:
mkdir _build
cd _build
și apelăm cmake cu calea către rădăcina proiectului (în acest caz folderul părinte):
cmake ..
aceasta va genera scripturi de construire folosind generatorul implicit — pe Linux/OSX acest lucru ar trebui să fie Makefiles.
în mod implicit cmake va instala construi noastre în directoarele de sistem.
pentru a defini un director de instalare personalizat, îl transmitem pur și simplu la cmake:
cmake .. -DCMAKE_INSTALL_PREFIX=../_install
pentru a rula scriptul de construire, puteți utiliza pur și simplu fișierul Makefile:
make
make install
acum putem rula binarul nostru din Directorul de instalare:
../_install/bin/myapp
dacă am dori să folosim un generator diferit, îl transmitem cmake folosind -G
parametru:
cmake .. -GXcode
acest lucru va afișa un proiect Xcode ușor configurat pentru a construi aplicația noastră.
utilizarea CMake cu biblioteci
pentru a construi o bibliotecă vom folosi un script similar:
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 va construi biblioteca calibtest.a
și instalați-l în folderul lib din Directorul de instalare.
includem, de asemenea, fișierul nostru antet public în etapa de instalare și spune cmake să-l pună îninclude
.
în locul unei biblioteci statice putem construi și un lib partajat:
add_library(test SHARED test.c)
conectând bibliotecile la executabile cu CMake
putem extinde executabilul nostru de sus conectându-l la libray libtest.a
.
să începem prin adăugarea directorului Bibliotecii ca subdirector la proiectul nostru myapp.
acum, putem folosi biblioteca definită în CMakeLists.txt de libtest_project în CMakeLists myapp lui.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
face bibliotecatest
definit în libtestproject disponibil pentru a construi.
Întarget_link_libraries
îi spunem lui CMake să-l conecteze la executabilul nostru. CMake va asigurați-vă că pentru a construi primul test înainte de conectarea la myapp.
inclusiv biblioteci externe care utilizează alte sisteme de construire
în timp ce CMake se bucură de un interes tot mai mare, există încă o mulțime de biblioteci care utilizează sisteme de construire native, cum ar fi Unix Makefiles. Puteți face uz de ele în proiectul CMake fără a fi nevoie să re-scrie script-urile lor construi.
tot ce avem nevoie este suportul CMake pentru proiecte externe și biblioteci importate:
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
ne permite să adăugăm un proiect extern ca țintă la proiectul nostru. Dacă nu specificați comenzi precumBUILD_COMMAND
sauINSTALL_COMMAND
, CMake va căuta unCMakeLists.txt
în proiectul extern și îl va executa.
în cazul nostru vrem să facă uz de Biblioteca luajit, care este construit folosind un Makefile.
add_library
acceptă și importul bibliotecilor deja construite – trebuie doar să setăm proprietateaIMPORTED_LOCATION
.
apelareaExternalProject_Add
specifică doar proiectul extern ca țintă, dar nu îl construiește automat. Acesta va fi construit numai dacă adăugăm o dependență. Prin urmare, apelăm add_dependencies
pentru a face biblioteca noastră importată dependentă de proiectul extern.
în cele din urmă putem lega biblioteca noastră importată la fel ca o bibliotecă „normală” cutarget_link_libraries
.