Skip to content

Commit a5cde76

Browse files
committed
Download re2c and Bison with FetchContent
This uses FetchContent and ExternalProject modules together. FetchContent integrates better with find_package() calls, and ExternalProject takes care of isolation. Changes and notes: - Redundant local FindBISON overrided module removed and configuration moved to Bison module itself. - The SOURCE_SUBDIR option pointing to non-existing relative path ensures that package is not added via add_subdirectory() to not mess the cache variables, and package can be still downloaded via FetchContent_MakeAvailable() command.
1 parent 8154ec4 commit a5cde76

File tree

3 files changed

+79
-63
lines changed

3 files changed

+79
-63
lines changed

cmake/cmake/modules/FindBISON.cmake

Lines changed: 0 additions & 21 deletions
This file was deleted.

cmake/cmake/modules/PHP/Bison.cmake

Lines changed: 34 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,7 @@ php_bison(foo foo.y foo.c OPTIONS -Wall --debug)
145145
# bison -Wall --debug foo.y --output foo.c
146146
```
147147
148-
### Specifying options
148+
### Example: Specifying options
149149
150150
This module provides some default options when using the `ADD_DEFAULT_OPTIONS`:
151151
@@ -317,6 +317,12 @@ function(php_bison name input output)
317317
AND NOT _PHP_BISON_DOWNLOAD
318318
)
319319
find_package(BISON ${PHP_BISON_VERSION} ${quiet})
320+
set_package_properties(
321+
BISON
322+
PROPERTIES
323+
URL "https://www.gnu.org/software/bison/"
324+
DESCRIPTION "General-purpose parser generator"
325+
)
320326
endif()
321327

322328
get_property(role GLOBAL PROPERTY CMAKE_ROLE)
@@ -655,8 +661,8 @@ function(_php_bison_download)
655661
)
656662

657663
# Target created by ExternalProject:
658-
if(TARGET bison)
659-
add_dependencies(Bison::Bison bison)
664+
if(TARGET BISON-install)
665+
add_dependencies(Bison::Bison BISON-install)
660666
endif()
661667

662668
# Move dependency to PACKAGES_FOUND.
@@ -676,22 +682,38 @@ function(_php_bison_download)
676682
_PHP_BISON_DOWNLOAD
677683
TRUE
678684
CACHE INTERNAL
679-
"Internal marker whether the Bison will be downloaded."
685+
"Internal marker whether Bison is downloaded."
680686
)
681687

682688
return(PROPAGATE BISON_FOUND BISON_VERSION)
683689
endfunction()
684690

685691
# Downloads GNU Bison.
686692
function(_php_bison_download_gnu)
687-
message(STATUS "GNU Bison ${BISON_VERSION} will be downloaded at build phase")
693+
message(
694+
STATUS
695+
"Downloading GNU Bison ${BISON_VERSION} from https://ftp.gnu.org/gnu/bison"
696+
)
688697

689698
include(ExternalProject)
699+
include(FetchContent)
690700

691-
ExternalProject_Add(
692-
bison
701+
FetchContent_Declare(
702+
BISON
693703
URL https://ftp.gnu.org/gnu/bison/bison-${BISON_VERSION}.tar.gz
704+
SOURCE_SUBDIR non-existing
694705
DOWNLOAD_EXTRACT_TIMESTAMP TRUE
706+
OVERRIDE_FIND_PACKAGE
707+
)
708+
709+
FetchContent_MakeAvailable(BISON)
710+
711+
ExternalProject_Add(
712+
BISON
713+
STEP_TARGETS build install
714+
SOURCE_DIR ${bison_SOURCE_DIR}
715+
BINARY_DIR ${bison_BINARY_DIR}
716+
INSTALL_DIR ${FETCHCONTENT_BASE_DIR}/bison-install
695717
CONFIGURE_COMMAND
696718
<SOURCE_DIR>/configure
697719
--disable-dependency-tracking
@@ -701,16 +723,18 @@ function(_php_bison_download_gnu)
701723
LOG_INSTALL TRUE
702724
)
703725

704-
ExternalProject_Get_Property(bison INSTALL_DIR)
726+
ExternalProject_Get_Property(BISON INSTALL_DIR)
705727

706728
set_property(CACHE BISON_EXECUTABLE PROPERTY VALUE ${INSTALL_DIR}/bin/bison)
707729
endfunction()
708730

709-
# Downloads https://github.com/lexxmark/winflexbison.
731+
# Downloads winflexbison.
710732
function(_php_bison_download_windows)
711733
message(
712734
STATUS
713-
"Downloading win_bison ${BISON_VERSION} (${PHP_BISON_WIN_VERSION_DOWNLOAD})"
735+
"Downloading win_bison ${BISON_VERSION} from "
736+
"https://github.com/lexxmark/winflexbison "
737+
"(${PHP_BISON_WIN_VERSION_DOWNLOAD})"
714738
)
715739

716740
get_directory_property(dir EP_BASE)

cmake/cmake/modules/PHP/Re2c.cmake

Lines changed: 45 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -618,60 +618,73 @@ function(_php_re2c_download)
618618
)
619619
endif()
620620

621-
message(STATUS "Re2c ${RE2C_VERSION} will be downloaded at build phase")
621+
message(
622+
STATUS
623+
"Downloading re2c ${RE2C_VERSION} from https://github.com/skvadrik/re2c"
624+
)
622625

623626
include(ExternalProject)
627+
include(FetchContent)
628+
629+
FetchContent_Declare(
630+
RE2C
631+
URL https://github.com/skvadrik/re2c/archive/refs/tags/${RE2C_VERSION}.tar.gz
632+
SOURCE_SUBDIR non-existing
633+
OVERRIDE_FIND_PACKAGE
634+
)
635+
636+
FetchContent_MakeAvailable(RE2C)
624637

625638
# Configure re2c build.
639+
set(options -DRE2C_BUILD_RE2GO=OFF -DRE2C_BUILD_RE2RUST=OFF)
640+
626641
if(RE2C_VERSION VERSION_GREATER_EQUAL 4)
627-
set(
628-
re2cOptions
629-
-DRE2C_BUILD_RE2D=OFF
630-
-DRE2C_BUILD_RE2HS=OFF
631-
-DRE2C_BUILD_RE2JAVA=OFF
632-
-DRE2C_BUILD_RE2JS=OFF
633-
-DRE2C_BUILD_RE2OCAML=OFF
634-
-DRE2C_BUILD_RE2PY=OFF
635-
-DRE2C_BUILD_RE2V=OFF
636-
-DRE2C_BUILD_RE2ZIG=OFF
637-
-DRE2C_BUILD_TESTS=OFF
642+
list(
643+
APPEND
644+
options
645+
-DRE2C_BUILD_RE2D=OFF
646+
-DRE2C_BUILD_RE2HS=OFF
647+
-DRE2C_BUILD_RE2JAVA=OFF
648+
-DRE2C_BUILD_RE2JS=OFF
649+
-DRE2C_BUILD_RE2OCAML=OFF
650+
-DRE2C_BUILD_RE2PY=OFF
651+
-DRE2C_BUILD_RE2V=OFF
652+
-DRE2C_BUILD_RE2ZIG=OFF
653+
-DRE2C_BUILD_TESTS=OFF
638654
)
639655
else()
640-
set(
641-
re2cOptions
642-
-DCMAKE_DISABLE_FIND_PACKAGE_Python3=TRUE
643-
-DPython3_VERSION=3.7
656+
list(
657+
APPEND
658+
options
659+
-DCMAKE_DISABLE_FIND_PACKAGE_Python3=TRUE
660+
-DPython3_VERSION=3.7
644661
)
645662
endif()
646663

647664
if(RE2C_VERSION VERSION_GREATER_EQUAL 4.2)
648-
list(APPEND re2cOptions -DRE2C_BUILD_RE2SWIFT=OFF)
665+
list(APPEND options -DRE2C_BUILD_RE2SWIFT=OFF)
649666
endif()
650667

651668
ExternalProject_Add(
652-
re2c
653-
URL
654-
https://github.com/skvadrik/re2c/archive/refs/tags/${RE2C_VERSION}.tar.gz
655-
CMAKE_ARGS
656-
-DRE2C_BUILD_RE2GO=OFF
657-
-DRE2C_BUILD_RE2RUST=OFF
658-
${re2cOptions}
669+
RE2C
670+
STEP_TARGETS build
671+
SOURCE_DIR ${re2c_SOURCE_DIR}
672+
BINARY_DIR ${re2c_BINARY_DIR}
673+
CMAKE_ARGS ${options}
659674
INSTALL_COMMAND ""
660675
)
661676

662-
ExternalProject_Get_Property(re2c BINARY_DIR)
663-
set(re2c ${BINARY_DIR}/re2c)
664-
if(CMAKE_SYSTEM_NAME STREQUAL "Windows")
665-
string(APPEND re2c ".exe")
666-
endif()
667-
set_property(CACHE RE2C_EXECUTABLE PROPERTY VALUE ${re2c})
677+
set_property(
678+
CACHE RE2C_EXECUTABLE
679+
PROPERTY VALUE ${re2c_BINARY_DIR}/re2c${CMAKE_EXECUTABLE_SUFFIX}
680+
)
668681

669682
add_executable(RE2C::RE2C IMPORTED GLOBAL)
670683
set_target_properties(
671684
RE2C::RE2C
672685
PROPERTIES IMPORTED_LOCATION ${RE2C_EXECUTABLE}
673686
)
674-
add_dependencies(RE2C::RE2C re2c)
687+
add_dependencies(RE2C::RE2C RE2C-build)
675688

676689
# Move dependency to PACKAGES_FOUND.
677690
block()
@@ -690,7 +703,7 @@ function(_php_re2c_download)
690703
_PHP_RE2C_DOWNLOAD
691704
TRUE
692705
CACHE INTERNAL
693-
"Internal marker whether the re2c will be downloaded."
706+
"Internal marker whether the re2c is downloaded."
694707
)
695708

696709
return(PROPAGATE RE2C_FOUND RE2C_VERSION)

0 commit comments

Comments
 (0)