[英]How to best handle data files with CMake?
我有一個包含代碼和一些數據文件的CMake項目(圖像是精確的)。
我的目錄結構是這樣的:
src包含源代碼,數據包含數據文件。 CMake建議在源代碼構建之外,所以當我調用make時 ,我有可執行程序,但不是數據文件,因此我無法執行該程序。
當然, make install會將我的數據文件復制到所需的位置並使其正常工作,因此我現在就這樣開發:
<edit source code>
如果我正在使用命令行和編輯器,那沒關系,但我最近決定轉向Eclipse CDT。 從CMake生成Eclipse項目效果很好,但是從Eclipse手動執行安裝目標並不是那么好。
你們是如何解決這個問題的呢? 你的程序是否有一些聰明的算法來嘗試找到它的數據目錄,即使它不是二進制文件的位置? 或者你不使用源代碼構建?
configure_file
應該解決這個問題。
我的數據目錄中有一個CMakeLists.txt文件,其中包含以下內容:
configure_file(data_file ${CMAKE_CURRENT_BINARY_DIR}/data_file COPYONLY)
這會在調用cmake時將指定的文件復制到構建目錄中,因此即使在源代碼構建之外,它也可以在同一位置使用。
configure_file
不支持目錄,但file
命令執行:
file(COPY assets DESTINATION ${CMAKE_CURRENT_BINARY_DIR})
如果復制文件需要花費太多時間(它們是圖像......),您可以通過使用configure_file創建“自定義”data_header.h來實現更好的目的,該configure_file包含仍在源目錄中的數據的路徑。
這就是我所做的:我的源代碼中有一個文件“global_build_config.h.in”,包含以下內容:
const char* const global_testdatapath = "@Test_Data_Path@";
然后在CMake中使用configure_file:
# Assume CMake knows a variable Test_Data_Path, it will be filled in automatically
# in the generated config/Global_Build_Config.h
configure_file( Global_Build_Config.h.in ${CMAKE_BINARY_DIR}/config/Global_Build_Config.h )
# The config directory should be added as a include-searchpath
include_directories( ${CMAKE_BINARY_DIR}/config/ )
然后我可以在我的cpp文件中#include“Global_Build_Config.h”並引用固定路徑。
你的問題有點舊,但是如果你仍然感興趣(或其他人),我有一個類似的場景,我將testdata復制到單元測試目標:
add_custom_command( TARGET ${UTEST_EXE_NAME}
POST_BUILD
COMMAND ${CMAKE_COMMAND} -E echo "Copying unit test data.."
COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_HOME_DIRECTORY}/utest/testdata ${CMAKE_BINARY_DIR}
)
因此,主要思想是使用后構建目標,並在每次構建后執行。 對我來說,數據並不多,而且文件系統會緩存它,所以我根本不會感覺到復制過程。 你可以通過copy_if_different復制來增強它。 但是,在這種情況下,您必須創建一個圖像文件列表並編寫一個循環,因為該命令是基於文件的。 使用GLOB命令,如果需要,這應該不難做到。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.