not how found descargar c++ makefile cmake bison flex-lexer

c++ - how - CMake y Flex/Bison



flex install windows (2)

Estoy convirtiendo mi sistema de compilación de configure / make a un sistema cmake

El sistema tiene algunos archivos autogenerados, desde bison / flex. Los comandos originales de makefile son:

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

Encontré este antiguo enlace que parece explicar cómo hacerlo, pero cuando ejecuto cmake con los siguientes comandos personalizados, no parece que ocurra nada (no hay mensajes de error, no hay generación de archivos)

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)

Soy nuevo en cmake, así que es un poco confuso para mí. ¿Alguien tiene alguna idea de lo que sería un custom_command de trabajo?


El formato de tus add_custom_command s no es del todo correcto, pero parecen ser casi correctos. Hay dos versiones de add_custom_command , y la que desea es la que produce un archivo de salida (las partes entre corchetes son opcionales):

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])

La idea es que el comando personalizado solo se ejecute si el archivo especificado como la OUTPUT de este comando se utiliza como una entrada en cualquier lugar en el mismo CMakeLists.txt (por ejemplo, en una llamada add_library o add_executable ).

Por lo tanto, el comando personalizado solo se ejecutará en tiempo de compilación (es decir, cuando ejecute make ), no en el momento de la configuración (cuando ejecuta CMake), y solo si está creando un objetivo que necesita directa o indirectamente el archivo OUTPUT .

Para arreglar tus comandos, creo que lo siguiente debería funcionar (no probado):

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})


El nuevo hotness para el uso del bisonte está documentado en cmake.org. Por lo tanto, para un proyecto de analizador simple:

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

es lo que harías Del mismo modo para Flex.