2015-06-16 9 views
7

प्राप्त करें मैंने हाल ही में ऑटोटूल से सेमेक तक कुछ परियोजनाओं को स्विच किया है।सेमीकेक - प्रयुक्त कमांडलाइन झंडे "-D"

ऑटोोटूल पर मुझे पसंद होने वाली एक आम बात यह है कि - अगर मैं src build निर्देशिका में जाता हूं। config.log/config.status है - जहां शीर्ष पर ./configure --params कमांड सूचीबद्ध है - इसलिए पूर्व प्रयुक्त कमांडलाइन झंडे को फिर से चालू करना आसान है।

(जैसे कुछ सामान संकलन के बाद - मैं जोड़ना चाहते हैं एक दूसरे --enable-this - तो config.log/स्थिति से & पेस्ट कॉपी - और फिर से चलाएं ./configure --old-params --enable-this)

cmake में - मैं -D झंडे का एक समूह है - मैं cmake प्रोजेक्ट के साथ config.log/status में उपयोग की गई कमांडलाइन कैसे ढूंढ सकता हूं?

मुझे पता 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}) 

बनाता है:

मैं निम्नलिखित समाधान के साथ आया था बिल्ड फ़ोल्डर में एक फ़ाइल config.status - सभी सेट cmake पैराम युक्त।

समर्थक:

  • बाद cmake पर काम करने लगता है कॉल मेरी समस्या का समाधान करने लगता है

चोर:

  • FILE(write पर chmod सेट करने में असमर्थ? चर
  • MY_CMAKE_FLAGS जाना जाता झंडे शामिल हैं - मैन्युअल अद्यतन करने की जरूरत है, तो एक नया झंडा जोड़ा जाता है

संबंध

+1

यह एक उत्कृष्ट सवाल यह है - एक है कि मैं कुछ साल के लिए किया गया है लेकिन StackOverflow पर नहीं पूछा है। मुझे नहीं लगता कि cmake का आह्वान करते समय-डी फ्लैग का सेट प्राप्त करने का एक तरीका है। नीचे दिए गए उत्तर चक्र से पता चलता है कि सेमेक आमंत्रण के परिणामस्वरूप सटीक आदेश कैसे प्राप्त करें, लेकिन यह आपको cmake कॉन्फ़िगरेशन आमंत्रण के लिए उपयोग किए गए तर्क नहीं देता है। एक सही उत्तर एक अपेक्षा से अधिक कठिन होता है क्योंकि उपयोगकर्ता लगातार 'cmake -Danotherflag = value' का उपयोग कर एक सेमेक बिल्ड निर्देशिका को फिर से कॉन्फ़िगर कर सकता है। – Phil

+0

दुखी है! वास्तव में मुझे वास्तव में सेमेक पसंद है, यह ऑटोमूल से 3.5 एमओओ मुद्दों (मैंने साथ रहने के लिए सीखा) की तरह हल किया है - लेकिन उपयोगकर्ता को कमांडलाइन झंडे की आपूर्ति करने की कमी वास्तव में खराब है। –

+0

मेरा संपादित प्रश्न देखें - यह मेरे लिए मेरे मुद्दे को हल करता है (वैसे भी एक सही तरीके से नहीं) –

उत्तर

1

एक विशेषता यह है कि सहायक हो सकता है इस परियोजना के CMake में झंडा CMAKE_EXPORT_COMPILE_COMMANDS पर घूम रहा है कैश। निर्माण के दौरान, यह सीएमके को बाइनरी निर्देशिका में JSON फ़ाइल compile_commands.json उत्पन्न करेगा जिसमें सभी अनुवाद इकाइयों के लिए सटीक कंपाइलर कॉल शामिल हैं।

+2

thx आपके उत्तर के लिए, और 'CMAKE_EXPORT_COMPILE_COMMANDS' के बारे में जानना अच्छा लगता है लेकिन यह मेरी समस्या का समाधान नहीं करता है। –

0

सीएमके आपको सभी प्रयुक्त-डी फ्लैग (परिभाषित) सूचीबद्ध करने का आसान तरीका नहीं देता है। हालांकि, सही ढंग से लिखित सीएमकेलिस्ट के लिए, एक विशेष परिभाषा/विकल्प बदलने के लिए सभी-डी फ्लैग के साथ पूर्ण कमांड लाइन को जानने की आवश्यकता नहीं है।

इस 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 पर आधारित विशेषताएं हैं, लेकिन मेरे प्रश्न के लिए यह अधिक है - मेरे पास सर्वर ए पर एक बिल्ड फ़ोल्डर है - और स्रोत को एक अलग सर्वर पर स्क्रैच से संकलित करना चाहते हैं (autotools दिनों में - मैंने बस नए सर्वर पर स्रोत डाउनलोड किया - कॉन्फ़िगरेशन स्थिति से कॉन्फ़िगर कमांड की प्रतिलिपि बनाई है, और इसे नए सर्वर पर चलाएं) मेरा संपादित प्रश्न देखें - यह वास्तव में एक तरीका है जिससे मैं –

+1

के साथ रह सकता हूं, जहां आपने अपना हालिया संपादन दिया है, कहें कि आप 'MY_CMAKE_FLAGS'' का ट्रैक रखने के साथ रह सकते हैं, आपको cmake मॉड्यूल [फ़ीचरसमरी] (http://www.cmake.org/cmake/help/v3.3/module/FeatureSummary.html) पर विचार करना चाहिए। – Phil

0

आप क्या CMake के स्रोत कोड में bootstrap स्क्रिप्ट में किया जाता है पर एक नज़र लेने के लिए चाहते हो सकता है:

# 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 पर आउटपुट करना चाहते हैं - यह प्रारंभिक-कैश सीएमके स्क्रिप्ट set(... CACHE) आदेशों के अलावा message() आदेशों को भी स्वीकार करता है।

भी देखें How to store CMake build settings