2013-10-16 21 views
11

मैं कॉन्फ़िगर से अपने निर्माण प्रणाली परिवर्तित कर रहा हूँ/एक cmake प्रणालीCMake और फ्लेक्स/बाइसन

प्रणाली कुछ स्वत: जनरेट की फ़ाइलें हैं करने के लिए बनाने के लिए, जंगली भैंसों/फ्लेक्स से। मूल makefile आदेशों हैं:

bison --defines=tokens.h --output=parser.cpp parser.y 
flex --outfile=scanner.cpp scanner.l 

मैं this ancient link जो इसे कैसे करना समझाने के लिए लगता है भर में आया है, लेकिन जब मैं निम्नलिखित कस्टम आदेशों के साथ cmake चलाने के लिए, कुछ भी नहीं है (कोई त्रुटि संदेश, कोई फ़ाइल पीढ़ी) होने के लिए प्रकट होता है

FIND_PACKAGE(BISON REQUIRED) 
IF(BISON_FOUND) 
    ADD_CUSTOM_COMMAND(
     SOURCE ${CMAKE_SOURCE_DIR}/src/rcdgen/parser.y 
     COMMAND ${BISON_EXECUTABLE} 
     ARGS --defines=${CMAKE_SOURCE_DIR}/src/rcdgen/tokens.h 
      -o ${CMAKE_SOURCE_DIR}/src/rcdgen/parser.cpp 
      ${CMAKE_SOURCE_DIR}/src/rcdgen/parser.y 
     COMMENT "Generating parser.cpp" 
     OUTPUT ${CMAKE_SOURCE_DIR}/src/rcdgen/parser.cpp 
    ) 
ENDIF(BISON_FOUND) 

FIND_PACKAGE(FLEX REQUIRED) 
IF(FLEX_FOUND) 
    ADD_CUSTOM_COMMAND(
     SOURCE ${CMAKE_SOURCE_DIR}/src/rcdgen/scanner.l 
     COMMAND ${FLEX_EXECUTABLE} 
     ARGS -o${CMAKE_SOURCE_DIR}/src/rcdgen/parser.cpp 
      ${CMAKE_SOURCE_DIR}/src/rcdgen/scanner.l 
     COMMENT "Generating scanner.cpp" 
     OUTPUT ${CMAKE_SOURCE_DIR}/src/rcdgen/scanner.cpp 
    ) 
ENDIF(FLEX_FOUND) 

मैं सेमीकेक में नया हूं, इसलिए यह मेरे लिए थोड़ा उलझन में है। क्या किसी को कोई आइडिया है कि एक कामकाजी custom_command क्या होगा?

+0

क्या आप सीएमकेलिस्ट का हिस्सा भी पोस्ट कर सकते हैं जो जेनरेट की गई फाइलों का उपयोग करता है? – Angew

+0

कृपया टैगिंग के बारे में जागरूक रहें। फ्लेक्स-लेक्सर व्याख्यात्मक विश्लेषक के लिए है; फ्लेक्स टैग एडोब/अपाचे यूआई फ्रेमवर्क के लिए है। – JeffryHouser

+0

क्षमा करें, 'फ्लेक्स' मुझे स्वचालित रूप से सुझाया गया था, मैंने – LordAro

उत्तर

11

आपके add_custom_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 
            [<lang2> depend2] ...] 
        [WORKING_DIRECTORY dir] 
        [COMMENT comment] [VERBATIM] [APPEND]) 

विचार है कि कस्टम आदेश केवल तभी निर्दिष्ट फ़ाइल निष्पादित करता है चूंकि इस कमांड के OUTPUT को उसी CMakeLists.txt में कहीं और इनपुट के रूप में उपयोग किया जाता है (उदाहरण के लिए add_library या add_executable कॉल में)।

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

अपने आदेश को ठीक करने के लिए, मुझे लगता है कि निम्नलिखित (untested) काम करना चाहिए:

FIND_PACKAGE(BISON REQUIRED) 
SET(BisonOutput ${CMAKE_SOURCE_DIR}/src/rcdgen/parser.cpp) 
IF(BISON_FOUND) 
    ADD_CUSTOM_COMMAND(
     OUTPUT ${BisonOutput} 
     COMMAND ${BISON_EXECUTABLE} 
       --defines=${CMAKE_SOURCE_DIR}/src/rcdgen/tokens.h 
       --output=${BisonOutput} 
       ${CMAKE_SOURCE_DIR}/src/rcdgen/parser.y 
     COMMENT "Generating parser.cpp" 
    ) 
ENDIF() 

FIND_PACKAGE(FLEX REQUIRED) 
SET(FlexOutput ${CMAKE_SOURCE_DIR}/src/rcdgen/scanner.cpp) 
IF(FLEX_FOUND) 
    ADD_CUSTOM_COMMAND(
     OUTPUT ${FlexOutput} 
     COMMAND ${FLEX_EXECUTABLE} 
       --outfile=${FlexOutput} 
       ${CMAKE_SOURCE_DIR}/src/rcdgen/scanner.l 
     COMMENT "Generating scanner.cpp" 
    ) 
ENDIF() 

ADD_LIBRARY(MyLib ${BisonOutput} ${FlexOutput}) 
+0

विवरण को जांचना नहीं सोचा था, यह अच्छा लगता है, हालांकि मुझे यकीन नहीं है कि add_library क्या है, क्या आप विस्तृत कर सकते हैं? – LordAro

+0

@LordAro - क्षमा करें, मैं इसे थोड़ा स्पष्ट बना सकता था। मैं वास्तव में आउटपुट फ़ाइलों का उपयोग किसी अन्य कमांड में इनपुट के रूप में करने का एक उदाहरण देने का प्रयास कर रहा था। मुझे उम्मीद नहीं है कि आपके पास वास्तव में "माईलिब" नामक लाइब्रेरी है या कोई भी लक्ष्य इन 2 फ़ाइलों का उपयोग करता है। मुझे लगता है कि ये फ़ाइलें कई में से 2 होंगी जिनमें आपके CMakeLists.txt में lib/exe शामिल है। – Fraser

+0

ठीक है, मुझे यह संदेह है, और, ऐसा लगता है :) धन्यवाद बहुत – LordAro

15

जंगली भैंसों के उपयोग के लिए नवीनतम को वास्तव में तो एक सरल पार्सर परियोजना के लिए cmake.org पर दर्ज है:

bison_target(parser fl.ypp fl.tab.cpp) 
add_executable(fl ${BISON_parser_OUTPUTS}) 

वह है जो आप करेंगे। इसी प्रकार फ्लेक्स के लिए।

+1

पुराने संस्करण पर काम नहीं करता है फ्लेक्स संस्करण इसके लिए 2.5.5 या इससे अधिक होना चाहिए। कारण इन कार्यों द्वारा पारित पैरामीटर हैं। –