2015-06-16 20 views
7

tôi vừa chuyển một vài dự án từ autotools sang cmake.cmake - nhận các cờ dòng lệnh được sử dụng "-D"

một điều phổ biến tôi thích trên autotools là - nếu tôi đi vào thư mục xây dựng src. có config.log/config.status - nơi ở trên cùng lệnh ./configure --params được liệt kê - vì vậy rất dễ dàng chạy lại các cờ dòng lệnh cũ đã sử dụng.

(như sau khi biên soạn một số nội dung - tôi muốn thêm một khác --enable-this - vì vậy copy & dán từ config.log/trạng thái - và chạy lại ./configure --old-params --enable-this)

trong cmake - tôi có một loạt các -D cờ - làm thế nào tôi có thể tìm thấy các dòng lệnh được sử dụng như trong config.log/status - với một dự án cmake?

tôi biết đó là CMakeCache ... - nhưng nó khó có thể lấy những lá cờ sử dụng

chỉnh sửa:

tôi đã đưa ra các giải pháp sau đây:

#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}) 

tạo tập tin config.status trong thư mục build - chứa tất cả các tham số cmake được thiết lập.

pro:

  • dường như để giải quyết vấn đề của tôi
  • dường như làm việc trên cmake tiếp theo gọi

con:

  • không thể thiết lập chmod trên FILE(write? biến
  • MY_CMAKE_FLAGS chứa cờ biết - cần phải được tự cập nhật nếu một lá cờ mới được thêm vào

liên quan

+1

Đây là một câu hỏi tuyệt vời - một trong đó tôi đã có cho một vài năm nhưng chưa hỏi trên StackOverflow. Tôi không nghĩ rằng có một cách để có được bộ cờ -D được sử dụng khi gọi cmake. Câu trả lời sakra đưa ra dưới đây cho thấy làm thế nào để có được xem các lệnh chính xác là kết quả của lời gọi cmake, nhưng điều đó không cung cấp cho bạn các args được sử dụng cho lệnh cấu hình cmake. Câu trả lời đúng là khó hơn người ta có thể mong đợi vì người dùng có thể liên tục cấu hình lại một thư mục build cmake bằng cách sử dụng 'cmake -Danotherflag = value''. – Phil

+0

thats sad! trong thực tế tôi thực sự yêu cmake, nó giải quyết như 3.5mio vấn đề (tôi học để sống với) từ autotools - nhưng thiếu nhận được người dùng cung cấp cờ commandline, thực sự là xấu. –

+0

xem câu hỏi đã chỉnh sửa của tôi - nó tối ưu cho tôi giải quyết vấn đề của tôi (theo cách không hoàn hảo) –

Trả lời

1

Một tính năng có thể hữu ích được bật cờ CMAKE_EXPORT_COMPILE_COMMANDS trong CMake của dự án bộ nhớ cache. Trong quá trình xây dựng, điều này sẽ làm cho CMake tạo ra một tệp JSON compile_commands.json trong thư mục nhị phân chứa các trình biên dịch chính xác cho tất cả các đơn vị dịch.

+2

thx cho câu trả lời của bạn, và tốt đẹp để biết về 'CMAKE_EXPORT_COMPILE_COMMANDS' nhưng nó không giải quyết được vấn đề của tôi. –

0

Cmake không cung cấp cho bạn cách dễ dàng để liệt kê tất cả các cờ -D được sử dụng (định nghĩa). Tuy nhiên, đối với các CMakeLists được viết chính xác, không cần phải biết dòng lệnh đầy đủ với tất cả các cờ -D để thay đổi một định nghĩa/tùy chọn cụ thể.

Cân nhắc snipplet này:

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}") 

Đầu tiên cmake gọi:

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

Second cmake gọi:

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

Lưu ý rằng my_var_1=FALSE thậm chí nó không phải là tuyên bố explicitely (lấy từ bộ nhớ cache)

+0

thx cho câu trả lời của bạn tôi biết rằng các tính năng, dựa trên cmakecache nhưng đối với câu hỏi của tôi giống như - tôi có một thư mục xây dựng trên máy chủ A - và muốn biên dịch nguồn trên một máy chủ khác nhau từ đầu (trong autotools ngày - tôi chỉ cần tải về nguồn cho máy chủ mới - sao chép lệnh cấu hình từ trạng thái cấu hình và chạy trên máy chủ mới) xem câu hỏi đã chỉnh sửa của tôi - đây thực sự là cách tôi có thể sống với –

+1

nói rằng bạn có thể sống với việc theo dõi '' MY_CMAKE_FLAGS'', bạn nên xem xét mô-đun cmake [FeatureSummary] (http://www.cmake.org/cmake/help/v3.3/module/FeatureSummary.html). – Phil

0

Bạn có thể muốn có một cái nhìn vào những gì được thực hiện trong bootstrap kịch bản trong mã nguồn CMake của:

# 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]" 

Kịch bản boostrap là tạo ra một tập tin InitialCacheFlags.cmake và sau đó được tải trước đó với các tùy chọn cmake -C.

Và - nếu bạn muốn thêm các giá trị vào stdout - tập lệnh CMake ban đầu này cũng chấp nhận lệnh message() ngoài lệnh set(... CACHE).

Xem thêm How to store CMake build settings

Các vấn đề liên quan