Merge topic 'FindBISON-report-file'

33b562aa Help: Add notes for topic 'FindBISON-report-file'
ab8d5d0f FindBISON: Refactor public and inner macro routines
c42e63a9 FindBISON: Add REPORT_FILE option to pass --report-file=FILE
ad2497aa FindBISON: Change usage of [VERBOSE <file>] to [VERBOSE [<file>]]
This commit is contained in:
Brad King 2016-07-19 08:25:56 -04:00 committed by CMake Topic Stage
commit 922bb1fd69
2 changed files with 92 additions and 48 deletions

View File

@ -0,0 +1,5 @@
FindBISON-report-file
---------------------
* The :module:`FindBISON` module ``BISON_TARGET`` macro learned a new
``REPORT_FILE`` option to specify the bison ``--report-file=`` option.

View File

@ -23,7 +23,8 @@
# BISON_TARGET(<Name> <YaccInput> <CodeOutput> # BISON_TARGET(<Name> <YaccInput> <CodeOutput>
# [COMPILE_FLAGS <flags>] # [COMPILE_FLAGS <flags>]
# [DEFINES_FILE <file>] # [DEFINES_FILE <file>]
# [VERBOSE <file>] # [VERBOSE [<file>]]
# [REPORT_FILE <file>]
# ) # )
# #
# which will create a custom rule to generate a parser. ``<YaccInput>`` is # which will create a custom rule to generate a parser. ``<YaccInput>`` is
@ -39,9 +40,14 @@
# ``DEFINES_FILE <file>`` # ``DEFINES_FILE <file>``
# Specify a non-default header ``<file>`` to be generated by ``bison``. # Specify a non-default header ``<file>`` to be generated by ``bison``.
# #
# ``VERBOSE <file>`` # ``VERBOSE [<file>]``
# Tell ``bison`` to write verbose descriptions of the grammar and # Tell ``bison`` to write a report file of the grammar and parser.
# parser to the given ``<file>``. # If ``<file>`` is given, it specifies path the report file is copied to.
# ``[<file>]`` is left for backward compatibility of this module.
# Use ``VERBOSE REPORT_FILE <file>``.
#
# ``REPORT_FILE <file>``
# Specify a non-default report ``<file>``, if generated.
# #
# The macro defines the following variables: # The macro defines the following variables:
# #
@ -58,7 +64,7 @@
# The header file generated by bison # The header file generated by bison
# #
# ``BISON_<Name>_OUTPUTS`` # ``BISON_<Name>_OUTPUTS``
# The sources files generated by bison # All files generated by bison including the source, the header and the report
# #
# ``BISON_<Name>_COMPILE_FLAGS`` # ``BISON_<Name>_COMPILE_FLAGS``
# Options used in the ``bison`` command line # Options used in the ``bison`` command line
@ -120,35 +126,65 @@ if(BISON_EXECUTABLE)
endif() endif()
# internal macro # internal macro
macro(BISON_TARGET_option_verbose Name BisonOutput filename) # sets BISON_TARGET_cmdopt
list(APPEND BISON_TARGET_cmdopt "--verbose")
get_filename_component(BISON_TARGET_output_path "${BisonOutput}" PATH)
get_filename_component(BISON_TARGET_output_name "${BisonOutput}" NAME_WE)
add_custom_command(OUTPUT ${filename}
COMMAND ${CMAKE_COMMAND} -E copy
"${BISON_TARGET_output_path}/${BISON_TARGET_output_name}.output"
"${filename}"
VERBATIM
DEPENDS
"${BISON_TARGET_output_path}/${BISON_TARGET_output_name}.output"
COMMENT "[BISON][${Name}] Copying bison verbose table to ${filename}"
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR})
set(BISON_${Name}_VERBOSE_FILE ${filename})
list(APPEND BISON_TARGET_extraoutputs
"${BISON_TARGET_output_path}/${BISON_TARGET_output_name}.output")
endmacro()
# internal macro
macro(BISON_TARGET_option_extraopts Options) macro(BISON_TARGET_option_extraopts Options)
set(BISON_TARGET_cmdopt "")
set(BISON_TARGET_extraopts "${Options}") set(BISON_TARGET_extraopts "${Options}")
separate_arguments(BISON_TARGET_extraopts) separate_arguments(BISON_TARGET_extraopts)
list(APPEND BISON_TARGET_cmdopt ${BISON_TARGET_extraopts}) list(APPEND BISON_TARGET_cmdopt ${BISON_TARGET_extraopts})
endmacro() endmacro()
# internal macro # internal macro
macro(BISON_TARGET_option_defines Header) # sets BISON_TARGET_output_header and BISON_TARGET_cmdopt
set(BISON_TARGET_output_header "${Header}") macro(BISON_TARGET_option_defines BisonOutput Header)
list(APPEND BISON_TARGET_cmdopt --defines=${BISON_TARGET_output_header}) if("${Header}" STREQUAL "")
# default header path generated by bison (see option -d)
string(REGEX REPLACE "^(.*)(\\.[^.]*)$" "\\2" _fileext "${BisonOutput}")
string(REPLACE "c" "h" _fileext ${_fileext})
string(REGEX REPLACE "^(.*)(\\.[^.]*)$" "\\1${_fileext}"
BISON_TARGET_output_header "${BisonOutput}")
list(APPEND BISON_TARGET_cmdopt "-d")
else()
set(BISON_TARGET_output_header "${Header}")
list(APPEND BISON_TARGET_cmdopt "--defines=${BISON_TARGET_output_header}")
endif()
endmacro()
# internal macro
# sets BISON_TARGET_verbose_file and BISON_TARGET_cmdopt
macro(BISON_TARGET_option_report_file BisonOutput ReportFile)
if("${ReportFile}" STREQUAL "")
get_filename_component(BISON_TARGET_output_path "${BisonOutput}" PATH)
get_filename_component(BISON_TARGET_output_name "${BisonOutput}" NAME_WE)
set(BISON_TARGET_verbose_file
"${BISON_TARGET_output_path}/${BISON_TARGET_output_name}.output")
else()
set(BISON_TARGET_verbose_file "${ReportFile}")
list(APPEND BISON_TARGET_cmdopt "--report-file=${BISON_TARGET_verbose_file}")
endif()
endmacro()
# internal macro
# adds a custom command and sets
# BISON_TARGET_cmdopt, BISON_TARGET_verbose_file, BISON_TARGET_extraoutputs
macro(BISON_TARGET_option_verbose Name BisonOutput filename)
list(APPEND BISON_TARGET_cmdopt "--verbose")
list(APPEND BISON_TARGET_extraoutputs
"${BISON_TARGET_verbose_file}")
if (NOT "${filename}" STREQUAL "")
add_custom_command(OUTPUT ${filename}
COMMAND ${CMAKE_COMMAND} -E copy
"${BISON_TARGET_verbose_file}"
"${filename}"
VERBATIM
DEPENDS
"${BISON_TARGET_verbose_file}"
COMMENT "[BISON][${Name}] Copying bison verbose table to ${filename}"
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR})
set(BISON_${Name}_VERBOSE_FILE ${filename})
list(APPEND BISON_TARGET_extraoutputs
"${filename}")
endif()
endmacro() endmacro()
#============================================================ #============================================================
@ -156,18 +192,20 @@ if(BISON_EXECUTABLE)
#============================================================ #============================================================
# #
macro(BISON_TARGET Name BisonInput BisonOutput) macro(BISON_TARGET Name BisonInput BisonOutput)
set(BISON_TARGET_output_header "")
set(BISON_TARGET_cmdopt "")
set(BISON_TARGET_outputs "${BisonOutput}") set(BISON_TARGET_outputs "${BisonOutput}")
set(BISON_TARGET_extraoutputs "")
# Parsing parameters # Parsing parameters
set(BISON_TARGET_PARAM_OPTIONS) set(BISON_TARGET_PARAM_OPTIONS
)
set(BISON_TARGET_PARAM_ONE_VALUE_KEYWORDS set(BISON_TARGET_PARAM_ONE_VALUE_KEYWORDS
VERBOSE
COMPILE_FLAGS COMPILE_FLAGS
DEFINES_FILE DEFINES_FILE
REPORT_FILE
)
set(BISON_TARGET_PARAM_MULTI_VALUE_KEYWORDS
VERBOSE
) )
set(BISON_TARGET_PARAM_MULTI_VALUE_KEYWORDS)
cmake_parse_arguments( cmake_parse_arguments(
BISON_TARGET_ARG BISON_TARGET_ARG
"${BISON_TARGET_PARAM_OPTIONS}" "${BISON_TARGET_PARAM_OPTIONS}"
@ -178,29 +216,30 @@ if(BISON_EXECUTABLE)
if(NOT "${BISON_TARGET_ARG_UNPARSED_ARGUMENTS}" STREQUAL "") if(NOT "${BISON_TARGET_ARG_UNPARSED_ARGUMENTS}" STREQUAL "")
message(SEND_ERROR "Usage") message(SEND_ERROR "Usage")
elseif("${BISON_TARGET_ARG_VERBOSE}" MATCHES ";")
# [VERBOSE [<file>] hack: <file> is non-multi value by usage
message(SEND_ERROR "Usage")
else() else()
BISON_TARGET_option_extraopts("${BISON_TARGET_ARG_COMPILE_FLAGS}")
BISON_TARGET_option_defines("${BisonOutput}" "${BISON_TARGET_ARG_DEFINES_FILE}")
BISON_TARGET_option_report_file("${BisonOutput}" "${BISON_TARGET_ARG_REPORT_FILE}")
if(NOT "${BISON_TARGET_ARG_VERBOSE}" STREQUAL "") if(NOT "${BISON_TARGET_ARG_VERBOSE}" STREQUAL "")
BISON_TARGET_option_verbose(${Name} ${BisonOutput} "${BISON_TARGET_ARG_VERBOSE}") BISON_TARGET_option_verbose(${Name} ${BisonOutput} "${BISON_TARGET_ARG_VERBOSE}")
endif() else()
if(NOT "${BISON_TARGET_ARG_COMPILE_FLAGS}" STREQUAL "") # [VERBOSE [<file>]] is used with no argument or is not used
BISON_TARGET_option_extraopts("${BISON_TARGET_ARG_COMPILE_FLAGS}") set(BISON_TARGET_args "${ARGN}")
endif() list(FIND BISON_TARGET_args "VERBOSE" BISON_TARGET_args_indexof_verbose)
if(NOT "${BISON_TARGET_ARG_DEFINES_FILE}" STREQUAL "") if(${BISON_TARGET_args_indexof_verbose} GREATER -1)
BISON_TARGET_option_defines("${BISON_TARGET_ARG_DEFINES_FILE}") # VERBOSE is used without <file>
BISON_TARGET_option_verbose(${Name} ${BisonOutput} "")
endif()
endif() endif()
if("${BISON_TARGET_output_header}" STREQUAL "")
# Header's name generated by bison (see option -d)
list(APPEND BISON_TARGET_cmdopt "-d")
string(REGEX REPLACE "^(.*)(\\.[^.]*)$" "\\2" _fileext "${BisonOutput}")
string(REPLACE "c" "h" _fileext ${_fileext})
string(REGEX REPLACE "^(.*)(\\.[^.]*)$" "\\1${_fileext}"
BISON_TARGET_output_header "${BisonOutput}")
endif()
list(APPEND BISON_TARGET_outputs "${BISON_TARGET_output_header}") list(APPEND BISON_TARGET_outputs "${BISON_TARGET_output_header}")
add_custom_command(OUTPUT ${BISON_TARGET_outputs} add_custom_command(OUTPUT ${BISON_TARGET_outputs}
${BISON_TARGET_extraoutputs} ${BISON_TARGET_verbose_file}
COMMAND ${BISON_EXECUTABLE} ${BISON_TARGET_cmdopt} -o ${BisonOutput} ${BisonInput} COMMAND ${BISON_EXECUTABLE} ${BISON_TARGET_cmdopt} -o ${BisonOutput} ${BisonInput}
VERBATIM VERBATIM
DEPENDS ${BisonInput} DEPENDS ${BisonInput}
@ -210,7 +249,7 @@ if(BISON_EXECUTABLE)
# define target variables # define target variables
set(BISON_${Name}_DEFINED TRUE) set(BISON_${Name}_DEFINED TRUE)
set(BISON_${Name}_INPUT ${BisonInput}) set(BISON_${Name}_INPUT ${BisonInput})
set(BISON_${Name}_OUTPUTS ${BISON_TARGET_outputs}) set(BISON_${Name}_OUTPUTS ${BISON_TARGET_outputs} ${BISON_TARGET_extraoutputs})
set(BISON_${Name}_COMPILE_FLAGS ${BISON_TARGET_cmdopt}) set(BISON_${Name}_COMPILE_FLAGS ${BISON_TARGET_cmdopt})
set(BISON_${Name}_OUTPUT_SOURCE "${BisonOutput}") set(BISON_${Name}_OUTPUT_SOURCE "${BisonOutput}")
set(BISON_${Name}_OUTPUT_HEADER "${BISON_TARGET_output_header}") set(BISON_${Name}_OUTPUT_HEADER "${BISON_TARGET_output_header}")