11#[=============================================================================[ 
22# PHP/Bison 
33
4- Finds  the Bison command-line parser generator and provides a command to generate 
5- parser files with Bison: 
4+ This module finds  the Bison command-line parser generator and provides a command
5+ to generate  parser files with Bison:
66
77```cmake 
88include(PHP/Bison) 
@@ -117,10 +117,15 @@ These variables can be set before using this module to configure behavior:
117117* `PHP_BISON_VERSION` - The version constraint, when looking for BISON package 
118118  with `find_package(BISON <version-constraint> ...)` in this module. 
119119
120- * `PHP_BISON_VERSION_DOWNLOAD` - When Bison cannot be found on the system or the 
121-   found version is not suitable, this module can also download and build it from 
122-   its release archive sources as part of the project build. Set which version 
123-   should be downloaded. 
120+ * `PHP_BISON_GNU_VERSION_DOWNLOAD` - When Bison cannot be found on the system or 
121+   the found version is not suitable, this module can also download and build it 
122+   from its release archive sources as part of the project build. This variable 
123+   specifies which GNU Bison version should be downloaded. 
124+ 
125+ * `PHP_BISON_WIN_VERSION_DOWNLOAD` - When Bison cannot be found on the Windows 
126+   host system or the found version is not suitable, this module can also 
127+   download [`win_bison.exe`](https://github.com/lexxmark/winflexbison). This 
128+   variable specifies which `winflexbison` version should be downloaded. 
124129
125130* `PHP_BISON_WORKING_DIRECTORY` - Set the default global working directory 
126131  for all `php_bison()` invocations in the directory scope where the 
@@ -205,9 +210,16 @@ macro(_php_bison_config)
205210    set (PHP_BISON_VERSION 3.0.0)
206211  endif ()
207212
208-   # If Bison is not found on the system, set which version to download. 
209-   if (NOT  PHP_BISON_VERSION_DOWNLOAD)
210-     set (PHP_BISON_VERSION_DOWNLOAD 3.8.2)
213+   # If Bison is not found on the system, set which version to download for 
214+   # POSIX platforms that might support GNU Bison. 
215+   if (NOT  PHP_BISON_GNU_VERSION_DOWNLOAD)
216+     set (PHP_BISON_GNU_VERSION_DOWNLOAD 3.8.2)
217+   endif ()
218+ 
219+   # If Bison is not found on the Windows host system, set which winflexbison 
220+   # version to download. 
221+   if (NOT  PHP_BISON_WIN_VERSION_DOWNLOAD)
222+     set (PHP_BISON_WIN_VERSION_DOWNLOAD 2.5.25)
211223  endif ()
212224endmacro ()
213225
@@ -311,11 +323,10 @@ function(php_bison name input output)
311323
312324  if (
313325    NOT  BISON_FOUND
314-     AND  PHP_BISON_VERSION_DOWNLOAD
326+     AND  PHP_BISON_GNU_VERSION_DOWNLOAD
327+     AND  PHP_BISON_WIN_VERSION_DOWNLOAD
315328    AND  packageType STREQUAL  "REQUIRED" 
316329    AND  role STREQUAL  "PROJECT" 
317-     # TODO: Support for other platforms. 
318-     AND  CMAKE_HOST_SYSTEM_NAME  STREQUAL  "Linux" 
319330  )
320331    _php_bison_download()
321332  endif ()
@@ -616,14 +627,58 @@ endfunction()
616627
617628# Download and build Bison if not found. 
618629function (_php_bison_download)
619-   set (BISON_VERSION ${PHP_BISON_VERSION_DOWNLOAD } )
630+   set (BISON_VERSION ${PHP_BISON_GNU_VERSION_DOWNLOAD } )
620631  set (BISON_FOUND TRUE )
621632
622633  if (TARGET  Bison::Bison)
623634    return (PROPAGATE BISON_FOUND BISON_VERSION)
624635  endif ()
625636
626-   message (STATUS  "Bison ${BISON_VERSION}  will be downloaded at build phase" )
637+   if (CMAKE_HOST_SYSTEM_NAME  STREQUAL  "Windows" )
638+     _php_bison_download_windows()
639+   elseif (CMAKE_HOST_SYSTEM_NAME  STREQUAL  "Linux" )
640+     _php_bison_download_gnu()
641+   else ()
642+     # TODO: Add support for more platforms. 
643+     message (
644+       WARNING
645+       "Bison couldn't be downloaded. The current platform ${CMAKE_SYSTEM_NAME}  " 
646+       "is not yet supported by PHP/Bison module. Please install Bison manually." 
647+     )
648+     return ()
649+   endif ()
650+ 
651+   add_executable (Bison::Bison IMPORTED  GLOBAL )
652+   set_target_properties (
653+     Bison::Bison
654+     PROPERTIES IMPORTED_LOCATION  ${BISON_EXECUTABLE} 
655+   )
656+ 
657+   # Target created by ExternalProject: 
658+   if (TARGET  bison)
659+     add_dependencies (Bison::Bison bison)
660+   endif ()
661+ 
662+   # Move dependency to PACKAGES_FOUND. 
663+   get_property (packagesNotFound GLOBAL  PROPERTY PACKAGES_NOT_FOUND )
664+   list (REMOVE_ITEM packagesNotFound BISON)
665+   set_property (GLOBAL  PROPERTY PACKAGES_NOT_FOUND  ${packagesNotFound} )
666+   get_property (packagesFound GLOBAL  PROPERTY PACKAGES_FOUND )
667+   set_property (GLOBAL  APPEND  PROPERTY PACKAGES_FOUND  BISON)
668+ 
669+   set (
670+     _PHP_BISON_DOWNLOAD
671+     TRUE 
672+     CACHE  INTERNAL 
673+     "Internal marker whether the Bison will be downloaded." 
674+   )
675+ 
676+   return (PROPAGATE BISON_FOUND BISON_VERSION)
677+ endfunction ()
678+ 
679+ # Downloads GNU Bison. 
680+ function (_php_bison_download_gnu)
681+   message (STATUS  "GNU Bison ${BISON_VERSION}  will be downloaded at build phase" )
627682
628683  include (ExternalProject)
629684
@@ -641,28 +696,36 @@ function(_php_bison_download)
641696  )
642697
643698  ExternalProject_Get_Property(bison INSTALL_DIR)
699+ 
644700  set_property (CACHE  BISON_EXECUTABLE PROPERTY VALUE  ${INSTALL_DIR} /bin/bison)
701+ endfunction ()
645702
646-   add_executable (Bison::Bison IMPORTED  GLOBAL )
647-   set_target_properties (
648-     Bison::Bison
649-     PROPERTIES IMPORTED_LOCATION  ${BISON_EXECUTABLE} 
703+ # Downloads https://github.com/lexxmark/winflexbison. 
704+ function (_php_bison_download_windows)
705+   message (
706+     STATUS 
707+     "Downloading win_bison ${BISON_VERSION}  (${PHP_BISON_WIN_VERSION_DOWNLOAD} )" 
650708  )
651-   add_dependencies (Bison::Bison bison)
652709
653-   # Move dependency to PACKAGES_FOUND. 
654-   get_property (packagesNotFound GLOBAL  PROPERTY PACKAGES_NOT_FOUND )
655-   list (REMOVE_ITEM packagesNotFound BISON)
656-   set_property (GLOBAL  PROPERTY PACKAGES_NOT_FOUND  ${packagesNotFound} )
657-   get_property (packagesFound GLOBAL  PROPERTY PACKAGES_FOUND )
658-   set_property (GLOBAL  APPEND  PROPERTY PACKAGES_FOUND  BISON)
710+   get_directory_property (dir EP_BASE)
711+   if (NOT  dir)
712+     set (dir "${CMAKE_CURRENT_BINARY_DIR} /CMakeFiles" )
713+   endif ()
659714
660-   set (
661-     _PHP_BISON_DOWNLOAD
662-     TRUE 
663-     CACHE  INTERNAL 
664-     "Internal marker whether the Bison will be downloaded." 
715+   set (file "${dir} /win_flex_bison.zip" )
716+ 
717+   file (
718+     DOWNLOAD
719+     "https://github.com/lexxmark/winflexbison/releases/download/v${PHP_BISON_WIN_VERSION_DOWNLOAD} /win_flex_bison-${PHP_BISON_WIN_VERSION_DOWNLOAD} .zip" 
720+     ${file} 
721+     SHOW_PROGRESS 
665722  )
666723
667-   return (PROPAGATE BISON_FOUND BISON_VERSION)
724+   file (ARCHIVE_EXTRACT INPUT  "${file} "  DESTINATION  "${dir} /win_flex_bison" )
725+ 
726+   set_property (
727+     CACHE 
728+     BISON_EXECUTABLE
729+     PROPERTY VALUE  "${dir} /win_flex_bison/win_bison.exe" 
730+   )
668731endfunction ()
0 commit comments