Używanie CMake do budowania projektu

[ niedziela, 23 Sierpień 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.

Wiadomość źródłowa: Używanie CMake do budowania projektu (SlackBlog)

This website uses IntenseDebate comments, but they are not currently loaded because either your browser doesn't support JavaScript, or they didn't load fast enough.

RSS feed

Komentarze

Brak komentarzy.

Komentarze do tego wpisu są wyłączone.

Reklama :)

jakilinux.org - Linux krok po kroku!