2012-03-22 13 views
14

बनाओ मैं vim में C++ प्रोजेक्ट को कोड कर रहा हूं।cmake में एक शेल कमांड (ctags) चलाएं और

मैं रन बनाने पर संदर्भ उत्पन्न करने के लिए ctags कमांड (ctags -R --c++-kinds=+p --fields=+iaS --extra=+q .) चलाने के लिए चाहता हूं।

मुझे लगता है कि ऐसा करने का तरीका add_custom_command का उपयोग करना है, लेकिन मैं इसे CMakeLists.txt में एकीकृत करने के तरीके पर उलझन में हूं।

+0

मैं इन उत्तरों अब और परीक्षण नहीं कर रहा हूँ। ctags मेरे अल्ट्रा लो पावर i5 पर समय लेता है, इसलिए मैं इसे थोड़ी देर में विम से कॉल करता हूं। –

उत्तर

15

यह करने के लिए सबसे बुनियादी तरीका है:

set_source_files_properties(tags PROPERTIES GENERATED true) 
add_custom_command (OUTPUT tags 
    COMMAND ctags -R --c++-kinds=+p --fields=+iaS --extra=+q . 
    WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}) 
add_executable (MyProjectOutput tags) 

पहली पंक्ति बताता CMake कि tags उत्पन्न हो जाएगा। add_custom_commandCMake आवश्यक होने पर tags उत्पन्न करेगा, और अंत में, कुछ लक्ष्य को tags पर निर्भर करने की आवश्यकता है। डिफ़ॉल्ट कार्य निर्देशिका निर्माण पेड़ में है, इसलिए WORKING_DIRECTORY आपके स्रोत पेड़ पर सेट होना चाहिए।

tags: 
    ctags -R --c++-kinds=+p --fields=+iaS --extra=+q . 

MyProjectOutput: tags 
    # Whatever here... 
+0

बस यह सुनिश्चित करने के लिए, 'CMAKE_SOURCE_DIR' डिफ़ॉल्ट रूप से निर्दिष्ट है। मुझे इसे निर्दिष्ट करने की आवश्यकता नहीं है। सही? –

+1

हां, 'CMAKE_SOURCE_DIR' स्वचालित रूप से _current_ स्रोत निर्देशिका पर सेट हो जाता है (यदि आप स्रोत फ़ाइलों को दोबारा जोड़ रहे हैं तो एक उपनिर्देशिका हो सकती है)। 'CMAKE_SOURCE_DIR' आमतौर पर वह निर्देशिका होती है जहां 'CMakeLists.txt' फ़ाइल स्थित होती है। –

+0

CMAKE_SOURCE_DIR स्रोत पेड़ के शीर्ष स्तर का मार्ग है। – camino

7

नए समाधान:

मुझे लगता है कि CMake बदल के बाद से पिछले जवाब दिया गया था यह बराबर एक Makefile प्रविष्टि है।
यहाँ लाइनों मैं अपने CMakeLists.txt में जोड़ा (संस्करण 2.8.12 के साथ परीक्षण) है:

# Add "tags" target and make my_project depending on this target. 
set_source_files_properties(tags PROPERTIES GENERATED true) 
add_custom_target(tags 
    COMMAND ctags -R --c++-kinds=+p --fields=+iaS --extra=+q . 
    WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}) 
add_dependencies(my_project tags) 

और यह पूरी तरह से अब काम करता है!

+1

हाय क्रैक, यह एक जवाब के रूप में चिह्नित किया गया है। क्या इससे आपकी समस्या हल हो गई है या आप एक सवाल पूछ रहे हैं। यदि कोई समस्या हल हो रही है, तो क्या आप अपनी पोस्ट संपादित कर सकते हैं और स्पष्टीकरण दे सकते हैं ताकि अन्य लोग गलती से इसे ध्वजांकित न करें? यदि कोई प्रश्न पूछना है, तो क्या आप इसे हटा सकते हैं और अधिक जानकारी के लिए [पूछ सकते हैं] देख सकते हैं? उम्मीद है इससे मदद मिलेगी और सौभाग्यशाली हो! :) – jmort253

+1

@ jmort253: क्षमा करें क्रैक, मैंने आपकी पोस्ट को सही ढंग से नहीं पढ़ा। मुझे फ्लैगिंग को पूर्ववत करने के बारे में कोई जानकारी नहीं है (आपने एक त्रुटि की है और आप अब मॉडरेटर ध्यान आकर्षित नहीं करना चाहते हैं ....)। – user2284570

+1

@ jmort253: मैंने अपनी टिप्पणी बदल दी, यह निश्चित रूप से एक ** उत्तर ** और ** कोई प्रश्न नहीं है **। – Creak

8

डैनियल और चरमराहट के जवाब मुझे शुरू कर दिया है, लेकिन मुझे एक अधिक जटिल समाधान है कि मैंने सोचा कि मैं हिस्सा था के साथ समाप्त हो गया:

# Add a top-level "tags" target which includes all files in both 
# the build and source versions of src/*. 
set_source_files_properties(tags PROPERTIES GENERATED true) 
add_custom_target(tags 
    COMMAND ctags -R --c++-kinds=+p --fields=+iaS --extra=+q 
     ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR} 
    COMMAND ln -sf ${CMAKE_CURRENT_BINARY_DIR}/tags ${CMAKE_BINARY_DIR} 
    WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) 

# ...but only make it a dependency of the project if the ctags program 
# is available, else it will fail to build on Windows. 
find_program(CTAGS_PATH ctags) 
if(CTAGS_PATH) 
    message(STATUS "Found ctags: ${CTAGS_PATH}") 
    add_dependencies(MyProjecct tags) 
endif(CTAGS_PATH) 

यह कई काम करता है सरल समाधान नहीं है कि:

  1. यदि सिस्टम पर वास्तव में ctags प्रोग्राम है तो यह केवल प्राथमिक निर्माण उत्पाद (MyProject) की निर्भरता के रूप में "टैग" जोड़ता है। हम बिल्ड को तोड़ना नहीं चाहते हैं क्योंकि यह विंडोज है, या क्योंकि ctags अभी तक बिल्ड सिस्टम पर स्थापित नहीं किया गया है।

  2. यह बिल्ड और स्रोत निर्देशिका दोनों में स्रोत फ़ाइलों से प्रतीकों को निकालता है। यह कुछ मामलों में मायने रखता है।

    सबसे पहले, आप configure_file() का उपयोग कर किया जा सकता है और, एक Autotools पृष्ठभूमि से आते हैं, ताकि आप अपने सच्चे स्रोत फ़ाइलों *.in, ctags -R उन्हें स्कैन नहीं होगा जिसका मतलब है कि नाम दिया है। बिल्ड निर्देशिका में उत्पन्न संस्करणों को स्कैन करने के लिए आपको इसकी आवश्यकता है। उदाहरण के लिए, आपके स्रोत पेड़ में src/mainheader.h.in हो सकता है, प्रोजेक्ट संस्करण संख्या स्वचालित रूप से इसे build/src/mainheader.h के रूप में उपज कर देती है।

    दूसरा, आपकी कुछ "स्रोत" फ़ाइलों को अन्य उपकरणों द्वारा उत्पन्न किया जा सकता है। मेरे वर्तमान प्रोजेक्ट में, मेरे पास कुछ सी ++ हेडर फाइलें हैं जो पर्ल स्क्रिप्ट द्वारा उत्पन्न की जाती हैं। मैं टैग किए गए शीर्षलेख और टैग फ़ाइल में पर्ल स्क्रिप्ट दोनों के प्रतीकों को चाहता हूं।

  3. यह एक उपनिर्देशिका में काम करता है।

    प्रोजेक्ट में मैं अभी काम कर रहा हूं, प्राथमिक निर्माण उत्पाद प्रोजेक्ट रूट के सापेक्ष src/* से बना है, और मुझे केवल टैग फ़ाइल में उस उपट्री से प्रतीकों चाहिए। मैं नहीं चाहता कि इसमें इकाई परीक्षण, उदाहरण, या उपयोगिता स्क्रिप्ट से प्रतीकों को शामिल किया जाए।

    क्योंकि इसे उपनिर्देशिका में चलाने के लिए डिज़ाइन किया गया है, यह निर्माण निर्देशिका के शीर्ष पर src/tags फ़ाइल में एक सिम्लिंक बनाता है, ताकि vi -t TagName काम करता है। (मैं यहाँ भी यह सोचते हैं रहा है कि अगर ctags मौजूद है, ln करता है,।)

संबंधित मुद्दे