所以我不小心偶然發現了這一點,我知道它可能太晚了,但調用配置是可能的,正是我如何做到這一點與mercurial版本。
這個把戲需要很多不同的工具,而且我沒有時間來制定一個好的答案atm,但提出問題,我會在有空的時候填寫它。
工具1:調用的exec_program提取修訂信息(這是善變很容易)
exec_program(hg ${PROJECT_SOURCE_DIR} ARGS "id" "-i" OUTPUT_VARIABLE OUTPUT_VARIABLE ${PROJECT_NAME}_HG_HASH_CODE)
我可能做一些更復雜的比你所關心的在這裏,但基本位hg
這您將使用您正在使用的任何版本控制進行替換,${PROJECT_SOURCE_DIR}
您將設置爲執行所需的任何目錄,並填寫自定義參數。
我把所有版本提取到一個宏(ReadProjectRevisionStatus()
)。
下一步是創建一個完全不同的CMake文件,該文件調用ReadProjectRevisionStatus(),然後調用CONFIGURE_FILE。這個文件會假定當你進入它時,所有正確的值都被設置。就我而言,我將這個文件的位置存儲到$ {CONFIG_FILE_LOC}中。
最後一步是添加一個將調用此腳本的自定義目標。例如:
ADD_CUSTOM_TARGET(${PROJECT_NAME}_HG_VERSION_CONFIG
COMMAND ${CMAKE_COMMAND}
ARGS -DPROJECT_SOURCE_DIR=${PROJECT_SOURCE_DIR}
-DPROJECT_BINARY_DIR=${PROJECT_BINARY_DIR}
-DPROJECT_NAME=${PROJECT_NAME}
-DCMAKE_MODULE_PATH=${CMAKE_MODULE_PATH}
"-D${PROJECT_NAME}_HG_CONFIG_FILE_IN=\"${${PROJECT_NAME}_HG_CONFIG_FILE_IN}\""
"-D${PROJECT_NAME}_HG_CONFIG_FILE_OUT=\"${${PROJECT_NAME}_HG_CONFIG_FILE_OUT}\""
${ARGN}
-P ${CONFIG_FILE_LOC})
一個這樣做的漂亮的地方是自定義的目標呼叫也被稱爲的CMake構建系統之外,我已經上了幾個項目的完成,這是bash通話類似於:
cmake -D PROJECT_SOURCE_DIR=$sourcedir -DPROJECT_BINARY_DIR=$sourcedir -DPROJECT_NAME=uControl -DCMAKE_MODULE_PATH=$sourcedir -DuControl_HG_CONFIG_FILE_IN=$sourcedir/tsi_software_version.h.in -DuControl_HG_CONFIG_FILE_OUT=$sourcedir/tsi_software_version.h -P $sourcedir/ConfigureHGVersion.cmake
'version.hpp.cmake'裏面有什麼?如果你在'CMakeLists.txt'中指定了版本宏,那麼調用'make'會導致檢查'CMakeLists.txt'是否被改變,並且它會自動調用'cmake'。 – yegorich
@yegorich更新了問題。 – Meysam
@yegorich如果'CMakeLists.txt'文件已更改,則當前調用'cmake'。但是如果'version.hpp'不存在(出於某種原因),它將如何被創建? – Meysam