c++ सीमेक और फ्लेक्स/बायसन




makefile cmake (2)

मैं अपने बिल्ड सिस्टम को कॉन्फ़िगर / एक सेंकॉम सिस्टम में बनाकर परिवर्तित कर रहा हूं

सिस्टम में कुछ ऑटजनरेटेड फाइलें हैं, बाइसन / फ्लेक्स से मूल makefile आज्ञाएं हैं:

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

मैं इस प्राचीन लिंक पर आया जो कि यह कैसे करना है यह बताता है, लेकिन जब मैं सीमक को निम्नलिखित कस्टम आज्ञाओं से चलाता हूं, तो कुछ भी नहीं होता है (कोई त्रुटि संदेश नहीं, कोई फ़ाइल पीढ़ी नहीं)

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 होगा?


आपके add_custom_command s का प्रारूप बिल्कुल सही नहीं है, लेकिन वे लगभग सही लगते हैं 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})

बीसिन उपयोग के लिए नई गर्मता वास्तव में cmake.org पर प्रलेखित है, इसलिए एक साधारण पार्सर परियोजना के लिए:

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

तुम क्या करोगे इसी तरह फ्लेक्स के लिए