CMake, na przykład, na przykład

Mirko Kiefer
22 lutego 2017 · 4 min czytać

próbując dowiedzieć się z cmake, nie mogłem znaleźć dobre wprowadzenie. Dokumentacja CMake jest dość obszerna, ale nie nadaje się dla początkujących. Istnieje kilka przydatnych samouczków połączonych na CMake Wiki, ale większość z nich dotyczy tylko bardzo konkretnych problemów lub jest zbyt podstawowa. Napisałem więc to krótkie wprowadzenie CMake jako destylowaną wersję tego, co dowiedziałem się po pracy nad dokumentami i po pytaniach stackoverflow.

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.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *