2011-10-05 87 views
3

如何在CMake中實現以下功能(使用版本2.8.5)?我有一個由名爲doc的自定義目標生成的文檔,我希望在安裝或CPacking時將其輸出。如何告訴CMake安裝目錄取決於僞目標?

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

Doxyfile告訴Doxygen的放出來的文檔在${CMAKE_BINARY_DIR}/doc

如果我做這個build目錄:

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 doccpack手動將其與配置工作在這個崗位上,但我怎麼能告訴cmake的/ cpack的install指令依賴於自定義的目標doc,使建築的文檔發生自動撥打電話cpackmake install

謝謝!

回答

2

也許你需要ALL關鍵字:

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

更新:

目前CMake的不提供一個選項,以自定義的依賴關係添加到其內置的目標(如allinstall,test等)。而且它似乎不會在不久的將來提供此選項 - 請參閱http://public.kitware.com/Bug/view.php?id=8438

但是,仍然有可能通過一些黑客/變通辦法實現所需的行爲。例如,您可以在安裝步驟開始時直接運行make工具。

所以在你自己的風險使用:

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() 
+0

謝謝,這確實是一個可能的解決方案。但是,'ALL'關鍵字始終會導致目標被建立。在這種情況下,這不是問題,但我仍然對通用解決方案感興趣,我可以在安裝目標(隱含地取決於'ALL')和我的自定義目標之間添加顯式依賴關係。 –

+0

@ysnikraz我已經更新了我的答案。不幸的是,cmake沒有明確的方式來設置定製和內置目標之間的依賴關係。 –

+0

非常感謝您的更新和解決方法!只是測試它,它運作良好。正是我在找什麼! –

1

我已經以建立在Linux和Windows

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

改變這個有點在我CMakeList.txt這是我的解。只有在需要doc或安裝目標時,纔會生成始終爲「ALL」的文檔(在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) 

希望它會對某人有用。

Regards, Alex