Skip to content

Commit 985011c

Browse files
authored
Add new global target php_sapi (PHP::SAPI) (#24)
This add new global target php_sapi (PHP::SAPI) which collects all usage requirements for PHP SAPIs. Also all targets related to main, win32 and Zend were refactored to make this few steps easier to handle and have better options to extend it in the future. Additionally: * MAX_EXECUTION_TIMERS don't need to be set in PARENT_SCOPE anymore * Reordered some include directories * DTrace and Dmalloc checks moved to configure checks * Usage requirements in main and win32 collected through interface targets directly otherwise cyclic dependencies quickly pop up
1 parent 8ec2c72 commit 985011c

File tree

19 files changed

+201
-276
lines changed

19 files changed

+201
-276
lines changed

cmake/Zend/CMakeLists.txt

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -298,8 +298,8 @@ target_link_libraries(zend PRIVATE PHP::configuration)
298298
target_include_directories(
299299
zend
300300
INTERFACE
301-
${CMAKE_CURRENT_SOURCE_DIR}
302301
${CMAKE_CURRENT_BINARY_DIR}
302+
${CMAKE_CURRENT_SOURCE_DIR}
303303
)
304304

305305
target_compile_definitions(
@@ -318,23 +318,35 @@ set_target_properties(
318318
ZEND_MODULE_API_NO ${Zend_VERSION_MODULE_API_NO}
319319
)
320320

321-
# Add Zend PUBLIC/INTERFACE compile properties to configuration.
321+
################################################################################
322+
# Add usage requirements to PHP interface targets.
323+
################################################################################
324+
322325
# Cleaner COMPILE_ONLY generator expression is available in CMake >= 3.27.
323326
if(CMAKE_VERSION VERSION_GREATER_EQUAL 3.27)
324-
target_link_libraries(php_configuration INTERFACE $<COMPILE_ONLY:zend>)
327+
target_link_libraries(php_configuration INTERFACE $<COMPILE_ONLY:Zend::Zend>)
325328
else()
326-
target_include_directories(
329+
target_compile_definitions(
327330
php_configuration
328331
INTERFACE
329-
$<TARGET_PROPERTY:zend,INTERFACE_INCLUDE_DIRECTORIES>
332+
$<TARGET_PROPERTY:Zend::Zend,INTERFACE_COMPILE_DEFINITIONS>
330333
)
331-
target_compile_definitions(
334+
target_compile_options(
335+
php_configuration
336+
INTERFACE
337+
$<TARGET_PROPERTY:Zend::Zend,INTERFACE_COMPILE_OPTIONS>
338+
)
339+
target_include_directories(
332340
php_configuration
333341
INTERFACE
334-
$<TARGET_PROPERTY:zend,INTERFACE_COMPILE_DEFINITIONS>
342+
$<TARGET_PROPERTY:Zend::Zend,INTERFACE_INCLUDE_DIRECTORIES>
343+
$<TARGET_PROPERTY:Zend::Zend,INTERFACE_SYSTEM_INCLUDE_DIRECTORIES>
335344
)
336345
endif()
337346

347+
target_link_libraries(php_sapi INTERFACE Zend::Zend)
348+
target_sources(php_sapi INTERFACE $<TARGET_OBJECTS:Zend::Zend>)
349+
338350
################################################################################
339351
# TSRM (Thread Safe Resource Manager) is a separate directory in php-src as it
340352
# was once a standalone project. Ideally, it should be moved into Zend Engine at

cmake/Zend/cmake/MaxExecutionTimers.cmake

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -86,13 +86,6 @@ add_feature_info(
8686
"enhanced timeout and signal handling"
8787
)
8888

89-
# Set the result variable also in the PARENT_SCOPE, to make it available for the
90-
# parent project PHP in its configuration headers. This module is included in
91-
# the Zend Engine which is added with add_subdirectory() in the PHP project.
92-
if(NOT PROJECT_IS_TOP_LEVEL)
93-
set(ZEND_MAX_EXECUTION_TIMERS ${ZEND_MAX_EXECUTION_TIMERS} PARENT_SCOPE)
94-
endif()
95-
9689
add_library(Zend::MaxExecutionTimers INTERFACE IMPORTED GLOBAL)
9790
if(libraryForTimerCreate)
9891
target_link_libraries(

cmake/cmake/Bootstrap.cmake

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ include(PHP/InterproceduralOptimization)
3333
# Set CMAKE_POSITION_INDEPENDENT_CODE.
3434
include(PHP/PositionIndependentCode)
3535

36-
# Create a project wide INTERFACE library with project configuration.
36+
# INTERFACE library with usage requirements.
3737
add_library(php_configuration INTERFACE)
3838
add_library(PHP::configuration ALIAS php_configuration)
3939
target_include_directories(
@@ -43,6 +43,11 @@ target_include_directories(
4343
${PHP_SOURCE_DIR}
4444
)
4545

46+
# INTERFACE library that ties objects and configuration together for PHP SAPIs.
47+
add_library(php_sapi INTERFACE)
48+
add_library(PHP::SAPI ALIAS php_sapi)
49+
target_link_libraries(php_sapi INTERFACE PHP::configuration)
50+
4651
# Create a custom target for generating files (parsers, lexers, etc.) manually:
4752
# cmake --build <dir> -t php_generate_files
4853
add_custom_target(php_generate_files)

cmake/cmake/ConfigureChecks.cmake

Lines changed: 78 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -818,7 +818,7 @@ if(PHP_GCOV)
818818
endif()
819819
endif()
820820

821-
# Check Valgrind.
821+
# Valgrind.
822822
if(PHP_VALGRIND)
823823
find_package(Valgrind)
824824
set_package_properties(
@@ -836,6 +836,82 @@ if(PHP_VALGRIND)
836836
endif()
837837
add_feature_info(
838838
"Valgrind"
839-
PHP_VALGRIND
839+
HAVE_VALGRIND
840840
"dynamic analysis"
841841
)
842+
843+
# DTrace.
844+
if(PHP_DTRACE)
845+
message(CHECK_START "Checking for DTrace support")
846+
847+
find_package(DTrace)
848+
set_package_properties(
849+
DTrace
850+
PROPERTIES
851+
TYPE REQUIRED
852+
PURPOSE "Necessary to enable the DTrace support."
853+
)
854+
855+
if(DTrace_FOUND)
856+
dtrace_target(
857+
php_dtrace
858+
INPUT ${PHP_SOURCE_DIR}/Zend/zend_dtrace.d
859+
HEADER ${PHP_BINARY_DIR}/Zend/zend_dtrace_gen.h
860+
SOURCES
861+
${PHP_SOURCE_DIR}/main/main.c
862+
${PHP_SOURCE_DIR}/Zend/zend_API.c
863+
${PHP_SOURCE_DIR}/Zend/zend_dtrace.c
864+
${PHP_SOURCE_DIR}/Zend/zend_exceptions.c
865+
${PHP_SOURCE_DIR}/Zend/zend_execute.c
866+
${PHP_SOURCE_DIR}/Zend/zend.c
867+
INCLUDES
868+
$<TARGET_PROPERTY:PHP::configuration,INTERFACE_INCLUDE_DIRECTORIES>
869+
)
870+
target_link_libraries(php_configuration INTERFACE DTrace::DTrace)
871+
target_link_libraries(php_sapi INTERFACE php_dtrace)
872+
873+
set(HAVE_DTRACE TRUE)
874+
875+
message(CHECK_PASS "yes")
876+
else()
877+
message(CHECK_FAIL "no")
878+
endif()
879+
endif()
880+
add_feature_info(
881+
"DTrace"
882+
HAVE_DTRACE
883+
"performance analysis and troubleshooting"
884+
)
885+
886+
# Dmalloc.
887+
if(PHP_DMALLOC)
888+
message(CHECK_START "Checking for Dmalloc support")
889+
890+
find_package(Dmalloc)
891+
set_package_properties(
892+
Dmalloc
893+
PROPERTIES
894+
TYPE REQUIRED
895+
PURPOSE "Necessary to use Dmalloc memory debugger."
896+
)
897+
898+
target_compile_definitions(
899+
php_configuration
900+
INTERFACE
901+
$<$<COMPILE_LANGUAGE:ASM,C,CXX>:DMALLOC_FUNC_CHECK>
902+
)
903+
904+
target_link_libraries(php_configuration INTERFACE Dmalloc::Dmalloc)
905+
906+
if(Dmalloc_FOUND)
907+
message(CHECK_PASS "yes")
908+
set(HAVE_DMALLOC TRUE)
909+
else()
910+
message(CHECK_FAIL "no")
911+
endif()
912+
endif()
913+
add_feature_info(
914+
"Dmalloc"
915+
HAVE_DMALLOC
916+
"memory debugging"
917+
)

cmake/cmake/modules/FindGcov.cmake

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -188,27 +188,29 @@ macro(gcov_generate_report)
188188
)
189189

190190
# Create a list of PHP SAPIs with genex for usage in the add_custom_command.
191-
block(PROPAGATE php_sapis)
192-
set(php_sapis "")
191+
block(PROPAGATE sapis)
192+
set(sapis "")
193193
file(GLOB directories ${PROJECT_SOURCE_DIR}/sapi/*)
194194
foreach(dir ${directories})
195195
cmake_path(GET dir FILENAME sapi)
196-
list(APPEND php_sapis "$<TARGET_NAME_IF_EXISTS:php_${sapi}>")
196+
list(APPEND sapis "$<TARGET_NAME_IF_EXISTS:php_${sapi}>")
197197
endforeach()
198198
endblock()
199199

200200
add_custom_command(
201201
OUTPUT ${PROJECT_BINARY_DIR}/php_lcov.info
202202
COMMAND ${CMAKE_COMMAND} -P "CMakeFiles/GenerateGcovReport.cmake"
203-
DEPENDS
204-
${php_sapis}
203+
DEPENDS ${sapis}
205204
COMMENT "[GCOV] Generating GCOV coverage report"
205+
VERBATIM
206+
COMMAND_EXPAND_LISTS
206207
)
207208

208-
unset(php_sapis)
209+
unset(sapis)
209210

210211
# Create target which consumes the command via DEPENDS.
211-
add_custom_target(gcov ALL
212+
add_custom_target(
213+
gcov ALL
212214
DEPENDS ${PROJECT_BINARY_DIR}/php_lcov.info
213215
COMMENT "[GCOV] Generating GCOV files"
214216
)

cmake/cmake/modules/PHP/Extensions.cmake

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -396,13 +396,17 @@ function(php_extensions_postconfigure extension)
396396
"'ON'."
397397
)
398398

399-
set(
400-
EXT_${dependencyUpper}
401-
ON
402-
CACHE BOOL
403-
"Enable the ${dependency} extension"
404-
FORCE
405-
)
399+
if(DEFINED CACHE{EXT_${dependencyUpper}})
400+
set_property(CACHE EXT_${dependencyUpper} PROPERTY VALUE ON)
401+
else()
402+
set(
403+
EXT_${dependencyUpper}
404+
ON
405+
CACHE BOOL
406+
"Enable the ${dependency} extension"
407+
FORCE
408+
)
409+
endif()
406410
endforeach()
407411

408412
if(NOT TARGET PHP::${extension})

cmake/ext/CMakeLists.txt

Lines changed: 4 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,5 @@
11
#[=============================================================================[
22
Add subdirectories of PHP extensions.
3-
4-
## INTERFACE target
5-
6-
* `php_extensions` (alias `PHP::extensions`) is an INTERFACE library with all
7-
enabled extensions linked into for convenience.
83
#]=============================================================================]
94

105
include(PHP/Extensions)
@@ -57,9 +52,6 @@ set_property(GLOBAL PROPERTY PHP_ALL_EXTENSIONS ${extensions})
5752
# Sort and preconfigure extensions by their dependencies.
5853
php_extensions_preprocess(extensions)
5954

60-
add_library(php_extensions INTERFACE)
61-
add_library(PHP::extensions ALIAS php_extensions)
62-
6355
# Add subdirectories of extensions.
6456
foreach(extension IN LISTS extensions)
6557
list(APPEND CMAKE_MESSAGE_CONTEXT "${extension}")
@@ -80,9 +72,7 @@ foreach(extension IN LISTS extensions)
8072

8173
add_dependencies(php_${extension} Zend::Zend)
8274

83-
# Add extension's transitive compile and link properties to configuration.
84-
# The INTERFACE_SOURCES are propagated separately only to PHP::PHP.
85-
# See: https://cmake.org/cmake/help/latest/manual/cmake-buildsystem.7.html
75+
# Add usage requirements to PHP interface targets.
8676
# TODO: Should PHP_CLI extensions pass properties only to PHP_CLI SAPIs?
8777
get_target_property(type php_${extension} TYPE)
8878
if(NOT type MATCHES "^(MODULE|SHARED)_LIBRARY$")
@@ -112,17 +102,15 @@ foreach(extension IN LISTS extensions)
112102
)
113103

114104
target_link_libraries(
115-
php_extensions
105+
php_sapi
116106
INTERFACE
117-
$<IF:$<BOOL:$<TARGET_GENEX_EVAL:PHP::${extension},$<TARGET_PROPERTY:PHP::${extension},PHP_CLI>>>,$<$<BOOL:$<TARGET_PROPERTY:PHP_CLI>>:$<LINK_ONLY:PHP::${extension}>>,$<LINK_ONLY:PHP::${extension}>>
107+
$<IF:$<BOOL:$<TARGET_GENEX_EVAL:PHP::${extension},$<TARGET_PROPERTY:PHP::${extension},PHP_CLI>>>,$<$<BOOL:$<TARGET_PROPERTY:PHP_CLI>>:PHP::${extension}>,PHP::${extension}>
118108
)
119109

120110
target_sources(
121-
php_extensions
111+
php_sapi
122112
INTERFACE
123113
$<IF:$<BOOL:$<TARGET_GENEX_EVAL:PHP::${extension},$<TARGET_PROPERTY:PHP::${extension},PHP_CLI>>>,$<$<BOOL:$<TARGET_PROPERTY:PHP_CLI>>:$<TARGET_OBJECTS:PHP::${extension}>>,$<TARGET_OBJECTS:PHP::${extension}>>
124-
125-
$<IF:$<BOOL:$<TARGET_GENEX_EVAL:PHP::${extension},$<TARGET_PROPERTY:PHP::${extension},PHP_CLI>>>,$<$<BOOL:$<TARGET_PROPERTY:PHP_CLI>>:$<TARGET_PROPERTY:PHP::${extension},INTERFACE_SOURCES>>,$<TARGET_PROPERTY:PHP::${extension},INTERFACE_SOURCES>>
126114
)
127115
endif()
128116

cmake/ext/skeleton/cmake/modules/FindPHP.cmake

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ Components:
1313
Module defines the following `IMPORTED` target(s):
1414
1515
* `PHP::php` - The PHP package `IMPORTED` target, if found.
16-
* `PHP:embed` - The PHP embed SAPI, if found.
16+
* `PHP::embed` - The PHP embed SAPI, if found.
1717
1818
## Result variables
1919

cmake/ext/standard/CMakeLists.txt

Lines changed: 11 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -534,42 +534,26 @@ endblock()
534534

535535
check_symbol_exists(chroot "unistd.h" HAVE_CHROOT)
536536

537-
add_library(php_standard_functions_cli OBJECT)
538537
add_library(php_standard_functions OBJECT)
538+
add_library(php_standard_functions_cli OBJECT)
539539

540-
target_sources(php_standard_functions_cli PRIVATE basic_functions.c dir.c)
541540
target_sources(php_standard_functions PRIVATE basic_functions.c dir.c)
541+
target_sources(php_standard_functions_cli PRIVATE basic_functions.c dir.c)
542542

543-
target_include_directories(
544-
php_standard_functions_cli
545-
PRIVATE
546-
$<TARGET_PROPERTY:php_standard,INCLUDE_DIRECTORIES>
547-
)
548-
target_include_directories(
543+
set_target_properties(
549544
php_standard_functions
550-
PRIVATE
551-
$<TARGET_PROPERTY:php_standard,INCLUDE_DIRECTORIES>
545+
php_standard_functions_cli
546+
PROPERTIES
547+
INCLUDE_DIRECTORIES $<TARGET_PROPERTY:php_standard,INCLUDE_DIRECTORIES>
548+
COMPILE_DEFINITIONS $<TARGET_PROPERTY:php_standard,COMPILE_DEFINITIONS>
549+
LINK_LIBRARIES $<TARGET_PROPERTY:php_standard,LINK_LIBRARIES>
552550
)
553551

554552
target_compile_definitions(
555553
php_standard_functions_cli
556554
PRIVATE
557-
$<TARGET_PROPERTY:php_standard,COMPILE_DEFINITIONS>
558555
$<$<NOT:$<PLATFORM_ID:Windows>>:ENABLE_CHROOT_FUNC>
559556
)
560-
target_compile_definitions(
561-
php_standard_functions
562-
PRIVATE $<TARGET_PROPERTY:php_standard,COMPILE_DEFINITIONS>
563-
)
564-
565-
target_link_libraries(
566-
php_standard_functions_cli
567-
PRIVATE $<TARGET_PROPERTY:php_standard,LINK_LIBRARIES>
568-
)
569-
target_link_libraries(
570-
php_standard_functions
571-
PRIVATE $<TARGET_PROPERTY:php_standard,LINK_LIBRARIES>
572-
)
573557

574558
# ext/standard functions objects based on the SAPI type.
575559
target_sources(
@@ -578,6 +562,9 @@ target_sources(
578562
$<IF:$<BOOL:$<TARGET_PROPERTY:PHP_CLI>>,$<TARGET_OBJECTS:php_standard_functions_cli>,$<TARGET_OBJECTS:php_standard_functions>>
579563
)
580564

565+
add_dependencies(php_standard_functions php_standard)
566+
add_dependencies(php_standard_functions_cli php_standard)
567+
581568
################################################################################
582569
# Configuration header
583570
################################################################################

0 commit comments

Comments
 (0)