CMake
Deweloperzy | Andy Cedilnik, Bill Hoffman, Brad King, Ken Martin, Alexander Neundorf |
---|---|
Pierwsze wydanie | 2000 |
Wersja stabilna | |
Magazyn | |
Napisane w | C , C++ |
System operacyjny | Międzyplatformowe |
Typ | Narzędzia programistyczne |
Licencja | Klauzula BSD-3 |
Strona internetowa |
|
W dziedzinie tworzenia oprogramowania CMake to wieloplatformowe bezpłatne oprogramowanie typu open source do automatyzacji kompilacji , testowania , pakowania i instalowania oprogramowania przy użyciu metody niezależnej od kompilatora . CMake sam w sobie nie jest systemem kompilacji; generuje pliki kompilacji innego systemu. Obsługuje hierarchie katalogów i aplikacje zależne od wielu bibliotek. Jest używany w połączeniu z natywnymi środowiskami kompilacji, takimi jak Make , Qt Creator , Ninja , Android Studio , Xcode firmy Apple i Microsoft Visual Studio . Ma minimalne zależności, wymaga jedynie C++ na własnym systemie kompilacji.
CMake jest rozpowszechniany jako oprogramowanie typu open source na licencji BSD-3-Clause .
Historia
Tworzenie CMake rozpoczęło się w 1999 roku w odpowiedzi na zapotrzebowanie na wieloplatformowe środowisko kompilacji dla zestawu Insight Segmentation and Registration Toolkit . Projekt jest finansowany przez Narodową Bibliotekę Medyczną Stanów Zjednoczonych w ramach programu Visible Human Project . Został częściowo zainspirowany pcmakerem, który został stworzony przez Kena Martina i innych programistów w celu obsługi Visualization Toolkit (VTK) . W Kitware Bill Hoffman połączył komponenty pcmakera z własnymi pomysłami, starając się naśladować funkcjonalność uniksowych skryptów konfiguracyjnych . CMake został po raz pierwszy wdrożony w 2000 roku i dalej rozwijany w 2001 roku.
Ciągły rozwój i ulepszenia były napędzane przez włączenie CMake do własnych systemów deweloperów, w tym VXL Project, [ wymagane wyjaśnienie ] funkcji CABLE dodanych przez Brada Kinga, [ wymagane wyjaśnienie ] oraz GE Corporate R&D w celu obsługi DART. [ wymagane wyjaśnienie ] Dodatkowe funkcje zostały stworzone, gdy VTK przeszedł na CMake dla swojego środowiska kompilacji i obsługi ParaView .
Wersja 3.0 została wydana w czerwcu 2014 roku. Została opisana jako początek „Modern CMake”. Eksperci radzą teraz unikać zmiennych na rzecz celów i właściwości . Polecenia add_compile_options
, include_directories
, link_directories
, link_libraries
, które były podstawą CMake 2, powinny teraz zostać zastąpione poleceniami specyficznymi dla celu.
Cechy
Kluczową cechą jest możliwość umieszczania danych wyjściowych kompilatora (takich jak pliki obiektowe) poza drzewem źródłowym. Umożliwia to wiele kompilacji z tego samego drzewa źródłowego i krzyżową kompilację . Umieszczenie danych wyjściowych kompilatora poza drzewem źródłowym sprawia, że drzewo jest oddzielone od plików kompilacji, zapewniając, że usunięcie katalogu kompilacji nie spowoduje usunięcia plików źródłowych. Jednak użytkownicy nie są w żaden sposób chronieni przed usunięciem oryginalnego folderu z kodem źródłowym.
Elastyczna struktura projektu
CMake może zlokalizować ogólnosystemowe i określone przez użytkownika pliki wykonywalne, pliki i biblioteki. Te lokalizacje są przechowywane w pamięci podręcznej , którą można następnie dostosować przed wygenerowaniem docelowych plików kompilacji. Pamięć podręczną można edytować za pomocą edytora graficznego, który jest dostarczany z CMake.
Skomplikowane hierarchie katalogów i aplikacje, które opierają się na kilku bibliotekach, są dobrze obsługiwane przez CMake. Na przykład CMake jest w stanie pomieścić projekt, który ma wiele zestawów narzędzi lub bibliotek, z których każda ma wiele katalogów. Ponadto CMake może pracować z projektami, które wymagają utworzenia plików wykonywalnych przed wygenerowaniem kodu do skompilowania dla ostatecznej aplikacji. Jego rozszerzalna konstrukcja typu open source umożliwia dostosowanie CMake w razie potrzeby do konkretnych projektów.
Wsparcie konfiguracji IDE
CMake może generować pliki projektów dla kilku popularnych IDE , takich jak Microsoft Visual Studio , Xcode i Eclipse CDT . Może również tworzyć skrypty kompilacji dla MSBuild lub NMake w systemie Windows; Unix Make na platformach uniksopodobnych, takich jak Linux , macOS i Cygwin ; i Ninja na platformach Windows i Unix.
Wykrywanie funkcji kompilatora
CMake umożliwia określenie funkcji, które kompilator musi obsługiwać, aby skompilować docelowy program lub bibliotekę.
Kompilatory
CMake obsługuje obszerną listę kompilatorów, w tym: Apple Clang, Clang , GNU GCC , MSVC , Oracle Developer Studio i Intel C++ Compiler .
System pakowania
Mimo że CMake nie jest menedżerem pakietów , zapewnia podstawowe funkcje modułów (patrz CPack) do instalowania plików binarnych i informacji o pakietach zadeklarowanych przez skrypt CMakeList.txt
do wykorzystania przez konsumenckie projekty CMake. Pakiet może być również spakowany do pliku archiwum dla menedżera pakietów lub instalatora obsługiwanego przez platformę docelową. Pakiety innych firm można również importować za pośrednictwem skonfigurowanych plików CMake, które są dostarczane przez tę samą firmę zewnętrzną lub tworzone ręcznie.
GUI
Cmake jest dostarczany z wbudowanym programem ncurses ccmake
, którego można używać do konfigurowania projektów za pomocą interfejsu wiersza poleceń.
Proces kompilacji
Kompilacja programu lub biblioteki za pomocą CMake to proces dwuetapowy. Najpierw tworzone są (generowane) standardowe pliki kompilacji (zwykle skrypty) z plików konfiguracyjnych (CMakeLists.txt), które są napisane w języku CMake . Następnie natywne narzędzia do budowania platformy (native toolchain) są używane do rzeczywistego budowania programów. Skrypty generowane przez CMake są następnie wykorzystywane do tworzenia rzeczywistych plików binarnych lub innych plików wyjściowych.
Generatory
Pliki kompilacji są konfigurowane w zależności od używanego generatora (np. Unix Makefile dla make ) i powiązanych plików narzędzi. Zaawansowani użytkownicy mogą również tworzyć i włączać dodatkowe generatory plików makefile, aby wspierać ich specyficzne potrzeby dotyczące kompilatora i systemu operacyjnego. Wygenerowane pliki są zwykle umieszczane (przy użyciu cmake
) w folderze poza folderem źródłowym (kompilacja poza źródłem), np. build/
.
Każdy projekt kompilacji z kolei zawiera własny plik CMakeCache.txt
i katalog CMakeFiles
w każdym (pod-)katalogu projektu zawartym w poleceniu add_subdirectory(...)
, co pomaga uniknąć lub przyspieszyć regenerację, gdy jest ona uruchamiana wielokrotnie.
Proces generowania i dane wyjściowe można było precyzyjnie dostroić za pomocą właściwości docelowych. Wcześniej odbywało się to za pomocą CMAKE_...
-zmiennych globalnych z prefiksem, które są również używane do konfigurowania samego CMake i ustawiania początkowych ustawień domyślnych. Starsze podejście jest obecnie odradzane.
Typy celów kompilacji
W zależności od konfiguracji CMakeLists.txt plikami kompilacji mogą być pliki wykonywalne, biblioteki (np. libxyz
, xyz.dll
itp.), biblioteki plików obiektowych lub pseudo-cel (w tym aliasy). CMake może tworzyć pliki obiektowe, z którymi można łączyć wykonywalne pliki binarne/biblioteki, unikając łączenia dynamicznego (w czasie wykonywania) i zamiast tego używając łączenia statycznego (w czasie kompilacji). Umożliwia to elastyczność w konfiguracji różnych optymalizacji.
Zależności kompilacji mogą być określane automatycznie.
Prekompilowane nagłówki
Możliwe jest generowanie prekompilowanych nagłówków przy użyciu CMake od wersji 3.6.
Język
CMakeLists.txt
CMake ma stosunkowo prosty interpretowany , imperatywny język skryptowy. Obsługuje zmienne, metody manipulacji łańcuchami, tablice, deklaracje funkcji/makr oraz włączanie modułów (importowanie). Polecenia języka CMake (lub dyrektywy) są odczytywane przez cmake
z pliku o nazwie CMakeLists.txt
. Ten plik określa pliki źródłowe i parametry kompilacji, które CMake umieści w specyfikacji kompilacji projektu (takiej jak Makefile). Ponadto .cmake
mogą zawierać skrypty używane przez CMake.
Aby wygenerować pliki kompilacji projektu, wywołuje się cmake
w terminalu i określa katalog zawierający CMakeLists.txt
. Ten plik zawiera jedno lub więcej poleceń w postaci COMMAND(argument ...)
.
Składnia polecenia
Argumenty poleceń są oddzielone białymi znakami i mogą zawierać słowa kluczowe oddzielające grupy argumentów. Polecenia mogą przyjmować słowa kluczowe. Na przykład w poleceniu SET_SOURCE_FILE_PROPERTIES ( plik_źródłowy ... COMPILE_FLAGS opcja_kompilatora ... )
słowem kluczowym jest COMPILE_FLAGS
. Służy jako ogranicznik między listą plików źródłowych a niektórymi innymi opcjami.
Przykłady poleceń, które CMake oferuje do określania celów i ich zależności oraz które służą jako punkt wyjścia CMakeLists.txt:
-
add_executable ( ... )
— deklaruje wykonywalny cel binarny ze źródłami (w zależności od wybranego języka) do zbudowania -
add_library ( ... )
— to samo, ale dla biblioteki -
target_link_libraries ( ... )
— dodaje zależności itp.
Ciągi JSON
CMake obsługuje wyodrębnianie wartości do zmiennych z ciągów danych JSON (od wersji 3.19).
Wewnętrzne
Programy wykonywalne CMake, CPack i CTest są napisane w języku programowania C++ .
Wiele funkcji CMake jest zaimplementowanych w modułach napisanych w języku CMake .
Od wersji 3.0 dokumentacja CMake używa znaczników reStructuredText . Strony HTML i strony man są generowane przez Sphinx .
Moduły i narzędzia
CMake jest dostarczany z licznymi modułami i narzędziami .cmake .
Ułatwiają one prace takie jak wyszukiwanie zależności (zarówno wbudowanych, jak i zewnętrznych, np. modułów FindXYZ
), testowanie środowiska toolchain i plików wykonywalnych, wydań pakietów ( moduł CPack
i komenda cpack
) oraz zarządzanie zależnościami od zewnętrznych projektów ( moduł ExternalProject ):
- ctest — jest używany do docelowych poleceń testowych określonych przez CMakeLists.txt
- ccmake i cmake-gui — poprawia i aktualizuje zmienne konfiguracyjne przeznaczone dla natywnego systemu kompilacji
- cpack — pomaga pakować oprogramowanie
CPack
CPack to system pakowania dystrybucji oprogramowania. Jest ściśle zintegrowany z CMake, ale może działać bez niego.
Może służyć do generowania:
- Linux RPM , deb i gzip (zarówno dla plików binarnych , jak i kodu źródłowego ).
- NSIS (dla systemu Microsoft Windows ).
- pakiety macOS .
Przyjęcie
CMake został bardzo szeroko przyjęty w projektach oprogramowania komercyjnego, open source i akademickiego. Kilku znaczących użytkowników to Android NDK , Netflix , Inria , MySQL , Boost (biblioteki C++) , KeePassXC , KDE , KiCAD , FreeCAD , Webkit , Blender , Biicode, ReactOS , Apache QPid, eksperyment ATLAS i Second Life .
Przykłady
Witaj świecie
Poniższe pliki kodu źródłowego pokazują, jak zbudować prosty program Hello World napisany w języku C++ przy użyciu narzędzia CMake.
// hello.cpp #include <iostream> int main () { std :: cout << "Witaj, świecie! \n " ; }
# CMakeLists.txt cmake_minimum_required ( WERSJA 3.5 ) projekt ( HelloWorld CXX ) add_executable ( hello hello.cpp )
powłoki do uruchamiania CMake w systemie Linux (należy wprowadzić do katalogu zawierającego dwa powyższe pliki):
cmake -B kompilacja . # Skonfiguruj katalog kompilacji. cmake --build build # Zbuduj program w katalogu build. ./build/hello # Uruchom program (wypisuje „Witaj, świecie!”)
Zobacz też
- Lista oprogramowania do automatyzacji kompilacji § Generowanie skryptu kompilacji
- skonfiguruj skrypt
- Robić
- Monorepo
- Qmake