Browse Source

FindBISON: Add policy CMP0088 to run bison in build tree

Robert Maynard 6 years ago
parent
commit
5000fed5af

+ 1 - 0
Help/manual/cmake-policies.7.rst

@@ -57,6 +57,7 @@ Policies Introduced by CMake 3.14
 .. toctree::
 .. toctree::
    :maxdepth: 1
    :maxdepth: 1
 
 
+   CMP0088: FindBISON runs bison in CMAKE_CURRENT_BINARY_DIR when executing. </policy/CMP0088>
    CMP0087: install(SCRIPT | CODE) supports generator expressions. </policy/CMP0087>
    CMP0087: install(SCRIPT | CODE) supports generator expressions. </policy/CMP0087>
    CMP0086: UseSWIG honors SWIG_MODULE_NAME via -module flag. </policy/CMP0086>
    CMP0086: UseSWIG honors SWIG_MODULE_NAME via -module flag. </policy/CMP0086>
    CMP0085: IN_LIST generator expression handles empty list items. </policy/CMP0085>
    CMP0085: IN_LIST generator expression handles empty list items. </policy/CMP0085>

+ 29 - 0
Help/policy/CMP0088.rst

@@ -0,0 +1,29 @@
+CMP0088
+-------
+
+:module:`FindBISON` runs bison in :variable:`CMAKE_CURRENT_BINARY_DIR`
+when executing.
+
+The module provides a ``BISON_TARGET`` macro which generates BISON output.
+In CMake 3.13 and below the macro would generate a custom command that runs
+``bison`` in the source directory.  CMake 3.14 and later prefer to run it
+in the build directory and use :variable:`CMAKE_CURRENT_BINARY_DIR` as the
+``WORKING_DIRECTORY`` of its :command:`add_custom_command` invocation.
+This ensures that any implicitly generated file is written to the build
+tree rather than the source.
+
+This policy provides compatibility for projects that have not been updated
+to expect the new behavior.
+
+The ``OLD`` behavior for this policy is for ``BISON_TARGET`` to use
+the current source directory for the ``WORKING_DIRECTORY`` and where
+to generate implicit files. The ``NEW`` behavior of this policy is to
+use the current binary directory for the ``WORKING_DIRECTORY`` and where
+to generate implicit files.
+
+This policy was introduced in CMake version 3.14.  Use the
+:command:`cmake_policy` command to set it to ``OLD`` or ``NEW`` explicitly.
+Unlike most policies, CMake version |release| does *not* warn
+when this policy is not set and simply uses ``OLD`` behavior.
+
+.. include:: DEPRECATED.txt

+ 6 - 0
Help/release/dev/bison_target_policy.rst

@@ -0,0 +1,6 @@
+bison_target_policy
+-------------------
+
+* The :module:`FindBISON` module's ``BISON_TARGET`` command now runs ``bison``
+  with :variable:`CMAKE_CURRENT_BINARY_DIR` as the working directory.
+  See policy :policy:`CMP0088`.

+ 34 - 4
Modules/FindBISON.cmake

@@ -151,7 +151,15 @@ if(BISON_EXECUTABLE)
       list(APPEND BISON_TARGET_cmdopt "--report-file=${BISON_TARGET_verbose_file}")
       list(APPEND BISON_TARGET_cmdopt "--report-file=${BISON_TARGET_verbose_file}")
     endif()
     endif()
     if(NOT IS_ABSOLUTE "${BISON_TARGET_verbose_file}")
     if(NOT IS_ABSOLUTE "${BISON_TARGET_verbose_file}")
-      set(BISON_TARGET_verbose_file "${CMAKE_CURRENT_SOURCE_DIR}/${BISON_TARGET_verbose_file}")
+      cmake_policy(GET CMP0088 _BISON_CMP0088
+        PARENT_SCOPE # undocumented, do not use outside of CMake
+        )
+      if("x${_BISON_CMP0088}x" STREQUAL "xNEWx")
+        set(BISON_TARGET_verbose_file "${CMAKE_CURRENT_BINARY_DIR}/${BISON_TARGET_verbose_file}")
+      else()
+        set(BISON_TARGET_verbose_file "${CMAKE_CURRENT_SOURCE_DIR}/${BISON_TARGET_verbose_file}")
+      endif()
+      unset(_BISON_CMP0088)
     endif()
     endif()
   endmacro()
   endmacro()
 
 
@@ -159,6 +167,15 @@ if(BISON_EXECUTABLE)
   # adds a custom command and sets
   # adds a custom command and sets
   #   BISON_TARGET_cmdopt, BISON_TARGET_extraoutputs
   #   BISON_TARGET_cmdopt, BISON_TARGET_extraoutputs
   macro(BISON_TARGET_option_verbose Name BisonOutput filename)
   macro(BISON_TARGET_option_verbose Name BisonOutput filename)
+    cmake_policy(GET CMP0088 _BISON_CMP0088
+        PARENT_SCOPE # undocumented, do not use outside of CMake
+        )
+    set(_BISON_WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
+    if("x${_BISON_CMP0088}x" STREQUAL "xNEWx")
+      set(_BISON_WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
+    endif()
+    unset(_BISON_CMP0088)
+
     list(APPEND BISON_TARGET_cmdopt "--verbose")
     list(APPEND BISON_TARGET_cmdopt "--verbose")
     list(APPEND BISON_TARGET_outputs
     list(APPEND BISON_TARGET_outputs
       "${BISON_TARGET_verbose_file}")
       "${BISON_TARGET_verbose_file}")
@@ -166,8 +183,9 @@ if(BISON_EXECUTABLE)
       if(IS_ABSOLUTE "${filename}")
       if(IS_ABSOLUTE "${filename}")
         set(BISON_TARGET_verbose_extra_file "${filename}")
         set(BISON_TARGET_verbose_extra_file "${filename}")
       else()
       else()
-        set(BISON_TARGET_verbose_extra_file "${CMAKE_CURRENT_SOURCE_DIR}/${filename}")
+        set(BISON_TARGET_verbose_extra_file "${_BISON_WORKING_DIRECTORY}/${filename}")
       endif()
       endif()
+
       add_custom_command(OUTPUT ${BISON_TARGET_verbose_extra_file}
       add_custom_command(OUTPUT ${BISON_TARGET_verbose_extra_file}
         COMMAND ${CMAKE_COMMAND} -E copy
         COMMAND ${CMAKE_COMMAND} -E copy
         "${BISON_TARGET_verbose_file}"
         "${BISON_TARGET_verbose_file}"
@@ -176,10 +194,11 @@ if(BISON_EXECUTABLE)
         DEPENDS
         DEPENDS
         "${BISON_TARGET_verbose_file}"
         "${BISON_TARGET_verbose_file}"
         COMMENT "[BISON][${Name}] Copying bison verbose table to ${filename}"
         COMMENT "[BISON][${Name}] Copying bison verbose table to ${filename}"
-        WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
+        WORKING_DIRECTORY ${_BISON_WORKING_DIRECTORY})
       list(APPEND BISON_TARGET_extraoutputs
       list(APPEND BISON_TARGET_extraoutputs
         "${BISON_TARGET_verbose_extra_file}")
         "${BISON_TARGET_verbose_extra_file}")
       unset(BISON_TARGET_verbose_extra_file)
       unset(BISON_TARGET_verbose_extra_file)
+      unset(_BISON_WORKING_DIRECTORY)
     endif()
     endif()
   endmacro()
   endmacro()
 
 
@@ -234,12 +253,23 @@ if(BISON_EXECUTABLE)
 
 
       list(APPEND BISON_TARGET_outputs "${BISON_TARGET_output_header}")
       list(APPEND BISON_TARGET_outputs "${BISON_TARGET_output_header}")
 
 
+      cmake_policy(GET CMP0088 _BISON_CMP0088
+        PARENT_SCOPE # undocumented, do not use outside of CMake
+        )
+      set(_BISON_WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
+      if("x${_BISON_CMP0088}x" STREQUAL "xNEWx")
+        set(_BISON_WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
+      endif()
+      unset(_BISON_CMP0088)
+
       add_custom_command(OUTPUT ${BISON_TARGET_outputs}
       add_custom_command(OUTPUT ${BISON_TARGET_outputs}
         COMMAND ${BISON_EXECUTABLE} ${BISON_TARGET_cmdopt} -o ${BisonOutput} ${BisonInput}
         COMMAND ${BISON_EXECUTABLE} ${BISON_TARGET_cmdopt} -o ${BisonOutput} ${BisonInput}
         VERBATIM
         VERBATIM
         DEPENDS ${BisonInput}
         DEPENDS ${BisonInput}
         COMMENT "[BISON][${Name}] Building parser with bison ${BISON_VERSION}"
         COMMENT "[BISON][${Name}] Building parser with bison ${BISON_VERSION}"
-        WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
+        WORKING_DIRECTORY ${_BISON_WORKING_DIRECTORY})
+
+      unset(_BISON_WORKING_DIRECTORY)
 
 
       # define target variables
       # define target variables
       set(BISON_${Name}_DEFINED TRUE)
       set(BISON_${Name}_DEFINED TRUE)

+ 3 - 0
Source/cmPolicies.h

@@ -258,6 +258,9 @@ class cmMakefile;
   SELECT(POLICY, CMP0087,                                                     \
   SELECT(POLICY, CMP0087,                                                     \
          "Install CODE|SCRIPT allow the use of generator "                    \
          "Install CODE|SCRIPT allow the use of generator "                    \
          "expressions.",                                                      \
          "expressions.",                                                      \
+         3, 14, 0, cmPolicies::WARN)                                          \
+  SELECT(POLICY, CMP0088,                                                     \
+         "FindBISON runs bison in CMAKE_CURRENT_BINARY_DIR when executing.",  \
          3, 14, 0, cmPolicies::WARN)
          3, 14, 0, cmPolicies::WARN)
 
 
 #define CM_SELECT_ID(F, A1, A2, A3, A4, A5, A6) F(A1)
 #define CM_SELECT_ID(F, A1, A2, A3, A4, A5, A6) F(A1)