From 80687dfea3787f2729d76c10377a6c726684f440 Mon Sep 17 00:00:00 2001 From: Jerry Ma Date: Thu, 19 Jun 2025 19:31:25 +0800 Subject: [PATCH] Add macOS strip option `-S`, fix macOS micro strip option (#778) * Add macOS strip option `-S`, fix macOS micro strip option * Change docs and help messages --- docs/en/faq/index.md | 14 ++++---------- docs/en/guide/manual-build.md | 2 +- docs/zh/faq/index.md | 14 ++++---------- docs/zh/guide/manual-build.md | 2 +- src/SPC/builder/macos/MacOSBuilder.php | 15 +++++++++------ src/SPC/command/BuildPHPCommand.php | 7 +------ src/globals/test-extensions.php | 22 +++++++++++----------- 7 files changed, 31 insertions(+), 45 deletions(-) diff --git a/docs/en/faq/index.md b/docs/en/faq/index.md index 1e8e0a47..a942244c 100644 --- a/docs/en/faq/index.md +++ b/docs/en/faq/index.md @@ -38,17 +38,11 @@ buildroot/bin/php -d "zend_extension=/path/to/php{PHP_VER}-{ts/nts}/xdebug.so" - ``` For macOS platform, almost all binaries under macOS cannot be truly purely statically linked, and almost all binaries will link macOS system libraries: `/usr/lib/libresolv.9.dylib` and `/usr/lib/libSystem.B.dylib`. -So on macOS, you can use statically compiled PHP binaries under certain compilation conditions, and dynamically linked extensions: +So on macOS, you can **directly** use SPC to build statically compiled PHP binaries with dynamically linked extensions: -1. Using the `--no-strip` parameter will not strip information such as debugging symbols from the binary file for use with external Zend extensions such as `Xdebug`. -2. If you want to compile some Zend extensions, use Homebrew, MacPorts, source code compilation, and install a normal version of PHP on your operating system. -3. Use the `phpize && ./configure && make` command to compile the extensions you want to use. -4. Copy the extension file `xxxx.so` to the outside, use the statically compiled PHP binary, for example to use the Xdebug extension: `cd buildroot/bin/ && ./php -d "zend_extension=/path/to/xdebug.so"`. - -```bash -# build statically linked php-cli but not stripped -bin/spc build ffi --build-cli --no-strip -``` +1. Build shared extension `xxx.so` using: `--build-shared=XXX` option. e.g. `bin/spc build bcmath,zlib --build-shared=xdebug --build-cli` +2. You will get `buildroot/modules/xdebug.so` and `buildroot/bin/php`. +3. The `xdebug.so` file could be used for php that version and thread-safe are the same. ## Can it support Oracle database extension? diff --git a/docs/en/guide/manual-build.md b/docs/en/guide/manual-build.md index 13038360..e8e4510e 100644 --- a/docs/en/guide/manual-build.md +++ b/docs/en/guide/manual-build.md @@ -339,7 +339,7 @@ You can try to use the following commands: - `--cxx=XXX`: Specifies the execution command of the C++ language compiler (Linux defaults to `g++`, macOS defaults to `clang++`) - `--with-clean`: clean up old make files before compiling PHP - `--enable-zts`: Make compiled PHP thread-safe version (default is NTS version) -- `--no-strip`: Do not run `strip` after compiling the PHP library to trim the binary file to reduce its size (the macOS binary file without trim can use dynamically linked third-party extensions) +- `--no-strip`: Do not run `strip` after compiling the PHP library to trim the binary file to reduce its size - `--with-libs=XXX,YYY`: Compile the specified dependent library before compiling PHP, and activate some extended optional functions (such as libavif of the gd library, etc.) - `--with-config-file-path=XXX`: Set the path in which to look for `php.ini` (Check [here](../faq/index.html#what-is-the-path-of-php-ini) for default paths) - `--with-config-file-scan-dir=XXX`: Set the directory to scan for `.ini` files after reading `php.ini` (Check [here](../faq/index.html#what-is-the-path-of-php-ini) for default paths) diff --git a/docs/zh/faq/index.md b/docs/zh/faq/index.md index 4367b35b..4dfbade4 100644 --- a/docs/zh/faq/index.md +++ b/docs/zh/faq/index.md @@ -35,17 +35,11 @@ buildroot/bin/php -d "zend_extension=/path/to/php{PHP_VER}-{ts/nts}/xdebug.so" - ``` 对于 macOS 平台来说,macOS 下的几乎所有二进制文件都无法真正纯静态链接,几乎所有二进制文件都会链接 macOS 的系统库:`/usr/lib/libresolv.9.dylib` 和 `/usr/lib/libSystem.B.dylib`。 -所以在 macOS 系统下,在特定的编译条件下可以使用静态编译的 php 二进制文件,可使用动态链接的扩展: +因此,在 macOS 上,您可以直接构建出使用静态编译的 PHP 二进制文件和动态链接的扩展: -1. 使用 `--no-strip` 参数,将不会对二进制文件去除调试符号等信息,以供使用 `Xdebug` 等外部 Zend 扩展。 -2. 如果要编译某些 Zend 扩展,使用 Homebrew、MacPorts、源码编译的形式,在所在的操作系统安装一个普通版本的 PHP。 -3. 使用 `phpize && ./configure && make` 命令编译想要使用的扩展。 -4. 将扩展文件 `xxxx.so` 拷贝到外部,使用静态编译的 PHP 二进制,例如使用 Xdebug 扩展:`cd buildroot/bin/ && ./php -d "zend_extension=/path/to/xdebug.so"`。 - -```bash -# 构建静态 php-cli -bin/spc build ffi --build-cli --no-strip -``` +1. 使用 `--build-shared=XXX` 选项构建共享扩展 `xxx.so`。例如:`bin/spc build bcmath,zlib --build-shared=xdebug --build-cli` +2. 您将获得 `buildroot/modules/xdebug.so` 和 `buildroot/bin/php`。 +3. `xdebug.so` 文件可用于版本和线程安全相同的 php。 ## 可以支持 Oracle 数据库扩展吗 diff --git a/docs/zh/guide/manual-build.md b/docs/zh/guide/manual-build.md index 0db0bc86..5301fca1 100644 --- a/docs/zh/guide/manual-build.md +++ b/docs/zh/guide/manual-build.md @@ -296,7 +296,7 @@ bin/spc build bcmath,curl,openssl,ftp,posix,pcntl --build-cli - `--cxx=XXX`: 指定 C++ 语言编译器的执行命令(Linux 默认 `g++`,macOS 默认 `clang++`) - `--with-clean`: 编译 PHP 前先清理旧的 make 产生的文件 - `--enable-zts`: 让编译的 PHP 为线程安全版本(默认为 NTS 版本) -- `--no-strip`: 编译 PHP 库后不运行 `strip` 裁剪二进制文件缩小体积(不裁剪的 macOS 二进制文件可使用动态链接的第三方扩展) +- `--no-strip`: 编译 PHP 库后不运行 `strip` 裁剪二进制文件缩小体积 - `--with-libs=XXX,YYY`: 编译 PHP 前先编译指定的依赖库,激活部分扩展的可选功能(例如 gd 库的 libavif 等) - `--with-config-file-path=XXX`: 查找 `php.ini` 的路径(在 [这里](../faq/index.html#php-ini-的路径是什么) 查看默认路径) - `--with-config-file-scan-dir=XXX`: 读取 `php.ini` 后扫描 `.ini` 文件的目录(在 [这里](../faq/index.html#php-ini-的路径是什么) 查看默认路径) diff --git a/src/SPC/builder/macos/MacOSBuilder.php b/src/SPC/builder/macos/MacOSBuilder.php index 153da08c..d43aab4a 100644 --- a/src/SPC/builder/macos/MacOSBuilder.php +++ b/src/SPC/builder/macos/MacOSBuilder.php @@ -207,7 +207,7 @@ class MacOSBuilder extends UnixBuilderBase $SPC_CMD_PREFIX_PHP_MAKE = getenv('SPC_CMD_PREFIX_PHP_MAKE') ?: 'make'; $shell->exec("{$SPC_CMD_PREFIX_PHP_MAKE} {$vars} cli"); if (!$this->getOption('no-strip', false)) { - $shell->exec('dsymutil -f sapi/cli/php')->exec('strip sapi/cli/php'); + $shell->exec('dsymutil -f sapi/cli/php')->exec('strip -S sapi/cli/php'); } $this->deployBinary(BUILD_TARGET_CLI); } @@ -234,12 +234,15 @@ class MacOSBuilder extends UnixBuilderBase // patch fake cli for micro $vars['EXTRA_CFLAGS'] .= $enable_fake_cli; - if ($this->getOption('no-strip', false)) { - $vars['STRIP'] = 'dsymutil -f '; - } $vars = SystemUtil::makeEnvVarString($vars); - shell()->cd(SOURCE_PATH . '/php-src')->exec(getenv('SPC_CMD_PREFIX_PHP_MAKE') . " {$vars} micro"); + $shell = shell()->cd(SOURCE_PATH . '/php-src'); + // build + $shell->exec(getenv('SPC_CMD_PREFIX_PHP_MAKE') . " {$vars} micro"); + // strip + if (!$this->getOption('no-strip', false)) { + $shell->exec('dsymutil -f sapi/micro/micro.sfx')->exec('strip -S sapi/micro/micro.sfx'); + } $this->deployBinary(BUILD_TARGET_MICRO); @@ -261,7 +264,7 @@ class MacOSBuilder extends UnixBuilderBase $shell = shell()->cd(SOURCE_PATH . '/php-src'); $shell->exec(getenv('SPC_CMD_PREFIX_PHP_MAKE') . " {$vars} fpm"); if (!$this->getOption('no-strip', false)) { - $shell->exec('dsymutil -f sapi/fpm/php-fpm')->exec('strip sapi/fpm/php-fpm'); + $shell->exec('dsymutil -f sapi/fpm/php-fpm')->exec('strip -S sapi/fpm/php-fpm'); } $this->deployBinary(BUILD_TARGET_FPM); } diff --git a/src/SPC/command/BuildPHPCommand.php b/src/SPC/command/BuildPHPCommand.php index e40a7d83..571c9e85 100644 --- a/src/SPC/command/BuildPHPCommand.php +++ b/src/SPC/command/BuildPHPCommand.php @@ -34,7 +34,7 @@ class BuildPHPCommand extends BuildCommand $this->addOption('build-embed', null, InputOption::VALUE_OPTIONAL, 'Build embed SAPI (not available on Windows)'); $this->addOption('build-frankenphp', null, null, 'Build FrankenPHP SAPI (not available on Windows)'); $this->addOption('build-all', null, null, 'Build all SAPI'); - $this->addOption('no-strip', null, null, 'build without strip, in order to debug and load external extensions'); + $this->addOption('no-strip', null, null, 'build without strip, keep symbols to debug'); $this->addOption('disable-opcache-jit', null, null, 'disable opcache jit'); $this->addOption('with-config-file-path', null, InputOption::VALUE_REQUIRED, 'Set the path in which to look for php.ini', $isWindows ? null : '/usr/local/etc/php'); $this->addOption('with-config-file-scan-dir', null, InputOption::VALUE_REQUIRED, 'Set the directory to scan for .ini files after reading php.ini', $isWindows ? null : '/usr/local/etc/php/conf.d'); @@ -62,11 +62,6 @@ class BuildPHPCommand extends BuildCommand $rule = $this->parseRules($shared_extensions); // check dynamic extension build env - // macOS must use --no-strip option - if (!empty($shared_extensions) && PHP_OS_FAMILY === 'Darwin' && !$this->getOption('no-strip')) { - $this->output->writeln('MacOS does not support dynamic extension loading with stripped binary, please use --no-strip option!'); - return static::FAILURE; - } // linux must build with glibc if (!empty($shared_extensions) && PHP_OS_FAMILY === 'Linux' && getenv('SPC_LIBC') !== 'glibc') { $this->output->writeln('Linux does not support dynamic extension loading with musl-libc full-static build, please build with glibc!'); diff --git a/src/globals/test-extensions.php b/src/globals/test-extensions.php index 229da487..955d72cc 100644 --- a/src/globals/test-extensions.php +++ b/src/globals/test-extensions.php @@ -13,9 +13,9 @@ declare(strict_types=1); // test php version (8.1 ~ 8.4 available, multiple for matrix) $test_php_version = [ - // '8.1', - // '8.2', - // '8.3', + '8.1', + '8.2', + '8.3', '8.4', ]; @@ -24,16 +24,16 @@ $test_os = [ 'macos-13', // 'macos-14', 'macos-15', - 'ubuntu-latest', - 'ubuntu-22.04', - 'ubuntu-24.04', - 'ubuntu-22.04-arm', - 'ubuntu-24.04-arm', + // 'ubuntu-latest', + // 'ubuntu-22.04', + // 'ubuntu-24.04', + // 'ubuntu-22.04-arm', + // 'ubuntu-24.04-arm', // 'windows-latest', ]; // whether enable thread safe -$zts = true; +$zts = false; $no_strip = false; @@ -41,10 +41,10 @@ $no_strip = false; $upx = false; // whether to test frankenphp build, only available for macos and linux -$frankenphp = true; +$frankenphp = false; // prefer downloading pre-built packages to speed up the build process -$prefer_pre_built = false; +$prefer_pre_built = true; // If you want to test your added extensions and libs, add below (comma separated, example `bcmath,openssl`). $extensions = match (PHP_OS_FAMILY) {