Skip to content

Commit e15979d

Browse files
committed
Add customized FindBISON module
1 parent f0edab9 commit e15979d

File tree

11 files changed

+806
-383
lines changed

11 files changed

+806
-383
lines changed

cmake/Zend/cmake/GenerateGrammar.cmake

Lines changed: 110 additions & 88 deletions
Original file line numberDiff line numberDiff line change
@@ -10,83 +10,103 @@ if(
1010
endif()
1111
include(PHP/BISON)
1212

13-
php_bison(
14-
zend_ini_parser
15-
zend_ini_parser.y
16-
${CMAKE_CURRENT_SOURCE_DIR}/zend_ini_parser.c
17-
COMPILE_FLAGS "${PHP_BISON_DEFAULT_OPTIONS}"
18-
VERBOSE REPORT_FILE zend_ini_parser.output
19-
DEFINES_FILE ${CMAKE_CURRENT_SOURCE_DIR}/zend_ini_parser.h
20-
)
21-
22-
php_bison(
23-
zend_language_parser
24-
zend_language_parser.y
25-
${CMAKE_CURRENT_SOURCE_DIR}/zend_language_parser.c
26-
COMPILE_FLAGS "${PHP_BISON_DEFAULT_OPTIONS}"
27-
VERBOSE REPORT_FILE zend_language_parser.output
28-
DEFINES_FILE ${CMAKE_CURRENT_SOURCE_DIR}/zend_language_parser.h
29-
)
30-
31-
# Tweak zendparse to be exported through ZEND_API. This has to be revisited
32-
# once bison supports foreign skeletons and that bison version is used. Read
33-
# https://git.savannah.gnu.org/cgit/bison.git/tree/data/README.md for more.
34-
block()
35-
string(
36-
CONCAT patch
37-
"set(SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR})\n"
38-
[[
39-
file(READ "${SOURCE_DIR}/zend_language_parser.h" content)
40-
string(
41-
REPLACE
42-
"int zendparse"
43-
"ZEND_API int zendparse"
44-
content_2
45-
"${content}"
46-
)
47-
if(
48-
NOT content MATCHES "ZEND_API int zendparse"
49-
AND NOT content STREQUAL "${content_2}"
50-
)
51-
message(STATUS "[Zend] Patching zend_language_parser.h")
52-
file(WRITE "${SOURCE_DIR}/zend_language_parser.h" "${content_2}")
53-
endif()
13+
if(BISON_FOUND)
14+
if(CMAKE_SCRIPT_MODE_FILE)
15+
set(verbose "")
16+
else()
17+
set(verbose VERBOSE REPORT_FILE zend_ini_parser.output)
18+
endif()
5419

55-
file(READ "${SOURCE_DIR}/zend_language_parser.c" content)
56-
string(
57-
REPLACE
58-
"int zendparse"
59-
"ZEND_API int zendparse"
60-
content_2
61-
"${content}"
62-
)
63-
if(
64-
NOT content MATCHES "ZEND_API int zendparse"
65-
AND NOT content STREQUAL "${content_2}"
66-
)
67-
message(STATUS "[Zend] Patching zend_language_parser.c")
68-
file(WRITE "${SOURCE_DIR}/zend_language_parser.c" "${content_2}")
69-
endif()
70-
]])
20+
bison(
21+
zend_ini_parser
22+
zend_ini_parser.y
23+
${CMAKE_CURRENT_SOURCE_DIR}/zend_ini_parser.c
24+
HEADER
25+
#HEADER_FILE ${CMAKE_CURRENT_SOURCE_DIR}/zend_ini_parser.h
26+
${verbose}
27+
)
7128

72-
# Run patch based on whether building or running inside a CMake script.
7329
if(CMAKE_SCRIPT_MODE_FILE)
74-
cmake_language(EVAL CODE "${patch}")
30+
set(verbose "")
7531
else()
76-
file(
77-
GENERATE
78-
OUTPUT CMakeFiles/PatchLanguageParser.cmake
79-
CONTENT "${patch}"
80-
)
81-
add_custom_target(
82-
zend_patch_language_parser
83-
COMMAND ${CMAKE_COMMAND} -P CMakeFiles/PatchLanguageParser.cmake
84-
DEPENDS ${BISON_zend_language_parser_OUTPUTS}
85-
VERBATIM
86-
)
87-
add_dependencies(zend zend_patch_language_parser)
32+
set(verbose VERBOSE REPORT_FILE zend_language_parser.output)
8833
endif()
89-
endblock()
34+
35+
bison(
36+
zend_language_parser
37+
zend_language_parser.y
38+
${CMAKE_CURRENT_SOURCE_DIR}/zend_language_parser.c
39+
HEADER
40+
#HEADER_FILE ${CMAKE_CURRENT_SOURCE_DIR}/zend_language_parser.h
41+
${verbose}
42+
)
43+
44+
# Tweak zendparse to be exported through ZEND_API. This has to be revisited
45+
# once bison supports foreign skeletons and that bison version is used. Read
46+
# https://git.savannah.gnu.org/cgit/bison.git/tree/data/README.md for more.
47+
block()
48+
string(
49+
CONCAT patch
50+
"cmake_path(SET SOURCE_DIR NORMALIZE ${CMAKE_CURRENT_SOURCE_DIR})\n"
51+
[[
52+
cmake_path(
53+
RELATIVE_PATH
54+
SOURCE_DIR
55+
BASE_DIRECTORY ${CMAKE_SOURCE_DIR}
56+
OUTPUT_VARIABLE relativeDir
57+
)
58+
file(READ "${SOURCE_DIR}/zend_language_parser.h" content)
59+
string(
60+
REPLACE
61+
"int zendparse"
62+
"ZEND_API int zendparse"
63+
content_2
64+
"${content}"
65+
)
66+
if(
67+
NOT content MATCHES "ZEND_API int zendparse"
68+
AND NOT content STREQUAL "${content_2}"
69+
)
70+
message(STATUS "Patching ${relativeDir}/zend_language_parser.h")
71+
file(WRITE "${SOURCE_DIR}/zend_language_parser.h" "${content_2}")
72+
endif()
73+
74+
file(READ "${SOURCE_DIR}/zend_language_parser.c" content)
75+
string(
76+
REPLACE
77+
"int zendparse"
78+
"ZEND_API int zendparse"
79+
content_2
80+
"${content}"
81+
)
82+
if(
83+
NOT content MATCHES "ZEND_API int zendparse"
84+
AND NOT content STREQUAL "${content_2}"
85+
)
86+
message(STATUS "Patching ${relativeDir}/zend_language_parser.c")
87+
file(WRITE "${SOURCE_DIR}/zend_language_parser.c" "${content_2}")
88+
endif()
89+
]])
90+
91+
# Run patch based on whether building or running inside a CMake script.
92+
if(CMAKE_SCRIPT_MODE_FILE)
93+
cmake_language(EVAL CODE "${patch}")
94+
else()
95+
file(
96+
GENERATE
97+
OUTPUT CMakeFiles/PatchLanguageParser.cmake
98+
CONTENT "${patch}"
99+
)
100+
add_custom_target(
101+
zend_language_parser_patch
102+
COMMAND ${CMAKE_COMMAND} -P CMakeFiles/PatchLanguageParser.cmake
103+
DEPENDS zend_language_parser
104+
VERBATIM
105+
)
106+
add_dependencies(zend zend_language_parser_patch)
107+
endif()
108+
endblock()
109+
endif()
90110

91111
if(
92112
EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/zend_ini_scanner.c
@@ -98,20 +118,22 @@ if(
98118
endif()
99119
include(PHP/RE2C)
100120

101-
php_re2c(
102-
zend_ini_scanner
103-
zend_ini_scanner.l
104-
${CMAKE_CURRENT_SOURCE_DIR}/zend_ini_scanner.c
105-
HEADER ${CMAKE_CURRENT_SOURCE_DIR}/zend_ini_scanner_defs.h
106-
OPTIONS --case-inverted -cbdF
107-
CODEGEN
108-
)
121+
if(RE2C_FOUND)
122+
re2c(
123+
zend_ini_scanner
124+
zend_ini_scanner.l
125+
${CMAKE_CURRENT_SOURCE_DIR}/zend_ini_scanner.c
126+
HEADER ${CMAKE_CURRENT_SOURCE_DIR}/zend_ini_scanner_defs.h
127+
OPTIONS --case-inverted -cbdF
128+
CODEGEN
129+
)
109130

110-
php_re2c(
111-
zend_language_scanner
112-
zend_language_scanner.l
113-
${CMAKE_CURRENT_SOURCE_DIR}/zend_language_scanner.c
114-
HEADER ${CMAKE_CURRENT_SOURCE_DIR}/zend_language_scanner_defs.h
115-
OPTIONS --case-inverted -cbdF
116-
CODEGEN
117-
)
131+
re2c(
132+
zend_language_scanner
133+
zend_language_scanner.l
134+
${CMAKE_CURRENT_SOURCE_DIR}/zend_language_scanner.c
135+
HEADER ${CMAKE_CURRENT_SOURCE_DIR}/zend_language_scanner_defs.h
136+
OPTIONS --case-inverted -cbdF
137+
CODEGEN
138+
)
139+
endif()

0 commit comments

Comments
 (0)