2013-11-03 13:45:26 +01:00
# - Find flex executable and provides a macro to generate custom build rules
#
# The module defines the following variables:
# FLEX_FOUND - true is flex executable is found
# FLEX_EXECUTABLE - the path to the flex executable
# FLEX_VERSION - the version of flex
# FLEX_LIBRARIES - The flex libraries
#
# The minimum required version of flex can be specified using the
# standard syntax, e.g. FIND_PACKAGE(FLEX 2.5.13)
#
#
# If flex is found on the system, the module provides the macro:
# FLEX_TARGET(Name FlexInput FlexOutput [COMPILE_FLAGS <string>])
# which creates a custom command to generate the <FlexOutput> file from
# the <FlexInput> file. If COMPILE_FLAGS option is specified, the next
# parameter is added to the flex command line. Name is an alias used to
# get details of this custom command. Indeed the macro defines the
# following variables:
# FLEX_${Name}_DEFINED - true is the macro ran successfully
# FLEX_${Name}_OUTPUTS - the source file generated by the custom rule, an
# alias for FlexOutput
# FLEX_${Name}_INPUT - the flex source file, an alias for ${FlexInput}
#
# Flex scanners oftenly use tokens defined by Bison: the code generated
# by Flex depends of the header generated by Bison. This module also
# defines a macro:
# ADD_FLEX_BISON_DEPENDENCY(FlexTarget BisonTarget)
# which adds the required dependency between a scanner and a parser
# where <FlexTarget> and <BisonTarget> are the first parameters of
# respectively FLEX_TARGET and BISON_TARGET macros.
#
# ====================================================================
# Example:
#
# find_package(BISON)
# find_package(FLEX)
#
# BISON_TARGET(MyParser parser.y ${CMAKE_CURRENT_BINARY_DIR}/parser.cpp
# FLEX_TARGET(MyScanner lexer.l ${CMAKE_CURRENT_BIANRY_DIR}/lexer.cpp)
# ADD_FLEX_BISON_DEPENDENCY(MyScanner MyParser)
#
# include_directories(${CMAKE_CURRENT_BINARY_DIR})
# add_executable(Foo
# Foo.cc
# ${BISON_MyParser_OUTPUTS}
# ${FLEX_MyScanner_OUTPUTS}
# )
# ====================================================================
#=============================================================================
# Copyright 2009 Kitware, Inc.
# Copyright 2006 Tristan Carel
# Modified 2010 by Jon Siwek, backporting for CMake 2.6 compat
#
# Distributed under the OSI-approved BSD License (the "License"):
# CMake - Cross Platform Makefile Generator
# Copyright 2000-2009 Kitware, Inc., Insight Software Consortium
# All rights reserved.
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
#
# * Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
#
# * Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
#
# * Neither the names of Kitware, Inc., the Insight Software Consortium,
# nor the names of their contributors may be used to endorse or promote
# products derived from this software without specific prior written
# permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
# HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#
# This software is distributed WITHOUT ANY WARRANTY; without even the
# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
# See the License for more information.
#=============================================================================
FIND_PROGRAM ( FLEX_EXECUTABLE flex DOC "path to the flex executable" )
MARK_AS_ADVANCED ( FLEX_EXECUTABLE )
FIND_LIBRARY ( FL_LIBRARY NAMES fl
D O C " p a t h t o t h e f l l i b r a r y " )
MARK_AS_ADVANCED ( FL_LIBRARY )
SET ( FLEX_LIBRARIES ${ FL_LIBRARY } )
IF ( FLEX_EXECUTABLE )
2015-03-30 23:02:50 +02:00
GET_FILENAME_COMPONENT ( FLEX_EXECUTABLE_NAME ${ FLEX_EXECUTABLE } NAME )
2013-11-03 13:45:26 +01:00
EXECUTE_PROCESS ( COMMAND ${ FLEX_EXECUTABLE } --version
O U T P U T _ V A R I A B L E F L E X _ v e r s i o n _ o u t p u t
E R R O R _ V A R I A B L E F L E X _ v e r s i o n _ e r r o r
R E S U L T _ V A R I A B L E F L E X _ v e r s i o n _ r e s u l t
O U T P U T _ S T R I P _ T R A I L I N G _ W H I T E S P A C E )
IF ( NOT ${ FLEX_version_result } EQUAL 0 )
IF ( FLEX_FIND_REQUIRED )
MESSAGE ( SEND_ERROR "Command \" ${ FLEX_EXECUTABLE } --version\ " failed with output:\n${FLEX_version_output}\n${FLEX_version_error}" )
ELSE ( )
MESSAGE ( "Command \" ${ FLEX_EXECUTABLE } --version\ " failed with output:\n${FLEX_version_output}\n${FLEX_version_error}\nFLEX_VERSION will not be available" )
ENDIF ( )
ELSE ( )
2015-03-30 23:02:50 +02:00
STRING ( REGEX REPLACE "^${FLEX_EXECUTABLE_NAME}[^ ]* (.*)$" "\\1"
2013-11-03 13:45:26 +01:00
F L E X _ V E R S I O N " $ { F L E X _ v e r s i o n _ o u t p u t } " )
ENDIF ( )
2015-03-16 13:31:33 +01:00
IF ( FLEX_FIND_VERSION )
IF ( "${FLEX_VERSION}" VERSION_LESS "${FLEX_FIND_VERSION}" )
MESSAGE ( SEND_ERROR "Your version of flex is too old. You can specify an alternative path using -DFLEX_EXECUTABLE=/path/to/flex" )
ENDIF ( )
ENDIF ( )
2013-11-03 13:45:26 +01:00
#============================================================
# FLEX_TARGET (public macro)
#============================================================
#
MACRO ( FLEX_TARGET Name Input Output )
SET ( FLEX_TARGET_usage "FLEX_TARGET(<Name> <Input> <Output> [COMPILE_FLAGS <string>]" )
IF ( ${ ARGC } GREATER 3 )
IF ( ${ ARGC } EQUAL 5 )
IF ( "${ARGV3}" STREQUAL "COMPILE_FLAGS" )
SET ( FLEX_EXECUTABLE_opts "${ARGV4}" )
SEPARATE_ARGUMENTS ( FLEX_EXECUTABLE_opts )
ELSE ( )
MESSAGE ( SEND_ERROR ${ FLEX_TARGET_usage } )
ENDIF ( )
ELSE ( )
MESSAGE ( SEND_ERROR ${ FLEX_TARGET_usage } )
ENDIF ( )
ENDIF ( )
ADD_CUSTOM_COMMAND ( OUTPUT ${ Output }
C O M M A N D $ { F L E X _ E X E C U T A B L E }
A R G S $ { F L E X _ E X E C U T A B L E _ o p t s } - o $ { O u t p u t } $ { I n p u t }
D E P E N D S $ { I n p u t }
C O M M E N T " [ F L E X ] [ $ { N a m e } ] B u i l d i n g s c a n n e r w i t h f l e x $ { F L E X _ V E R S I O N } "
W O R K I N G _ D I R E C T O R Y $ { C M A K E _ C U R R E N T _ S O U R C E _ D I R } )
SET ( FLEX_ ${ Name } _DEFINED TRUE )
SET ( FLEX_ ${ Name } _OUTPUTS ${ Output } )
SET ( FLEX_ ${ Name } _INPUT ${ Input } )
SET ( FLEX_ ${ Name } _COMPILE_FLAGS ${ FLEX_EXECUTABLE_opts } )
ENDMACRO ( FLEX_TARGET )
#============================================================
#============================================================
# ADD_FLEX_BISON_DEPENDENCY (public macro)
#============================================================
#
MACRO ( ADD_FLEX_BISON_DEPENDENCY FlexTarget BisonTarget )
IF ( NOT FLEX_ ${ FlexTarget } _OUTPUTS )
MESSAGE ( SEND_ERROR "Flex target `${FlexTarget}' does not exists." )
ENDIF ( )
IF ( NOT BISON_ ${ BisonTarget } _OUTPUT_HEADER )
MESSAGE ( SEND_ERROR "Bison target `${BisonTarget}' does not exists." )
ENDIF ( )
SET_SOURCE_FILES_PROPERTIES ( ${ FLEX_${FlexTarget } _OUTPUTS}
P R O P E R T I E S O B J E C T _ D E P E N D S $ { B I S O N _ $ { B i s o n T a r g e t } _ O U T P U T _ H E A D E R } )
ENDMACRO ( ADD_FLEX_BISON_DEPENDENCY )
#============================================================
ENDIF ( FLEX_EXECUTABLE )
INCLUDE ( FindPackageHandleStandardArgs )
FIND_PACKAGE_HANDLE_STANDARD_ARGS ( FLEX FLEX_EXECUTABLE
F L E X _ V E R S I O N )
2015-03-16 13:31:33 +01:00
# FindFLEX.cmake ends here