Добавить пользовательский шаг сборки в 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.