2016-09-27 22:01:08 +03:00
# Distributed under the OSI-approved BSD 3-Clause License. See accompanying
# file Copyright.txt or https://cmake.org/licensing for details.
2013-10-15 19:17:36 +04:00
#.rst:
# FindFLEX
# --------
#
# Find flex executable and provides a macro to generate custom build rules
#
#
2009-08-13 08:11:23 +04:00
#
# The module defines the following variables:
2013-10-15 19:17:36 +04:00
#
# ::
#
# 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
# FLEX_INCLUDE_DIRS - The path to the flex headers
#
#
2009-08-13 08:11:23 +04:00
#
2010-08-08 00:01:44 +04:00
# The minimum required version of flex can be specified using the
2013-10-15 19:17:36 +04:00
# standard syntax, e.g. find_package(FLEX 2.5.13)
#
2010-08-08 00:01:44 +04:00
#
#
2009-08-13 08:11:23 +04:00
# If flex is found on the system, the module provides the macro:
2013-10-15 19:17:36 +04:00
#
# ::
#
2015-10-17 19:51:51 +03:00
# FLEX_TARGET(Name FlexInput FlexOutput
# [COMPILE_FLAGS <string>]
# [DEFINES_FILE <string>]
# )
2013-10-15 19:17:36 +04:00
#
# which creates a custom command to generate the <FlexOutput> file from
# the <FlexInput> file. If COMPILE_FLAGS option is specified, the next
2015-10-17 19:51:51 +03:00
# parameter is added to the flex command line. If flex is configured to
# output a header file, the DEFINES_FILE option may be used to specify its
# name. Name is an alias used to get details of this custom command.
# Indeed the macro defines the following variables:
2009-08-13 08:11:23 +04:00
#
2013-10-15 19:17:36 +04:00
# ::
#
# 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}
2015-10-17 19:51:51 +03:00
# FLEX_${Name}_OUTPUT_HEADER - the header flex output, if any.
2013-10-15 19:17:36 +04:00
#
#
#
# Flex scanners oftenly use tokens defined by Bison: the code generated
# by Flex depends of the header generated by Bison. This module also
2009-08-13 08:11:23 +04:00
# defines a macro:
2013-10-15 19:17:36 +04:00
#
# ::
#
# 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
2009-08-13 08:11:23 +04:00
# respectively FLEX_TARGET and BISON_TARGET macros.
#
2013-10-15 19:17:36 +04:00
# ::
#
# ====================================================================
# 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_BINARY_DIR}/lexer.cpp)
# ADD_FLEX_BISON_DEPENDENCY(MyScanner MyParser)
#
Fix module docs to be manpage (groff) friendly
Most problems are fixed (or rather worked-around) by making long '====='
separators pre-formatted (i.e. prefixed with two spaces). In order to
preserve visual view, the code examples themselves are prefixed with 3
spaces.
This commit fixes the following man warnings:
$ cmake --help-man - | LANG=C MANWIDTH=80 man --warnings -l - > /dev/null
<standard input>:6024: warning [p 105, 1.7i]: can't break line
<standard input>:6027: warning [p 105, 2.7i]: cannot adjust line
<standard input>:6027: warning [p 105, 2.8i]: can't break line
<standard input>:7142: warning [p 117, 7.8i]: can't break line
<standard input>:7171: warning [p 117, 11.8i]: can't break line
<standard input>:8878: warning [p 136, 9.0i]: can't break line
<standard input>:8887: warning [p 136, 11.5i]: cannot adjust line
<standard input>:8887: warning [p 136, 11.7i]: can't break line
<standard input>:8904: warning [p 136, 14.2i]: can't break line
Patch from Modestas Vainius. See issue #9659.
2009-10-05 18:28:05 +04:00
#
#
2013-10-15 19:17:36 +04:00
# ::
Fix module docs to be manpage (groff) friendly
Most problems are fixed (or rather worked-around) by making long '====='
separators pre-formatted (i.e. prefixed with two spaces). In order to
preserve visual view, the code examples themselves are prefixed with 3
spaces.
This commit fixes the following man warnings:
$ cmake --help-man - | LANG=C MANWIDTH=80 man --warnings -l - > /dev/null
<standard input>:6024: warning [p 105, 1.7i]: can't break line
<standard input>:6027: warning [p 105, 2.7i]: cannot adjust line
<standard input>:6027: warning [p 105, 2.8i]: can't break line
<standard input>:7142: warning [p 117, 7.8i]: can't break line
<standard input>:7171: warning [p 117, 11.8i]: can't break line
<standard input>:8878: warning [p 136, 9.0i]: can't break line
<standard input>:8887: warning [p 136, 11.5i]: cannot adjust line
<standard input>:8887: warning [p 136, 11.7i]: can't break line
<standard input>:8904: warning [p 136, 14.2i]: can't break line
Patch from Modestas Vainius. See issue #9659.
2009-10-05 18:28:05 +04:00
#
2013-10-15 19:17:36 +04:00
# include_directories(${CMAKE_CURRENT_BINARY_DIR})
# add_executable(Foo
# Foo.cc
# ${BISON_MyParser_OUTPUTS}
# ${FLEX_MyScanner_OUTPUTS}
# )
# ====================================================================
2009-08-13 08:11:23 +04:00
2012-11-27 01:22:39 +04:00
find_program ( FLEX_EXECUTABLE NAMES flex win_flex DOC "path to the flex executable" )
2012-08-13 21:47:32 +04:00
mark_as_advanced ( FLEX_EXECUTABLE )
2009-08-13 08:11:23 +04:00
2012-08-13 21:47:32 +04:00
find_library ( FL_LIBRARY NAMES fl
2011-09-17 16:27:24 +04:00
D O C " P a t h t o t h e f l l i b r a r y " )
2012-08-13 21:47:32 +04:00
find_path ( FLEX_INCLUDE_DIR FlexLexer.h
2011-09-17 16:27:24 +04:00
D O C " P a t h t o t h e f l e x h e a d e r s " )
2012-08-13 21:47:32 +04:00
mark_as_advanced ( FL_LIBRARY FLEX_INCLUDE_DIR )
2011-09-17 16:27:24 +04:00
2015-10-17 19:50:00 +03:00
include ( ${ CMAKE_CURRENT_LIST_DIR } /CMakeParseArguments.cmake )
2012-08-13 21:47:32 +04:00
set ( FLEX_INCLUDE_DIRS ${ FLEX_INCLUDE_DIR } )
set ( FLEX_LIBRARIES ${ FL_LIBRARY } )
2009-08-13 08:11:23 +04:00
2012-08-13 21:47:32 +04:00
if ( FLEX_EXECUTABLE )
2009-08-13 08:11:23 +04:00
2012-08-13 21:47:32 +04:00
execute_process ( COMMAND ${ FLEX_EXECUTABLE } --version
2009-08-13 08:11:23 +04:00
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 )
2012-08-13 21:47:32 +04:00
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 ( )
2012-01-20 20:44:00 +04:00
# older versions of flex printed "/full/path/to/executable version X.Y"
# newer versions use "basename(executable) X.Y"
2012-11-27 01:22:39 +04:00
get_filename_component ( FLEX_EXE_NAME_WE "${FLEX_EXECUTABLE}" NAME_WE )
get_filename_component ( FLEX_EXE_EXT "${FLEX_EXECUTABLE}" EXT )
string ( REGEX REPLACE "^.*${FLEX_EXE_NAME_WE}(${FLEX_EXE_EXT})?\" ? ( version ) ?([0-9]+[^ ]* ) ( . * ) ? $ " " \ \ 3 "
2009-08-13 08:11:23 +04: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 } " )
2012-11-27 01:22:39 +04:00
unset ( FLEX_EXE_EXT )
unset ( FLEX_EXE_NAME_WE )
2012-08-13 21:47:32 +04:00
endif ( )
2009-08-13 08:11:23 +04:00
#============================================================
# FLEX_TARGET (public macro)
#============================================================
#
2012-08-13 21:47:32 +04:00
macro ( FLEX_TARGET Name Input Output )
2015-10-17 19:51:51 +03:00
set ( FLEX_TARGET_outputs "${Output}" )
2015-10-17 19:50:00 +03:00
set ( FLEX_EXECUTABLE_opts "" )
set ( FLEX_TARGET_PARAM_OPTIONS )
set ( FLEX_TARGET_PARAM_ONE_VALUE_KEYWORDS
C O M P I L E _ F L A G S
2015-10-17 19:51:51 +03:00
D E F I N E S _ F I L E
2015-10-17 19:50:00 +03:00
)
set ( FLEX_TARGET_PARAM_MULTI_VALUE_KEYWORDS )
cmake_parse_arguments (
F L E X _ T A R G E T _ A R G
" $ { F L E X _ T A R G E T _ P A R A M _ O P T I O N S } "
" $ { F L E X _ T A R G E T _ P A R A M _ O N E _ V A L U E _ K E Y W O R D S } "
" $ { F L E X _ T A R G E T _ M U L T I _ V A L U E _ K E Y W O R D S } "
$ { A R G N }
)
2015-10-17 19:51:51 +03:00
set ( FLEX_TARGET_usage "FLEX_TARGET(<Name> <Input> <Output> [COMPILE_FLAGS <string>] [DEFINES_FILE <string>]" )
2015-10-17 19:50:00 +03:00
if ( NOT "${FLEX_TARGET_ARG_UNPARSED_ARGUMENTS}" STREQUAL "" )
message ( SEND_ERROR ${ FLEX_TARGET_usage } )
else ( )
if ( NOT "${FLEX_TARGET_ARG_COMPILE_FLAGS}" STREQUAL "" )
set ( FLEX_EXECUTABLE_opts "${FLEX_TARGET_ARG_COMPILE_FLAGS}" )
separate_arguments ( FLEX_EXECUTABLE_opts )
2012-08-13 21:47:32 +04:00
endif ( )
2015-10-17 19:51:51 +03:00
if ( NOT "${FLEX_TARGET_ARG_DEFINES_FILE}" STREQUAL "" )
list ( APPEND FLEX_TARGET_outputs "${FLEX_TARGET_ARG_DEFINES_FILE}" )
list ( APPEND FLEX_EXECUTABLE_opts --header-file= ${ FLEX_TARGET_ARG_DEFINES_FILE } )
endif ( )
2012-08-13 21:47:32 +04:00
2015-10-17 19:51:51 +03:00
add_custom_command ( OUTPUT ${ FLEX_TARGET_outputs }
2016-04-20 20:18:56 +03:00
C O M M A N D $ { F L E X _ E X E C U T A B L E } $ { 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 }
V E R B A T I M
2015-10-17 19:50:00 +03:00
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 } )
2015-10-17 19:51:51 +03:00
if ( "${FLEX_TARGET_ARG_DEFINES_FILE}" STREQUAL "" )
set ( FLEX_ ${ Name } _OUTPUT_HEADER "" )
else ( )
set ( FLEX_ ${ Name } _OUTPUT_HEADER ${ FLEX_TARGET_ARG_DEFINES_FILE } )
endif ( )
2015-10-17 19:50:00 +03:00
endif ( )
2012-08-13 21:50:14 +04:00
endmacro ( )
2009-08-13 08:11:23 +04:00
#============================================================
#============================================================
# ADD_FLEX_BISON_DEPENDENCY (public macro)
#============================================================
#
2012-08-13 21:47:32 +04:00
macro ( ADD_FLEX_BISON_DEPENDENCY FlexTarget BisonTarget )
2009-08-13 08:11:23 +04:00
2012-08-13 21:47:32 +04:00
if ( NOT FLEX_ ${ FlexTarget } _OUTPUTS )
2015-10-17 19:50:00 +03:00
message ( SEND_ERROR "Flex target `${FlexTarget}' does not exist." )
2012-08-13 21:47:32 +04:00
endif ( )
2009-08-13 08:11:23 +04:00
2012-08-13 21:47:32 +04:00
if ( NOT BISON_ ${ BisonTarget } _OUTPUT_HEADER )
2015-10-17 19:50:00 +03:00
message ( SEND_ERROR "Bison target `${BisonTarget}' does not exist." )
2012-08-13 21:47:32 +04:00
endif ( )
2009-08-13 08:11:23 +04:00
2012-08-13 21:47:32 +04:00
set_source_files_properties ( ${ FLEX_${FlexTarget } _OUTPUTS}
2009-08-13 08:11:23 +04:00
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 } )
2012-08-13 21:50:14 +04:00
endmacro ( )
2009-08-13 08:11:23 +04:00
#============================================================
2012-08-13 21:50:14 +04:00
endif ( )
2009-08-13 08:11:23 +04:00
2012-08-13 21:47:32 +04:00
include ( ${ CMAKE_CURRENT_LIST_DIR } /FindPackageHandleStandardArgs.cmake )
2010-08-08 00:01:44 +04:00
FIND_PACKAGE_HANDLE_STANDARD_ARGS ( FLEX REQUIRED_VARS FLEX_EXECUTABLE
V E R S I O N _ V A R F L E X _ V E R S I O N )
2009-08-13 08:11:23 +04:00
# FindFLEX.cmake ends here