CMakewieloplatformowe narzędzie do automatycznego zarządzania procesem kompilacji programu. Jego główna cecha to niezależność od używanego kompilatora oraz platformy sprzętowej. CMake nie kompiluje programu samodzielnie, lecz tworzy pliki z regułami kompilacji dla konkretnego środowiska; przykładowo w systemie GNU/Linux będą to pliki Makefile, natomiast pod Windowsem – pliki projektu dla Microsoft Visual Studio.

CMake
Logo CMake
Logo programu
ilustracja
Pierwsze wydanie 2000
Aktualna wersja stabilna 3.30.1
(19 lipca 2024) [±]
Język programowania C, C++
Platforma sprzętowa Wieloplatformowy
System operacyjny Wieloplatformowy
Rodzaj Narzędzia wspomagające budowę aplikacji
Licencja Licencja BSD
Strona internetowa

Rozwój projektu jest sponsorowany przez United States National Library of Medicine. Nazwa „CMake” to skrót od ang. Cross-platform Make.

Historia

edytuj

W 1999 roku amerykańska biblioteka medyczna National Library of Medicine zdobyła kontrakt na zaprojektowanie i stworzenie otwartej biblioteki do segmentacji i rejestracji obrazu, nazwanej później Insight Segmentation and Registration Toolkit. Projekt miał pracować na różnych platformach sprzętowych i środowiskach, lecz okazało się, że nie istnieje uniwersalny system budowania i kompilacji, który działałby na każdej z nich, co zmuszałoby twórców do utrzymywania kilku niezależnych skryptów dostosowanych do konkretnej platformy.

Bill Hoffman z Kitware, główny twórca CMake, inspirował się częściowo wcześniejszym projektem pcmaker autorstwa Ken Martina, dodając jednak sporo własnych pomysłów oraz idei zaczerpniętych z Autotools. Pierwsza implementacja powstała w połowie roku 2000, natomiast od następnego roku projekt przeżywał gwałtowny rozwój. Kolejne funkcjonalności były opracowywane przez programistów, którzy adaptowali CMake na potrzeby swoich własnych projektów i rozwiązywali napotykane tam problemy.

Możliwości

edytuj
  • niezależność od platformy sprzętowej, systemu operacyjnego i kompilatora,
  • obsługa złożonych struktur katalogowych,
  • kompilacja skrośna,
  • możliwość kompilowania w oddzielnym katalogu (out-of-source build, pliki wynikowe nie mieszają się ze źródłami),
  • wsparcie dla testów jednostkowych,
  • mechanizm wykrywania zależności i bibliotek zewnętrznych.

Elementy składowe

edytuj

Język skryptowy

edytuj

Głównym elementem składowym CMake jest prosty język skryptowy, w którym tworzone są pliki CMakeLists.txt umieszczane w katalogach ze źródłami projektu. Służy on do definiowania reguł budowania opisujących m.in. jakie pliki wynikowe powinny powstać w wyniku kompilacji, jak połączyć je z zewnętrznymi bibliotekami oraz jak je zainstalować. Przykładowy plik CMakeLists.txt przedstawiony jest poniżej:

cmake_minimum_required (VERSION 2.6)
project(przyklad)

# Przykladowa opcja kompilacji
option (USE_SOMETHING "Use some extra functionality" ON)

# Wyeksportuj ustawienia do pliku config.h
# uzywajac config.h.in jako szablonu
configure_file (
  "${PROJECT_SOURCE_DIR}/config.h.in"
  "${PROJECT_BINARY_DIR}/config.h"
)

# Ustaw katalog z plikami naglowkowymi i zbuduj projekt.
include_directories("${PROJECT_BINARY_DIR}")
add_executable(przyklad przyklad.c)

Duży nacisk kładziony jest na wsteczną kompatybilność tworzonych skryptów. Jeśli w nowej wersji CMake pojawia się zmiana, która zmienia zachowanie jednego z istniejących już elementów (np. w wyniku dodania nowej funkcjonalności lub naprawy znalezionego błędu), system umożliwia programiście wybór między użyciem starego i nowego zachowania.

Na podstawie plików CMakeLists.txt CMake jest w stanie wygenerować np. pliki Makefile, przy pomocy których można dokonać właściwej kompilacji programu zgodnie z wybranymi ustawieniami. Przykładowa sekwencja komend dla systemu GNU/Linux prowadząca do utworzenia skompilowanego programu to:

$ cmake ./ -DUSE_SOMETHING=ON
$ make
$ make install

Środowisko testów

edytuj

ctest to program narzędziowy wchodzący w skład CMake służący do uruchamiania testów jednostkowych. Testami są pliki wykonywalne powstałe podczas kompilacji i oznaczone jako testowe komendą add_test(). Po zbudowaniu aplikacji polecenie ctest uruchamia wszystkie dostępne testy lub tylko wybraną ich część, a następnie przedstawia raport końcowy zawierający informacje o wynikach każdego z nich oraz czasie wykonania. Uzyskany raport może być następnie wysłany do cdash, aplikacji WWW służącej do gromadzenia i analizy wyników testów.

Pakowanie aplikacji

edytuj

cpack to narzędzie wchodzące w skład CMake od wersji 2.4.2, które umożliwia wygenerowanie pakietów instalacyjnych dla konkretnych platform przy pomocy tzw. generatorów. Dostępnych jest obecnie kilkanaście generatorów, dzięki którym można utworzyć np. pakiety RPM czy DEB dla systemu Linux zawierające skompilowaną aplikację.

Linki zewnętrzne

edytuj