From 485ea4765831576fd990f329a6b3f40c6ec7452a Mon Sep 17 00:00:00 2001 From: Peter Kokot Date: Sat, 14 Dec 2024 23:35:02 +0100 Subject: [PATCH 1/2] Add timelib and libmbfl using target_sources in subdirectory --- cmake/ext/date/CMakeLists.txt | 43 +------- cmake/ext/date/lib/CMakeLists.txt | 77 ++++++++++++++ cmake/ext/mbstring/CMakeLists.txt | 80 ++------------ cmake/ext/mbstring/libmbfl/CMakeLists.txt | 121 ++++++++++++++++++++++ 4 files changed, 212 insertions(+), 109 deletions(-) create mode 100644 cmake/ext/date/lib/CMakeLists.txt create mode 100644 cmake/ext/mbstring/libmbfl/CMakeLists.txt diff --git a/cmake/ext/date/CMakeLists.txt b/cmake/ext/date/CMakeLists.txt index bfa56d679..c1f2009fe 100644 --- a/cmake/ext/date/CMakeLists.txt +++ b/cmake/ext/date/CMakeLists.txt @@ -13,7 +13,6 @@ project( LANGUAGES C ) -include(CheckIncludeFile) include(FeatureSummary) add_feature_info( @@ -22,40 +21,20 @@ add_feature_info( "date and time" ) -# Check for headers needed by timelib. -check_include_file(io.h HAVE_IO_H) - add_library(php_date OBJECT) target_sources( php_date PRIVATE - lib/astro.c - lib/dow.c - lib/interval.c - lib/parse_date.c - lib/parse_iso_intervals.c - lib/parse_posix.c - lib/parse_tz.c - lib/timelib.c - lib/tm2unixtime.c - lib/unixtime2tm.c php_date.c php_date.stub.php PUBLIC FILE_SET HEADERS FILES - lib/timelib.h php_date.h - # A separate file set so binary dir can also be created within a source dir. - PUBLIC - FILE_SET HEADERS - BASE_DIRS ${CMAKE_CURRENT_BINARY_DIR} - FILES - ${CMAKE_CURRENT_BINARY_DIR}/lib/timelib_config.h ) -target_include_directories(php_date PUBLIC ${CMAKE_CURRENT_BINARY_DIR}/lib) +target_compile_definitions(php_date PRIVATE ZEND_ENABLE_STATIC_TSRMLS_CACHE) target_compile_options( php_date @@ -63,25 +42,13 @@ target_compile_options( $<$:/wd4244> ) -target_compile_definitions( - php_date - PRIVATE - ZEND_ENABLE_STATIC_TSRMLS_CACHE - HAVE_TIMELIB_CONFIG_H - # The timelib uses C99 strtoll() function conditionally. - HAVE_STRTOLL -) +# Configure timelib. +set(TIMELIB_TARGET php_date) +add_subdirectory(lib) set(HAVE_TIMELIB_CONFIG_H TRUE) -cmake_path( - RELATIVE_PATH - CMAKE_CURRENT_BINARY_DIR - BASE_DIRECTORY ${CMAKE_BINARY_DIR} - OUTPUT_VARIABLE relativeDir -) -message(STATUS "Creating ${relativeDir}/lib/timelib_config.h") -file(CONFIGURE OUTPUT lib/timelib_config.h CONTENT [[ +file(APPEND ${CMAKE_CURRENT_BINARY_DIR}/lib/timelib_config.h "\n" [[ #ifdef PHP_WIN32 # include "config.w32.h" #else diff --git a/cmake/ext/date/lib/CMakeLists.txt b/cmake/ext/date/lib/CMakeLists.txt new file mode 100644 index 000000000..5ba335d83 --- /dev/null +++ b/cmake/ext/date/lib/CMakeLists.txt @@ -0,0 +1,77 @@ +#[=============================================================================[ +# timelib + +Simplified CMake-based build system for the timelib library. + +## Basic usage + +Adding timelib with `add_subdirectory()`: + +```cmake +set(TIMELIB_TARGET php_date) +add_subdirectory(lib) +``` +#]=============================================================================] + +include(CheckIncludeFile) + +if(NOT TIMELIB_TARGET) + set(TIMELIB_TARGET timelib) + add_library(${TIMELIB_TARGET}) +endif() + +set( + timelibSources + astro.c + dow.c + interval.c + parse_date.c + parse_iso_intervals.c + parse_posix.c + parse_tz.c + timelib.c + tm2unixtime.c + unixtime2tm.c +) + +target_sources( + ${TIMELIB_TARGET} + PRIVATE ${timelibSources} + PUBLIC + FILE_SET HEADERS + FILES + timelib.h + # A separate file set so binary dir can also be created within a source dir. + PUBLIC + FILE_SET HEADERS + BASE_DIRS $ + FILES + ${CMAKE_CURRENT_BINARY_DIR}/timelib_config.h +) + +target_include_directories(${TIMELIB_TARGET} PUBLIC ${CMAKE_CURRENT_BINARY_DIR}) + +target_compile_definitions( + ${TIMELIB_TARGET} + PRIVATE + HAVE_TIMELIB_CONFIG_H + # The timelib uses C99 strtoll() function conditionally. + HAVE_STRTOLL +) + +# The libmbfl configuration. + +check_include_file(io.h HAVE_IO_H) + +cmake_path( + RELATIVE_PATH + CMAKE_CURRENT_BINARY_DIR + BASE_DIRECTORY ${CMAKE_BINARY_DIR} + OUTPUT_VARIABLE relativeDir +) +message(STATUS "Creating ${relativeDir}/timelib_config.h") + +file(CONFIGURE OUTPUT timelib_config.h CONTENT [[ +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_IO_H 1 +]]) diff --git a/cmake/ext/mbstring/CMakeLists.txt b/cmake/ext/mbstring/CMakeLists.txt index ba3f2a624..804a15638 100644 --- a/cmake/ext/mbstring/CMakeLists.txt +++ b/cmake/ext/mbstring/CMakeLists.txt @@ -84,43 +84,6 @@ endif() target_sources( php_mbstring PRIVATE - libmbfl/filters/html_entities.c - libmbfl/filters/mbfilter_7bit.c - libmbfl/filters/mbfilter_base64.c - libmbfl/filters/mbfilter_cjk.c - libmbfl/filters/mbfilter_htmlent.c - libmbfl/filters/mbfilter_qprint.c - libmbfl/filters/mbfilter_singlebyte.c - libmbfl/filters/mbfilter_ucs2.c - libmbfl/filters/mbfilter_ucs4.c - libmbfl/filters/mbfilter_utf16.c - libmbfl/filters/mbfilter_utf32.c - libmbfl/filters/mbfilter_utf7.c - libmbfl/filters/mbfilter_utf7imap.c - libmbfl/filters/mbfilter_utf8_mobile.c - libmbfl/filters/mbfilter_utf8.c - libmbfl/filters/mbfilter_uuencode.c - libmbfl/mbfl/mbfilter_8bit.c - libmbfl/mbfl/mbfilter_pass.c - libmbfl/mbfl/mbfilter_wchar.c - libmbfl/mbfl/mbfilter.c - libmbfl/mbfl/mbfl_convert.c - libmbfl/mbfl/mbfl_encoding.c - libmbfl/mbfl/mbfl_filter_output.c - libmbfl/mbfl/mbfl_language.c - libmbfl/mbfl/mbfl_memory_device.c - libmbfl/mbfl/mbfl_string.c - libmbfl/nls/nls_de.c - libmbfl/nls/nls_en.c - libmbfl/nls/nls_hy.c - libmbfl/nls/nls_ja.c - libmbfl/nls/nls_kr.c - libmbfl/nls/nls_neutral.c - libmbfl/nls/nls_ru.c - libmbfl/nls/nls_tr.c - libmbfl/nls/nls_ua.c - libmbfl/nls/nls_uni.c - libmbfl/nls/nls_zh.c mb_gpc.c mbstring.c mbstring.stub.php @@ -128,26 +91,7 @@ target_sources( PUBLIC FILE_SET HEADERS FILES - libmbfl/mbfl/eaw_table.h - libmbfl/mbfl/mbfilter_8bit.h - libmbfl/mbfl/mbfilter_pass.h - libmbfl/mbfl/mbfilter_wchar.h - libmbfl/mbfl/mbfilter.h - libmbfl/mbfl/mbfl_consts.h - libmbfl/mbfl/mbfl_convert.h - libmbfl/mbfl/mbfl_defs.h - libmbfl/mbfl/mbfl_encoding.h - libmbfl/mbfl/mbfl_filter_output.h - libmbfl/mbfl/mbfl_language.h - libmbfl/mbfl/mbfl_memory_device.h - libmbfl/mbfl/mbfl_string.h mbstring.h - # A separate file set so binary dir can also be created within a source dir. - PUBLIC - FILE_SET HEADERS - BASE_DIRS ${CMAKE_CURRENT_BINARY_DIR} - FILES - ${CMAKE_CURRENT_BINARY_DIR}/libmbfl/config.h ) target_compile_definitions(php_mbstring PRIVATE ZEND_ENABLE_STATIC_TSRMLS_CACHE) @@ -164,27 +108,21 @@ set(HAVE_MBSTRING TRUE) # Configure libmbfl. ################################################################################ -# TODO: Fix this better. See also https://github.com/php/php-src/pull/13713 -# TODO: Should status message be here? -message(STATUS "Creating ext/mbstring/libmbfl/config.h") -file(CONFIGURE OUTPUT libmbfl/config.h CONTENT [[ +set(LIBMBFL_TARGET php_mbstring) +add_subdirectory(libmbfl) + +file(APPEND ${CMAKE_CURRENT_BINARY_DIR}/libmbfl/config.h "\n" [[ +#ifdef HAVE_CONFIG_H +# include +#endif #ifdef _WIN32 # define HAVE_STRICMP 1 -#elif defined HAVE_CONFIG_H -# include "" +# include #else -# include
+# include #endif ]]) -target_include_directories( - php_mbstring - PRIVATE - ${CMAKE_CURRENT_SOURCE_DIR}/libmbfl - ${CMAKE_CURRENT_BINARY_DIR}/libmbfl - ${CMAKE_CURRENT_SOURCE_DIR}/libmbfl/mbfl -) - ################################################################################ # Multibyte regex. ################################################################################ diff --git a/cmake/ext/mbstring/libmbfl/CMakeLists.txt b/cmake/ext/mbstring/libmbfl/CMakeLists.txt new file mode 100644 index 000000000..c88b6e174 --- /dev/null +++ b/cmake/ext/mbstring/libmbfl/CMakeLists.txt @@ -0,0 +1,121 @@ +#[=============================================================================[ +# libmbfl + +Simplified CMake-based build system for the libmbfl library. Since libmbfl is +closely integrated and intertwined with PHP sources, the `target_sources()` +approach is used, with no alternative implementations provided at this stage. + +## Basic usage + +Adding libmbfl with `add_subdirectory()`: + +```cmake +set(LIBMBFL_TARGET php_mbstring) +add_subdirectory(libmbfl) +``` +#]=============================================================================] + +include(CheckIncludeFile) +include(CheckSymbolExists) + +if(NOT LIBMBFL_TARGET) + set(LIBMBFL_TARGET libmbfl) + add_library(${LIBMBFL_TARGET}) +endif() + +target_sources( + ${LIBMBFL_TARGET} + PRIVATE + filters/html_entities.c + filters/mbfilter_7bit.c + filters/mbfilter_base64.c + filters/mbfilter_cjk.c + filters/mbfilter_htmlent.c + filters/mbfilter_qprint.c + filters/mbfilter_singlebyte.c + filters/mbfilter_ucs2.c + filters/mbfilter_ucs4.c + filters/mbfilter_utf16.c + filters/mbfilter_utf32.c + filters/mbfilter_utf7.c + filters/mbfilter_utf7imap.c + filters/mbfilter_utf8_mobile.c + filters/mbfilter_utf8.c + filters/mbfilter_uuencode.c + mbfl/mbfilter_8bit.c + mbfl/mbfilter_pass.c + mbfl/mbfilter_wchar.c + mbfl/mbfilter.c + mbfl/mbfl_convert.c + mbfl/mbfl_encoding.c + mbfl/mbfl_filter_output.c + mbfl/mbfl_language.c + mbfl/mbfl_memory_device.c + mbfl/mbfl_string.c + nls/nls_de.c + nls/nls_en.c + nls/nls_hy.c + nls/nls_ja.c + nls/nls_kr.c + nls/nls_neutral.c + nls/nls_ru.c + nls/nls_tr.c + nls/nls_ua.c + nls/nls_uni.c + nls/nls_zh.c + PUBLIC + FILE_SET HEADERS + FILES + mbfl/eaw_table.h + mbfl/mbfilter_8bit.h + mbfl/mbfilter_pass.h + mbfl/mbfilter_wchar.h + mbfl/mbfilter.h + mbfl/mbfl_consts.h + mbfl/mbfl_convert.h + mbfl/mbfl_defs.h + mbfl/mbfl_encoding.h + mbfl/mbfl_filter_output.h + mbfl/mbfl_language.h + mbfl/mbfl_memory_device.h + mbfl/mbfl_string.h + # A separate file set so binary dir can also be created within a source dir. + PUBLIC + FILE_SET HEADERS + BASE_DIRS $ + FILES + ${CMAKE_CURRENT_BINARY_DIR}/config.h +) + +target_include_directories( + ${LIBMBFL_TARGET} + PRIVATE + ${CMAKE_CURRENT_BINARY_DIR} + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/mbfl +) + +target_compile_definitions( + ${LIBMBFL_TARGET} + PRIVATE + $<$,$,MODULE_LIBRARY$SHARED_LIBRARY>>:MBFL_DLL_EXPORT> +) + +# The libmbfl configuration header. +check_include_file(strings.h HAVE_STRINGS_H) +check_symbol_exists(strcasecmp "strings.h" HAVE_STRCASECMP) + +cmake_path( + RELATIVE_PATH + CMAKE_CURRENT_BINARY_DIR + BASE_DIRECTORY ${CMAKE_BINARY_DIR} + OUTPUT_VARIABLE relativeDir +) +message(STATUS "Creating ${relativeDir}/config.h") +file(CONFIGURE OUTPUT config.h CONTENT [[ +/* Define to 1 if you have the 'strcasecmp' function. */ +#cmakedefine HAVE_STRCASECMP 1 + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_STRINGS_H 1 +]]) From 8345fd3ddfea820155a12b6059e6c305ca2fa117 Mon Sep 17 00:00:00 2001 From: Peter Kokot Date: Sun, 15 Dec 2024 15:07:19 +0100 Subject: [PATCH 2/2] Fix FILE_SET usage When same header set (HEADERS) has base directory inside the other it doesn't work. So a completely separate FILE_SET with name must be created instead. --- cmake/Zend/CMakeLists.txt | 24 ++++++++++++----------- cmake/cmake/modules/PHP/Extensions.cmake | 17 +++++++++++++--- cmake/ext/date/lib/CMakeLists.txt | 14 +++++++------ cmake/ext/mbstring/libmbfl/CMakeLists.txt | 4 ++-- cmake/main/CMakeLists.txt | 6 ++++-- cmake/win32/CMakeLists.txt | 6 ++++-- 6 files changed, 45 insertions(+), 26 deletions(-) diff --git a/cmake/Zend/CMakeLists.txt b/cmake/Zend/CMakeLists.txt index 0162d5891..82f3fcddf 100644 --- a/cmake/Zend/CMakeLists.txt +++ b/cmake/Zend/CMakeLists.txt @@ -180,6 +180,15 @@ target_sources( PUBLIC FILE_SET HEADERS FILES + Optimizer/zend_call_graph.h + Optimizer/zend_cfg.h + Optimizer/zend_dfg.h + Optimizer/zend_dump.h + Optimizer/zend_func_info.h + Optimizer/zend_inference.h + Optimizer/zend_optimizer.h + Optimizer/zend_ssa.h + Optimizer/zend_worklist.h zend_alloc_sizes.h zend_alloc.h zend_API.h @@ -276,18 +285,9 @@ target_sources( zend_weakrefs_arginfo.h zend_weakrefs.h zend.h - Optimizer/zend_call_graph.h - Optimizer/zend_cfg.h - Optimizer/zend_dfg.h - Optimizer/zend_dump.h - Optimizer/zend_func_info.h - Optimizer/zend_inference.h - Optimizer/zend_optimizer.h - Optimizer/zend_ssa.h - Optimizer/zend_worklist.h - # A separate file set so binary dir can also be created within a source dir. PUBLIC - FILE_SET HEADERS + FILE_SET generated + TYPE HEADERS BASE_DIRS ${CMAKE_CURRENT_BINARY_DIR} FILES $<$>:${CMAKE_CURRENT_BINARY_DIR}/zend_config.h> @@ -686,4 +686,6 @@ install( ARCHIVE EXCLUDE_FROM_ALL FILE_SET HEADERS DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${PHP_INCLUDE_PREFIX}/Zend + FILE_SET generated + DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${PHP_INCLUDE_PREFIX}/Zend ) diff --git a/cmake/cmake/modules/PHP/Extensions.cmake b/cmake/cmake/modules/PHP/Extensions.cmake index 9056d273a..3ea6c7fd4 100644 --- a/cmake/cmake/modules/PHP/Extensions.cmake +++ b/cmake/cmake/modules/PHP/Extensions.cmake @@ -419,7 +419,19 @@ function(php_extensions_postconfigure extension) set_property(TARGET php_${extension} PROPERTY OUTPUT_NAME ${extension}) endif() - # Add extension's default installation instructions. + # Specify extension's default installation rules. + get_target_property(sets php_${extension} INTERFACE_HEADER_SETS) + set(fileSets "") + foreach(set IN LISTS sets) + list( + APPEND + fileSets + FILE_SET + ${set} + DESTINATION + ${CMAKE_INSTALL_INCLUDEDIR}/${PHP_INCLUDE_PREFIX}/ext/${extension} + ) + endforeach() install( TARGETS php_${extension} ARCHIVE EXCLUDE_FROM_ALL @@ -427,8 +439,7 @@ function(php_extensions_postconfigure extension) DESTINATION ${PHP_EXTENSION_DIR} LIBRARY DESTINATION ${PHP_EXTENSION_DIR} - FILE_SET HEADERS - DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${PHP_INCLUDE_PREFIX}/ext/${extension} + ${fileSets} ) # Configure shared extension. diff --git a/cmake/ext/date/lib/CMakeLists.txt b/cmake/ext/date/lib/CMakeLists.txt index 5ba335d83..5f24c32e7 100644 --- a/cmake/ext/date/lib/CMakeLists.txt +++ b/cmake/ext/date/lib/CMakeLists.txt @@ -13,6 +13,10 @@ add_subdirectory(lib) ``` #]=============================================================================] +cmake_minimum_required(VERSION 3.25...3.31) + +project(Timelib LANGUAGES C) + include(CheckIncludeFile) if(NOT TIMELIB_TARGET) @@ -36,14 +40,15 @@ set( target_sources( ${TIMELIB_TARGET} - PRIVATE ${timelibSources} + PRIVATE + ${timelibSources} PUBLIC FILE_SET HEADERS FILES timelib.h - # A separate file set so binary dir can also be created within a source dir. PUBLIC - FILE_SET HEADERS + FILE_SET generated + TYPE HEADERS BASE_DIRS $ FILES ${CMAKE_CURRENT_BINARY_DIR}/timelib_config.h @@ -59,8 +64,6 @@ target_compile_definitions( HAVE_STRTOLL ) -# The libmbfl configuration. - check_include_file(io.h HAVE_IO_H) cmake_path( @@ -70,7 +73,6 @@ cmake_path( OUTPUT_VARIABLE relativeDir ) message(STATUS "Creating ${relativeDir}/timelib_config.h") - file(CONFIGURE OUTPUT timelib_config.h CONTENT [[ /* Define to 1 if you have the header file. */ #cmakedefine HAVE_IO_H 1 diff --git a/cmake/ext/mbstring/libmbfl/CMakeLists.txt b/cmake/ext/mbstring/libmbfl/CMakeLists.txt index c88b6e174..cc1706e1a 100644 --- a/cmake/ext/mbstring/libmbfl/CMakeLists.txt +++ b/cmake/ext/mbstring/libmbfl/CMakeLists.txt @@ -79,9 +79,9 @@ target_sources( mbfl/mbfl_language.h mbfl/mbfl_memory_device.h mbfl/mbfl_string.h - # A separate file set so binary dir can also be created within a source dir. PUBLIC - FILE_SET HEADERS + FILE_SET generated + TYPE HEADERS BASE_DIRS $ FILES ${CMAKE_CURRENT_BINARY_DIR}/config.h diff --git a/cmake/main/CMakeLists.txt b/cmake/main/CMakeLists.txt index 302e971a8..68e6f5f26 100644 --- a/cmake/main/CMakeLists.txt +++ b/cmake/main/CMakeLists.txt @@ -92,9 +92,9 @@ target_sources( streams/php_stream_userspace.h streams/php_streams_int.h streams/userspace_arginfo.h - # A separate file set so binary dir can also be created within a source dir. PUBLIC - FILE_SET HEADERS + FILE_SET generated + TYPE HEADERS BASE_DIRS ${CMAKE_CURRENT_BINARY_DIR} FILES $<$:${CMAKE_CURRENT_BINARY_DIR}/config.w32.h> @@ -415,4 +415,6 @@ install( ARCHIVE EXCLUDE_FROM_ALL FILE_SET HEADERS DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${PHP_INCLUDE_PREFIX}/main + FILE_SET generated + DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${PHP_INCLUDE_PREFIX}/main ) diff --git a/cmake/win32/CMakeLists.txt b/cmake/win32/CMakeLists.txt index 22b1587e6..a90749688 100644 --- a/cmake/win32/CMakeLists.txt +++ b/cmake/win32/CMakeLists.txt @@ -59,9 +59,9 @@ target_sources( time.h unistd.h winutil.h - # A separate file set so binary dir can also be created within a source dir. PUBLIC - FILE_SET HEADERS + FILE_SET generated + TYPE HEADERS BASE_DIRS ${CMAKE_CURRENT_BINARY_DIR} FILES ${CMAKE_CURRENT_BINARY_DIR}/wsyslog.h @@ -163,4 +163,6 @@ install( ARCHIVE EXCLUDE_FROM_ALL FILE_SET HEADERS DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${PHP_INCLUDE_PREFIX}/win32 + FILE_SET generated + DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${PHP_INCLUDE_PREFIX}/win32 )