Definicja #
CMake to narzędzie do zarządzania procesem budowania projektów C/C++ (i innych języków) w sposób niezależny od platformy i kompilatora. Nie kompiluje kodu bezpośrednio — generuje pliki wejściowe dla wybranego systemu budowania: Makefile (Linux/macOS), Ninja, pliki projektów Visual Studio (Windows) lub Xcode (macOS).
Konfiguracja projektu odbywa się w plikach CMakeLists.txt przy użyciu języka CMake. Nowoczesne CMake (od wersji 3.x) opiera się na koncepcji targetów i właściwości (target-based approach) — zamiast globalnych zmiennych, właściwości jak include directories czy compile flags są przypisane do konkretnych targetów.
Kluczowe funkcje: znajdowanie bibliotek (find_package), zarządzanie zależnościami (FetchContent, CPM.cmake), obsługa testów (CTest), tworzenie pakietów (CPack), generowanie eksportu konfiguracji dla innych projektów (install + export).
Zastosowania #
- Budowanie projektów C/C++ na wielu platformach z jedną konfiguracją CMakeLists.txt
- Embedded i cross-compilation — generowanie plików dla toolchainów ARM, AVR, RISC-V
- Integracja z IDE — CLion, Visual Studio Code (CMake Tools extension), Visual Studio
- Zarządzanie zależnościami bibliotek (OpenCV, Boost, Qt, GoogleTest) przez find_package
- Automatyzacja testów przez CTest i integracja z CI/CD (GitHub Actions, Jenkins)
Ścieżka nauki #
Naukę CMake zacznij od oficjalnej dokumentacji (cmake.org) i tutoriala CMake Tutorial. Polecany zasób to książka Professional CMake Craiga Scotta — najbardziej kompleksowe źródło wiedzy o nowoczesnym CMake.
Kluczowe zagadnienia: tworzenie podstawowego CMakeLists.txt, definiowanie targetów (add_executable, add_library), łączenie bibliotek (target_link_libraries), znajdowanie pakietów (find_package), system budowania Ninja jako szybsza alternatywa dla Make. Warto też opanować FetchContent do zarządzania zależnościami. Praktyczne ćwiczenie: zbuduj projekt z kilkoma bibliotekami (np. fmt, spdlog, GoogleTest) używając tylko CMake.
FAQ #
- Czym różni się CMake od Make?
- Make to system budowania wykonujący instrukcje z Makefile. CMake to generator — tworzy Makefile (lub pliki dla innych systemów budowania) na podstawie CMakeLists.txt. CMake obsługuje wiele platform i IDE, Make jest specyficzny dla Unixa. W nowoczesnych projektach CMake generuje pliki dla Ninja (szybszy niż Make).
- Co to jest nowoczesne CMake (Modern CMake)?
- Modern CMake (wersja 3.x+) to podejście oparte na targetach — każda biblioteka i executable jest targetem z własnymi właściwościami. Zamiast globalnego include_directories() używa się target_include_directories(). To eliminuje problemy z propagacją ustawień i ułatwia tworzenie wielomodułowych projektów.
- Jak CMake obsługuje zależności zewnętrzne?
- CMake oferuje kilka podejść: find_package() do znajdowania zainstalowanych bibliotek, FetchContent do pobierania źródeł podczas konfiguracji, ExternalProject_Add do budowania zależności jako osobnych projektów. Popularne nakładki to CPM.cmake i vcpkg (menedżer pakietów dla C++).
- Czy CMake nadaje się do embedded?
- Tak — CMake jest szeroko używany w embedded dzięki obsłudze toolchain files (pliki definiujące cross-compiler). Frameworki jak Zephyr RTOS, ESP-IDF i ARM Mbed używają CMake. Można generować pliki dla OpenOCD i debuggerów JTAG/SWD.