Добавить пользовательский шаг сборки в CMake
Я пытаюсь добавить пользовательский шаг сборки в CMake, который генерирует некоторые файлы. Я не нашел описания, как это работает.
У меня есть проект, где файлы источника, заголовка и реализации должны быть созданы ODB для С++. ODB принимает заголовки классов в качестве аргументов и генерирует исходные файлы, которые я хочу использовать в своем проекте.
Сейчас у меня есть следующая команда в CMakeLists.txt:
add_custom_command(TARGET ${PROJECT_NAME}
PRE_BUILD
COMMAND odb -o /home/david/dev/ --std c++11 -I/home/david/dev/ -d sqlite --generate- query --generate-schema ${PROMOTER_LIB_PREFIX}/entities/person.hpp
DEPENDS ${PROJECT_NAME}
VERBATIM
)
Для файла person.hpp
ODB должен генерировать person-odb.hxx
, person-odb.cxx
, person-odb.ixx
, но команда CMake, которую я использовал, не генерирует ничего. В терминале эта команда работает нормально.
Что я делаю неправильно?
EDIT: проблему можно решить, добавив следующие строки:
set(FAKE_TARGET fakeTarget)
add_custom_target(fakeTarget
odb -o /home/david/dev/ --std c++11 -I/home/david/dev/ -d sqlite --generate-query --generate-schema ${PROMOTER_LIB_PREFIX}/entities/person.hpp
)
add_dependencies(${PROJECT_NAME} ${FAKE_TARGET})
Ответы
Ответ 1
Для меня, с чем-то похожим, я просто использую:
add_custom_command(TARGET ${PROJECT_NAME}
PRE_BUILD
COMMAND odb -o /home/david/dev/ --std c++11 -I/home/david/dev/ -d sqlite --generate- query --generate-schema ${PROMOTER_LIB_PREFIX}/entities/person.hpp
)
Мы не используем DEPENDS
или VERBATIM
.
Параметр DEPENDS
указывает, что команда должна быть выполнена только после того, как будет создан проект, который вы дали этому параметру.
EDIT:
Обратите внимание, что параметр PRE_BUILD поддерживается только в Visual Studio 7 или более поздней версии. Для всех других генераторов PRE_BUILD будет рассматриваться как PRE_LINK.
Возможно, почему это не работает для вас.
Работа может быть (немного уродливой):
- Создайте поддельный проект
- Добавьте в него свою пользовательскую команду как POST_BUILD
- Сделайте текущий проект зависимым от поддельного
Ответ 2
Я использую это:
add_custom_command(
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/gen_icinstrtab.hpp
COMMAND xsltproc --output ${CMAKE_CURRENT_BINARY_DIR}/gen_icinstrtab.hpp ${CMAKE_SOURCE_DIR}/xml/genictabc.xslt ${CMAKE_SOURCE_DIR}/xml/icminstr.xml
)
add_executable(
du4
${CMAKE_CURRENT_BINARY_DIR}/gen_icinstrtab.hpp
.
.
.
)
Ключ должен был добавить файлы .hpp в блок add_executable.