diff --git a/config/ext.json b/config/ext.json index a5eca9f4..a98ed3e3 100644 --- a/config/ext.json +++ b/config/ext.json @@ -495,6 +495,7 @@ "type": "builtin", "arg-type": "custom", "arg-type-windows": "with", + "build-with-php": true, "lib-depends": [ "openssl", "zlib" diff --git a/src/SPC/builder/Extension.php b/src/SPC/builder/Extension.php index 84450bbd..ad208d40 100644 --- a/src/SPC/builder/Extension.php +++ b/src/SPC/builder/Extension.php @@ -12,6 +12,7 @@ use SPC\store\FileSystem; use SPC\toolchain\ToolchainManager; use SPC\toolchain\ZigToolchain; use SPC\util\SPCConfigUtil; +use SPC\util\SPCTarget; class Extension { @@ -187,6 +188,19 @@ class Extension */ public function patchBeforeMake(): bool { + if ( + PHP_OS_FAMILY === 'Linux' && + $this->isBuildShared() && + ToolchainManager::getToolchainClass() === ZigToolchain::class && + ($extra = (new ZigToolchain())->getExtraRuntimeObjects()) + ) { + FileSystem::replaceFileRegex( + $this->source_dir . '/Makefile', + "/^(shared_objects_{$this->getName()}\\s*=.*)$/m", + "$1 {$extra}", + ); + return true; + } return false; } diff --git a/src/SPC/builder/extension/amqp.php b/src/SPC/builder/extension/amqp.php index 7e0ea2de..d4df5504 100644 --- a/src/SPC/builder/extension/amqp.php +++ b/src/SPC/builder/extension/amqp.php @@ -13,6 +13,7 @@ class amqp extends Extension { public function patchBeforeMake(): bool { + $patched = parent::patchBeforeMake(); if (PHP_OS_FAMILY === 'Windows') { FileSystem::replaceFileRegex(BUILD_INCLUDE_PATH . '\amqp.h', '/^#warning.*/m', ''); FileSystem::replaceFileRegex(BUILD_INCLUDE_PATH . '\amqp_framing.h', '/^#warning.*/m', ''); @@ -20,7 +21,7 @@ class amqp extends Extension FileSystem::replaceFileRegex(BUILD_INCLUDE_PATH . '\amqp_tcp_socket.h', '/^#warning.*/m', ''); return true; } - return false; + return $patched; } public function getUnixConfigureArg(bool $shared = false): string diff --git a/src/SPC/builder/extension/curl.php b/src/SPC/builder/extension/curl.php index 9ac3fd9b..a9079830 100644 --- a/src/SPC/builder/extension/curl.php +++ b/src/SPC/builder/extension/curl.php @@ -60,13 +60,14 @@ class curl extends Extension public function patchBeforeMake(): bool { + $patched = parent::patchBeforeMake(); $extra_libs = getenv('SPC_EXTRA_LIBS'); if ($this->builder instanceof WindowsBuilder && !str_contains($extra_libs, 'secur32.lib')) { $extra_libs .= ' secur32.lib'; putenv('SPC_EXTRA_LIBS=' . trim($extra_libs)); return true; } - return false; + return $patched; } public function patchBeforeSharedConfigure(): bool diff --git a/src/SPC/builder/extension/event.php b/src/SPC/builder/extension/event.php index 95d9aba6..d2d063b2 100644 --- a/src/SPC/builder/extension/event.php +++ b/src/SPC/builder/extension/event.php @@ -41,10 +41,12 @@ class event extends Extension */ public function patchBeforeMake(): bool { + $patched = parent::patchBeforeMake(); // Prevent event extension compile error on macOS if ($this->builder instanceof MacOSBuilder) { FileSystem::replaceFileRegex(SOURCE_PATH . '/php-src/main/php_config.h', '/^#define HAVE_OPENPTY 1$/m', ''); + return true; } - return true; + return $patched; } } diff --git a/src/SPC/builder/extension/grpc.php b/src/SPC/builder/extension/grpc.php index 852f2933..53eae210 100644 --- a/src/SPC/builder/extension/grpc.php +++ b/src/SPC/builder/extension/grpc.php @@ -39,6 +39,7 @@ class grpc extends Extension public function patchBeforeMake(): bool { + parent::patchBeforeMake(); // add -Wno-strict-prototypes GlobalEnvManager::putenv('SPC_CMD_VAR_PHP_MAKE_EXTRA_CFLAGS=' . getenv('SPC_CMD_VAR_PHP_MAKE_EXTRA_CFLAGS') . ' -Wno-strict-prototypes'); return true; diff --git a/src/SPC/builder/extension/imap.php b/src/SPC/builder/extension/imap.php index f36ffb1e..81bb3164 100644 --- a/src/SPC/builder/extension/imap.php +++ b/src/SPC/builder/extension/imap.php @@ -45,8 +45,9 @@ class imap extends Extension public function patchBeforeMake(): bool { + $patched = parent::patchBeforeMake(); if (PHP_OS_FAMILY !== 'Linux' || SystemUtil::isMuslDist()) { - return false; + return $patched; } $extra_libs = trim(getenv('SPC_EXTRA_LIBS') . ' -lcrypt'); f_putenv('SPC_EXTRA_LIBS=' . $extra_libs); diff --git a/src/SPC/builder/extension/openssl.php b/src/SPC/builder/extension/openssl.php index fc4831f3..3ef4998f 100644 --- a/src/SPC/builder/extension/openssl.php +++ b/src/SPC/builder/extension/openssl.php @@ -12,6 +12,7 @@ class openssl extends Extension { public function patchBeforeMake(): bool { + $patched = parent::patchBeforeMake(); // patch openssl3 with php8.0 bug if ($this->builder->getPHPVersionID() < 80100) { $openssl_c = file_get_contents(SOURCE_PATH . '/php-src/ext/openssl/openssl.c'); @@ -20,7 +21,7 @@ class openssl extends Extension return true; } - return false; + return $patched; } public function getUnixConfigureArg(bool $shared = false): string diff --git a/src/SPC/builder/extension/opentelemetry.php b/src/SPC/builder/extension/opentelemetry.php index 4b0829e0..4b3c5aaa 100644 --- a/src/SPC/builder/extension/opentelemetry.php +++ b/src/SPC/builder/extension/opentelemetry.php @@ -34,6 +34,7 @@ class opentelemetry extends Extension public function patchBeforeMake(): bool { + parent::patchBeforeMake(); // add -Wno-strict-prototypes GlobalEnvManager::putenv('SPC_CMD_VAR_PHP_MAKE_EXTRA_CFLAGS=' . getenv('SPC_CMD_VAR_PHP_MAKE_EXTRA_CFLAGS') . ' -Wno-strict-prototypes'); return true; diff --git a/src/SPC/builder/extension/password_argon2.php b/src/SPC/builder/extension/password_argon2.php index fc30288a..4a7fd9d0 100644 --- a/src/SPC/builder/extension/password_argon2.php +++ b/src/SPC/builder/extension/password_argon2.php @@ -26,6 +26,7 @@ class password_argon2 extends Extension public function patchBeforeMake(): bool { + $patched = parent::patchBeforeMake(); if ($this->builder->getLib('libsodium') !== null) { $extraLibs = getenv('SPC_EXTRA_LIBS'); if ($extraLibs !== false) { @@ -36,8 +37,9 @@ class password_argon2 extends Extension ); $extraLibs = trim(preg_replace('/\s+/', ' ', $extraLibs)); // normalize spacing f_putenv('SPC_EXTRA_LIBS=' . $extraLibs); + return true; } } - return false; + return $patched; } } diff --git a/src/SPC/builder/extension/rdkafka.php b/src/SPC/builder/extension/rdkafka.php index cb1792c5..575ab309 100644 --- a/src/SPC/builder/extension/rdkafka.php +++ b/src/SPC/builder/extension/rdkafka.php @@ -20,6 +20,7 @@ class rdkafka extends Extension public function patchBeforeMake(): bool { + parent::patchBeforeMake(); // when compiling rdkafka with inline builds, it shows some errors, I don't know why. FileSystem::replaceFileStr( SOURCE_PATH . '/php-src/ext/rdkafka/rdkafka.c', diff --git a/src/SPC/builder/extension/swoole.php b/src/SPC/builder/extension/swoole.php index dee2ddc3..00085e8b 100644 --- a/src/SPC/builder/extension/swoole.php +++ b/src/SPC/builder/extension/swoole.php @@ -14,6 +14,7 @@ class swoole extends Extension { public function patchBeforeMake(): bool { + $patched = parent::patchBeforeMake(); if ($this->builder instanceof MacOSBuilder) { // Fix swoole with event extension conflict bug $util_path = shell()->execWithResult('xcrun --show-sdk-path', false)[1][0] . '/usr/include/util.h'; @@ -24,7 +25,7 @@ class swoole extends Extension ); return true; } - return false; + return $patched; } public function getExtVersion(): ?string diff --git a/src/SPC/builder/extension/xlswriter.php b/src/SPC/builder/extension/xlswriter.php index 878168ad..56b1988c 100644 --- a/src/SPC/builder/extension/xlswriter.php +++ b/src/SPC/builder/extension/xlswriter.php @@ -27,6 +27,7 @@ class xlswriter extends Extension public function patchBeforeMake(): bool { + $patched = parent::patchBeforeMake(); if (PHP_OS_FAMILY === 'Windows') { // fix windows build with openssl extension duplicate symbol bug SourcePatcher::patchFile('spc_fix_xlswriter_win32.patch', $this->source_dir); @@ -37,6 +38,6 @@ class xlswriter extends Extension } return true; } - return false; + return $patched; } }