Skip to content

Commit 4247883

Browse files
authored
Merge branch 'main' into fix-zig
2 parents 8680e83 + 3198cc4 commit 4247883

File tree

10 files changed

+95
-27
lines changed

10 files changed

+95
-27
lines changed

config/ext.json

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -414,9 +414,17 @@
414414
"libmemcached",
415415
"fastlz"
416416
],
417+
"lib-suggests": [
418+
"zstd"
419+
],
417420
"ext-depends": [
418421
"session",
419422
"zlib"
423+
],
424+
"ext-suggests": [
425+
"igbinary",
426+
"msgpack",
427+
"session"
420428
]
421429
},
422430
"mongodb": {

config/lib.json

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,17 +9,19 @@
99
"lib-base",
1010
"micro"
1111
],
12+
"lib-depends-macos": [
13+
"lib-base",
14+
"micro",
15+
"libxml2"
16+
],
1217
"lib-suggests-linux": [
1318
"libacl",
1419
"brotli",
1520
"watcher"
1621
],
17-
"lib-suggests-unix": [
22+
"lib-suggests-macos": [
1823
"brotli",
1924
"watcher"
20-
],
21-
"lib-depends-macos": [
22-
"libxml2"
2325
]
2426
},
2527
"micro": {
@@ -450,6 +452,7 @@
450452
},
451453
"libmemcached": {
452454
"source": "libmemcached",
455+
"cpp-library": true,
453456
"static-libs-unix": [
454457
"libmemcached.a",
455458
"libmemcachedprotocol.a",
@@ -594,7 +597,6 @@
594597
],
595598
"lib-suggests-unix": [
596599
"xz",
597-
"icu",
598600
"zlib"
599601
],
600602
"lib-depends-windows": [

src/SPC/ConsoleApplication.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@
3434
*/
3535
final class ConsoleApplication extends Application
3636
{
37-
public const string VERSION = '2.7.3';
37+
public const string VERSION = '2.7.4';
3838

3939
public function __construct()
4040
{

src/SPC/builder/Extension.php

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,14 @@
55
namespace SPC\builder;
66

77
use SPC\exception\EnvironmentException;
8+
use SPC\exception\FileSystemException;
89
use SPC\exception\SPCException;
910
use SPC\exception\ValidationException;
1011
use SPC\exception\WrongUsageException;
1112
use SPC\store\Config;
1213
use SPC\store\FileSystem;
14+
use SPC\toolchain\ClangNativeToolchain;
15+
use SPC\toolchain\GccNativeToolchain;
1316
use SPC\toolchain\ToolchainManager;
1417
use SPC\toolchain\ZigToolchain;
1518
use SPC\util\SPCConfigUtil;
@@ -418,8 +421,24 @@ public function buildUnixShared(): void
418421
'LIBS' => clean_spaces("{$preStatic} {$staticLibs} {$postStatic} {$sharedLibs}"),
419422
'LD_LIBRARY_PATH' => BUILD_LIB_PATH,
420423
];
421-
if (ToolchainManager::getToolchainClass() === ZigToolchain::class && SPCTarget::getTargetOS() === 'Linux') {
422-
$env['SPC_COMPILER_EXTRA'] = '-lstdc++';
424+
if (str_contains($env['LIBS'], '-lstdc++') && SPCTarget::getTargetOS() === 'Linux') {
425+
if (ToolchainManager::getToolchainClass() === ZigToolchain::class) {
426+
$env['SPC_COMPILER_EXTRA'] = '-lstdc++';
427+
} elseif (ToolchainManager::getToolchainClass() === GccNativeToolchain::class || ToolchainManager::getToolchainClass() === ClangNativeToolchain::class) {
428+
try {
429+
$content = FileSystem::readFile($this->source_dir . '/config.m4');
430+
if ($content && !str_contains($content, 'PHP_ADD_LIBRARY(stdc++')) {
431+
$pattern = '/(PHP_NEW_EXTENSION\(' . $this->name . ',.*\))/m';
432+
$replacement = "$1\nPHP_ADD_LIBRARY(stdc++, 1, " . strtoupper($this->name) . '_SHARED_LIBADD)';
433+
FileSystem::replaceFileRegex(
434+
$this->source_dir . '/config.m4',
435+
$pattern,
436+
$replacement
437+
);
438+
}
439+
} catch (FileSystemException) {
440+
}
441+
}
423442
}
424443

425444
if ($this->patchBeforeSharedPhpize()) {

src/SPC/builder/extension/memcached.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,10 @@ public function getUnixConfigureArg(bool $shared = false): string
1717
'--with-libmemcached-dir=' . BUILD_ROOT_PATH . ' ' .
1818
'--disable-memcached-sasl ' .
1919
'--enable-memcached-json ' .
20+
($this->builder->getLib('zstd') ? '--with-zstd ' : '') .
21+
($this->builder->getExt('igbinary') ? '--enable-memcached-igbinary ' : '') .
22+
($this->builder->getExt('session') ? '--enable-memcached-session ' : '') .
23+
($this->builder->getExt('msgpack') ? '--enable-memcached-msgpack ' : '') .
2024
'--with-system-fastlz';
2125
}
2226
}

src/SPC/builder/linux/LinuxBuilder.php

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -103,9 +103,8 @@ public function buildPHP(int $build_target = BUILD_TARGET_NONE): void
103103
);
104104
}
105105

106-
shell()->cd(SOURCE_PATH . '/php-src')
107-
->exec(
108-
$php_configure_env . ' ' .
106+
$this->seekPhpSrcLogFileOnException(fn () => shell()->cd(SOURCE_PATH . '/php-src')->exec(
107+
$php_configure_env . ' ' .
109108
getenv('SPC_CMD_PREFIX_PHP_CONFIGURE') . ' ' .
110109
($enableCli ? '--enable-cli ' : '--disable-cli ') .
111110
($enableFpm ? '--enable-fpm ' . ($this->getLib('libacl') !== null ? '--with-fpm-acl ' : '') : '--disable-fpm ') .
@@ -118,7 +117,7 @@ public function buildPHP(int $build_target = BUILD_TARGET_NONE): void
118117
$zts .
119118
$maxExecutionTimers .
120119
$this->makeStaticExtensionArgs() . ' '
121-
);
120+
));
122121

123122
$this->emitPatchPoint('before-php-make');
124123
SourcePatcher::patchBeforeMake($this);

src/SPC/builder/macos/MacOSBuilder.php

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -118,9 +118,8 @@ public function buildPHP(int $build_target = BUILD_TARGET_NONE): void
118118
}
119119

120120
$embed_type = getenv('SPC_CMD_VAR_PHP_EMBED_TYPE') ?: 'static';
121-
shell()->cd(SOURCE_PATH . '/php-src')
122-
->exec(
123-
getenv('SPC_CMD_PREFIX_PHP_CONFIGURE') . ' ' .
121+
$this->seekPhpSrcLogFileOnException(fn () => shell()->cd(SOURCE_PATH . '/php-src')->exec(
122+
getenv('SPC_CMD_PREFIX_PHP_CONFIGURE') . ' ' .
124123
($enableCli ? '--enable-cli ' : '--disable-cli ') .
125124
($enableFpm ? '--enable-fpm ' : '--disable-fpm ') .
126125
($enableEmbed ? "--enable-embed={$embed_type} " : '--disable-embed ') .
@@ -132,7 +131,7 @@ public function buildPHP(int $build_target = BUILD_TARGET_NONE): void
132131
$zts .
133132
$this->makeStaticExtensionArgs() . ' ' .
134133
$envs_build_php
135-
);
134+
));
136135

137136
$this->emitPatchPoint('before-php-make');
138137
SourcePatcher::patchBeforeMake($this);

src/SPC/builder/unix/UnixBuilderBase.php

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
use SPC\builder\BuilderBase;
88
use SPC\builder\linux\SystemUtil as LinuxSystemUtil;
9+
use SPC\exception\SPCException;
910
use SPC\exception\SPCInternalException;
1011
use SPC\exception\ValidationException;
1112
use SPC\exception\WrongUsageException;
@@ -333,4 +334,20 @@ protected function buildFrankenphp(): void
333334
}
334335
}
335336
}
337+
338+
/**
339+
* Seek php-src/config.log when building PHP, add it to exception.
340+
*/
341+
protected function seekPhpSrcLogFileOnException(callable $callback): void
342+
{
343+
try {
344+
$callback();
345+
} catch (SPCException $e) {
346+
if (file_exists(SOURCE_PATH . '/php-src/config.log')) {
347+
$e->addExtraLogFile('php-src config.log', 'php-src.config.log');
348+
copy(SOURCE_PATH . '/php-src/config.log', SPC_LOGS_DIR . '/php-src.config.log');
349+
}
350+
throw $e;
351+
}
352+
}
336353
}

src/SPC/builder/unix/library/libxml2.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,17 +20,17 @@ public function build(): void
2020
"-DZLIB_INCLUDE_DIR={$this->getIncludeDir()}",
2121
'-DLIBXML2_WITH_ZLIB=OFF',
2222
)
23-
->optionalLib('icu', ...cmake_boolean_args('LIBXML2_WITH_ICU'))
2423
->optionalLib('xz', ...cmake_boolean_args('LIBXML2_WITH_LZMA'))
2524
->addConfigureArgs(
2625
'-DLIBXML2_WITH_ICONV=ON',
26+
'-DLIBXML2_WITH_ICU=OFF', // optional, but discouraged: https://gitlab.gnome.org/GNOME/libxml2/-/blob/master/README.md
2727
'-DLIBXML2_WITH_PYTHON=OFF',
2828
'-DLIBXML2_WITH_PROGRAMS=OFF',
2929
'-DLIBXML2_WITH_TESTS=OFF',
3030
);
3131

3232
if ($this instanceof LinuxLibraryBase) {
33-
$cmake->addConfigureArgs('-DIconv_IS_BUILD_IN=OFF');
33+
$cmake->addConfigureArgs('-DIconv_IS_BUILT_IN=OFF');
3434
}
3535

3636
$cmake->build();

src/globals/ext-tests/gettext.php

Lines changed: 29 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,20 +4,40 @@
44

55
assert(function_exists('gettext'));
66
assert(function_exists('bindtextdomain'));
7+
assert(function_exists('bind_textdomain_codeset'));
78
assert(function_exists('textdomain'));
89

9-
if (!is_dir('locale/en_US/LC_MESSAGES/')) {
10-
mkdir('locale/en_US/LC_MESSAGES/', 0755, true);
10+
foreach (['en_US', 'en_GB'] as $lc) {
11+
$dir = "locale/{$lc}/LC_MESSAGES";
12+
if (!is_dir($dir)) {
13+
mkdir($dir, 0755, true);
14+
}
15+
$mo = '3hIElQAAAAACAAAAHAAAACwAAAAFAAAAPAAAAAAAAABQAAAABgAAAFEAAAAXAQAAWAAAAAcAAABwAQAAAQAAAAAAAAAAAAAAAgAAAAAAAAAA56S65L6LAFByb2plY3QtSWQtVmVyc2lvbjogUEFDS0FHRSBWRVJTSU9OClJlcG9ydC1Nc2dpZC1CdWdzLVRvOiAKUE8tUmV2aXNpb24tRGF0ZTogWUVBUi1NTy1EQSBITzpNSytaT05FCkxhc3QtVHJhbnNsYXRvcjogRlVMTCBOQU1FIDxFTUFJTEBBRERSRVNTPgpMYW5ndWFnZS1UZWFtOiBMQU5HVUFHRSA8TExAbGkub3JnPgpMYW5ndWFnZTogCk1JTUUtVmVyc2lvbjogMS4wCkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD1VVEYtOApDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA4Yml0CgBFeGFtcGxlAA==';
16+
$path = "{$dir}/test.mo";
17+
if (!file_exists($path)) {
18+
file_put_contents($path, base64_decode($mo));
19+
}
1120
}
12-
if (!file_exists('locale/en_US/LC_MESSAGES/test.mo')) {
13-
$mo = '3hIElQAAAAACAAAAHAAAACwAAAAFAAAAPAAAAAAAAABQAAAABgAAAFEAAAAXAQAAWAAAAAcAAABwAQAAAQAAAAAAAAAAAAAAAgAAAAAAAAAA56S65L6LAFByb2plY3QtSWQtVmVyc2lvbjogUEFDS0FHRSBWRVJTSU9OClJlcG9ydC1Nc2dpZC1CdWdzLVRvOiAKUE8tUmV2aXNpb24tRGF0ZTogWUVBUi1NTy1EQSBITzpNSStaT05FCkxhc3QtVHJhbnNsYXRvcjogRlVMTCBOQU1FIDxFTUFJTEBBRERSRVNTPgpMYW5ndWFnZS1UZWFtOiBMQU5HVUFHRSA8TExAbGkub3JnPgpMYW5ndWFnZTogCk1JTUUtVmVyc2lvbjogMS4wCkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD1VVEYtOApDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA4Yml0CgBFeGFtcGxlAA==';
14-
file_put_contents('locale/en_US/LC_MESSAGES/test.mo', base64_decode($mo));
15-
}
16-
putenv('LANG=en_US');
17-
assert(setlocale(LC_ALL, 'en_US.utf-8') === 'en_US.utf-8');
21+
22+
// Probe for an available English locale
23+
$candidates = [
24+
'en_US.UTF-8', 'en_US.utf8', 'en_US.utf-8', 'en_US',
25+
'en_GB.UTF-8', 'en_GB.utf8', 'en_GB.utf-8', 'en_GB',
26+
'English_United States.65001', 'English_United States.1252',
27+
'English_United Kingdom.65001', 'English_United Kingdom.1252',
28+
];
29+
30+
$locale = setlocale(LC_ALL, $candidates);
31+
assert($locale !== false);
32+
33+
putenv('LC_ALL=' . $locale);
34+
putenv('LANG=' . $locale);
35+
putenv('LANGUAGE=' . (stripos($locale, 'US') !== false ? 'en_US:en_GB' : 'en_GB:en_US'));
1836

1937
$domain = 'test';
2038
bindtextdomain($domain, 'locale/');
39+
bind_textdomain_codeset($domain, 'UTF-8');
2140
textdomain($domain);
2241

23-
assert(gettext(json_decode('"\u793a\u4f8b"', true)) === 'Example');
42+
$src = json_decode('"\u793a\u4f8b"', true);
43+
assert(gettext($src) === 'Example');

0 commit comments

Comments
 (0)