Я изучал CMake, пытаясь понять это. Насколько я понимаю, он действительно хорош в объединении пакетов C++.
Однако я не вижу, как включить в него генераторы кода. С GNU Makefiles я бы написал простое правило:
%.h: %.fbs
flatc ... $< -o $@
Как мне написать это же правило в CMake?
В отличие от Make, CMake не имеет ни правил шаблон, ни правил автоматические переменные, которые расширяются в соответствии с текущим цель или команда.
Вместо этого CMake позволяет определить функцию или макрос, который инкапсулирует создание цель или команды с соответствующим содержимым.
Ваша команда может быть заключена в следующую функцию:
function(add_fbs_header name)
add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${name}.h
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${name}.fbs
COMMAND flatc ${CMAKE_CURRENT_SOURCE_DIR}/${name}.fbs -o ${CMAKE_CURRENT_BINARY_DIR}/${name}.h
)
endfunction(add_fbs_header name)
с использованием заполнения:
# equivalent to
# flatc <source_dir>/foo.fbs -o <binary_dir>/foo.h
# with proper dependencies and output.
add_fbs_header(foo)
Кстати, функциональность для создания файлов заголовков с использованием плоских буферов уже предусмотрена в скрипте FindFlatBuffers.cmake, который поставляется с пакетом FlatBuffers.
Для включения скрипта FindXXX.cmake
используйте find_package(XXX)
.
Команда, созданная с помощью add_custom_command
, будет выполняться только тогда, когда какая-либо цель (или другая команда) зависит от ВЫВОДА команды. Например. указанным способом:
add_fbs_header(foo)
add_executable(my_exe my.cpp foo.h)
Пока add_custom_command
обрабатывается на этапе настроить, его КОМАНДЫ выполняются на этапе этап сборки.
Разве это не вызывает компиляцию во время настройки CMake?