Якщо це питання стосується зразкового 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 Складіть правила
В використовуються замість . Окрім -подібної функції, надайте прив’язування. Мій мінімалістичний буде виглядати наступним чином,Makefile
rules and recipes
functions
function
rules and recipes
Makefile
-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
, і навпаки.