Jelajahi Sumber

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>]]
Brad King 9 tahun lalu
induk
melakukan
922bb1fd69
2 mengubah file dengan 92 tambahan dan 48 penghapusan
  1. 5 0
      Help/release/dev/FindBISON-report-file.rst
  2. 87 48
      Modules/FindBISON.cmake

+ 5 - 0
Help/release/dev/FindBISON-report-file.rst

@@ -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.

+ 87 - 48
Modules/FindBISON.cmake

@@ -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>``
-#   Tell ``bison`` to write verbose descriptions of the grammar and
-#   parser to the given ``<file>``.
+# ``VERBOSE [<file>]``
+#   Tell ``bison`` to write a report file of the grammar and parser.
+#   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)
-    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
+  # sets BISON_TARGET_cmdopt
   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)
-    set(BISON_TARGET_output_header "${Header}")
-    list(APPEND BISON_TARGET_cmdopt --defines=${BISON_TARGET_output_header})
+  # sets BISON_TARGET_output_header and BISON_TARGET_cmdopt
+  macro(BISON_TARGET_option_defines BisonOutput 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()
-      if(NOT "${BISON_TARGET_ARG_COMPILE_FLAGS}" STREQUAL "")
-        BISON_TARGET_option_extraopts("${BISON_TARGET_ARG_COMPILE_FLAGS}")
-      endif()
-      if(NOT "${BISON_TARGET_ARG_DEFINES_FILE}" STREQUAL "")
-        BISON_TARGET_option_defines("${BISON_TARGET_ARG_DEFINES_FILE}")
+      else()
+        # [VERBOSE [<file>]] is used with no argument or is not used
+        set(BISON_TARGET_args "${ARGN}")
+        list(FIND BISON_TARGET_args "VERBOSE" BISON_TARGET_args_indexof_verbose)
+        if(${BISON_TARGET_args_indexof_verbose} GREATER -1)
+          # 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}")