Jeśli to pytanie dotyczy przykładowego Makefilewyjścia CMakeList.txtpliku, sprawdź źródła zaplecza cmake i wygeneruj takie Makefile. Jeśli nie, to dodając do odpowiedzi @Roberto, staram się to uprościć, ukrywając szczegóły.
Funkcja CMake
Chociaż Makejest elastycznym narzędziem do reguł i receptur, CMakejest warstwą abstrakcji, która dodaje również funkcję konfiguracji.
Moja równina CMakeLists.txtbędzie wyglądać następująco,
cmake_minimum_required(VERSION 2.8)
project(example)
file(GLOB testapp_SOURCES *.cc)
add_executable(testapp ${testapp_SOURCES})
Zauważ, że CMakeukrywanie howkompilacji można zrobić. Podaliśmy tylko whatdane wejściowe i wyjściowe.
CMakeLists.txtZawiera listę funkcji oraz połączeń, które są zdefiniowane przez cmake.
(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,Makefilerules and recipesfunctionsfunctionrules and recipesMakefile
-include "executable.mk"
TARGETS=testapp.bin
all:${TARGETS}
Podczas gdy executable.mkwygląd będzie wyglądał następująco,
SOURCES=$(wildcard *.cpp)
OBJECTS=$(SOURCES:.cpp=.o)
DEPS=$(SOURCES:.cpp=.d)
%.bin:$(OBJECTS)
$(CC) $(CFLAGS) -o $@ $^ $(LFLAGS) $(LIBS)
.PHONY: all clean
clean:
$(RM) $(OBJECTS) $(DEPS) $(TARGETS)
-include $(DEPS)
Zaczynając od zera, zacznę od czegoś Makefilepodobnego:
all: testapp.bin
testapp.bin:sourcea.o sourcb.o
$(CC) $(CFLAGS) -o $@ $^ $(LFLAGS) $(LIBS)
.PHONY: all clean
clean:
$(RM) $(OBJECTS) testapp.bin
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 Makefilezawiera szczegóły recipepokazujące, howże kompilacja może być wykonana. Istnieje możliwość zapisania executable.mkszczegółów w jednym pliku. W ten sposób makefile można zmniejszyć, jak pokazałem wcześniej.
Zmienne wewnętrzne w CMakeiMake
Trochę bardziej zaawansowany, CMakemożemy ustawić flagę kompilatora, jak poniżej,
set(CMAKE_C_FLAGS "-Wall")
Dowiedz się więcej o CMakedomyślnych zmiennych w CMakeCache.txtpliku. Powyższy CMakekod będzie równoważny z Makekodem poniżej,
CFLAGS = -Wall
Zauważ, że CFLAGSjest to zmienna wewnętrzna w Make, w ten sam sposób, CMAKE_C_FLAGSjest zmienną wewnętrzną w CMake.
dodawanie dołączeń i ścieżek do biblioteki w CMake
Możemy to zrobić cmakeużywając funkcji.
target_include_directories(testapp PRIVATE "myincludes")
list(APPEND testapp_LIBRARIES
mytest mylibrarypath
)
target_link_libraries(testapp ${testapp_LIBRARIES})
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,
INCLUDES += -Imyincludes
LIBS += -Lmylibrarypath -lmytest
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.hpliku, tak jak auto-confignarzędzia, przy użyciu configure_filefunkcji. Możliwe jest wykonanie większej liczby sztuczek, pisząc funkcje niestandardowe. Na koniec możemy wybrać konfigurację taką jak poniżej,
cmake --build . --config "Release"
Za pomocą optionfunkcji 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ś makepodobnego,
make CXXFLAGS=NDEBUG
Myślę zmiennych wewnętrznych, Makefile-rulesa CMake-functionsto dobry początek dla porównania, powodzenia więcej kopania.
cmake, też tego chciałem. Ale wątpię, żebyś go znalazł, ponieważ możliwości po prostu nie są dobrze odwzorowane. Jeśli spróbujeszcmakeudawaćmake, że doprowadzisz się do szału, poważnie. Najlepiej zacząć od zera. Rzeczy, w które są trywialne,makesą dość zaangażowanecmakei vice versa.