jest to praca w toku i postaram się go stale ulepszać.
CMake jest narzędziem meta build, które pozwala na generowanie natywnych skryptów kompilacji dla wielu platform:
- Unix Makefiles
- Xcode
- Visual Studio
- blokady kodowe
- Eclipse
- i więcej…
Zobacz pełną listę generatorów CMake.
Załóżmy, że mamy prostą aplikację z pojedynczym .plik C.
tworzymy plik CMakeLists.txt
w katalogu głównym naszego projektu.
cmake_minimum_required(VERSION 2.8)project(app_project)add_executable(myapp main.c)install(TARGETS myapp DESTINATION bin)
to wszystko, czego potrzebujemy, aby móc zbudować naszą aplikację z dowolnym z dostępnych generatorów.
add_executable
definiuje nasz plik binarny ze wszystkimi powiązanymi plikami źródłowymi.
install
mówi cmake, aby zainstalować nasz plik binarny w katalogubin
katalogu instalacyjnego.
budowanie
CMake obsługuje Out-of-source builds — więc cały nasz skompilowany kod trafia do katalogu oddzielnego od źródeł.
aby rozpocząć kompilację tworzymy nowy folder:
mkdir _build
cd _build
i wywołujemy cmake ze ścieżką do katalogu głównego projektu (w tym przypadku katalogu nadrzędnego):
cmake ..
spowoduje to wygenerowanie skryptów kompilacji przy użyciu domyślnego generatora — na Linuksie / OSX powinno to być Makefiles.
domyślnie cmake zainstaluje nasz build w katalogach systemowych.
Aby zdefiniować własny katalog instalacyjny, po prostu przekazujemy go do cmake:
cmake .. -DCMAKE_INSTALL_PREFIX=../_install
aby uruchomić skrypt kompilacji, możesz po prostu użyć Makefile:
make
make install
możemy teraz uruchomić nasz plik binarny z katalogu instalacyjnego:
../_install/bin/myapp
jeśli chcemy użyć innego generatora, przekazujemy go do cmake za pomocą -G
parametr:
cmake .. -GXcode
to wyprowadzi łatwo skonfigurowany projekt Xcode do zbudowania naszej aplikacji.
używając CMake z bibliotekami
do zbudowania biblioteki używamy podobnego skryptu:
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 zbuduje bibliotekę jakolibtest.a
i zainstaluje ją w folderze lib katalogu instalacyjnego.
dołączamy również nasz publiczny plik nagłówka do kroku instalacji i każemy cmake ’ owi umieścić go winclude
.
zamiast statycznej biblioteki możemy również zbudować współdzielony lib:
add_library(test SHARED test.c)
łączenie bibliotek do plików wykonywalnych za pomocą CMake
możemy rozszerzyć nasz plik wykonywalny z góry, łącząc go z naszym libraylibtest.a
.
zacznijmy od dodania katalogu biblioteki jako podkatalogu do naszego projektu myapp.
teraz możemy korzystać z biblioteki zdefiniowanej w CMakeLists.txt libtest_project w Cmakelistach 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
udostępnia bibliotekętest
zdefiniowaną w libtestproject.
wtarget_link_libraries
mówimy CMake, aby połączył go z naszym plikiem wykonywalnym. CMake upewni się, że najpierw test kompilacji przed połączeniem go z myapp.
w tym zewnętrzne biblioteki używające innych systemów kompilacji
chociaż CMake cieszy się coraz większym zainteresowaniem, nadal istnieje wiele bibliotek używających natywnych systemów kompilacji, takich jak Unix Makefiles. Możesz je wykorzystać w swoim projekcie CMake bez konieczności ponownego pisania skryptów kompilacji.
wszystko, czego potrzebujemy, to wsparcie CMake dla zewnętrznych projektów i importowanych bibliotek:
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
pozwala nam dodać zewnętrzny projekt jako cel do naszego projektu. Jeśli nie określisz poleceń takich jak BUILD_COMMAND
lub INSTALL_COMMAND
, CMake będzie szukał CMakeLists.txt
w zewnętrznym projekcie i uruchomi go.
w naszym przypadku chcemy skorzystać z biblioteki luajit, która jest zbudowana przy użyciu pliku Makefile.
add_library
obsługuje również import już zbudowanych bibliotek – wystarczy ustawić jej właściwośćIMPORTED_LOCATION
.
wywołanieExternalProject_Add
określa tylko zewnętrzny projekt jako cel, ale nie automatycznie go buduje. Zostanie zbudowany tylko wtedy, gdy dodamy do niego zależność. Dlatego wywołujemy add_dependencies
, aby nasza importowana biblioteka była zależna od zewnętrznego projektu.
wreszcie możemy połączyć naszą zaimportowaną bibliotekę tak jak „normalną” bibliotekę ztarget_link_libraries
.