diff --git a/config/lib.json b/config/lib.json index 77d032a4..d1295074 100644 --- a/config/lib.json +++ b/config/lib.json @@ -655,7 +655,7 @@ "mimalloc": { "source": "mimalloc", "static-libs-unix": [ - "mimalloc.o" + "libmimalloc.a" ] }, "ncurses": { diff --git a/src/SPC/builder/Extension.php b/src/SPC/builder/Extension.php index 234f80b0..721d1f42 100644 --- a/src/SPC/builder/Extension.php +++ b/src/SPC/builder/Extension.php @@ -548,6 +548,9 @@ class Extension $libs = explode(' ', $allLibs); foreach ($libs as $lib) { $staticLib = BUILD_LIB_PATH . '/lib' . str_replace('-l', '', $lib) . '.a'; + if (str_starts_with($lib, BUILD_LIB_PATH . '/lib') && str_ends_with($lib, '.a')) { + $staticLib = $lib; + } if ($lib === '-lphp' || !file_exists($staticLib)) { $sharedLibString .= " {$lib}"; } else { diff --git a/src/SPC/builder/linux/LinuxBuilder.php b/src/SPC/builder/linux/LinuxBuilder.php index 3bd74ead..2d42f931 100644 --- a/src/SPC/builder/linux/LinuxBuilder.php +++ b/src/SPC/builder/linux/LinuxBuilder.php @@ -88,12 +88,11 @@ class LinuxBuilder extends UnixBuilderBase $enableFrankenphp = ($build_target & BUILD_TARGET_FRANKENPHP) === BUILD_TARGET_FRANKENPHP; // prepare build php envs - $mimallocLibs = $this->getLib('mimalloc') !== null ? BUILD_LIB_PATH . '/mimalloc.o ' : ''; $php_configure_env = SystemUtil::makeEnvVarString([ 'CFLAGS' => getenv('SPC_CMD_VAR_PHP_CONFIGURE_CFLAGS'), 'CPPFLAGS' => '-I' . BUILD_INCLUDE_PATH, 'LDFLAGS' => '-L' . BUILD_LIB_PATH, - 'LIBS' => $mimallocLibs . SPCTarget::getRuntimeLibs(), // do not pass static libraries here yet, they may contain polyfills for libc functions! + 'LIBS' => SPCTarget::getRuntimeLibs(), // do not pass static libraries here yet, they may contain polyfills for libc functions! ]); $embed_type = getenv('SPC_CMD_VAR_PHP_EMBED_TYPE') ?: 'static'; diff --git a/src/SPC/builder/macos/MacOSBuilder.php b/src/SPC/builder/macos/MacOSBuilder.php index b8a8d814..3530de1b 100644 --- a/src/SPC/builder/macos/MacOSBuilder.php +++ b/src/SPC/builder/macos/MacOSBuilder.php @@ -112,12 +112,10 @@ class MacOSBuilder extends UnixBuilderBase $enableFrankenphp = ($build_target & BUILD_TARGET_FRANKENPHP) === BUILD_TARGET_FRANKENPHP; // prepare build php envs - $mimallocLibs = $this->getLib('mimalloc') !== null ? BUILD_LIB_PATH . '/mimalloc.o ' : ''; $envs_build_php = SystemUtil::makeEnvVarString([ 'CFLAGS' => getenv('SPC_CMD_VAR_PHP_CONFIGURE_CFLAGS'), 'CPPFLAGS' => '-I' . BUILD_INCLUDE_PATH, 'LDFLAGS' => '-L' . BUILD_LIB_PATH, - 'LIBS' => $mimallocLibs . getenv('SPC_CMD_VAR_PHP_CONFIGURE_LIBS'), ]); if ($this->getLib('postgresql')) { @@ -269,8 +267,7 @@ class MacOSBuilder extends UnixBuilderBase ->exec(getenv('SPC_CMD_PREFIX_PHP_MAKE') . ' INSTALL_ROOT=' . BUILD_ROOT_PATH . " {$vars} install"); if (getenv('SPC_CMD_VAR_PHP_EMBED_TYPE') === 'static') { - shell()->cd(SOURCE_PATH . '/php-src') - ->exec('ar -t ' . BUILD_LIB_PATH . "/libphp.a | grep '\\.a$' | xargs -n1 ar d " . BUILD_LIB_PATH . '/libphp.a'); + f_passthru('ar -t ' . BUILD_LIB_PATH . "/libphp.a | grep '\\.a$' | xargs -n1 ar d " . BUILD_LIB_PATH . '/libphp.a'); } $this->patchPhpScripts(); } diff --git a/src/SPC/builder/unix/library/mimalloc.php b/src/SPC/builder/unix/library/mimalloc.php index 6d89e6df..d483ed39 100644 --- a/src/SPC/builder/unix/library/mimalloc.php +++ b/src/SPC/builder/unix/library/mimalloc.php @@ -14,6 +14,7 @@ trait mimalloc $cmake = UnixCMakeExecutor::create($this) ->addConfigureArgs( '-DMI_BUILD_SHARED=OFF', + '-DMI_BUILD_OBJECT=OFF', '-DMI_INSTALL_TOPLEVEL=ON', ); if (SPCTarget::getLibc() === 'musl') { diff --git a/src/SPC/util/SPCConfigUtil.php b/src/SPC/util/SPCConfigUtil.php index c3bb83cc..08570008 100644 --- a/src/SPC/util/SPCConfigUtil.php +++ b/src/SPC/util/SPCConfigUtil.php @@ -94,8 +94,8 @@ class SPCConfigUtil if ($this->libs_only_deps) { // mimalloc must come first - if (str_contains($libs, BUILD_LIB_PATH . '/mimalloc.o')) { - $libs = BUILD_LIB_PATH . '/mimalloc.o ' . str_replace(BUILD_LIB_PATH . '/mimalloc.o', '', $libs); + if ($this->builder->getLib('mimalloc') && file_exists(BUILD_LIB_PATH . '/libmimalloc.a')) { + $libs = BUILD_LIB_PATH . '/libmimalloc.a ' . str_replace([BUILD_LIB_PATH . '/libmimalloc.a', '-lmimalloc'], ['', ''], $libs); } return [ 'cflags' => clean_spaces(getenv('CFLAGS') . ' ' . $cflags), @@ -112,8 +112,8 @@ class SPCConfigUtil $allLibs = getenv('LIBS') . ' ' . $libs; // mimalloc must come first - if (str_contains($libs, BUILD_LIB_PATH . '/mimalloc.o')) { - $allLibs = BUILD_LIB_PATH . '/mimalloc.o ' . str_replace(BUILD_LIB_PATH . '/mimalloc.o', '', $allLibs); + if ($this->builder->getLib('mimalloc') && file_exists(BUILD_LIB_PATH . '/libmimalloc.a')) { + $allLibs = BUILD_LIB_PATH . '/libmimalloc.a ' . str_replace([BUILD_LIB_PATH . '/libmimalloc.a', '-lmimalloc'], ['', ''], $allLibs); } return [ diff --git a/tests/SPC/util/SPCConfigUtilTest.php b/tests/SPC/util/SPCConfigUtilTest.php index c37f01f3..7b8baa6c 100644 --- a/tests/SPC/util/SPCConfigUtilTest.php +++ b/tests/SPC/util/SPCConfigUtilTest.php @@ -57,18 +57,18 @@ class SPCConfigUtilTest extends TestCase $result = (new SPCConfigUtil())->config(['rar']); $this->assertStringContainsString(PHP_OS_FAMILY === 'Darwin' ? '-lc++' : '-lstdc++', $result['libs']); - // has mimalloc.o in lib dir + // has libmimalloc.a in lib dir // backup first - if (file_exists(BUILD_LIB_PATH . '/mimalloc.o')) { - $bak = file_get_contents(BUILD_LIB_PATH . '/mimalloc.o'); - @unlink(BUILD_LIB_PATH . '/mimalloc.o'); + if (file_exists(BUILD_LIB_PATH . '/libmimalloc.a')) { + $bak = file_get_contents(BUILD_LIB_PATH . '/libmimalloc.a'); + @unlink(BUILD_LIB_PATH . '/libmimalloc.a'); } - file_put_contents(BUILD_LIB_PATH . '/mimalloc.o', ''); + file_put_contents(BUILD_LIB_PATH . '/libmimalloc.a', ''); $result = (new SPCConfigUtil())->config(['bcmath'], ['mimalloc']); - $this->assertStringStartsWith(BUILD_LIB_PATH . '/mimalloc.o', $result['libs']); - @unlink(BUILD_LIB_PATH . '/mimalloc.o'); + $this->assertStringStartsWith(BUILD_LIB_PATH . '/libmimalloc.a', $result['libs']); + @unlink(BUILD_LIB_PATH . '/libmimalloc.a'); if (isset($bak)) { - file_put_contents(BUILD_LIB_PATH . '/mimalloc.o', $bak); + file_put_contents(BUILD_LIB_PATH . '/libmimalloc.a', $bak); } } }