From 29a8c9c1968e26d90a093ace9dd2520872c67e9e Mon Sep 17 00:00:00 2001 From: henderkes Date: Sun, 24 May 2026 21:28:31 +0700 Subject: [PATCH 1/5] libraries: honour SPC_DEFAULT_CFLAGS/CXXFLAGS/LDFLAGS and bug fixes bzip2, fastlz, jbig, qdbm: thread SPC_DEFAULT_CFLAGS into the hand-rolled Makefile patches and shell compile commands. Backward compatible when the env var is empty. icu: append SPC_DEFAULT_CXXFLAGS/LDFLAGS to runConfigureICU's CXXFLAGS and LDFLAGS so user flags reach the bundled cxx invocation. openssl: append user CFLAGS/LDFLAGS after the target name on Configure so options like -flto and -fprofile-* reach the openssl build. libheif: rewrite libheif 1.22+'s C-incompatible `struct heif_bad_pixel { uint32_t row; uint32_t column; };` as a typedef so C consumers compile. ncurses: filter the clang/zig-cc "N warning(s) generated." stdout line out of MKlib_gen.sh's preprocessor pipe before sed turns it into invalid C in lib_gen.c. libaom: detect target CPU from SystemTarget instead of hard-coding generic, fall back to generic only when neither nasm nor yasm is available, and turn off examples/tests/tools/docs. --- src/Package/Library/bzip2.php | 4 +++- src/Package/Library/fastlz.php | 4 +++- src/Package/Library/icu.php | 7 +++++-- src/Package/Library/jbig.php | 4 +++- src/Package/Library/libaom.php | 18 +++++++++++++++++- src/Package/Library/libheif.php | 11 +++++++++++ src/Package/Library/ncurses.php | 20 ++++++++++++++++++++ src/Package/Library/openssl.php | 9 ++++++++- src/Package/Library/qdbm.php | 5 +++++ 9 files changed, 75 insertions(+), 7 deletions(-) diff --git a/src/Package/Library/bzip2.php b/src/Package/Library/bzip2.php index 90fcce7c6..7f99c22b4 100644 --- a/src/Package/Library/bzip2.php +++ b/src/Package/Library/bzip2.php @@ -17,7 +17,9 @@ class bzip2 #[PatchBeforeBuild] public function patchBeforeBuild(LibraryPackage $lib): void { - FileSystem::replaceFileStr($lib->getSourceDir() . '/Makefile', 'CFLAGS=-Wall', 'CFLAGS=-fPIC -Wall'); + // Makefile pins -O2 -fPIC; inject SPC_DEFAULT_CFLAGS + $extra = deduplicate_flags(trim((string) getenv('SPC_DEFAULT_CFLAGS')) . ' -fPIC -Wall'); + FileSystem::replaceFileStr($lib->getSourceDir() . '/Makefile', 'CFLAGS=-Wall', "CFLAGS={$extra}"); } #[BuildFor('Windows')] diff --git a/src/Package/Library/fastlz.php b/src/Package/Library/fastlz.php index f9dd010dc..7c3792cd2 100644 --- a/src/Package/Library/fastlz.php +++ b/src/Package/Library/fastlz.php @@ -18,9 +18,11 @@ public function build(LibraryPackage $lib): void { $cc = getenv('CC') ?: 'cc'; $ar = getenv('AR') ?: 'ar'; + $extra = trim((string) getenv('SPC_DEFAULT_CFLAGS')); + $extra = $extra !== '' ? $extra . ' -fPIC' : '-O3 -fPIC'; shell()->cd($lib->getSourceDir())->initializeEnv($lib) - ->exec("{$cc} -c -O3 -fPIC fastlz.c -o fastlz.o") + ->exec("{$cc} -c {$extra} fastlz.c -o fastlz.o") ->exec("{$ar} rcs libfastlz.a fastlz.o"); // Copy header file diff --git a/src/Package/Library/icu.php b/src/Package/Library/icu.php index 7364e94ab..bab245081 100644 --- a/src/Package/Library/icu.php +++ b/src/Package/Library/icu.php @@ -24,9 +24,12 @@ public function beforePack(LibraryPackage $lib): void #[BuildFor('Linux')] public function buildLinux(LibraryPackage $lib, ToolchainInterface $toolchain, PackageBuilder $builder): void { + // runConfigureICU bakes CXXFLAGS/LDFLAGS, apply user flags too + $userCxxFlags = trim((string) getenv('SPC_DEFAULT_CXXFLAGS')); + $userLdFlags = trim((string) getenv('SPC_DEFAULT_LDFLAGS')); $cppflags = 'CPPFLAGS="-DU_CHARSET_IS_UTF8=1 -DU_USING_ICU_NAMESPACE=1 -DU_STATIC_IMPLEMENTATION=1 -DPIC -fPIC"'; - $cxxflags = 'CXXFLAGS="-std=c++17 -DPIC -fPIC -fno-ident"'; - $ldflags = $toolchain->isStatic() ? 'LDFLAGS="-static"' : ''; + $cxxflags = "CXXFLAGS=\"-std=c++17 -DPIC -fPIC -fno-ident {$userCxxFlags}\""; + $ldflags = $toolchain->isStatic() ? "LDFLAGS=\"-static {$userLdFlags}\"" : "LDFLAGS=\"{$userLdFlags}\""; shell()->cd($lib->getSourceDir() . '/source')->initializeEnv($lib) ->exec( "{$cppflags} {$cxxflags} {$ldflags} " . diff --git a/src/Package/Library/jbig.php b/src/Package/Library/jbig.php index 1cfe60b74..94527f457 100644 --- a/src/Package/Library/jbig.php +++ b/src/Package/Library/jbig.php @@ -17,7 +17,9 @@ class jbig #[PatchBeforeBuild] public function patchBeforeBuild(LibraryPackage $lib): void { - FileSystem::replaceFileStr($lib->getSourceDir() . '/Makefile', 'CFLAGS = -O2 -W -Wno-unused-result', 'CFLAGS = -O2 -W -Wno-unused-result -fPIC'); + $extra = trim((string) getenv('SPC_DEFAULT_CFLAGS')); + $cflags = ($extra !== '' ? $extra : '-O2') . ' -W -Wno-unused-result -fPIC'; + FileSystem::replaceFileStr($lib->getSourceDir() . '/Makefile', 'CFLAGS = -O2 -W -Wno-unused-result', "CFLAGS = {$cflags}"); } #[BuildFor('Darwin')] diff --git a/src/Package/Library/libaom.php b/src/Package/Library/libaom.php index 7e578242b..7549125d5 100644 --- a/src/Package/Library/libaom.php +++ b/src/Package/Library/libaom.php @@ -9,8 +9,10 @@ use StaticPHP\Package\LibraryPackage; use StaticPHP\Runtime\Executor\UnixCMakeExecutor; use StaticPHP\Runtime\Executor\WindowsCMakeExecutor; +use StaticPHP\Runtime\SystemTarget; use StaticPHP\Toolchain\Interface\ToolchainInterface; use StaticPHP\Toolchain\ZigToolchain; +use StaticPHP\Util\System\UnixUtil; #[Library('libaom')] class libaom extends LibraryPackage @@ -39,9 +41,23 @@ public function buildUnix(ToolchainInterface $toolchain): void $new = trim($extra . ' -D_GNU_SOURCE'); f_putenv("SPC_COMPILER_EXTRA={$new}"); } + $targetCpu = SystemTarget::getTargetArch(); + if (str_starts_with($targetCpu, 'aarch')) { + $targetCpu = str_replace('aarch', 'arm', $targetCpu); + } + if (!UnixUtil::findCommand('nasm') && !UnixUtil::findCommand('yasm')) { + $targetCpu = 'generic'; + } UnixCMakeExecutor::create($this) ->setBuildDir("{$this->getSourceDir()}/builddir") - ->addConfigureArgs('-DAOM_TARGET_CPU=generic') + ->addConfigureArgs( + "-DAOM_TARGET_CPU={$targetCpu}", + '-DCONFIG_RUNTIME_CPU_DETECT=1', + '-DENABLE_EXAMPLES=OFF', + '-DENABLE_TESTS=OFF', + '-DENABLE_TOOLS=OFF', + '-DENABLE_DOCS=OFF', + ) ->build(); f_putenv("SPC_COMPILER_EXTRA={$extra}"); $this->patchPkgconfPrefix(['aom.pc']); diff --git a/src/Package/Library/libheif.php b/src/Package/Library/libheif.php index 65545f365..19ad4c619 100644 --- a/src/Package/Library/libheif.php +++ b/src/Package/Library/libheif.php @@ -24,6 +24,17 @@ public function patchBeforeBuild(LibraryPackage $lib): void 'list(APPEND REQUIRES_PRIVATE "libbrotlidec")' . "\n" . ' list(APPEND REQUIRES_PRIVATE "libbrotlienc")' ); } + // libheif 1.22+ ships a C-incompatible header: `struct heif_bad_pixel` + $heif_properties = $lib->getSourceDir() . '/libheif/api/libheif/heif_properties.h'; + if (file_exists($heif_properties) + && str_contains(file_get_contents($heif_properties), 'struct heif_bad_pixel { uint32_t row; uint32_t column; };') + ) { + FileSystem::replaceFileStr( + $heif_properties, + 'struct heif_bad_pixel { uint32_t row; uint32_t column; };', + 'typedef struct heif_bad_pixel { uint32_t row; uint32_t column; } heif_bad_pixel;' + ); + } } #[BuildFor('Darwin')] diff --git a/src/Package/Library/ncurses.php b/src/Package/Library/ncurses.php index dd591a6f9..e27cefcd4 100644 --- a/src/Package/Library/ncurses.php +++ b/src/Package/Library/ncurses.php @@ -6,6 +6,8 @@ use StaticPHP\Attribute\Package\BuildFor; use StaticPHP\Attribute\Package\Library; +use StaticPHP\Attribute\Package\PatchBeforeBuild; +use StaticPHP\Attribute\PatchDescription; use StaticPHP\Package\LibraryPackage; use StaticPHP\Runtime\Executor\UnixAutoconfExecutor; use StaticPHP\Toolchain\Interface\ToolchainInterface; @@ -16,6 +18,24 @@ #[Library('ncursesw')] class ncurses { + #[PatchBeforeBuild] + #[PatchDescription('Filter clang/zig "N warning(s) generated." line out of MKlib_gen.sh preprocessor pipe')] + public function patchBeforeBuild(LibraryPackage $lib): void + { + // MKlib_gen.sh feeds the C preprocessor's stdout through a sed/awk + // pipeline into lib_gen.c. zig-cc/clang emits "N warning(s) generated." + // on stdout (not stderr), and that line ends up as invalid C in the + // generated source. Filter it out of the pipe before sed sees it. + $mklibGen = $lib->getSourceDir() . '/ncurses/base/MKlib_gen.sh'; + if (is_file($mklibGen) && !str_contains((string) file_get_contents($mklibGen), "| grep -v ' generated")) { + FileSystem::replaceFileStr( + $mklibGen, + '$preprocessor $TMP 2>/dev/null \\', + "\$preprocessor \$TMP 2>/dev/null \\\n| grep -v ' generated\\.\$' \\", + ); + } + } + #[BuildFor('Darwin')] #[BuildFor('Linux')] public function build(LibraryPackage $package, ToolchainInterface $toolchain): void diff --git a/src/Package/Library/openssl.php b/src/Package/Library/openssl.php index 69297198d..e0493ea5d 100644 --- a/src/Package/Library/openssl.php +++ b/src/Package/Library/openssl.php @@ -111,6 +111,12 @@ public function build(LibraryPackage $lib): void $openssl_dir ??= LinuxUtil::getOSRelease()['dist'] === 'redhat' ? '/etc/pki/tls' : '/etc/ssl'; $ex_lib = trim($ex_lib); + // anything we want included (PGO -fprofile-*, LTO, custom hardening) + // has to be appended on the command line *after* the target name. + $userCFlags = trim((string) getenv('SPC_DEFAULT_CFLAGS')); + $userLdFlags = trim((string) getenv('SPC_DEFAULT_LDFLAGS')); + $userExtra = trim($userCFlags . ' ' . $userLdFlags); + shell()->cd($lib->getSourceDir())->initializeEnv($lib) ->exec( "{$env} ./Configure no-shared zlib " . @@ -121,7 +127,8 @@ public function build(LibraryPackage $lib): void 'enable-pie ' . 'no-legacy ' . 'no-tests ' . - "linux-{$arch}" + "linux-{$arch} " . + $userExtra ) ->exec('make clean') ->exec("make -j{$lib->getBuilder()->concurrency} CNF_EX_LIBS=\"{$ex_lib}\"") diff --git a/src/Package/Library/qdbm.php b/src/Package/Library/qdbm.php index 358846fb6..c7785683a 100644 --- a/src/Package/Library/qdbm.php +++ b/src/Package/Library/qdbm.php @@ -20,6 +20,11 @@ public function buildUnix(LibraryPackage $lib): void { $ac = UnixAutoconfExecutor::create($lib)->configure(); FileSystem::replaceFileRegex($lib->getSourceDir() . '/Makefile', '/MYLIBS = libqdbm.a.*/m', 'MYLIBS = libqdbm.a'); + // Makefile pins -O3, replace with SPC_DEFAULT_CFLAGS + $extra = trim((string) getenv('SPC_DEFAULT_CFLAGS')); + if ($extra !== '') { + FileSystem::replaceFileRegex($lib->getSourceDir() . '/Makefile', '/^CFLAGS = .*$/m', "CFLAGS = -Wall {$extra}"); + } $ac->make(SystemTarget::getTargetOS() === 'Darwin' ? 'mac' : ''); $lib->patchPkgconfPrefix(['qdbm.pc']); } From 727600a73aab31569252e2fd6a8589162f8c912e Mon Sep 17 00:00:00 2001 From: henderkes Date: Tue, 26 May 2026 21:10:00 +0700 Subject: [PATCH 2/5] disable a whole lot of things we don't need to build --- src/Package/Library/brotli.php | 5 ++++- src/Package/Library/imagemagick.php | 3 +++ src/Package/Library/ldap.php | 1 + src/Package/Library/libavif.php | 9 +++++++-- src/Package/Library/libffi.php | 3 ++- src/Package/Library/libheif.php | 1 + src/Package/Library/libjxl.php | 1 + src/Package/Library/libmemcached.php | 12 ++++++++++-- src/Package/Library/libpng.php | 2 ++ src/Package/Library/librabbitmq.php | 16 ++++++++++++++-- src/Package/Library/libtiff.php | 3 +++ src/Package/Library/libuv.php | 10 ++++++++-- src/Package/Library/libxslt.php | 1 + src/Package/Library/mimalloc.php | 1 + src/Package/Library/nghttp3.php | 1 + src/Package/Library/ngtcp2.php | 1 + src/Package/Library/readline.php | 1 + src/Package/Library/tidy.php | 6 ++++-- src/Package/Library/unixodbc.php | 1 + src/Package/Library/xz.php | 5 +++++ src/Package/Library/zstd.php | 17 +++++++++-------- src/Package/Target/curl.php | 5 +++++ 22 files changed, 85 insertions(+), 20 deletions(-) diff --git a/src/Package/Library/brotli.php b/src/Package/Library/brotli.php index cab05112b..7a56afe78 100644 --- a/src/Package/Library/brotli.php +++ b/src/Package/Library/brotli.php @@ -27,7 +27,10 @@ public function build(LibraryPackage $lib): void { UnixCMakeExecutor::create($lib) ->setBuildDir($lib->getSourceDir() . '/build-dir') - ->addConfigureArgs("-DSHARE_INSTALL_PREFIX={$lib->getBuildRootPath()}") + ->addConfigureArgs( + "-DSHARE_INSTALL_PREFIX={$lib->getBuildRootPath()}", + '-DBROTLI_DISABLE_TESTS=ON', + ) ->build(); // Patch pkg-config files diff --git a/src/Package/Library/imagemagick.php b/src/Package/Library/imagemagick.php index d423163a2..7fd7ec61e 100644 --- a/src/Package/Library/imagemagick.php +++ b/src/Package/Library/imagemagick.php @@ -45,6 +45,9 @@ public function buildUnix(LibraryPackage $lib, ToolchainInterface $toolchain): v // implicit --with-gcc-arch // bleeds host cpu features into built binaries '--without-gcc-arch', + '--disable-docs', + '--without-utilities', + '--disable-dpc', ); // special: linux-static target needs `-static` diff --git a/src/Package/Library/ldap.php b/src/Package/Library/ldap.php index 21e7f8c04..bbaf06b47 100644 --- a/src/Package/Library/ldap.php +++ b/src/Package/Library/ldap.php @@ -35,6 +35,7 @@ public function build(LibraryPackage $lib): void ->optionalPackage('libsodium', '--with-argon2=libsodium', '--enable-argon2=no') ->addConfigureArgs( '--disable-slapd', + '--disable-debug', '--without-systemd', '--without-cyrus-sasl', 'ac_cv_func_pthread_kill_other_threads_np=no' diff --git a/src/Package/Library/libavif.php b/src/Package/Library/libavif.php index b8321375e..ef86386d3 100644 --- a/src/Package/Library/libavif.php +++ b/src/Package/Library/libavif.php @@ -35,7 +35,12 @@ public function buildUnix(LibraryPackage $lib): void ->optionalPackage('libjpeg', '-DAVIF_JPEG=SYSTEM', '-DAVIF_JPEG=OFF') ->optionalPackage('libxml2', '-DAVIF_LIBXML2=SYSTEM', '-DAVIF_LIBXML2=OFF') ->optionalPackage('libpng', '-DAVIF_LIBPNG=SYSTEM', '-DAVIF_LIBPNG=OFF') - ->addConfigureArgs('-DAVIF_LIBYUV=OFF') + ->addConfigureArgs( + '-DAVIF_LIBYUV=OFF', + '-DAVIF_BUILD_APPS=OFF', + '-DAVIF_BUILD_TESTS=OFF', + '-DAVIF_GTEST=OFF', + ) ->build(); // patch pkgconfig $lib->patchPkgconfPrefix(['libavif.pc']); @@ -49,7 +54,7 @@ public function buildWin(LibraryPackage $lib): void '-DAVIF_BUILD_APPS=OFF', '-DAVIF_BUILD_TESTS=OFF', '-DAVIF_LIBYUV=OFF', - '-DAVIF_ENABLE_GTEST=OFF', + '-DAVIF_GTEST=OFF', ) ->build(); } diff --git a/src/Package/Library/libffi.php b/src/Package/Library/libffi.php index 351b9076c..74000ef56 100644 --- a/src/Package/Library/libffi.php +++ b/src/Package/Library/libffi.php @@ -16,7 +16,7 @@ class libffi extends LibraryPackage public function buildLinux(): void { UnixAutoconfExecutor::create($this) - ->configure()->make(); + ->configure('--disable-docs')->make(); if (is_file("{$this->getBuildRootPath()}/lib64/libffi.a")) { copy("{$this->getBuildRootPath()}/lib64/libffi.a", "{$this->getBuildRootPath()}/lib/libffi.a"); @@ -33,6 +33,7 @@ public function buildDarwin(): void ->configure( "--host={$arch}-apple-darwin", "--target={$arch}-apple-darwin", + '--disable-docs', ) ->make(); $this->patchPkgconfPrefix(['libffi.pc']); diff --git a/src/Package/Library/libheif.php b/src/Package/Library/libheif.php index 19ad4c619..935817f78 100644 --- a/src/Package/Library/libheif.php +++ b/src/Package/Library/libheif.php @@ -47,6 +47,7 @@ public function buildUnix(LibraryPackage $lib): void '-DWITH_EXAMPLES=OFF', '-DWITH_GDK_PIXBUF=OFF', '-DBUILD_TESTING=OFF', + '-DBUILD_DOCUMENTATION=OFF', '-DWITH_LIBSHARPYUV=ON', // optional: libwebp '-DENABLE_PLUGIN_LOADING=OFF', ) diff --git a/src/Package/Library/libjxl.php b/src/Package/Library/libjxl.php index 74b87907d..668f2bb95 100644 --- a/src/Package/Library/libjxl.php +++ b/src/Package/Library/libjxl.php @@ -25,6 +25,7 @@ public function buildUnix(ToolchainInterface $toolchain): void '-DJPEGXL_ENABLE_MANPAGES=OFF', '-DJPEGXL_ENABLE_BENCHMARK=OFF', '-DJPEGXL_ENABLE_PLUGINS=OFF', + '-DJPEGXL_ENABLE_DOXYGEN=OFF', '-DJPEGXL_ENABLE_SJPEG=ON', '-DJPEGXL_ENABLE_JNI=OFF', '-DJPEGXL_ENABLE_TRANSCODE_JPEG=ON', diff --git a/src/Package/Library/libmemcached.php b/src/Package/Library/libmemcached.php index ea632192a..7744f3f0c 100644 --- a/src/Package/Library/libmemcached.php +++ b/src/Package/Library/libmemcached.php @@ -12,17 +12,25 @@ #[Library('libmemcached')] class libmemcached extends LibraryPackage { + private const array DISABLE_ARGS = [ + '-DBUILD_TESTING=OFF', + '-DBUILD_DOCS=OFF', + '-DENABLE_MEMASLAP=OFF', + ]; + #[BuildFor('Linux')] public function buildLinux(): void { UnixCMakeExecutor::create($this) - ->addConfigureArgs('-DCMAKE_INSTALL_RPATH=""') + ->addConfigureArgs('-DCMAKE_INSTALL_RPATH=""', ...self::DISABLE_ARGS) ->build(); } #[BuildFor('Darwin')] public function buildDarwin(): void { - UnixCMakeExecutor::create($this)->build(); + UnixCMakeExecutor::create($this) + ->addConfigureArgs(...self::DISABLE_ARGS) + ->build(); } } diff --git a/src/Package/Library/libpng.php b/src/Package/Library/libpng.php index 6a1690105..8613c2dbe 100644 --- a/src/Package/Library/libpng.php +++ b/src/Package/Library/libpng.php @@ -20,6 +20,8 @@ public function buildUnix(LibraryPackage $lib): void { $args = [ '--enable-hardware-optimizations', + '--disable-tests', + '--disable-tools', "--with-zlib-prefix={$lib->getBuildRootPath()}", ]; diff --git a/src/Package/Library/librabbitmq.php b/src/Package/Library/librabbitmq.php index 03eda2a74..990c70237 100644 --- a/src/Package/Library/librabbitmq.php +++ b/src/Package/Library/librabbitmq.php @@ -13,17 +13,29 @@ #[Library('librabbitmq')] class librabbitmq extends LibraryPackage { + private const array DISABLE_ARGS = [ + '-DBUILD_EXAMPLES=OFF', + '-DBUILD_TESTING=OFF', + '-DBUILD_TOOLS=OFF', + '-DBUILD_TOOLS_DOCS=OFF', + '-DBUILD_API_DOCS=OFF', + ]; + #[BuildFor('Darwin')] #[BuildFor('Linux')] public function buildUnix(): void { - UnixCMakeExecutor::create($this)->addConfigureArgs('-DBUILD_STATIC_LIBS=ON')->build(); + UnixCMakeExecutor::create($this) + ->addConfigureArgs('-DBUILD_STATIC_LIBS=ON', ...self::DISABLE_ARGS) + ->build(); } #[BuildFor('Windows')] public function buildWin(): void { - WindowsCMakeExecutor::create($this)->build(); + WindowsCMakeExecutor::create($this) + ->addConfigureArgs(...self::DISABLE_ARGS) + ->build(); rename("{$this->getLibDir()}\\librabbitmq.4.lib", "{$this->getLibDir()}\\rabbitmq.4.lib"); } } diff --git a/src/Package/Library/libtiff.php b/src/Package/Library/libtiff.php index 385ff3ca4..1626db3c2 100644 --- a/src/Package/Library/libtiff.php +++ b/src/Package/Library/libtiff.php @@ -41,6 +41,9 @@ public function buildUnix(LibraryPackage $lib): void '--disable-libdeflate', '--disable-tools', '--disable-contrib', + '--disable-tests', + '--disable-docs', + '--disable-sphinx', '--disable-cxx', '--without-x', ) diff --git a/src/Package/Library/libuv.php b/src/Package/Library/libuv.php index c27b499c9..95fbae405 100644 --- a/src/Package/Library/libuv.php +++ b/src/Package/Library/libuv.php @@ -13,12 +13,18 @@ #[Library('libuv')] class libuv { + private const array DISABLE_ARGS = [ + '-DLIBUV_BUILD_SHARED=OFF', + '-DLIBUV_BUILD_TESTS=OFF', + '-DLIBUV_BUILD_BENCH=OFF', + ]; + #[BuildFor('Darwin')] #[BuildFor('Linux')] public function buildUnix(LibraryPackage $lib): void { UnixCMakeExecutor::create($lib) - ->addConfigureArgs('-DLIBUV_BUILD_SHARED=OFF') + ->addConfigureArgs(...self::DISABLE_ARGS) ->build(); // patch pkgconfig $lib->patchPkgconfPrefix(['libuv-static.pc']); @@ -28,7 +34,7 @@ public function buildUnix(LibraryPackage $lib): void public function buildWindows(LibraryPackage $lib): void { WindowsCMakeExecutor::create($lib) - ->addConfigureArgs('-DLIBUV_BUILD_SHARED=OFF') + ->addConfigureArgs(...self::DISABLE_ARGS) ->build(); } } diff --git a/src/Package/Library/libxslt.php b/src/Package/Library/libxslt.php index 7513d1468..35118c775 100644 --- a/src/Package/Library/libxslt.php +++ b/src/Package/Library/libxslt.php @@ -34,6 +34,7 @@ public function buildUnix(LibraryPackage $lib, PackageInstaller $installer): voi '--without-crypto', '--without-debug', '--without-debugger', + '--without-profiler', "--with-libxml-prefix={$lib->getBuildRootPath()}", ); if (getenv('SPC_LD_LIBRARY_PATH') && getenv('SPC_LIBRARY_PATH')) { diff --git a/src/Package/Library/mimalloc.php b/src/Package/Library/mimalloc.php index fd7a73513..241e08aa0 100644 --- a/src/Package/Library/mimalloc.php +++ b/src/Package/Library/mimalloc.php @@ -21,6 +21,7 @@ public function buildUnix(LibraryPackage $lib): void ->addConfigureArgs( '-DMI_BUILD_SHARED=OFF', '-DMI_BUILD_OBJECT=OFF', + '-DMI_BUILD_TESTS=OFF', '-DMI_INSTALL_TOPLEVEL=ON', ); if (SystemTarget::getLibc() === 'musl') { diff --git a/src/Package/Library/nghttp3.php b/src/Package/Library/nghttp3.php index 4659c5711..f20fbc94e 100644 --- a/src/Package/Library/nghttp3.php +++ b/src/Package/Library/nghttp3.php @@ -24,6 +24,7 @@ public function buildWin(LibraryPackage $lib): void '-DBUILD_SHARED_LIBS=OFF', '-DENABLE_STATIC_CRT=ON', '-DENABLE_LIB_ONLY=ON', + '-DBUILD_TESTING=OFF', ) ->build(); } diff --git a/src/Package/Library/ngtcp2.php b/src/Package/Library/ngtcp2.php index 0a5ca8f5a..e392431fe 100644 --- a/src/Package/Library/ngtcp2.php +++ b/src/Package/Library/ngtcp2.php @@ -25,6 +25,7 @@ public function buildWin(LibraryPackage $lib): void '-DENABLE_STATIC_CRT=ON', '-DENABLE_LIB_ONLY=ON', '-DENABLE_OPENSSL=OFF', + '-DBUILD_TESTING=OFF', ) ->build(); } diff --git a/src/Package/Library/readline.php b/src/Package/Library/readline.php index a32334723..6213c37fa 100644 --- a/src/Package/Library/readline.php +++ b/src/Package/Library/readline.php @@ -20,6 +20,7 @@ public function buildUnix(LibraryPackage $lib): void ->configure( '--with-curses', '--enable-multibyte=yes', + '--disable-install-examples', ) ->make(); $lib->patchPkgconfPrefix(['readline.pc']); diff --git a/src/Package/Library/tidy.php b/src/Package/Library/tidy.php index 5e16b2d18..1f40c535d 100644 --- a/src/Package/Library/tidy.php +++ b/src/Package/Library/tidy.php @@ -22,7 +22,8 @@ public function buildUnix(LibraryPackage $lib): void ->setBuildDir("{$lib->getSourceDir()}/build-dir") ->addConfigureArgs( '-DSUPPORT_CONSOLE_APP=OFF', - '-DBUILD_SHARED_LIB=OFF' + '-DBUILD_SHARED_LIB=OFF', + '-DSUPPORT_LOCALIZATIONS=OFF', ); if (version_compare(get_cmake_version(), '4.0.0', '>=')) { $cmake->addConfigureArgs('-DCMAKE_POLICY_VERSION_MINIMUM=3.5'); @@ -38,7 +39,8 @@ public function buildWindows(LibraryPackage $lib): void ->setBuildDir("{$lib->getSourceDir()}/build-dir") ->addConfigureArgs( '-DSUPPORT_CONSOLE_APP=OFF', - '-DBUILD_SHARED_LIB=OFF' + '-DBUILD_SHARED_LIB=OFF', + '-DSUPPORT_LOCALIZATIONS=OFF', )->build(); // rename tidy_static.lib to tidy_a.lib diff --git a/src/Package/Library/unixodbc.php b/src/Package/Library/unixodbc.php index e482e68be..9048acf6a 100644 --- a/src/Package/Library/unixodbc.php +++ b/src/Package/Library/unixodbc.php @@ -35,6 +35,7 @@ public function buildUnix(): void '--with-included-ltdl', "--sysconfdir={$sysconf_selector}", '--enable-gui=no', + '--enable-readline=no', ) ->make(); $this->patchPkgconfPrefix(['odbc.pc', 'odbccr.pc', 'odbcinst.pc']); diff --git a/src/Package/Library/xz.php b/src/Package/Library/xz.php index 44a20090f..4671c77d9 100644 --- a/src/Package/Library/xz.php +++ b/src/Package/Library/xz.php @@ -22,6 +22,11 @@ public function build(LibraryPackage $lib): void ->configure( '--disable-scripts', '--disable-doc', + '--disable-xz', + '--disable-xzdec', + '--disable-lzmadec', + '--disable-lzmainfo', + '--disable-lzma-links', '--with-libiconv', '--bindir=/tmp/xz', // xz binary will corrupt `tar` command, that's really strange. ) diff --git a/src/Package/Library/zstd.php b/src/Package/Library/zstd.php index a5df737e5..a038e6a68 100644 --- a/src/Package/Library/zstd.php +++ b/src/Package/Library/zstd.php @@ -14,16 +14,20 @@ #[Library('zstd')] class zstd { + private const array DISABLE_ARGS = [ + '-DZSTD_BUILD_STATIC=ON', + '-DZSTD_BUILD_SHARED=OFF', + '-DZSTD_BUILD_PROGRAMS=OFF', + '-DZSTD_BUILD_TESTS=OFF', + ]; + #[BuildFor('Windows')] public function buildWin(LibraryPackage $package): void { WindowsCMakeExecutor::create($package) ->setWorkingDir("{$package->getSourceDir()}/build/cmake") ->setBuildDir("{$package->getSourceDir()}/build/cmake/build") - ->addConfigureArgs( - '-DZSTD_BUILD_STATIC=ON', - '-DZSTD_BUILD_SHARED=OFF', - ) + ->addConfigureArgs(...self::DISABLE_ARGS) ->build(); FileSystem::copy($package->getLibDir() . '\zstd_static.lib', $package->getLibDir() . '/zstd.lib'); FileSystem::copy($package->getLibDir() . '\zstd_static.lib', $package->getLibDir() . '/libzstd.lib'); @@ -35,10 +39,7 @@ public function build(LibraryPackage $lib): void { UnixCMakeExecutor::create($lib) ->setBuildDir("{$lib->getSourceDir()}/build/cmake/build") - ->addConfigureArgs( - '-DZSTD_BUILD_STATIC=ON', - '-DZSTD_BUILD_SHARED=OFF', - ) + ->addConfigureArgs(...self::DISABLE_ARGS) ->build(); $lib->patchPkgconfPrefix(['libzstd.pc'], PKGCONF_PATCH_PREFIX); diff --git a/src/Package/Target/curl.php b/src/Package/Target/curl.php index 3117a8cd1..358982549 100644 --- a/src/Package/Target/curl.php +++ b/src/Package/Target/curl.php @@ -43,6 +43,8 @@ public function buildWin(LibraryPackage $lib): void '-DZSTD_LIBRARY=zstd_static.lib', '-DBUILD_TESTING=OFF', '-DBUILD_EXAMPLES=OFF', + '-DBUILD_LIBCURL_DOCS=OFF', + '-DENABLE_CURL_MANUAL=OFF', '-DUSE_LIBIDN2=OFF', '-DCURL_USE_LIBPSL=OFF', '-DUSE_WINDOWS_SSPI=ON', @@ -81,6 +83,9 @@ public function build(LibraryPackage $lib): void ->addConfigureArgs( '-DBUILD_CURL_EXE=ON', '-DBUILD_LIBCURL_DOCS=OFF', + '-DBUILD_TESTING=OFF', + '-DBUILD_EXAMPLES=OFF', + '-DENABLE_CURL_MANUAL=OFF', '-DOPENSSL_ROOT_DIR=' . BUILD_ROOT_PATH, ) ->build(); From daea8e10ad18756ee9ba86ec7f23414928d8fa94 Mon Sep 17 00:00:00 2001 From: henderkes Date: Thu, 28 May 2026 12:22:14 +0700 Subject: [PATCH 3/5] fix https://github.com/php/frankenphp/issues/1346 --- src/Package/Library/gmp.php | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/Package/Library/gmp.php b/src/Package/Library/gmp.php index f8eb5f8e4..c9cac70b4 100644 --- a/src/Package/Library/gmp.php +++ b/src/Package/Library/gmp.php @@ -8,6 +8,7 @@ use StaticPHP\Attribute\Package\Library; use StaticPHP\Package\LibraryPackage; use StaticPHP\Runtime\Executor\UnixAutoconfExecutor; +use StaticPHP\Runtime\SystemTarget; #[Library('gmp')] class gmp @@ -16,10 +17,12 @@ class gmp #[BuildFor('Darwin')] public function build(LibraryPackage $lib): void { - UnixAutoconfExecutor::create($lib) - ->appendEnv(['CFLAGS' => '-std=c17']) - ->configure('--enable-fat') - ->make(); + $make = UnixAutoconfExecutor::create($lib)->appendEnv(['CFLAGS' => '-std=c17']); + if (SystemTarget::getTargetArch() === 'x86_64' && SystemTarget::getTargetOS() === 'Linux') { + $libc = SystemTarget::getLibc() === 'glibc' ? 'gnu' : 'musl'; + $make->addConfigureArgs(["--host=x86_64-pc-linux-{$libc}"]); + } + $make->configure('--enable-fat')->make(); $lib->patchPkgconfPrefix(['gmp.pc']); } } From e6eaac8e78d2a9edaabc10cae4b4416d159e4c2b Mon Sep 17 00:00:00 2001 From: crazywhalecc Date: Mon, 19 Oct 2026 16:01:10 +0800 Subject: [PATCH 4/5] phpstan fix --- src/Package/Library/gmp.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Package/Library/gmp.php b/src/Package/Library/gmp.php index c9cac70b4..31a1b220b 100644 --- a/src/Package/Library/gmp.php +++ b/src/Package/Library/gmp.php @@ -20,7 +20,7 @@ public function build(LibraryPackage $lib): void $make = UnixAutoconfExecutor::create($lib)->appendEnv(['CFLAGS' => '-std=c17']); if (SystemTarget::getTargetArch() === 'x86_64' && SystemTarget::getTargetOS() === 'Linux') { $libc = SystemTarget::getLibc() === 'glibc' ? 'gnu' : 'musl'; - $make->addConfigureArgs(["--host=x86_64-pc-linux-{$libc}"]); + $make->addConfigureArgs("--host=x86_64-pc-linux-{$libc}"); } $make->configure('--enable-fat')->make(); $lib->patchPkgconfPrefix(['gmp.pc']); From a6f199702977b3ca7c61a30bf5424d5eed77f20f Mon Sep 17 00:00:00 2001 From: crazywhalecc Date: Mon, 19 Oct 2026 16:24:03 +0800 Subject: [PATCH 5/5] fix(uv): link synchronization.lib on Windows libuv 1.53.0 calls WaitOnAddress()/WakeByAddressSingle() from src/win/pipe.c. Those symbols live in synchronization.lib (Win8+), and libuv's CMake lists "synchronization" in uv_libraries only for its own CMake targets. uv_a is a static archive, so the dependency does not propagate to php.exe, which links libuv.lib directly and therefore must pass the system library itself. Without it the Windows uv matrix job fails at link time: libuv.lib(pipe.obj) : error LNK2001: unresolved external symbol WaitOnAddress libuv.lib(pipe.obj) : error LNK2001: unresolved external symbol WakeByAddressSingle php.exe : fatal error LNK1120: 2 unresolved externals Inject CHECK_LIB("synchronization.lib", ...) next to the dbghelp.lib one we already add, so LIBS_UV carries it into the php.exe / CGI / embed links. EXTENSION() is decided earlier, so a missing library still only warns. Windows-only: the hook runs in php::buildconfForWindows. --- src/Package/Extension/uv.php | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/Package/Extension/uv.php b/src/Package/Extension/uv.php index ddc38353a..1d44c2098 100644 --- a/src/Package/Extension/uv.php +++ b/src/Package/Extension/uv.php @@ -35,7 +35,13 @@ public function patchBeforeBuild(): void FileSystem::replaceFileStr( "{$this->getBuildDir()}/config.w32", 'CHECK_LIB("Ws2_32.lib","uv", PHP_UV);', - "CHECK_LIB(\"Ws2_32.lib\",\"uv\" , PHP_UV);\n\tCHECK_LIB(\"dbghelp.lib\",\"uv\", PHP_UV);", + implode("\n\t", [ + 'CHECK_LIB("Ws2_32.lib","uv" , PHP_UV);', + 'CHECK_LIB("dbghelp.lib","uv", PHP_UV);', + // libuv >= 1.53 calls WaitOnAddress()/WakeByAddressSingle() in win/pipe.c; + // php.exe links libuv.lib directly, so the consumer has to pass synchronization.lib. + 'CHECK_LIB("synchronization.lib","uv", PHP_UV);', + ]), ); }