Merge topic 'FindBISON-OPTIONS-keyword'

211cec0f20 FindBISON: Add new keyword OPTIONS

Acked-by: Kitware Robot <kwrobot@kitware.com>
Tested-by: buildbot <buildbot@kitware.com>
Merge-request: !10129
diff --git a/Help/release/dev/FindFLEX.rst b/Help/release/dev/FindFLEX.rst
new file mode 100644
index 0000000..6faec23
--- /dev/null
+++ b/Help/release/dev/FindFLEX.rst
@@ -0,0 +1,6 @@
+FindFLEX
+--------
+
+* The :module:`FindFLEX` module :command:`flex_target` command has a new
+  ``OPTIONS`` option to add Flex command-line options as a
+  :ref:`semicolon-separated list <CMake Language Lists>`.
diff --git a/Modules/FindBoost.cmake b/Modules/FindBoost.cmake
index aed1854..39ddfbe 100644
--- a/Modules/FindBoost.cmake
+++ b/Modules/FindBoost.cmake
@@ -1396,7 +1396,7 @@
       set(_Boost_TIMER_DEPENDENCIES chrono)
       set(_Boost_WAVE_DEPENDENCIES filesystem serialization thread chrono atomic)
       set(_Boost_WSERIALIZATION_DEPENDENCIES serialization)
-    else()
+    elseif(Boost_VERSION_STRING VERSION_LESS 1.87.0)
       set(_Boost_CONTRACT_DEPENDENCIES thread chrono)
       set(_Boost_COROUTINE_DEPENDENCIES context)
       set(_Boost_FIBER_DEPENDENCIES context)
@@ -1410,7 +1410,21 @@
       set(_Boost_THREAD_DEPENDENCIES chrono atomic)
       set(_Boost_WAVE_DEPENDENCIES filesystem serialization thread chrono atomic)
       set(_Boost_WSERIALIZATION_DEPENDENCIES serialization)
-      if(Boost_VERSION_STRING VERSION_GREATER_EQUAL 1.87.0 AND NOT Boost_NO_WARN_NEW_VERSIONS)
+    else()
+      set(_Boost_CONTRACT_DEPENDENCIES thread chrono)
+      set(_Boost_COROUTINE_DEPENDENCIES context)
+      set(_Boost_FIBER_DEPENDENCIES context)
+      set(_Boost_IOSTREAMS_DEPENDENCIES regex)
+      set(_Boost_JSON_DEPENDENCIES container)
+      set(_Boost_LOG_DEPENDENCIES log_setup filesystem thread regex atomic)
+      set(_Boost_MATH_DEPENDENCIES math_c99 math_c99f math_c99l math_tr1 math_tr1f math_tr1l)
+      set(_Boost_MPI_DEPENDENCIES serialization)
+      set(_Boost_MPI_PYTHON_DEPENDENCIES python${component_python_version} mpi serialization)
+      set(_Boost_NUMPY_DEPENDENCIES python${component_python_version})
+      set(_Boost_THREAD_DEPENDENCIES chrono atomic)
+      set(_Boost_WAVE_DEPENDENCIES filesystem serialization thread chrono atomic)
+      set(_Boost_WSERIALIZATION_DEPENDENCIES serialization)
+      if(Boost_VERSION_STRING VERSION_GREATER_EQUAL 1.88.0 AND NOT Boost_NO_WARN_NEW_VERSIONS)
         message(WARNING "New Boost version may have incorrect or missing dependencies and imported targets")
       endif()
     endif()
@@ -1685,7 +1699,7 @@
   # _Boost_COMPONENT_HEADERS.  See the instructions at the top of
   # _Boost_COMPONENT_DEPENDENCIES.
   set(_Boost_KNOWN_VERSIONS ${Boost_ADDITIONAL_VERSIONS}
-    "1.86.0" "1.86" "1.85.0" "1.85" "1.84.0" "1.84"
+    "1.87.0" "1.87" "1.86.0" "1.86" "1.85.0" "1.85" "1.84.0" "1.84"
     "1.83.0" "1.83" "1.82.0" "1.82" "1.81.0" "1.81" "1.80.0" "1.80" "1.79.0" "1.79"
     "1.78.0" "1.78" "1.77.0" "1.77" "1.76.0" "1.76" "1.75.0" "1.75" "1.74.0" "1.74"
     "1.73.0" "1.73" "1.72.0" "1.72" "1.71.0" "1.71" "1.70.0" "1.70" "1.69.0" "1.69"
diff --git a/Modules/FindFLEX.cmake b/Modules/FindFLEX.cmake
index 009e6b0..d9d0afa 100644
--- a/Modules/FindFLEX.cmake
+++ b/Modules/FindFLEX.cmake
@@ -35,6 +35,7 @@
   .. code-block:: cmake
 
     flex_target(<Name> <FlexInput> <FlexOutput>
+                [OPTIONS <options>...]
                 [COMPILE_FLAGS <string>]
                 [DEFINES_FILE <string>]
                 )
@@ -45,9 +46,18 @@
 
 The options are:
 
+``OPTIONS <options>...``
+  .. versionadded:: 3.32
+
+  A :ref:`semicolon-separated list <CMake Language Lists>` of flex options added
+  to the ``flex`` command line.
+
 ``COMPILE_FLAGS <string>``
+  .. deprecated:: 3.32
+
   Space-separated flex options added to the ``flex`` command line.
   A :ref:`;-list <CMake Language Lists>` will not work.
+  This option is deprecated in favor of ``OPTIONS <options>...``.
 
 ``DEFINES_FILE <string>``
   .. versionadded:: 3.5
@@ -73,6 +83,11 @@
 ``FLEX_<Name>_OUTPUT_HEADER``
   The header flex output, if any.
 
+``FLEX_<Name>_OPTIONS``
+  .. versionadded:: 3.32
+
+  Options used in the ``flex`` command line.
+
 Flex scanners often use tokens defined by Bison: the code generated
 by Flex depends of the header generated by Bison.  This module also
 defines a macro:
@@ -106,6 +121,29 @@
     ${FLEX_MyScanner_OUTPUTS}
   )
   target_link_libraries(Foo ${FLEX_LIBRARIES})
+
+Adding additional command-line options to the ``flex`` executable can be passed
+as a list. For example, adding the ``--warn`` option to report warnings, and the
+``--noline`` (``-L``) to not generate ``#line`` directives.
+
+.. code-block:: cmake
+
+  find_package(FLEX)
+
+  if(FLEX_FOUND)
+    flex_target(MyScanner lexer.l lexer.cpp OPTIONS --warn --noline)
+  endif()
+
+Generator expressions can be used in ``OPTIONS <options...``. For example, to
+add the ``--debug`` (``-d``) option only for the ``Debug`` build type:
+
+.. code-block:: cmake
+
+  find_package(FLEX)
+
+  if(FLEX_FOUND)
+    flex_target(MyScanner lexer.l lexer.cpp OPTIONS $<$<CONFIG:Debug>:--debug>)
+  endif()
 #]=======================================================================]
 
 find_program(FLEX_EXECUTABLE NAMES flex win-flex win_flex DOC "path to the flex executable")
@@ -157,20 +195,35 @@
       COMPILE_FLAGS
       DEFINES_FILE
       )
-    set(FLEX_TARGET_PARAM_MULTI_VALUE_KEYWORDS)
+    set(FLEX_TARGET_PARAM_MULTI_VALUE_KEYWORDS OPTIONS)
 
     cmake_parse_arguments(
       FLEX_TARGET_ARG
       "${FLEX_TARGET_PARAM_OPTIONS}"
       "${FLEX_TARGET_PARAM_ONE_VALUE_KEYWORDS}"
-      "${FLEX_TARGET_MULTI_VALUE_KEYWORDS}"
+      "${FLEX_TARGET_PARAM_MULTI_VALUE_KEYWORDS}"
       ${ARGN}
       )
 
-    set(FLEX_TARGET_usage "FLEX_TARGET(<Name> <Input> <Output> [COMPILE_FLAGS <string>] [DEFINES_FILE <string>]")
+    string(
+      JOIN "\n" FLEX_TARGET_usage
+      "Usage:"
+      "  flex_target("
+      "    <Name>"
+      "    <Input>"
+      "    <Output>"
+      "    [OPTIONS <options>...]"
+      "    [COMPILE_FLAGS <string>]"
+      "    [DEFINES_FILE <string>]"
+      "  )"
+    )
 
     if(NOT "${FLEX_TARGET_ARG_UNPARSED_ARGUMENTS}" STREQUAL "")
-      message(SEND_ERROR ${FLEX_TARGET_usage})
+      message(
+        SEND_ERROR
+        "Unrecognized arguments: ${FLEX_TARGET_ARG_UNPARSED_ARGUMENTS}\n"
+        "${FLEX_TARGET_usage}"
+      )
     else()
 
       cmake_policy(GET CMP0098 _flex_CMP0098
@@ -199,6 +252,10 @@
         separate_arguments(_flex_EXE_OPTS)
       endif()
 
+      if(FLEX_TARGET_ARG_OPTIONS)
+        list(APPEND _flex_EXE_OPTS ${FLEX_TARGET_ARG_OPTIONS})
+      endif()
+
       set(_flex_OUTPUT_HEADER "")
       if(NOT "${FLEX_TARGET_ARG_DEFINES_FILE}" STREQUAL "")
         set(_flex_OUTPUT_HEADER "${FLEX_TARGET_ARG_DEFINES_FILE}")
@@ -217,11 +274,13 @@
         VERBATIM
         DEPENDS ${_flex_INPUT}
         COMMENT "[FLEX][${Name}] Building scanner with ${_flex_EXE_NAME_WE} ${FLEX_VERSION}"
-        WORKING_DIRECTORY ${_flex_WORKING_DIR})
+        WORKING_DIRECTORY ${_flex_WORKING_DIR}
+        COMMAND_EXPAND_LISTS)
 
       set(FLEX_${Name}_DEFINED TRUE)
       set(FLEX_${Name}_OUTPUTS ${_flex_TARGET_OUTPUTS})
       set(FLEX_${Name}_INPUT ${_flex_INPUT})
+      set(FLEX_${Name}_OPTIONS ${_flex_EXE_OPTS})
       set(FLEX_${Name}_COMPILE_FLAGS ${_flex_EXE_OPTS})
       set(FLEX_${Name}_OUTPUT_HEADER ${_flex_OUTPUT_HEADER})
 
diff --git a/Source/CMakeVersion.cmake b/Source/CMakeVersion.cmake
index c5fb6d1..8b818b4 100644
--- a/Source/CMakeVersion.cmake
+++ b/Source/CMakeVersion.cmake
@@ -1,7 +1,7 @@
 # CMake version number components.
 set(CMake_VERSION_MAJOR 3)
 set(CMake_VERSION_MINOR 31)
-set(CMake_VERSION_PATCH 20250106)
+set(CMake_VERSION_PATCH 20250108)
 #set(CMake_VERSION_RC 0)
 set(CMake_VERSION_IS_DIRTY 0)
 
diff --git a/Source/cmGlobalUnixMakefileGenerator3.cxx b/Source/cmGlobalUnixMakefileGenerator3.cxx
index 32c2a20..671dae2 100644
--- a/Source/cmGlobalUnixMakefileGenerator3.cxx
+++ b/Source/cmGlobalUnixMakefileGenerator3.cxx
@@ -951,6 +951,9 @@
   if (!this->GlobalSettingIsOn("CMAKE_SUPPRESS_REGENERATION")) {
     lg->AppendEcho(commands, "... depend");
   }
+  if (this->CheckCMP0171()) {
+    lg->AppendEcho(commands, "... codegen");
+  }
 
   // Keep track of targets already listed.
   std::set<std::string> emittedTargets;