Zastanawiałem się, czy istnieje przykładowy kod dla Makefile
s ( make
) i CMakeLists.txt
( cmake
), które robią to samo (jedyną różnicą jest to, że jeden jest zapisany, make
a drugi cmake
).
Próbowałem poszukać „cmake vs make”, ale nigdy nie znalazłem żadnych porównań kodu. Zrozumienie różnic byłoby naprawdę pomocne, nawet w prostym przypadku.
cmake
, też tego chciałem. Ale wątpię, żebyś go znalazł, ponieważ możliwości po prostu nie są dobrze odwzorowane. Jeśli spróbujeszcmake
udawaćmake
, że doprowadzisz się do szału, poważnie. Najlepiej zacząć od zera. Rzeczy, w które są trywialne,make
są dość zaangażowanecmake
i vice versa.make
icmake
tak wyraźna, że należy je traktować raczej jako komplementarne, a nie konkurencyjne narzędzia?cp *.x $(OUTDIR)
" zapisywanymi w Makefile. Być może najbardziej irytujące dla mnie jest to, że generowane pliki Makefile są z założenia całkowicie nieprzenośne i nieelastyczne (ciąg dalszy)Odpowiedzi:
Poniższy plik Makefile tworzy plik wykonywalny nazwany
prog
na podstawie źródełprog1.c, prog2.c, prog3.c and main.c
.prog
jest powiązanylibmystatlib.a
ilibmydynlib.so
oba są również zbudowane ze źródła. Dodatkowoprog
wykorzystuje bibliotekęlibstuff.a
wstuff/lib
i jego nagłówekstuff/include
. Plik Makefile domyślnie buduje cel wydania, ale oferuje również cel debugowania:Oto plik,
CMakeLists.txt
który robi (prawie) dokładnie to samo, z kilkoma komentarzami podkreślającymi podobieństwa do pliku Makefile:W tym prostym przykładzie najważniejsze różnice to:
CMake rozpoznaje, których kompilatorów użyć dla jakiego rodzaju źródła. Ponadto wywołuje odpowiednią sekwencję poleceń dla każdego typu celu. Dlatego też, nie ma wyraźnego określenie poleceń, takich jak
$(CC) ...
,$(RANLIB) ...
i tak dalej.Wszystkie typowe flagi kompilatora / konsolidatora dotyczące dołączania plików nagłówkowych, bibliotek itp. Są zastępowane przez polecenia niezależne od platformy / niezależne od systemu kompilacji.
Debugowanie flagi są włączone albo przez ustawienie zmiennej
CMAKE_BUILD_TYPE
do „Debug”, lub przekazując go do CMake podczas wywoływania programu:cmake -DCMAKE_BUILD_TYPE:STRING=Debug
.CMake oferuje również niezależne od platformy włączenie flagi „-fPIC” (poprzez
POSITION_INDEPENDENT_CODE
właściwość) i wielu innych. Mimo to, bardziej niejasne ustawienia można zaimplementować ręcznie w CMake, tak samo dobrze jak w Makefile (używającCOMPILE_FLAGS
i podobnych właściwości). Oczywiście CMake naprawdę zaczyna świecić, gdy biblioteki innych firm (takie jak OpenGL) są dołączane w sposób przenośny.Jeśli używasz pliku Makefile, proces budowania ma jeden krok, a mianowicie wpisywanie
make
w wierszu poleceń. W przypadku CMake są dwa kroki: Najpierw musisz skonfigurować środowisko kompilacji (wpisująccmake <source_dir>
katalog kompilacji lub uruchamiając klienta GUI). Tworzy to Makefile lub coś równoważnego, w zależności od wybranego systemu budowania (np. Make na Unixes lub VC ++ lub MinGW + Msys w Windows). System kompilacji można przekazać do CMake jako parametr; jednak CMake dokonuje rozsądnych domyślnych wyborów w zależności od konfiguracji systemu. Po drugie, wykonujesz rzeczywistą kompilację w wybranym systemie kompilacji.Źródła i instrukcje kompilacji są dostępne pod adresem https://github.com/rhoelzel/make_cmake .
źródło
CPPFLAGS
zamiastINCDIR
jednego, można by użyć wbudowanych reguł, a jawne wywołanie kompilatora byłoby zbędne. Podobnie w przypadku obsługi ar, wbudowane reguły mogą to również obejmować. Poza tym, po co ustawiaćCPP
iCC
jawnie? Są już ustawione na dobre wartości przezmake
, są predefiniowanymi zmiennymi.make
rozpoznaje również, którego kompilatora użyć dla jakiego rodzaju źródła, wbudowanych reguł jest wiele.:=
zamiast=
.cmake
jest bardziej porównywalnaautomake
niżmake
.INCLUDES
zamiastINCDIR
. Nie potrzebujesz reguł% .o:%. C.Pobierz oprogramowanie, które używa CMake jako systemu kompilacji (na przykład jest wiele projektów open source do wyboru). Pobierz kod źródłowy i skonfiguruj go za pomocą CMake. Przeczytaj wynikowe pliki makefile i ciesz się.
Należy pamiętać, że te narzędzia nie mapują jeden do jednego. Najbardziej oczywistą różnicą jest to, że CMake skanuje zależności między różnymi plikami (np. Nagłówkiem C i plikami źródłowymi), podczas gdy make pozostawia to autorom makefile.
źródło
Jeśli to pytanie dotyczy przykładowego
Makefile
wyjściaCMakeList.txt
pliku, sprawdź źródła zaplecza cmake i wygeneruj takieMakefile
. Jeśli nie, to dodając do odpowiedzi @Roberto, staram się to uprościć, ukrywając szczegóły.Funkcja CMake
Chociaż
Make
jest elastycznym narzędziem do reguł i receptur,CMake
jest warstwą abstrakcji, która dodaje również funkcję konfiguracji.Moja równina
CMakeLists.txt
będzie wyglądać następująco,Zauważ, że
CMake
ukrywaniehow
kompilacji można zrobić. Podaliśmy tylkowhat
dane wejściowe i wyjściowe.CMakeLists.txt
Zawiera listę funkcji oraz połączeń, które są zdefiniowane przezcmake
.(Funkcja CMake) Vs Tworzenie reguł
W stosowane są zamiast . Oprócz funkcji podobnej do podobnej, zapewnij tworzenie łańcuchów. Mój minimalistyczny będzie wyglądał następująco,
Makefile
rules and recipes
functions
function
rules and recipes
Makefile
Podczas gdy
executable.mk
wygląd będzie wyglądał następująco,Zaczynając od zera, zacznę od czegoś
Makefile
podobnego:Mam stąd ten fragment i zmodyfikowałem go. Zauważ, że do tego pliku dodane są pewne niejawne reguły, które można znaleźć w dokumentacji makefile. Niektóre niejawne zmienne są tutaj również istotne.
Zauważ, że
Makefile
zawiera szczegółyrecipe
pokazujące,how
że kompilacja może być wykonana. Istnieje możliwość zapisaniaexecutable.mk
szczegółów w jednym pliku. W ten sposób makefile można zmniejszyć, jak pokazałem wcześniej.Zmienne wewnętrzne w
CMake
iMake
Trochę bardziej zaawansowany,
CMake
możemy ustawić flagę kompilatora, jak poniżej,Dowiedz się więcej o
CMake
domyślnych zmiennych wCMakeCache.txt
pliku. PowyższyCMake
kod będzie równoważny zMake
kodem poniżej,Zauważ, że
CFLAGS
jest to zmienna wewnętrzna wMake
, w ten sam sposób,CMAKE_C_FLAGS
jest zmienną wewnętrzną wCMake
.dodawanie dołączeń i ścieżek do biblioteki w CMake
Możemy to zrobić
cmake
używając funkcji.Vs dodając dołączenie i ścieżkę do biblioteki w Make
Możemy dodawać dołączenia i biblioteki, dodając wiersze takie jak poniżej,
Zauważ, że powyższe wiersze mogą być wygenerowane z narzędzi auto-gen lub pkg-config. (chociaż Makefile nie jest zależny od narzędzi do automatycznej konfiguracji)
Konfiguracja / tweek CMake
Zwykle możliwe jest wygenerowanie jakiegoś
config.h
pliku, tak jakauto-config
narzędzia, przy użyciuconfigure_file
funkcji. Możliwe jest wykonanie większej liczby sztuczek, pisząc funkcje niestandardowe. Na koniec możemy wybrać konfigurację taką jak poniżej,Za pomocą
option
funkcji można dodać konfigurowalną opcję .Konfiguracja / poprawianie pliku Makefile
Jeśli w jakiś sposób musimy go skompilować z jakąś flagą debugowania, możemy wywołać coś
make
podobnego,Myślę zmiennych wewnętrznych,
Makefile-rules
aCMake-functions
to dobry początek dla porównania, powodzenia więcej kopania.źródło