Jak dokładnie działa CMake?

158

Nie proszę o to tylko dla siebie. Mam nadzieję, że to pytanie będzie punktem odniesienia dla wielu początkujących, którzy mnie lubią, i uznało to za całkowicie zakłopotane, co dokładnie dzieje się za kulisami, gdy dla tak małego CMakeLists.txtpliku

cmake_minimum_required (VERSION 2.6)
project(Tutorial)
add_executable(Tutorial tutorial.cpp)

i taki mały tutorial.cpp

int main() { return 0; } 

jest tak wiele wygenerowanych plików

CMakeCache.txt  cmake_install.cmake  Makefile
CMakeLists.txt  tutorial.cpp

i CMakeFilesfolder z wieloma plikami i folderami

CMakeCCompiler.cmake               CMakeOutput.log    Makefile.cmake
cmake.check_cache                  CMakeSystem.cmake  progress.marks
CMakeCXXCompiler.cmake             CMakeTmp           TargetDirectories.txt
CMakeDetermineCompilerABI_C.bin    CompilerIdC        Tutorial.dir
CMakeDetermineCompilerABI_CXX.bin  CompilerIdCXX
CMakeDirectoryInformation.cmake    Makefile2

Brak zrozumienia, co dzieje się za kulisami (tj. Dlaczego tak może być generowane pliki i jaki był ich cel), był największą przeszkodą w nauce CMake.

Jeśli ktoś wie, czy mógłbyś to wyjaśnić dla dobra potomności? Jaki jest cel tych plików, a kiedy piszę cmake ., co dokładnie konfiguruje i generuje cmake, zanim zbuduje projekt?

Nav
źródło
1
Zdaję sobie sprawę z kompilacji spoza źródła. Jeśli ktoś nie wykonał kompilacji poza kodem źródłowym i nadal szuka sposobu na wyczyszczenie wygenerowanych plików, ta technika działa dobrze: stackoverflow.com/a/12055610/453673
Nav
3
Jest wspaniały opis na: aosabook.org/en/cmake.html i prawdopodobnie dogłębna odpowiedź na pytanie (której nie można tutaj krótko podsumować).
parasrish
@SebTu Uszkodzony link. Strona cmake.html nie istnieje.
Nawigacja
3
@Nav Yap, zepsułem składnię znaczników, przepraszam. Tak więc, tutaj poprawiona wersja: Osobom nowym w cmake naprawdę polecam przeczytanie architektury cmake . Dostarcza wystarczającej ilości informacji, aby poczuć, jak działa cmake, nie tracąc przy tym na szczegóły.
SebNag

Odpowiedzi:

92

Sekret polega na tym, że nie musisz rozumieć, co robią wygenerowane pliki.

CMake wprowadza wiele złożoności do systemu kompilacji, z których większość opłaca się tylko wtedy, gdy używasz go do tworzenia złożonych projektów oprogramowania.

Dobrą wiadomością jest to, że CMake dobrze radzi sobie z utrzymywaniem wielu bałaganu z dala od Ciebie: używaj kompilacji spoza źródła i nie musisz nawet patrzeć na wygenerowane pliki. Jeśli nie zrobiłeś tego do tej pory (co, jak sądzę, ma miejsce, odkąd napisałeś cmake .), sprawdź je przed kontynuowaniem . Mieszanie katalogu kompilacji i katalogu źródłowego jest naprawdę bolesne w przypadku CMake i nie jest sposobem, w jaki system powinien być używany.

W skrócie: zamiast

cd <source_dir>
cmake .

zawsze używaj

cd <build_dir_different_from_source_dir>
cmake <source_dir>

zamiast. Zwykle używam pustego podfolderu buildw katalogu źródłowym jako katalogu kompilacji.

Aby złagodzić twój ból, pozwól mi krótko omówić odpowiednie pliki generowane przez CMake:

  • Pliki projektów / pliki Makefiles - co Cię faktycznie interesuje: Pliki wymagane do zbudowania projektu w wybranym generatorze. Może to być wszystko, od Unix Makefile po rozwiązanie Visual Studio.
  • CMakeCache.txt - jest to trwały magazyn ciągów klucza / wartości, który jest używany do buforowania wartości między uruchomieniami. Wartości przechowywane w tym miejscu mogą być ścieżkami do zależności bibliotek lub czy w ogóle ma być budowany opcjonalny komponent. Lista zmiennych jest w większości identyczna z tą, którą widzisz podczas uruchamiania ccmakelub cmake-gui. Może to być przydatne od czasu do czasu, ale zalecałbym korzystanie z wyżej wymienionych narzędzi do zmiany dowolnej wartości, jeśli to możliwe.
  • Wygenerowane pliki - może to być wszystko, od automatycznie generowanych plików źródłowych po eksportowanie makr, które pomagają w ponownej integracji utworzonego projektu z innymi projektami CMake. Większość z nich jest generowana tylko na żądanie i nie pojawi się w prostym projekcie, takim jak ten z pytania.
  • Wszystko inne jest dość hałasem, aby system kompilacji był zadowolony. W szczególności nigdy nie musiałem przejmować się tym, co dzieje się w CMakeFilespodkatalogu.

Generalnie nie powinieneś majstrować przy żadnym z plików generowanych przez CMake. Wszystkie problemy można rozwiązać od wewnątrz CMakeLists.txtw taki lub inny sposób. Dopóki wynik buduje projekt zgodnie z oczekiwaniami, prawdopodobnie wszystko jest w porządku. Nie przejmuj się zbytnio krwawymi szczegółami - ponieważ właśnie tego CMake próbował cię oszczędzić.

ComicSansMS
źródło
Dzięki. Miałem świadomość, że kompilacje nie pochodzą ze źródeł, ale jak widać, celem zadania tego pytania było zrozumienie więcej. Część Twojej odpowiedzi dotycząca CMakeCache.txt naprawdę pomogła. Tego rodzaju wyjaśnienia szukałem. Również ostatnie zdanie mojego pytania: „ co dokładnie konfiguruje i generuje cmake, zanim zbuduje projekt
Nawigacja,
1
CMakeFileskatalog zawiera CMakeError.logi jest CMakeOutput.logważny dla rozwiązywania problemów z kompilacjami CMake.
Serge Rogatch
1
Dwie rzeczy, które czasami trzeba sprawdzić w CMakeFiles/target_name.dirkatalogu, to pliki flags.makei link.txt. Musiałem to sprawdzić w złożonym projekcie, który odziedziczył flagi / elementy z linkami z projektów zewnętrznych. Np .: Miałem pewne błędy, ponieważ TPL A było zależne od TPL B. Również mój projekt był zależny od B, które zainstalowałem lokalnie; ale A używał wersji B z mojego systemu (zamiast mojej lokalnej instalacji), która miała różne włączone opcje i pojawiła się pierwsza, powodując błędy w moim projekcie. Dopiero patrząc na link.txt mogłem stwierdzić, że to się dzieje.
bartgol
13

Jak podano na swojej stronie internetowej:

Cmake to wieloplatformowy system kompilacji typu open source do zarządzania procesem tworzenia oprogramowania przy użyciu metody niezależnej od kompilatora

W większości przypadków służy do generowania plików projektu / tworzenia - w twoim przykładzie stworzył, Makefilektóre są używane do budowania twojego oprogramowania (głównie na platformie Linux / Unix).

Cmake pozwala na dostarczanie plików kompilacji dla wielu platform, które generowałyby projekty / pliki dla konkretnej platformy dla określonej kompilacji / platformy.

Na przykład możesz spróbować skompilować swoje oprogramowanie w systemie Windows za pomocą programu Visual Studio, a następnie z odpowiednią składnią w CMakeLists.txtpliku, który możesz uruchomić

cmake .

wewnątrz katalogu twojego projektu na platformie Windows, Cmake wygeneruje wszystkie niezbędne pliki projektu / rozwiązania ( .slnitp.).

Jeśli chcesz zbudować swoje oprogramowanie na platformie Linux / Unix, po prostu przejdź do katalogu źródłowego, w którym masz CMakeLists.txtplik i uruchom to samo, cmake .a wygeneruje wszystkie pliki niezbędne do zbudowania oprogramowania za pomocą prostego makelub make all.

Tutaj masz bardzo dobrą prezentację na temat kluczowych funkcji Cmake http://www.elpauer.org/stuff/learning_cmake.pdf

EDYTOWAĆ

Jeśli chcesz utworzyć biblioteki zależne od platformy, definicje zmiennych itp., Możesz użyć tej składni w CMakeLists.txtpliku

IF(WIN32)
   ...do something...
 ELSE(WIN32)
   ...do something else...
 ENDIF(WIN32)

Istnieje również wiele poleceń z wykorzystaniem którego są w stanie zapobiec gromadzeniu z braku w miejscu CUpewnij powiadomi Cię, że na przykład nie masz biblioteki Boost filesystemi regexzainstalowane w systemie. Aby to zrobić, możesz użyć następującej składni:

find_package(Boost 1.45.0 COMPONENTS filesystem regex)

Po sprawdzeniu, że wygeneruje pliki makefile dla odpowiedniego systemu / IDE / kompilatora.

Patryk
źródło
1
Dzięki Patryk. Pomocna odpowiedź, ale plik PDF, z którym łączysz się, wyjaśnia głównie drugi etap nauki CMake, który jest po prostu implementacją CMake. Pytam o wyjaśnienie pierwszego etapu, w którym człowiek musi zrozumieć, co się dzieje na ziemi w CMake!
Nav,
@Nav Trochę rozszerzyłem moją odpowiedź. Możesz nadal przeszukiwać Internet, aby uzyskać więcej informacji.
Patryk
To jest dalekie od odpowiedzi na zadane pytanie.
SenhorLucas
1

Jak dokładnie działa CMake, to pytanie do programistów, więc na to pytanie nie ma tutaj odpowiedzi.

Możemy jednak udzielić przydatnych wskazówek dotyczących tego, kiedy należy używać CMake i kiedy należy się martwić, jak to działa. Nie jestem też fanem odpowiedzi „o, to po prostu działa” - ponieważ, zwłaszcza w oprogramowaniu, NIC nigdy nie „po prostu działa” i ZAWSZE musisz w pewnym momencie zagłębić się w szczegóły.

CMake jest narzędziem przemysłowym. Automatyzuje kilka BARDZO skomplikowanych procesów i bierze pod uwagę wiele zmiennych, których możesz nie być świadomy, zwłaszcza jako całkiem nowy programista, prawdopodobnie pracujący z ograniczoną wiedzą na temat wszystkich systemów operacyjnych i narzędzi do budowania, z którymi może sobie radzić CMake. Powodem, dla którego generowanych jest tak wiele plików i dlaczego rzeczy wydają się tak złożone, jest to, że wszystkie te inne systemy są złożone i muszą być rozliczane i zautomatyzowane. Ponadto istnieją problemy związane z "buforowaniem" i innymi funkcjami narzędzia oszczędzającymi czas. Zrozumienie wszystkiego w CMake oznaczałoby zrozumienie wszystkiego w tych narzędziach do budowania i systemach operacyjnych oraz wszystkich możliwych kombinacji tych zmiennych, co, jak możesz sobie wyobrazić, jest niemożliwe.

Ważne jest, aby pamiętać, że jeśli nie jesteś odpowiedzialny za zarządzanie dużym, wieloplatformowym systemem kompilacji, a Twoja baza kodu to kilka KLOC, może nawet do 100 KLOG, użycie CMake wydaje się trochę jak użycie usuwania drzew leśnych za 100 000 dolarów maszyna do usuwania chwastów z ogrodu kwiatowego o wymiarach 2 stopy na 2 stopy. (Nawiasem mówiąc, jeśli nigdy nie widziałeś takiej maszyny, powinieneś poszukać takiej na youtube, są niesamowite)

Jeśli Twój system kompilacji jest mały i prosty, prawdopodobnie lepiej będzie po prostu ręcznie napisać własne pliki makefile lub samodzielnie je skrypty. Gdy twoje pliki makefile stają się nieporęczne lub musisz zbudować wersję swojego systemu na innej platformie, możesz przełączyć się na CMake. W tym momencie będziesz miał wiele problemów do rozwiązania i możesz zadawać bardziej szczegółowe pytania na ten temat. W międzyczasie zapoznaj się ze wspaniałymi książkami o CMake, a nawet lepiej, napisz własną! 8)

Panie Jeps
źródło