Jeśli to pytanie dotyczy przykładowego Makefile
wyjścia CMakeList.txt
pliku, 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ż 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,
cmake_minimum_required(VERSION 2.8)
project(example)
file(GLOB testapp_SOURCES *.cc)
add_executable(testapp ${testapp_SOURCES})
Zauważ, że CMake
ukrywanie how
kompilacji można zrobić. Podaliśmy tylko what
dane wejściowe i wyjściowe.
CMakeLists.txt
Zawiera 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,Makefile
rules and recipes
functions
function
rules and recipes
Makefile
-include "executable.mk"
TARGETS=testapp.bin
all:${TARGETS}
Podczas gdy executable.mk
wyglą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ś Makefile
podobnego:
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 Makefile
zawiera szczegóły recipe
pokazujące, how
że kompilacja może być wykonana. Istnieje możliwość zapisania executable.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,
set(CMAKE_C_FLAGS "-Wall")
Dowiedz się więcej o CMake
domyślnych zmiennych w CMakeCache.txt
pliku. Powyższy CMake
kod będzie równoważny z Make
kodem poniżej,
CFLAGS = -Wall
Zauważ, że CFLAGS
jest to zmienna wewnętrzna w Make
, w ten sam sposób, CMAKE_C_FLAGS
jest zmienną wewnętrzną w CMake
.
dodawanie dołączeń i ścieżek do biblioteki w CMake
Możemy to zrobić cmake
uż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.h
pliku, tak jak auto-config
narzędzia, przy użyciu configure_file
funkcji. 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ą 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,
make CXXFLAGS=NDEBUG
Myślę zmiennych wewnętrznych, Makefile-rules
a CMake-functions
to 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ó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.