Skip to content

Commit 485ea47

Browse files
committed
Add timelib and libmbfl using target_sources in subdirectory
1 parent 1156d75 commit 485ea47

File tree

4 files changed

+212
-109
lines changed

4 files changed

+212
-109
lines changed

cmake/ext/date/CMakeLists.txt

Lines changed: 5 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ project(
1313
LANGUAGES C
1414
)
1515

16-
include(CheckIncludeFile)
1716
include(FeatureSummary)
1817

1918
add_feature_info(
@@ -22,66 +21,34 @@ add_feature_info(
2221
"date and time"
2322
)
2423

25-
# Check for headers needed by timelib.
26-
check_include_file(io.h HAVE_IO_H)
27-
2824
add_library(php_date OBJECT)
2925

3026
target_sources(
3127
php_date
3228
PRIVATE
33-
lib/astro.c
34-
lib/dow.c
35-
lib/interval.c
36-
lib/parse_date.c
37-
lib/parse_iso_intervals.c
38-
lib/parse_posix.c
39-
lib/parse_tz.c
40-
lib/timelib.c
41-
lib/tm2unixtime.c
42-
lib/unixtime2tm.c
4329
php_date.c
4430
php_date.stub.php
4531
PUBLIC
4632
FILE_SET HEADERS
4733
FILES
48-
lib/timelib.h
4934
php_date.h
50-
# A separate file set so binary dir can also be created within a source dir.
51-
PUBLIC
52-
FILE_SET HEADERS
53-
BASE_DIRS ${CMAKE_CURRENT_BINARY_DIR}
54-
FILES
55-
${CMAKE_CURRENT_BINARY_DIR}/lib/timelib_config.h
5635
)
5736

58-
target_include_directories(php_date PUBLIC ${CMAKE_CURRENT_BINARY_DIR}/lib)
37+
target_compile_definitions(php_date PRIVATE ZEND_ENABLE_STATIC_TSRMLS_CACHE)
5938

6039
target_compile_options(
6140
php_date
6241
PRIVATE
6342
$<$<COMPILE_LANG_AND_ID:C,MSVC>:/wd4244>
6443
)
6544

66-
target_compile_definitions(
67-
php_date
68-
PRIVATE
69-
ZEND_ENABLE_STATIC_TSRMLS_CACHE
70-
HAVE_TIMELIB_CONFIG_H
71-
# The timelib uses C99 strtoll() function conditionally.
72-
HAVE_STRTOLL
73-
)
45+
# Configure timelib.
46+
set(TIMELIB_TARGET php_date)
47+
add_subdirectory(lib)
7448

7549
set(HAVE_TIMELIB_CONFIG_H TRUE)
7650

77-
cmake_path(
78-
RELATIVE_PATH
79-
CMAKE_CURRENT_BINARY_DIR
80-
BASE_DIRECTORY ${CMAKE_BINARY_DIR}
81-
OUTPUT_VARIABLE relativeDir
82-
)
83-
message(STATUS "Creating ${relativeDir}/lib/timelib_config.h")
84-
file(CONFIGURE OUTPUT lib/timelib_config.h CONTENT [[
51+
file(APPEND ${CMAKE_CURRENT_BINARY_DIR}/lib/timelib_config.h "\n" [[
8552
#ifdef PHP_WIN32
8653
# include "config.w32.h"
8754
#else

cmake/ext/date/lib/CMakeLists.txt

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
#[=============================================================================[
2+
# timelib
3+
4+
Simplified CMake-based build system for the timelib library.
5+
6+
## Basic usage
7+
8+
Adding timelib with `add_subdirectory()`:
9+
10+
```cmake
11+
set(TIMELIB_TARGET php_date)
12+
add_subdirectory(lib)
13+
```
14+
#]=============================================================================]
15+
16+
include(CheckIncludeFile)
17+
18+
if(NOT TIMELIB_TARGET)
19+
set(TIMELIB_TARGET timelib)
20+
add_library(${TIMELIB_TARGET})
21+
endif()
22+
23+
set(
24+
timelibSources
25+
astro.c
26+
dow.c
27+
interval.c
28+
parse_date.c
29+
parse_iso_intervals.c
30+
parse_posix.c
31+
parse_tz.c
32+
timelib.c
33+
tm2unixtime.c
34+
unixtime2tm.c
35+
)
36+
37+
target_sources(
38+
${TIMELIB_TARGET}
39+
PRIVATE ${timelibSources}
40+
PUBLIC
41+
FILE_SET HEADERS
42+
FILES
43+
timelib.h
44+
# A separate file set so binary dir can also be created within a source dir.
45+
PUBLIC
46+
FILE_SET HEADERS
47+
BASE_DIRS $<TARGET_PROPERTY:${TIMELIB_TARGET},BINARY_DIR>
48+
FILES
49+
${CMAKE_CURRENT_BINARY_DIR}/timelib_config.h
50+
)
51+
52+
target_include_directories(${TIMELIB_TARGET} PUBLIC ${CMAKE_CURRENT_BINARY_DIR})
53+
54+
target_compile_definitions(
55+
${TIMELIB_TARGET}
56+
PRIVATE
57+
HAVE_TIMELIB_CONFIG_H
58+
# The timelib uses C99 strtoll() function conditionally.
59+
HAVE_STRTOLL
60+
)
61+
62+
# The libmbfl configuration.
63+
64+
check_include_file(io.h HAVE_IO_H)
65+
66+
cmake_path(
67+
RELATIVE_PATH
68+
CMAKE_CURRENT_BINARY_DIR
69+
BASE_DIRECTORY ${CMAKE_BINARY_DIR}
70+
OUTPUT_VARIABLE relativeDir
71+
)
72+
message(STATUS "Creating ${relativeDir}/timelib_config.h")
73+
74+
file(CONFIGURE OUTPUT timelib_config.h CONTENT [[
75+
/* Define to 1 if you have the <io.h> header file. */
76+
#cmakedefine HAVE_IO_H 1
77+
]])

cmake/ext/mbstring/CMakeLists.txt

Lines changed: 9 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -84,70 +84,14 @@ endif()
8484
target_sources(
8585
php_mbstring
8686
PRIVATE
87-
libmbfl/filters/html_entities.c
88-
libmbfl/filters/mbfilter_7bit.c
89-
libmbfl/filters/mbfilter_base64.c
90-
libmbfl/filters/mbfilter_cjk.c
91-
libmbfl/filters/mbfilter_htmlent.c
92-
libmbfl/filters/mbfilter_qprint.c
93-
libmbfl/filters/mbfilter_singlebyte.c
94-
libmbfl/filters/mbfilter_ucs2.c
95-
libmbfl/filters/mbfilter_ucs4.c
96-
libmbfl/filters/mbfilter_utf16.c
97-
libmbfl/filters/mbfilter_utf32.c
98-
libmbfl/filters/mbfilter_utf7.c
99-
libmbfl/filters/mbfilter_utf7imap.c
100-
libmbfl/filters/mbfilter_utf8_mobile.c
101-
libmbfl/filters/mbfilter_utf8.c
102-
libmbfl/filters/mbfilter_uuencode.c
103-
libmbfl/mbfl/mbfilter_8bit.c
104-
libmbfl/mbfl/mbfilter_pass.c
105-
libmbfl/mbfl/mbfilter_wchar.c
106-
libmbfl/mbfl/mbfilter.c
107-
libmbfl/mbfl/mbfl_convert.c
108-
libmbfl/mbfl/mbfl_encoding.c
109-
libmbfl/mbfl/mbfl_filter_output.c
110-
libmbfl/mbfl/mbfl_language.c
111-
libmbfl/mbfl/mbfl_memory_device.c
112-
libmbfl/mbfl/mbfl_string.c
113-
libmbfl/nls/nls_de.c
114-
libmbfl/nls/nls_en.c
115-
libmbfl/nls/nls_hy.c
116-
libmbfl/nls/nls_ja.c
117-
libmbfl/nls/nls_kr.c
118-
libmbfl/nls/nls_neutral.c
119-
libmbfl/nls/nls_ru.c
120-
libmbfl/nls/nls_tr.c
121-
libmbfl/nls/nls_ua.c
122-
libmbfl/nls/nls_uni.c
123-
libmbfl/nls/nls_zh.c
12487
mb_gpc.c
12588
mbstring.c
12689
mbstring.stub.php
12790
php_unicode.c
12891
PUBLIC
12992
FILE_SET HEADERS
13093
FILES
131-
libmbfl/mbfl/eaw_table.h
132-
libmbfl/mbfl/mbfilter_8bit.h
133-
libmbfl/mbfl/mbfilter_pass.h
134-
libmbfl/mbfl/mbfilter_wchar.h
135-
libmbfl/mbfl/mbfilter.h
136-
libmbfl/mbfl/mbfl_consts.h
137-
libmbfl/mbfl/mbfl_convert.h
138-
libmbfl/mbfl/mbfl_defs.h
139-
libmbfl/mbfl/mbfl_encoding.h
140-
libmbfl/mbfl/mbfl_filter_output.h
141-
libmbfl/mbfl/mbfl_language.h
142-
libmbfl/mbfl/mbfl_memory_device.h
143-
libmbfl/mbfl/mbfl_string.h
14494
mbstring.h
145-
# A separate file set so binary dir can also be created within a source dir.
146-
PUBLIC
147-
FILE_SET HEADERS
148-
BASE_DIRS ${CMAKE_CURRENT_BINARY_DIR}
149-
FILES
150-
${CMAKE_CURRENT_BINARY_DIR}/libmbfl/config.h
15195
)
15296

15397
target_compile_definitions(php_mbstring PRIVATE ZEND_ENABLE_STATIC_TSRMLS_CACHE)
@@ -164,27 +108,21 @@ set(HAVE_MBSTRING TRUE)
164108
# Configure libmbfl.
165109
################################################################################
166110

167-
# TODO: Fix this better. See also https://github.com/php/php-src/pull/13713
168-
# TODO: Should status message be here?
169-
message(STATUS "Creating ext/mbstring/libmbfl/config.h")
170-
file(CONFIGURE OUTPUT libmbfl/config.h CONTENT [[
111+
set(LIBMBFL_TARGET php_mbstring)
112+
add_subdirectory(libmbfl)
113+
114+
file(APPEND ${CMAKE_CURRENT_BINARY_DIR}/libmbfl/config.h "\n" [[
115+
#ifdef HAVE_CONFIG_H
116+
# include <config.h>
117+
#endif
171118
#ifdef _WIN32
172119
# define HAVE_STRICMP 1
173-
#elif defined HAVE_CONFIG_H
174-
# include "<config.h>"
120+
# include <config.w32.h>
175121
#else
176-
# include <main/php_config.h>
122+
# include <php_config.h>
177123
#endif
178124
]])
179125

180-
target_include_directories(
181-
php_mbstring
182-
PRIVATE
183-
${CMAKE_CURRENT_SOURCE_DIR}/libmbfl
184-
${CMAKE_CURRENT_BINARY_DIR}/libmbfl
185-
${CMAKE_CURRENT_SOURCE_DIR}/libmbfl/mbfl
186-
)
187-
188126
################################################################################
189127
# Multibyte regex.
190128
################################################################################
Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
1+
#[=============================================================================[
2+
# libmbfl
3+
4+
Simplified CMake-based build system for the libmbfl library. Since libmbfl is
5+
closely integrated and intertwined with PHP sources, the `target_sources()`
6+
approach is used, with no alternative implementations provided at this stage.
7+
8+
## Basic usage
9+
10+
Adding libmbfl with `add_subdirectory()`:
11+
12+
```cmake
13+
set(LIBMBFL_TARGET php_mbstring)
14+
add_subdirectory(libmbfl)
15+
```
16+
#]=============================================================================]
17+
18+
include(CheckIncludeFile)
19+
include(CheckSymbolExists)
20+
21+
if(NOT LIBMBFL_TARGET)
22+
set(LIBMBFL_TARGET libmbfl)
23+
add_library(${LIBMBFL_TARGET})
24+
endif()
25+
26+
target_sources(
27+
${LIBMBFL_TARGET}
28+
PRIVATE
29+
filters/html_entities.c
30+
filters/mbfilter_7bit.c
31+
filters/mbfilter_base64.c
32+
filters/mbfilter_cjk.c
33+
filters/mbfilter_htmlent.c
34+
filters/mbfilter_qprint.c
35+
filters/mbfilter_singlebyte.c
36+
filters/mbfilter_ucs2.c
37+
filters/mbfilter_ucs4.c
38+
filters/mbfilter_utf16.c
39+
filters/mbfilter_utf32.c
40+
filters/mbfilter_utf7.c
41+
filters/mbfilter_utf7imap.c
42+
filters/mbfilter_utf8_mobile.c
43+
filters/mbfilter_utf8.c
44+
filters/mbfilter_uuencode.c
45+
mbfl/mbfilter_8bit.c
46+
mbfl/mbfilter_pass.c
47+
mbfl/mbfilter_wchar.c
48+
mbfl/mbfilter.c
49+
mbfl/mbfl_convert.c
50+
mbfl/mbfl_encoding.c
51+
mbfl/mbfl_filter_output.c
52+
mbfl/mbfl_language.c
53+
mbfl/mbfl_memory_device.c
54+
mbfl/mbfl_string.c
55+
nls/nls_de.c
56+
nls/nls_en.c
57+
nls/nls_hy.c
58+
nls/nls_ja.c
59+
nls/nls_kr.c
60+
nls/nls_neutral.c
61+
nls/nls_ru.c
62+
nls/nls_tr.c
63+
nls/nls_ua.c
64+
nls/nls_uni.c
65+
nls/nls_zh.c
66+
PUBLIC
67+
FILE_SET HEADERS
68+
FILES
69+
mbfl/eaw_table.h
70+
mbfl/mbfilter_8bit.h
71+
mbfl/mbfilter_pass.h
72+
mbfl/mbfilter_wchar.h
73+
mbfl/mbfilter.h
74+
mbfl/mbfl_consts.h
75+
mbfl/mbfl_convert.h
76+
mbfl/mbfl_defs.h
77+
mbfl/mbfl_encoding.h
78+
mbfl/mbfl_filter_output.h
79+
mbfl/mbfl_language.h
80+
mbfl/mbfl_memory_device.h
81+
mbfl/mbfl_string.h
82+
# A separate file set so binary dir can also be created within a source dir.
83+
PUBLIC
84+
FILE_SET HEADERS
85+
BASE_DIRS $<TARGET_PROPERTY:${LIBMBFL_TARGET},BINARY_DIR>
86+
FILES
87+
${CMAKE_CURRENT_BINARY_DIR}/config.h
88+
)
89+
90+
target_include_directories(
91+
${LIBMBFL_TARGET}
92+
PRIVATE
93+
${CMAKE_CURRENT_BINARY_DIR}
94+
${CMAKE_CURRENT_SOURCE_DIR}
95+
${CMAKE_CURRENT_SOURCE_DIR}/mbfl
96+
)
97+
98+
target_compile_definitions(
99+
${LIBMBFL_TARGET}
100+
PRIVATE
101+
$<$<AND:$<PLATFORM_ID:Windows>,$<IN_LIST:$<TARGET_PROPERTY:${LIBMBFL_TARGET},TYPE>,MODULE_LIBRARY$<SEMICOLON>SHARED_LIBRARY>>:MBFL_DLL_EXPORT>
102+
)
103+
104+
# The libmbfl configuration header.
105+
check_include_file(strings.h HAVE_STRINGS_H)
106+
check_symbol_exists(strcasecmp "strings.h" HAVE_STRCASECMP)
107+
108+
cmake_path(
109+
RELATIVE_PATH
110+
CMAKE_CURRENT_BINARY_DIR
111+
BASE_DIRECTORY ${CMAKE_BINARY_DIR}
112+
OUTPUT_VARIABLE relativeDir
113+
)
114+
message(STATUS "Creating ${relativeDir}/config.h")
115+
file(CONFIGURE OUTPUT config.h CONTENT [[
116+
/* Define to 1 if you have the 'strcasecmp' function. */
117+
#cmakedefine HAVE_STRCASECMP 1
118+
119+
/* Define to 1 if you have the <strings.h> header file. */
120+
#cmakedefine HAVE_STRINGS_H 1
121+
]])

0 commit comments

Comments
 (0)