Как сказать CMake, что каталог установки зависит от фальшивой цели? - PullRequest
3 голосов
/ 05 октября 2011

Как мне добиться следующего в CMake (используя версию 2.8.5)?У меня есть документация, сгенерированная пользовательской целью с именем doc, вывод которой я хотел бы включить при установке или CPack'ing.

add_custom_target( doc "${DOXYGEN_EXECUTABLE}" Doxyfile )
install( DIRECTORY ${CMAKE_BINARY_DIR}/doc DESTINATION doc )

Doxyfile говорит Doxygen, что нужно выдать документацию на${CMAKE_BINARY_DIR}/doc.

Если я делаю это в каталоге сборки:

make doc
cpack

все работает нормально, потому что в первой строке создается каталог, от которого зависит цель install.

Однако, если у меня свежая сборка (поэтому ${CMAKE_BINARY_DIR}/doc еще не существует), и я вызываю CPack напрямую:

cpack

, то он жалуется, что не может найти ${CMAKE_BINARY_DIR}/doc:

CMake Error at <snip>/build/cmake_install.cmake:36 (FILE):
  file INSTALL cannot find "<snip>/build/doc".

Я также попробовал следующее:

add_custom_command( OUTPUT ${CMAKE_BINARY_DIR}/doc COMMAND ${DOXYGEN_EXECUTABLE} ${CMAKE_BINARY_DIR}/Doxyfile )
install( DIRECTORY ${CMAKE_BINARY_DIR}/doc DESTINATION doc )

, но я все еще получаю ту же ошибку CPack, и выполнение make doc в каталоге сборки также не работает.

Так что, если я сделаю make doc вручную до cpack, он будет работать с конфигурацией в верхней части этого поста, но как я могу сказать cmake / cpack, что директива install зависит от пользовательской цели doc, так что сборка документации происходит автоматически, когдаn звонит cpack или make install?

Спасибо!

Ответы [ 2 ]

2 голосов
/ 05 октября 2011

Возможно, вам нужно ключевое слово ALL:

add_custom_target( doc ALL "${DOXYGEN_EXECUTABLE}" Doxyfile )

Обновление:

В настоящее время cmake не предоставляет возможность добавлять пользовательские зависимости в своивстроенные цели (например, all, install, test и т. д.).И кажется, что он не предоставит эту опцию в ближайшем будущем - см. http://public.kitware.com/Bug/view.php?id=8438

Однако все еще возможно достичь желаемого поведения с некоторыми взломами / обходными путями.Например, вы можете напрямую запустить make tool в начале шага установки.

Так что используйте на свой страх и риск :

add_custom_target(hack ${CMAKE_COMMAND} -E echo "Hacking install target")
if("${CMAKE_GENERATOR}" MATCHES Make)
    install(CODE "execute_process(COMMAND ${CMAKE_BUILD_TOOL} hack WORKING_DIRECTORY \"${CMAKE_CURRENT_BINARY_DIR}\")")
endif()
1 голос
/ 22 марта 2013

Я немного изменил это в моем CMakeList.txt, чтобы использовать как Linux, так и Windows

install(CODE "execute_process(COMMAND ${CMAKE_BUILD_TOOL} hack WORKING_DIRECTORY \"${CMAKE_CURRENT_BINARY_DIR}\")") endif()

Это мое решение.Он не создает документацию всегда «ВСЕ» только тогда, когда требуются doc или install target (в Visual Studio компилируется проект INSTALL).Это решение не является полным.Например, он не будет работать с MinGW, но ...

set( DOXYFILE_OUTPUT_DIR ${PROJECT_BINARY_DIR}/doc )
#-- Configure the Template Doxyfile
configure_file(Doxyfile.in ${PROJECT_BINARY_DIR}/Doxyfile  @ONLY IMMEDIATE)

#-- Add a custom target to run Doxygen
add_custom_target (doc
    COMMAND ${DOXYGEN_EXECUTABLE} ${PROJECT_BINARY_DIR}/Doxyfile
    SOURCES ${PROJECT_BINARY_DIR}/Doxyfile
    WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
)

if(WIN32)
    install(
        CODE "execute_process(COMMAND ${CMAKE_BUILD_TOOL} /Build Debug ABIHex.sln /project doc.vcproj
                              WORKING_DIRECTORY \"${CMAKE_CURRENT_BINARY_DIR}\")"
    )
else(WIN32)
    install(
        CODE "execute_process(COMMAND ${CMAKE_BUILD_TOOL} --build --target doc
                              WORKING_DIRECTORY \"${CMAKE_CURRENT_BINARY_DIR}\")"
    )
endif(WIN32)

Надеюсь, это кому-нибудь пригодится.

С уважением, Алекс

...