diff --git a/config/env.ini b/config/env.ini index 0fbcd6934..044de07b7 100644 --- a/config/env.ini +++ b/config/env.ini @@ -105,8 +105,6 @@ SPC_MICRO_PATCHES=cli_checks,disable_huge_page SPC_CMD_PREFIX_PHP_BUILDCONF="./buildconf --force" ; configure command SPC_CMD_PREFIX_PHP_CONFIGURE="./configure --prefix= --with-valgrind=no --disable-shared --enable-static --disable-all --disable-phpdbg --with-pic" -; make command -SPC_CMD_PREFIX_PHP_MAKE="make -j${SPC_CONCURRENCY}" ; *** default build vars for building php *** ; embed type for php, static (libphp.a) or shared (libphp.so) @@ -139,8 +137,6 @@ SPC_MICRO_PATCHES=cli_checks,macos_iconv SPC_CMD_PREFIX_PHP_BUILDCONF="./buildconf --force" ; configure command SPC_CMD_PREFIX_PHP_CONFIGURE="./configure --prefix= --with-valgrind=no --enable-shared=no --enable-static=yes --disable-all --disable-phpdbg" -; make command -SPC_CMD_PREFIX_PHP_MAKE="make -j${SPC_CONCURRENCY}" ; *** default build vars for building php *** ; embed type for php, static (libphp.a) or shared (libphp.dylib) diff --git a/config/ext.json b/config/ext.json index e8e21d689..59ff43524 100644 --- a/config/ext.json +++ b/config/ext.json @@ -687,7 +687,7 @@ "type": "builtin", "arg-type": "with-path", "lib-depends": [ - "readline" + "libedit" ], "target": [ "static" diff --git a/config/lib.json b/config/lib.json index ac2c5705e..81335539b 100644 --- a/config/lib.json +++ b/config/lib.json @@ -345,6 +345,15 @@ ], "cpp-library": true }, + "libedit": { + "source": "libedit", + "static-libs-unix": [ + "libedit.a" + ], + "lib-depends": [ + "ncurses" + ] + }, "libevent": { "source": "libevent", "static-libs-unix": [ diff --git a/config/source.json b/config/source.json index 7b5b6c25f..40a44f2d4 100644 --- a/config/source.json +++ b/config/source.json @@ -498,6 +498,16 @@ "path": "COPYING" } }, + "libedit": { + "type": "filelist", + "url": "https://thrysoee.dk/editline/", + "regex": "/href=\"(?libedit-(?[^\"]+)\\.tar\\.gz)\"/", + "provide-pre-built": true, + "license": { + "type": "file", + "path": "COPYING" + } + }, "libevent": { "type": "ghrel", "repo": "libevent/libevent", @@ -546,7 +556,7 @@ "provide-pre-built": true, "license": { "type": "file", - "path": "COPYING" + "path": "COPYING.LIB" } }, "libiconv-win": { diff --git a/src/SPC/builder/Extension.php b/src/SPC/builder/Extension.php index a8e875191..5b6a33293 100644 --- a/src/SPC/builder/Extension.php +++ b/src/SPC/builder/Extension.php @@ -305,7 +305,7 @@ public function runCliCheckUnix(): void // Run compile check if build target is cli // If you need to run some check, overwrite this or add your assert in src/globals/ext-tests/{extension_name}.php $sharedExtensions = $this->getSharedExtensionLoadString(); - [$ret, $out] = shell()->execWithResult(BUILD_BIN_PATH . '/php -n' . $sharedExtensions . ' --ri "' . $this->getDistName() . '"'); + [$ret] = shell()->execWithResult(BUILD_BIN_PATH . '/php -n' . $sharedExtensions . ' --ri "' . $this->getDistName() . '"'); if ($ret !== 0) { throw new ValidationException( "extension {$this->getName()} failed compile check: php-cli returned {$ret}", @@ -335,7 +335,7 @@ public function runCliCheckWindows(): void { // Run compile check if build target is cli // If you need to run some check, overwrite this or add your assert in src/globals/ext-tests/{extension_name}.php - [$ret] = cmd()->execWithResult(BUILD_ROOT_PATH . '/bin/php.exe -n --ri "' . $this->getDistName() . '"', false); + [$ret] = cmd()->execWithResult(BUILD_BIN_PATH . '/php.exe -n --ri "' . $this->getDistName() . '"', false); if ($ret !== 0) { throw new ValidationException("extension {$this->getName()} failed compile check: php-cli returned {$ret}", validation_module: "Extension {$this->getName()} sanity check"); } diff --git a/src/SPC/builder/extension/readline.php b/src/SPC/builder/extension/readline.php index a8ee48aa0..035d7b438 100644 --- a/src/SPC/builder/extension/readline.php +++ b/src/SPC/builder/extension/readline.php @@ -5,6 +5,7 @@ namespace SPC\builder\extension; use SPC\builder\Extension; +use SPC\exception\ValidationException; use SPC\store\FileSystem; use SPC\util\CustomExt; @@ -23,12 +24,7 @@ public function patchBeforeConfigure(): bool public function getUnixConfigureArg(bool $shared = false): string { - $enable = '--without-libedit --with-readline=' . BUILD_ROOT_PATH; - if ($this->builder->getPHPVersionID() < 84000) { - // the check uses `char rl_pending_input()` instead of `extern int rl_pending_input`, which makes LTO fail - $enable .= ' ac_cv_lib_readline_rl_pending_input=yes'; - } - return $enable; + return '--with-libedit --without-readline'; } public function buildUnixShared(): void @@ -39,4 +35,13 @@ public function buildUnixShared(): void } parent::buildUnixShared(); } + + public function runCliCheckUnix(): void + { + parent::runCliCheckUnix(); + [$ret, $out] = shell()->execWithResult('printf "exit\n" | ' . BUILD_BIN_PATH . '/php -a'); + if ($ret !== 0 || !str_contains(implode("\n", $out), 'Interactive shell')) { + throw new ValidationException("readline extension failed sanity check. Code: {$ret}, output: " . implode("\n", $out)); + } + } } diff --git a/src/SPC/builder/linux/LinuxBuilder.php b/src/SPC/builder/linux/LinuxBuilder.php index 299cdb644..97183ba73 100644 --- a/src/SPC/builder/linux/LinuxBuilder.php +++ b/src/SPC/builder/linux/LinuxBuilder.php @@ -107,19 +107,19 @@ public function buildPHP(int $build_target = BUILD_TARGET_NONE): void $this->seekPhpSrcLogFileOnException(fn () => shell()->cd(SOURCE_PATH . '/php-src')->exec( $php_configure_env . ' ' . - getenv('SPC_CMD_PREFIX_PHP_CONFIGURE') . ' ' . - ($enableCli ? '--enable-cli ' : '--disable-cli ') . - ($enableFpm ? '--enable-fpm ' . ($this->getLib('libacl') !== null ? '--with-fpm-acl ' : '') : '--disable-fpm ') . - ($enableEmbed ? "--enable-embed={$embed_type} " : '--disable-embed ') . - ($enableMicro ? '--enable-micro=all-static ' : '--disable-micro ') . - ($enableCgi ? '--enable-cgi ' : '--disable-cgi ') . - $config_file_path . - $config_file_scan_dir . - $json_74 . - $zts . - $maxExecutionTimers . - "{$phpvars} " . - $this->makeStaticExtensionArgs() . ' ' + getenv('SPC_CMD_PREFIX_PHP_CONFIGURE') . ' ' . + ($enableCli ? '--enable-cli ' : '--disable-cli ') . + ($enableFpm ? '--enable-fpm ' . ($this->getLib('libacl') !== null ? '--with-fpm-acl ' : '') : '--disable-fpm ') . + ($enableEmbed ? "--enable-embed={$embed_type} " : '--disable-embed ') . + ($enableMicro ? '--enable-micro=all-static ' : '--disable-micro ') . + ($enableCgi ? '--enable-cgi ' : '--disable-cgi ') . + $config_file_path . + $config_file_scan_dir . + $json_74 . + $zts . + $maxExecutionTimers . + $phpvars . ' ' . + $this->makeStaticExtensionArgs() . ' ' )); $this->emitPatchPoint('before-php-make'); @@ -179,16 +179,17 @@ public function testPHP(int $build_target = BUILD_TARGET_NONE) */ protected function buildCli(): void { - if ($this->getExt('readline')) { + if ($this->getExt('readline') && SPCTarget::isStatic()) { SourcePatcher::patchFile('musl_static_readline.patch', SOURCE_PATH . '/php-src'); } + $vars = SystemUtil::makeEnvVarString($this->getMakeExtraVars()); - $SPC_CMD_PREFIX_PHP_MAKE = getenv('SPC_CMD_PREFIX_PHP_MAKE') ?: 'make'; + $concurrency = getenv('SPC_CONCURRENCY') ? '-j' . getenv('SPC_CONCURRENCY') : ''; shell()->cd(SOURCE_PATH . '/php-src') ->exec('sed -i "s|//lib|/lib|g" Makefile') - ->exec("{$SPC_CMD_PREFIX_PHP_MAKE} {$vars} cli"); + ->exec("make {$concurrency} {$vars} cli"); - if ($this->getExt('readline')) { + if ($this->getExt('readline') && SPCTarget::isStatic()) { SourcePatcher::patchFile('musl_static_readline.patch', SOURCE_PATH . '/php-src', true); } @@ -206,10 +207,10 @@ protected function buildCli(): void protected function buildCgi(): void { $vars = SystemUtil::makeEnvVarString($this->getMakeExtraVars()); - $SPC_CMD_PREFIX_PHP_MAKE = getenv('SPC_CMD_PREFIX_PHP_MAKE') ?: 'make'; + $concurrency = getenv('SPC_CONCURRENCY') ? '-j' . getenv('SPC_CONCURRENCY') : ''; shell()->cd(SOURCE_PATH . '/php-src') ->exec('sed -i "s|//lib|/lib|g" Makefile') - ->exec("{$SPC_CMD_PREFIX_PHP_MAKE} {$vars} cgi"); + ->exec("make {$concurrency} {$vars} cgi"); if (!$this->getOption('no-strip', false)) { shell()->cd(SOURCE_PATH . '/php-src/sapi/cgi')->exec('strip --strip-unneeded php-cgi'); @@ -241,11 +242,11 @@ protected function buildMicro(): void // patch fake cli for micro $vars['EXTRA_CFLAGS'] .= $enable_fake_cli; $vars = SystemUtil::makeEnvVarString($vars); - $SPC_CMD_PREFIX_PHP_MAKE = getenv('SPC_CMD_PREFIX_PHP_MAKE') ?: 'make'; + $concurrency = getenv('SPC_CONCURRENCY') ? '-j' . getenv('SPC_CONCURRENCY') : ''; shell()->cd(SOURCE_PATH . '/php-src') ->exec('sed -i "s|//lib|/lib|g" Makefile') - ->exec("{$SPC_CMD_PREFIX_PHP_MAKE} {$vars} micro"); + ->exec("make {$concurrency} {$vars} micro"); $this->processMicroUPX(); @@ -262,10 +263,10 @@ protected function buildMicro(): void protected function buildFpm(): void { $vars = SystemUtil::makeEnvVarString($this->getMakeExtraVars()); - $SPC_CMD_PREFIX_PHP_MAKE = getenv('SPC_CMD_PREFIX_PHP_MAKE') ?: 'make'; + $concurrency = getenv('SPC_CONCURRENCY') ? '-j' . getenv('SPC_CONCURRENCY') : ''; shell()->cd(SOURCE_PATH . '/php-src') ->exec('sed -i "s|//lib|/lib|g" Makefile') - ->exec("{$SPC_CMD_PREFIX_PHP_MAKE} {$vars} fpm"); + ->exec("make {$concurrency} {$vars} fpm"); if (!$this->getOption('no-strip', false)) { shell()->cd(SOURCE_PATH . '/php-src/sapi/fpm')->exec('strip --strip-unneeded php-fpm'); @@ -283,11 +284,11 @@ protected function buildFpm(): void protected function buildEmbed(): void { $vars = SystemUtil::makeEnvVarString($this->getMakeExtraVars()); - + $concurrency = getenv('SPC_CONCURRENCY') ? '-j' . getenv('SPC_CONCURRENCY') : ''; shell()->cd(SOURCE_PATH . '/php-src') ->exec('sed -i "s|//lib|/lib|g" Makefile') ->exec('sed -i "s|^EXTENSION_DIR = .*|EXTENSION_DIR = /' . basename(BUILD_MODULES_PATH) . '|" Makefile') - ->exec(getenv('SPC_CMD_PREFIX_PHP_MAKE') . ' INSTALL_ROOT=' . BUILD_ROOT_PATH . " {$vars} install"); + ->exec("make {$concurrency} INSTALL_ROOT=" . BUILD_ROOT_PATH . " {$vars} install"); $ldflags = getenv('SPC_CMD_VAR_PHP_MAKE_EXTRA_LDFLAGS') ?: ''; $libDir = BUILD_LIB_PATH; diff --git a/src/SPC/builder/linux/library/libedit.php b/src/SPC/builder/linux/library/libedit.php new file mode 100644 index 000000000..ef8692126 --- /dev/null +++ b/src/SPC/builder/linux/library/libedit.php @@ -0,0 +1,12 @@ +getMakeExtraVars()); $shell = shell()->cd(SOURCE_PATH . '/php-src'); - $SPC_CMD_PREFIX_PHP_MAKE = getenv('SPC_CMD_PREFIX_PHP_MAKE') ?: 'make'; - $shell->exec("{$SPC_CMD_PREFIX_PHP_MAKE} {$vars} cli"); + $concurrency = getenv('SPC_CONCURRENCY') ? '-j' . getenv('SPC_CONCURRENCY') : ''; + $shell->exec("make {$concurrency} {$vars} cli"); if (!$this->getOption('no-strip', false)) { $shell->exec('dsymutil -f sapi/cli/php')->exec('strip -S sapi/cli/php'); } @@ -199,8 +199,8 @@ protected function buildCgi(): void $vars = SystemUtil::makeEnvVarString($this->getMakeExtraVars()); $shell = shell()->cd(SOURCE_PATH . '/php-src'); - $SPC_CMD_PREFIX_PHP_MAKE = getenv('SPC_CMD_PREFIX_PHP_MAKE') ?: 'make'; - $shell->exec("{$SPC_CMD_PREFIX_PHP_MAKE} {$vars} cgi"); + $concurrency = getenv('SPC_CONCURRENCY') ? '-j' . getenv('SPC_CONCURRENCY') : ''; + $shell->exec("make {$concurrency} {$vars} cgi"); if (!$this->getOption('no-strip', false)) { $shell->exec('dsymutil -f sapi/cgi/php-cgi')->exec('strip -S sapi/cgi/php-cgi'); } @@ -229,7 +229,8 @@ protected function buildMicro(): void $shell = shell()->cd(SOURCE_PATH . '/php-src'); // build - $shell->exec(getenv('SPC_CMD_PREFIX_PHP_MAKE') . " {$vars} micro"); + $concurrency = getenv('SPC_CONCURRENCY') ? '-j' . getenv('SPC_CONCURRENCY') : ''; + $shell->exec("make {$concurrency} {$vars} micro"); // strip if (!$this->getOption('no-strip', false)) { $shell->exec('dsymutil -f sapi/micro/micro.sfx')->exec('strip -S sapi/micro/micro.sfx'); @@ -250,7 +251,8 @@ protected function buildFpm(): void $vars = SystemUtil::makeEnvVarString($this->getMakeExtraVars()); $shell = shell()->cd(SOURCE_PATH . '/php-src'); - $shell->exec(getenv('SPC_CMD_PREFIX_PHP_MAKE') . " {$vars} fpm"); + $concurrency = getenv('SPC_CONCURRENCY') ? '-j' . getenv('SPC_CONCURRENCY') : ''; + $shell->exec("make {$concurrency} {$vars} fpm"); if (!$this->getOption('no-strip', false)) { $shell->exec('dsymutil -f sapi/fpm/php-fpm')->exec('strip -S sapi/fpm/php-fpm'); } @@ -263,9 +265,9 @@ protected function buildFpm(): void protected function buildEmbed(): void { $vars = SystemUtil::makeEnvVarString($this->getMakeExtraVars()); - + $concurrency = getenv('SPC_CONCURRENCY') ? '-j' . getenv('SPC_CONCURRENCY') : ''; shell()->cd(SOURCE_PATH . '/php-src') - ->exec(getenv('SPC_CMD_PREFIX_PHP_MAKE') . ' INSTALL_ROOT=' . BUILD_ROOT_PATH . " {$vars} install"); + ->exec("make {$concurrency} INSTALL_ROOT=" . BUILD_ROOT_PATH . " {$vars} install"); if (getenv('SPC_CMD_VAR_PHP_EMBED_TYPE') === 'static') { $AR = getenv('AR') ?: 'ar'; diff --git a/src/SPC/builder/macos/library/libedit.php b/src/SPC/builder/macos/library/libedit.php new file mode 100644 index 000000000..18d2c3d11 --- /dev/null +++ b/src/SPC/builder/macos/library/libedit.php @@ -0,0 +1,12 @@ +appendEnv(['CFLAGS' => '-D__STDC_ISO_10646__=201103L']) + ->configure() + ->make(); + $this->patchPkgconfPrefix(['libedit.pc']); + } +} diff --git a/src/globals/test-extensions.php b/src/globals/test-extensions.php index 05b617d2d..99e4e31ba 100644 --- a/src/globals/test-extensions.php +++ b/src/globals/test-extensions.php @@ -26,10 +26,10 @@ 'macos-15-intel', // bin/spc for x86_64 'macos-15', // bin/spc for arm64 // 'ubuntu-latest', // bin/spc-alpine-docker for x86_64 - // 'ubuntu-22.04', // bin/spc-gnu-docker for x86_64 - // 'ubuntu-24.04', // bin/spc for x86_64 - // 'ubuntu-22.04-arm', // bin/spc-gnu-docker for arm64 - // 'ubuntu-24.04-arm', // bin/spc for arm64 + 'ubuntu-22.04', // bin/spc-gnu-docker for x86_64 + 'ubuntu-24.04', // bin/spc for x86_64 + 'ubuntu-22.04-arm', // bin/spc-gnu-docker for arm64 + 'ubuntu-24.04-arm', // bin/spc for arm64 // 'windows-latest', // .\bin\spc.ps1 ];