Якщо це питання стосується зразкового Makefileвиводу CMakeList.txtфайлу, то, будь ласка, перевірте джерела cmake-backkend та генеруйте одне такеMakefile . Якщо це не додавання до відповіді @Roberto, я намагаюся спростити це, приховавши деталі.
Функція CMake
Хоча Makeце гнучкий інструмент для правил та рецептів,CMake це шар абстракції, який також додає функцію конфігурації.
Моя рівнина CMakeLists.txtбуде виглядати наступним чином,
cmake_minimum_required(VERSION 2.8)
project(example)
file(GLOB testapp_SOURCES *.cc)
add_executable(testapp ${testapp_SOURCES})
Зауважте, що CMakeприховувати howзбірку можна. Ми лише вказали whatвхід і вихід.
CMakeLists.txtМістить список функцій-викликів, які визначені cmake.
(Функція CMake) Vs Складіть правила
В використовуються замість . Окрім -подібної функції, надайте прив’язування. Мій мінімалістичний буде виглядати наступним чином,Makefilerules and recipesfunctionsfunctionrules and recipesMakefile
-include "executable.mk"
TARGETS=testapp.bin
all:${TARGETS}
Хоча executable.mkзаповіт буде виглядати наступним чином,
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)
Починаючи з нуля, я розпочну з Makefileнаступного,
all: testapp.bin
testapp.bin:sourcea.o sourcb.o
$(CC) $(CFLAGS) -o $@ $^ $(LFLAGS) $(LIBS)
.PHONY: all clean
clean:
$(RM) $(OBJECTS) testapp.bin
Я взяв цей фрагмент звідси і змінив його. Зауважте, що до цього файлу додаються деякі неявні правила, які можна знайти в документації makefile. Тут також мають значення деякі неявні змінні.
Зверніть увагу, що Makefileзабезпечує деталізацію з recipeзазначенням howскладання може бути зроблено. Можна записати, executable.mkщоб зберегти дані, визначені в одному файлі. Таким чином, makefile можна зменшити, як я показав раніше.
Внутрішні змінні в CMakeіMake
Тепер трохи просунувшись, CMakeми можемо встановити прапор компілятора на зразок наступного,
set(CMAKE_C_FLAGS "-Wall")
Дізнайтеся більше про CMakeзмінні за замовчуванням у CMakeCache.txtфайлі. CMakeВище код буде еквівалентний Makeкоду нижче,
CFLAGS = -Wall
Зауважте, що CFLAGSвнутрішня змінна в Make, таким же чином, CMAKE_C_FLAGSє внутрішньою змінною вCMake .
додавання включають і шлях до бібліотеки в CMake
Ми можемо це зробити за cmakeдопомогою функцій.
target_include_directories(testapp PRIVATE "myincludes")
list(APPEND testapp_LIBRARIES
mytest mylibrarypath
)
target_link_libraries(testapp ${testapp_LIBRARIES})
Додавання Vs включає і бібліотечний шлях у Make
Ми можемо додавати включення та бібліотеки, додаючи рядки, як описано нижче,
INCLUDES += -Imyincludes
LIBS += -Lmylibrarypath -lmytest
Зверніть увагу, що рядки вище можуть бути створені за допомогою інструментів автоматичного генерування або pkg-config. (хоча Makefile не залежить від інструментів автоматичного налаштування)
CMake configure / tweek
Зазвичай за допомогою функції можна генерувати якийсь config.hфайл, як і auto-configінструменти configure_file. Можна зробити більше трюків, написавши спеціальні функції. І, нарешті, ми можемо вибрати конфігурацію, як описано нижче,
cmake --build . --config "Release"
За допомогою optionфункції можна додати деякий параметр, який можна настроїти .
Налаштування / налаштування Makefile
Якщо нам якось потрібно скомпілювати його з деяким прапором налагодження, ми можемо викликати makeподібне,
make CXXFLAGS=NDEBUG
Я думаю, що внутрішні змінні, Makefile-rulesі CMake-functionsє гарним початком для порівняння, удачі з більшою кількістю копання.
cmakeя хотів і цього. Але я сумніваюсь, що ви знайдете це, оскільки можливості просто не відповідають тому, що добре. Якщо ви спробуєте змуситиcmakeсебе так діятиmake, ви серйозно змусите себе. Краще всього починати з нуля. Речі, які є банальнимиmake, досить задіяніcmake, і навпаки.