Skip to content

Commit 422b7bc

Browse files
committed
Fix transitive compile and link properties for extensions
Looks complicating, but it is relatively simple. It enables configuring objects and everything that should be passed to SAPIs on the extension level and hopefully works a bit more intuitive for STATIC, SHARED and executable SAPIs.
1 parent 626e3d1 commit 422b7bc

File tree

3 files changed

+42
-53
lines changed

3 files changed

+42
-53
lines changed

cmake/ext/CMakeLists.txt

Lines changed: 36 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -80,23 +80,49 @@ foreach(extension IN LISTS extensions)
8080

8181
add_dependencies(php_${extension} Zend::Zend)
8282

83-
# Add extension's PUBLIC/INTERFACE compile properties to configuration.
84-
# Cleaner COMPILE_ONLY generator expression is available in CMake >= 3.27.
85-
if(CMAKE_VERSION VERSION_GREATER_EQUAL 3.27)
86-
target_link_libraries(
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
86+
# TODO: Should PHP_CLI extensions pass properties only to PHP_CLI SAPIs?
87+
get_target_property(type php_${extension} TYPE)
88+
if(NOT type MATCHES "^(MODULE|SHARED)_LIBRARY$")
89+
target_compile_definitions(
90+
php_configuration
91+
INTERFACE
92+
$<TARGET_PROPERTY:PHP::${extension},INTERFACE_COMPILE_DEFINITIONS>
93+
)
94+
95+
target_compile_options(
96+
php_configuration
97+
INTERFACE
98+
$<TARGET_PROPERTY:PHP::${extension},INTERFACE_COMPILE_OPTIONS>
99+
)
100+
101+
target_compile_features(
87102
php_configuration
88103
INTERFACE
89-
$<COMPILE_ONLY:PHP::${extension}>
104+
$<TARGET_PROPERTY:PHP::${extension},INTERFACE_COMPILE_FEATURES>
90105
)
91-
else()
92-
# TODO: Fix this better. Either require 3.27, or limit/adjust compile
93-
# properties propagated globally. Also, shared extensions shouldn't
94-
# propagate globally.
95-
# https://cmake.org/cmake/help/latest/manual/cmake-buildsystem.7.html#id36
106+
96107
target_include_directories(
97108
php_configuration
98109
INTERFACE
99110
$<TARGET_PROPERTY:PHP::${extension},INTERFACE_INCLUDE_DIRECTORIES>
111+
$<TARGET_PROPERTY:PHP::${extension},INTERFACE_SYSTEM_INCLUDE_DIRECTORIES>
112+
)
113+
114+
target_link_libraries(
115+
php_extensions
116+
INTERFACE
117+
$<IF:$<BOOL:$<TARGET_PROPERTY:PHP::${extension},PHP_CLI>>,$<$<BOOL:$<TARGET_PROPERTY:PHP_CLI>>:$<LINK_ONLY:PHP::${extension}>>,$<LINK_ONLY:PHP::${extension}>>
118+
)
119+
120+
target_sources(
121+
php_extensions
122+
INTERFACE
123+
$<IF:$<BOOL:$<TARGET_PROPERTY:PHP::${extension},PHP_CLI>>,$<$<BOOL:$<TARGET_PROPERTY:PHP_CLI>>:$<TARGET_OBJECTS:PHP::${extension}>>,$<TARGET_OBJECTS:PHP::${extension}>>
124+
125+
$<IF:$<BOOL:$<TARGET_PROPERTY:PHP::${extension},PHP_CLI>>,$<$<BOOL:$<TARGET_PROPERTY:PHP_CLI>>:$<TARGET_PROPERTY:PHP::${extension},INTERFACE_SOURCES>>,$<TARGET_PROPERTY:PHP::${extension},INTERFACE_SOURCES>>
100126
)
101127
endif()
102128

@@ -109,44 +135,6 @@ foreach(extension IN LISTS extensions)
109135
$<TARGET_PROPERTY:php_configuration,INTERFACE_COMPILE_OPTIONS>
110136
)
111137

112-
get_target_property(type php_${extension} TYPE)
113-
get_target_property(isCli php_${extension} PHP_CLI)
114-
if(NOT type MATCHES "^(MODULE|SHARED)_LIBRARY$")
115-
# If extension is STATIC library link as whole archive, otherwise link
116-
# normally. CLI-based extensions are linked only to CLI-based SAPIs.
117-
if(NOT isCli)
118-
target_link_libraries(
119-
php_extensions
120-
INTERFACE
121-
$<IF:$<STREQUAL:$<TARGET_PROPERTY:PHP::${extension},TYPE>,STATIC_LIBRARY>,$<LINK_LIBRARY:WHOLE_ARCHIVE,PHP::${extension}>,PHP::${extension}>
122-
)
123-
124-
target_sources(
125-
php_extensions
126-
INTERFACE
127-
# If extension is OBJECT library:
128-
$<$<STREQUAL:$<TARGET_PROPERTY:PHP::${extension},TYPE>,OBJECT_LIBRARY>:$<TARGET_OBJECTS:PHP::${extension}>>
129-
# If extension and linked target (SAPI) are both STATIC libraries:
130-
$<$<AND:$<STREQUAL:$<TARGET_PROPERTY:TYPE>,STATIC_LIBRARY>,$<STREQUAL:$<TARGET_PROPERTY:PHP::${extension},TYPE>,STATIC_LIBRARY>>:$<TARGET_OBJECTS:PHP::${extension}>>
131-
)
132-
else()
133-
target_link_libraries(
134-
php_extensions
135-
INTERFACE
136-
$<$<BOOL:$<TARGET_PROPERTY:PHP_CLI>>:$<IF:$<STREQUAL:$<TARGET_PROPERTY:PHP::${extension},TYPE>,STATIC_LIBRARY>,$<LINK_LIBRARY:WHOLE_ARCHIVE,PHP::${extension}>,PHP::${extension}>>
137-
)
138-
139-
target_sources(
140-
php_extensions
141-
INTERFACE
142-
# If extension is OBJECT library:
143-
$<$<BOOL:$<TARGET_PROPERTY:PHP_CLI>>:$<$<STREQUAL:$<TARGET_PROPERTY:PHP::${extension},TYPE>,OBJECT_LIBRARY>:$<TARGET_OBJECTS:PHP::${extension}>>>
144-
# If extension and linked target (SAPI) are both STATIC libraries:
145-
$<$<BOOL:$<TARGET_PROPERTY:PHP_CLI>>:$<$<AND:$<STREQUAL:$<TARGET_PROPERTY:TYPE>,STATIC_LIBRARY>,$<STREQUAL:$<TARGET_PROPERTY:PHP::${extension},TYPE>,STATIC_LIBRARY>>:$<TARGET_OBJECTS:PHP::${extension}>>>
146-
)
147-
endif()
148-
endif()
149-
150138
message(CHECK_PASS "enabled")
151139
list(POP_BACK CMAKE_MESSAGE_CONTEXT)
152140
endforeach()

cmake/ext/standard/CMakeLists.txt

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -571,8 +571,12 @@ target_link_libraries(
571571
PRIVATE $<TARGET_PROPERTY:php_standard,LINK_LIBRARIES>
572572
)
573573

574-
add_dependencies(php_standard_functions_cli php_standard)
575-
add_dependencies(php_standard_functions php_standard)
574+
# ext/standard functions objects based on the SAPI type.
575+
target_sources(
576+
php_standard
577+
INTERFACE
578+
$<IF:$<BOOL:$<TARGET_PROPERTY:PHP_CLI>>,$<TARGET_OBJECTS:php_standard_functions_cli>,$<TARGET_OBJECTS:php_standard_functions>>
579+
)
576580

577581
################################################################################
578582
# Configuration header

cmake/main/CMakeLists.txt

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -189,9 +189,6 @@ target_sources(
189189
$<$<AND:$<STREQUAL:$<TARGET_PROPERTY:TYPE>,STATIC_LIBRARY>,$<STREQUAL:$<TARGET_PROPERTY:Zend::Zend,TYPE>,STATIC_LIBRARY>>:$<TARGET_OBJECTS:Zend::Zend>>
190190

191191
$<$<TARGET_EXISTS:PHP::windows>:$<TARGET_OBJECTS:PHP::windows>>
192-
193-
# ext/standard functions objects based on the SAPI type.
194-
$<IF:$<BOOL:$<TARGET_PROPERTY:PHP_CLI>>,$<TARGET_OBJECTS:php_standard_functions_cli>,$<TARGET_OBJECTS:php_standard_functions>>
195192
)
196193

197194
################################################################################

0 commit comments

Comments
 (0)