[CMake] No support for lex/flex and yacc/bison?
Clark J. Wang
dearvoid at gmail.com
Wed May 16 02:33:11 EDT 2007
Thanks, James.
On 5/16/07, James Bigler <bigler at cs.utah.edu> wrote:
>
> Clark J. Wang wrote:
> > I read through the CMake's man page and found no support for lex/flex
> and
> > yacc/bison. Need I define my own rules to handle with lex/yacc source
> > files?
>
> Yup, I haven't seen one either. I've attached the one that I've wrote and
> have
> been using. It does some fiddling with the output file names, but you can
> see
> that in the code.
>
> Here's some code that uses it:
>
> INCLUDE(${CMAKE_SOURCE_DIR}/CMake/FindParsers.cmake)
>
> IF(PARSERS_FOUND)
>
> GENERATE_BISON_FLEX_SOURCES(${CMAKE_CURRENT_SOURCE_DIR}/parse.y ""
> ${CMAKE_CURRENT_SOURCE_DIR}/lex.l "")
>
> INCLUDE_DIRECTORIES(
> ${CMAKE_CURRENT_BINARY_DIR}
> )
>
> ADD_LIBRARY(mylib mycode.cc ${BF_SOURCES})
> TARGET_LINK_LIBRARIES(scene_galileo ${OTHER_LIBRARIES})
>
> ELSE(PARSERS_FOUND)
> # Opps, didn't find the parsers
> MESSAGE(SEND_ERROR "The parsing tools can't be found.")
> ENDIF(PARSERS_FOUND)
>
>
> James
>
> # /*
> # For more information, please see: http://software.sci.utah.edu
>
> # The MIT License
>
> # Copyright (c) 2005-2006
> # Scientific Computing and Imaging Institute, University of Utah
>
> # License for the specific language governing rights and limitations
> under
> # Permission is hereby granted, free of charge, to any person obtaining
> a
> # copy of this software and associated documentation files (the
> "Software"),
> # to deal in the Software without restriction, including without
> limitation
> # the rights to use, copy, modify, merge, publish, distribute,
> sublicense,
> # and/or sell copies of the Software, and to permit persons to whom the
> # Software is furnished to do so, subject to the following conditions:
>
> # The above copyright notice and this permission notice shall be
> included
> # in all copies or substantial portions of the Software.
>
> # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
> EXPRESS
> # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
> MERCHANTABILITY,
> # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
> SHALL
> # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
> OTHER
> # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
> ARISING
> # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
> # DEALINGS IN THE SOFTWARE.
> # */
>
> SET(PARSERS_FOUND FOOBAR)
>
> # These variables need to be specified in order to get CMake not to
> # barf on the IF(EXISTS ${BISON_EXECUTABLE} ..) expression even though
> # the code shouldn't get called. By setting them to BISON_EXECUTABLE
>
> SET(BISON_EXECUTABLE "BISON_EXECUTABLE-NOTFOUND" CACHE FILEPATH "bison
> executable")
> SET(FLEX_EXECUTABLE "FLEX_EXECUTABLE-NOTFOUND" CACHE FILEPATH "flex
> executable")
> # Mark these variables as advanced options
> MARK_AS_ADVANCED(FORCE BISON_EXECUTABLE)
> MARK_AS_ADVANCED(FORCE FLEX_EXECUTABLE)
>
> # You need at least version 2.4 for this to work.
> IF("${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}" LESS 2.4)
> MESSAGE("You need at least version 2.4 for generating flex and bison
> parsers. Go get it from http://www.cmake.org/HTML/Download.html")
> SET(PARSERS_FOUND 0)
>
> ELSE("${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}" LESS 2.4)
>
> FIND_PROGRAM(BISON_EXECUTABLE
> NAMES bison
> PATHS ${BISON_DIR} )
>
> FIND_PROGRAM(FLEX_EXECUTABLE
> NAMES flex
> PATHS ${FLEX_DIR} )
>
> IF(EXISTS ${BISON_EXECUTABLE} AND EXISTS ${FLEX_EXECUTABLE})
> SET(PARSERS_FOUND 1)
>
> ELSE(EXISTS ${BISON_EXECUTABLE} AND EXISTS ${FLEX_EXECUTABLE})
> SET(PARSERS_FOUND 0)
> # Print some error messages to the user
> IF (NOT EXISTS ${BISON_EXECUTABLE})
> MESSAGE("Couldn't find bison executable. Please check value in
> BISON_EXECUTABLE in advanced settings.")
> ENDIF (NOT EXISTS ${BISON_EXECUTABLE})
> IF (NOT EXISTS ${FLEX_EXECUTABLE})
> MESSAGE("Couldn't find flex executable. Please check value in
> FLEX_EXECUTABLE in advanced settings.")
> ENDIF (NOT EXISTS ${FLEX_EXECUTABLE})
>
> ENDIF(EXISTS ${BISON_EXECUTABLE} AND EXISTS ${FLEX_EXECUTABLE})
>
> ENDIF("${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}" LESS 2.4)
>
> # These are helper functions for parsers.
>
> # parser is the parser file name like parser.y
> # lexer is like lexer.l
>
> # The names of the output files will be based on the input names.
> # BF_SOURCES will be parser.cc, parser.h and lexer.cc.
>
> MACRO(GENERATE_BISON_FLEX_SOURCES parser parser_args
> lexer lexer_args)
> GET_FILENAME_COMPONENT(parser_base "${parser}" NAME_WE)
>
> SET(BISON_TAB_C "${CMAKE_CURRENT_BINARY_DIR}/${parser_base}.tab.c")
> SET(BISON_TAB_H "${CMAKE_CURRENT_BINARY_DIR}/${parser_base}.tab.h")
> SET(BISON_CC "${CMAKE_CURRENT_BINARY_DIR}/${parser_base}.cc")
> SET(BISON_H "${CMAKE_CURRENT_BINARY_DIR}/${parser_base}.h")
>
> ADD_CUSTOM_COMMAND(
> OUTPUT ${BISON_TAB_C} ${BISON_TAB_H}
> COMMAND ${BISON_EXECUTABLE}
> ARGS "${parser}" ${parser_args} "--defines"
> DEPENDS "${parser}"
> COMMENT "Generating ${BISON_TAB_C} ${BISON_TAB_H} from ${parser}"
> )
>
> ADD_CUSTOM_COMMAND(
> OUTPUT ${BISON_CC}
> COMMAND ${CMAKE_COMMAND}
> ARGS -E copy ${BISON_TAB_C} ${BISON_CC}
> DEPENDS ${BISON_TAB_C}
> COMMENT "Copying ${BISON_TAB_C} to ${BISON_CC}"
> )
>
> ADD_CUSTOM_COMMAND(
> OUTPUT ${BISON_H}
> COMMAND ${CMAKE_COMMAND}
> ARGS -E copy ${BISON_TAB_H} ${BISON_H}
> DEPENDS ${BISON_TAB_H}
> COMMENT "Copying ${BISON_TAB_H} to ${BISON_H}"
> )
>
> GET_FILENAME_COMPONENT(lexer_base "${lexer}" NAME_WE)
> SET(FLEX_C "${CMAKE_CURRENT_BINARY_DIR}/lex.yy.c")
> SET(FLEX_CC "${CMAKE_CURRENT_BINARY_DIR}/${lexer_base}.cc")
>
> ADD_CUSTOM_COMMAND(
> OUTPUT ${FLEX_C}
> COMMAND ${FLEX_EXECUTABLE}
> ARGS "${lexer}" ${lexer_args}
> DEPENDS "${lexer}" ${BISON_H}
> COMMENT "Generating ${FLEX_C} from ${lexer}"
> )
>
> ADD_CUSTOM_COMMAND(
> OUTPUT ${FLEX_CC}
> COMMAND ${CMAKE_COMMAND}
> ARGS -E copy ${FLEX_C} ${FLEX_CC}
> DEPENDS ${FLEX_C}
> COMMENT "Copying ${FLEX_C} to ${FLEX_CC}"
> )
>
> SET(BF_SOURCES ${BISON_CC} ${BISON_H} ${FLEX_CC})
>
> ENDMACRO(GENERATE_BISON_FLEX_SOURCES)
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://public.kitware.com/pipermail/cmake/attachments/20070516/efd45657/attachment.htm
More information about the CMake
mailing list