2015-06-16 33 views
7

我最近將一些項目從autotools切換到cmake。cmake - 獲取使用的命令行標誌「-D」

我在autotools上喜歡的一件常見事情是 - 如果我進入src構建目錄。有config.log/config.status - 在頂部列出了./configure --params命令 - 因此很容易重新運行以前使用的命令行標誌。

(如編譯一些東西后 - 我想補充一個又一個--enable-this - 所以從的config.log /狀態複製粘貼& - 並重新運行./configure --old-params --enable-this

在cmake的 - 我有一堆-D標誌 - 我怎麼能找到像config.log /狀態中使用的命令行 - 用cmake項目?

我知道還有就是CMakeCache ... - 但它很難提取使用標誌

編輯:

我想出了以下解決方案:

#save commandline to rebuild this :) 
set(USED_CMD_LINE "cmake ") 
set(MY_CMAKE_FLAGS CMAKE_BUILD_TYPE CMAKE_INSTALL_PREFIX ENABLE_SSL ENABLE_LUA ENABLE_SSH ENABLE_SNMP MYSQL_USER MYSQL_PASS MYSQL_HOST MYSQL_DB FULL_FEATURES USE_COVERAGE) 
FOREACH(cmd_line_loop IN ITEMS ${MY_CMAKE_FLAGS}) 
    if(${cmd_line_loop}) 
     STRING(CONCAT USED_CMD_LINE ${USED_CMD_LINE} "-D" ${cmd_line_loop} "=" ${${cmd_line_loop}} " ") 
    endif() 
ENDFOREACH(cmd_line_loop) 
STRING(CONCAT USED_CMD_LINE ${USED_CMD_LINE} " .. ") 
#store to a file aka "config.status" 
FILE(WRITE ${CMAKE_CURRENT_BINARY_DIR}/config.status ${USED_CMD_LINE}) 

創建build文件夾中的文件config.status - 包含所有設置的cmake參數。

親:

  • 似乎解決我的問題
  • 似乎對後續的cmake工作電話

CON:

  • 無法設置文件模式上FILE(write?變量
  • MY_CMAKE_FLAGS包含已知的標誌 - 需要手動 更新,如果一個新的標誌被添加

問候

+1

這是一個很好的問題 - 一個我有一對夫婦的年,但並沒有要求在計算器上。我不認爲有一種方法可以在調用cmake時使用-D標誌集。下面給出的答案顯示瞭如何查看cmake調用結果的確切命令,但是這並不能給出用於cmake configure調用的參數。一個正確的答案比人們想象的要困難得多,因爲用戶可以使用'cmake -Danotherflag = value .'不斷重新配置cmake構建目錄。 – Phil

+0

多數民衆贊成在悲傷!事實上,我真的很喜歡cmake,它解決了像autotools一樣的3.5mio問題(我學會了解決這個問題) - 但是缺少獲取用戶提供的命令行標誌,實在是太糟糕了。 –

+0

看到我編輯的問題 - 它替代我解決我的問題(反正不完美的方式) –

回答

1

一個功能,可能會有所幫助在項目的CMake的開啓標誌CMAKE_EXPORT_COMPILE_COMMANDS緩存。在編譯期間,這將使CMake在二進制目錄中生成一個JSON文件compile_commands.json,該目錄包含所有翻譯單元的確切編譯器調用。

+2

thx爲您的答案,並很高興知道'CMAKE_EXPORT_COMPILE_COMMANDS',但它不能解決我的問題。 –

0

Cmake不給你簡單的方法列出所有使用的-D標誌(定義)。但是,對於正確編寫的CMakeLists,不需要知道具有全部-D標誌的完整命令行來更改一個特定的定義/選項。

考慮這個snipplet:

SET(my_var_1 TRUE CACHE BOOL "my var 1") 
SET(my_var_2 TRUE CACHE BOOL "my var 2") 

message(STATUS "my_var_1 ${my_var_1}") 
message(STATUS "my_var_2 ${my_var_2}") 

首先cmake的調用:

>cmake .. -Dmy_var_1=FALSE 
-- my_var_1 FALSE 
-- my_var_2 TRUE 
-- Configuring done 
-- Generating done 
-- Build files have been written to: out 

二cmake的調用:

>cmake .. -Dmy_var_2=FALSE 
-- my_var_1 FALSE 
-- my_var_2 FALSE 
-- Configuring done 
-- Generating done 
-- Build files have been written to: out 

注意my_var_1=FALSE即使它沒有明確地說明(從緩存中獲取)

+0

thx爲您的答案 我知道功能,基於cmakecache ,但對於我的問題,它更像 - 我有一個生成文件夾在服務器A - 並希望從頭開始在不同的服務器上編譯源代碼(在autotools天 - 我剛剛將源代碼下載到新服務器 - 從配置狀態複製配置命令,並在新的服務器上運行這個) 看到我編輯的問題 - 這實際上是一種方式,我可以住 –

+1

鑑於您最近的編輯假設你可以跟蹤「MY_CMAKE_FLAGS」,你應該考慮cmake模塊[FeatureSummary](http://www.cmake.org/cmake/help/v3.3/module/FeatureSummary.html)。 – Phil

0

你可能想看看是什麼在bootstrap腳本的CMake的源代碼來完成:

# Write our default settings to Bootstrap${_cmk}/InitialCacheFlags.cmake. 
echo ' 
# Generated by '"${cmake_source_dir}"'/bootstrap 
# Default cmake settings. These may be overridden any settings below. 
set (CMAKE_INSTALL_PREFIX "'"${cmake_prefix_dir}"'" CACHE PATH "Install path prefix, prepended onto install directories." FORCE) 
set (CMAKE_DOC_DIR "'"${cmake_doc_dir}"'" CACHE PATH "Install location for documentation (relative to prefix)." FORCE) 
set (CMAKE_MAN_DIR "'"${cmake_man_dir}"'" CACHE PATH "Install location for man pages (relative to prefix)." FORCE) 
set (CMAKE_DATA_DIR "'"${cmake_data_dir}"'" CACHE PATH "Install location for data (relative to prefix)." FORCE) 
' > "${cmake_bootstrap_dir}/InitialCacheFlags.cmake" 

[...] 

"${cmake_bootstrap_dir}/cmake" "${cmake_source_dir}" "-C${cmake_bootstrap_dir}/InitialCacheFlags.cmake" "-G${cmake_bootstrap_generator}" ${cmake_options} ${cmake_bootstrap_system_libs} "[email protected]" 

boostrap腳本生成InitialCacheFlags.cmake文件,然後用cmake -C選項預加載它。

而且 - 如果您還想將值輸出到stdout - 此初始緩存CMake腳本除set(... CACHE)命令外還接受message()命令。

參見How to store CMake build settings