2011-10-22 13 views
12

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

ADD_CUSTOM_TARGET(GenerateParser 
    COMMAND ${ANTLR_COMMAND} ${PROJECT_SOURCE_DIR}/src/MyGrammar.g 
          -o ${PROJECT_SOURCE_DIR}/src/MyGrammar 
) 

ADD_LIBRARY(MainProject ${LIBRARY_TYPE} ${TARGET_SOURCES} ${TARGET_OPTIONS}) 
ADD_DEPENDENCIES(MainProject GenerateParser) 

समस्या यह है कि हर बार जब मैं ANTLR परियोजना का निर्माण और पर्याप्त समय खपत चल जनरेटर है। मैं इसे कैसे चला सकता हूं केवल मेरा व्याकरण बदल गया है या नहीं? या हो सकता है कि एएनटीएलआर किसी भी तरह से व्याकरण के लिए केवल पार्सर उत्पन्न कर सके।

उत्तर

9

add_custom_command यदि आप सही ढंग से करने के लिए कॉल का निर्माण, चाल करेंगे।

इस तरह काम करना चाहिए:

ADD_CUSTOM_COMMAND(OUTPUT ${PROJECT_SOURCE_DIR}/src/MyGrammar 
    COMMAND ${ANTLR_COMMAND} ${PROJECT_SOURCE_DIR}/src/MyGrammar.g 
    -o ${PROJECT_SOURCE_DIR}/src/MyGrammar 
    DEPENDS ${PROJECT_SOURCE_DIR}/src/MyGrammar.g 
) 

ADD_CUSTOM_TARGET(GenerateParser ALL 
    DEPENDS ${PROJECT_SOURCE_DIR}/src/MyGrammar 
) 

ADD_LIBRARY(MainProject ${LIBRARY_TYPE} ${TARGET_SOURCES} ${TARGET_OPTIONS}) 
ADD_DEPENDENCIES(MainProject GenerateParser) 

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

जोड़ें लक्ष्य है कि अपने स्रोत फ़ाइल उत्पन्न करता है:

3

क्या add_custom_command चाल करेगा? यहां आप DEPENDS निर्दिष्ट कर सकते हैं [निर्भर करता है ...] जो निर्भर फ़ाइल को तब बदलता है जब निर्भर फ़ाइल बदलती है।

http://www.cmake.org/cmake/help/cmake2.6docs.html#command:add_custom_command

add_custom_command(OUTPUT output1 [output2 ...] 
       COMMAND command1 [ARGS] [args1...] 
       [COMMAND command2 [ARGS] [args2...] ...] 
       [MAIN_DEPENDENCY depend] 
       [DEPENDS [depends...]] 
       [IMPLICIT_DEPENDS <lang1> depend1 ...] 
       [WORKING_DIRECTORY dir] 
       [COMMENT comment] [VERBATIM] [APPEND]) 
+1

काम नहीं करता है। जैसा कि मैंने समझ लिया है कि केवल लक्ष्य के साथ काम करते हैं, उदा। जब भी निर्भर लक्ष्य बदल दिया गया था (मुक्ति पुनर्निर्मित, आदि) आदेश निष्पादित किया गया है। – DikobrAz

2

कस्टम लक्ष्य के साथ प्रस्तावित समाधान इसके अलावा, यदि आपका लक्ष्य कुछ उत्पन्न स्रोतों पर निर्भर करता है आम कार्यप्रवाह पीछा कर रहा है। मैं गलतियों से बचने के लिए पूर्ण पथ का उपयोग करने की सलाह देते हैं।

add_custom_command(OUTPUT ${GENERATED_SOURCE_FILE} 
    COMMAND ${GENERATION COMMAND} 
    DEPENDS ${DEPENDENCIES} 
) 

अपनी जेनरेट की गई स्रोत फ़ाइल के सामान्य गुण सेट करें। तो cmake गायब स्रोत फ़ाइल के बारे में शिकायत नहीं करेगा।

set_source_files_properties(${GENERATED_SOURCE_FILE} PROPERTIES 
    GENERATED TRUE 
) 

सामान्य रूप से आपके लक्ष्य में जेनरेट किया गया स्रोत जोड़ें।

add_executable(${YOUR_TARGET} SOURCES ${GENERATED_SOURCE_FILE}) 

तो प्रस्तावित उदाहरण $ में {पीढ़ी COMMAND} केवल तभी $ {DEPENDENCIES} फ़ाइलों में से कुछ बदल रहे थे शुरू किया जाएगा।

+0

[डॉक्स] के अनुसार (https://cmake.org/cmake/help/v3.6/command/add_custom_command.html) फ़ाइलों को मैन्युअल रूप से 'जेनरेटेड' के रूप में चिह्नित करने की आवश्यकता नहीं है, उन्हें इस तरह चिह्नित किया गया है चूक। –

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