Używanie CMake do budowania projektu

4 08 2009

Powszechnie 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.


Opcje

Info

2 Odpowiedzi do “Używanie CMake do budowania projektu”

4 08 2009
largo3 (19:50:42) :

GTK FTW!

24 08 2009
Planeta jakilinux.org » Używanie CMake do budowania projektu (09:02:24) :

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

Odpowiedz

Możesz używać tagów : <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>