Używanie CMake do budowania projektu
4 08 2009Powszechnie używanym narzędziem do konfiguracji i wygenerowania plików potrzebnych do kompilacji projektu w środowisku otwartego oprogramowania na licencjach GNU/GPL stał się skrypt configure. Niestety, ponieważ nie zachodzą w nim żadne przełomowe zmiany, trzeba wiele się napisać, by go wygenerować, a przede wszystkim trudno z jego pomocą obsługiwać projekt bazujący przykładowo na popularnym Qt, powstały nowe narzędzia budujące. Jednym z nich jest postępowy CMake.
Większość z nas pewnie dotychczas wykonało choć jedną kompilację przy jego użyciu. Na etapie konfiguracji widzimy czytelne komunikaty, a sama kompilacja opatrzona jest procentowym postępem i kolorową oprawą. CMake nie odchodzi jednak od Makefile. Choć używa CMake-owych narzędzi, nadal wpisujemy make w celu rozpoczęcia kompilacji. Generowany jest natomiast przez program cmake, który z kolei opiera się na pliku CMakeLists.txt, tak jak autoconf na configure.ac. I właśnie pisanie tego pliku chcę tu opisać. Opierać się będę na projekcie Qt QameOfLife, który już opublikowałem w poprzednim artykule.
CMakeLists.txt tworzy się we własnym interpretowanym języku (już nie w Bashu jak w configure), który posiada wiele komend. Na szczęście do obsłużenia prostego projektu nie potrzebujemy ich zbyt wielkiego wachlarza. Zaczynamy od nazwy projektu:
project ( QameOfLife )
Następnie przypisujemy nazwanym zmiennym pliki projektu, jakimi są pliki źródłowe, nagłówkowe, interfejsu użytkownika i źródeł plików.
set( QAMEOFLIFE_SRCS main.cpp mainwindow.cpp game.cpp ) set( QAMEOFLIFE_MOC_HDRS mainwindow.h game.h ) set( QAMEOFLIFE_UIS mainwindow.ui ) set( QAMEOFLIFE_RCS files.qrc )
Definiujemy minimalną potrzebną wersję CMake:
cmake_minimum_required( VERSION 2.6 )
Szukanie wymaganych pakietów w CMake rozwiązano modularnie. To znaczy, każdy pakiet posiada swój moduł, będący skryptem w języku CMake i właśnie dzięki niemu pakiet zostaje znaleziony i ewentualnie ustawiane są zmienne przechowujące katalogi z include’ami, bibliotekami itd. Moduły te znajdują się w /usr/share/cmake-*/Modules, aczkolwiek możemy używać własnych poprzez umieszczenie ich w katalogu projektu i zainclude-owanie. Szukamy Qt 4, które jest niezbędne (REQUIRED):
find_package( Qt4 REQUIRED )
Polecenia obsługujące Qt, odpowiedzialne za wygenerowanie odpowiednich plików na podstawie zawartości zdefiniowanych wcześniej zmiennych:
include( ${QT_USE_FILE} )
qt4_wrap_ui( QAMEOFLIFE_UI_HDRS ${QAMEOFLIFE_UIS} )
qt4_wrap_cpp( QAMEOFLIFE_MOC_SRCS ${QAMEOFLIFE_MOC_HDRS} )
qt4_add_resources( QAMEOFLIFE_RC_SRCS ${QAMEOFLIFE_RCS} )Ustawiamy flagi kompilacyjne:
add_definitions( -O2 -w -D_REENTRANT $(QT_DEFINITIONS) )
Wskazujemy katalogi z plikami nagłówkowymi:
include_directories(
${QT_INCLUDE_DIR}
${QAMEOFLIFE_BINARY_DIR}
${QAMEOFLIFE_SOURCE_DIR}
)Ścieżka, w której zostanie utworzona binarka (zwykle obecny katalog):
set( EXECUTABLE_OUTPUT_PATH ${CMAKE_BINARY_DIR} )Pliki źródłowe, na podstawie których powstanie plik wykonywalny qameoflife:
add_executable( qameoflife
${QAMEOFLIFE_SRCS}
${QAMEOFLIFE_MOC_SRCS}
${QAMEOFLIFE_UI_HDRS}
${QAMEOFLIFE_RC_SRCS}
)Biblioteki, które linker podlinkuje do pliku wynikowego (tutaj akurat zmienna zdefiniowana przez moduł szukający Qt 4):
target_link_libraries( qameoflife
${QT_LIBRARIES}
)Użyteczne pliki projektu, które zostaną zainstalowane w systemie po wydaniu polecenia make install z określeniem ścieżek docelowych:
install( TARGETS qameoflife RUNTIME DESTINATION /usr/bin ) install( FILES icons/qameoflife.xpm DESTINATION /usr/share/pixmaps )
W tym momencie mamy gotowy plik CMakeLists.txt służący do zbudowania prostego projektu.
Dokumentacja
Przy budowie bardziej skomplikowanego projektu z pewnością będziemy musieli skorzystać z dokumentacji. Zawiera ona szczegółowy opis CMake wraz mnóstwem przydatnych komend.
Używanie
Zbudowanie i zainstalowanie gotowego projektu jest bardzo proste:
CFLAGS="$SLKCFLAGS" CXXFLAGS="$SLKCFLAGS" cmake -DCMAKE_INSTALL_PREFIX=/usr make make install=$DESTDIR
gdzie $SLKCFLAGS to flagi optymalizacyjne, a $DESTDIR — katalog docelowy (niezbędne przy tworzeniu paczki).
Mam nadzieję, że przekonałem drogich Czytelników-programistów do korzystania z CMake, gdyż jest to nowoczesny, rozwijający się system budujący z pokaźną ofertą możliwości.



GTK FTW!
[...] źródłowa: Używanie CMake do budowania projektu [...]