From 4d4b1a334fe050fa3f46af7da74fb40928052d19 Mon Sep 17 00:00:00 2001 From: crazywhalecc Date: Thu, 5 Feb 2026 16:10:16 +0800 Subject: [PATCH] Add ext-readline,freetype,gmssl,grpc,icu --- config/pkg/ext/ext-mbregex.yml | 1 + config/pkg/ext/ext-readline.yml | 11 ++++++ config/pkg/lib/attr.yml | 8 +--- config/pkg/lib/freetype.yml | 22 +++++++++++ config/pkg/lib/gmssl.yml | 15 +++++++ config/pkg/lib/grpc.yml | 19 +++++++++ config/pkg/lib/icu.yml | 16 ++++++++ spc.registry.json | 4 +- src/Package/Library/freetype.php | 36 +++++++++++++++++ src/Package/Library/gmssl.php | 21 ++++++++++ src/Package/Library/grpc.php | 68 ++++++++++++++++++++++++++++++++ src/Package/Library/icu.php | 66 +++++++++++++++++++++++++++++++ 12 files changed, 280 insertions(+), 7 deletions(-) create mode 100644 config/pkg/ext/ext-readline.yml create mode 100644 config/pkg/lib/freetype.yml create mode 100644 config/pkg/lib/gmssl.yml create mode 100644 config/pkg/lib/grpc.yml create mode 100644 config/pkg/lib/icu.yml create mode 100644 src/Package/Library/freetype.php create mode 100644 src/Package/Library/gmssl.php create mode 100644 src/Package/Library/grpc.php create mode 100644 src/Package/Library/icu.php diff --git a/config/pkg/ext/ext-mbregex.yml b/config/pkg/ext/ext-mbregex.yml index eaa0481a..ae59f023 100644 --- a/config/pkg/ext/ext-mbregex.yml +++ b/config/pkg/ext/ext-mbregex.yml @@ -7,3 +7,4 @@ ext-mbregex: arg-type: custom build-shared: false build-static: true + display-name: mbstring diff --git a/config/pkg/ext/ext-readline.yml b/config/pkg/ext/ext-readline.yml new file mode 100644 index 00000000..19b1886c --- /dev/null +++ b/config/pkg/ext/ext-readline.yml @@ -0,0 +1,11 @@ +ext-readline: + type: php-extension + depends: + - libedit + php-extension: + support: + Windows: wip + BSD: wip + arg-type: with-path + build-shared: false + build-static: true diff --git a/config/pkg/lib/attr.yml b/config/pkg/lib/attr.yml index 289bcd67..cbf181c9 100644 --- a/config/pkg/lib/attr.yml +++ b/config/pkg/lib/attr.yml @@ -1,12 +1,8 @@ attr: type: library artifact: - source: - type: url - url: 'https://download.savannah.nongnu.org/releases/attr/attr-2.5.2.tar.gz' - source-mirror: - type: url - url: 'https://mirror.souseiseki.middlendian.com/nongnu/attr/attr-2.5.2.tar.gz' + source: 'https://download.savannah.nongnu.org/releases/attr/attr-2.5.2.tar.gz' + source-mirror: 'https://mirror.souseiseki.middlendian.com/nongnu/attr/attr-2.5.2.tar.gz' metadata: license-files: [doc/COPYING.LGPL] license: LGPL-2.1-or-later diff --git a/config/pkg/lib/freetype.yml b/config/pkg/lib/freetype.yml new file mode 100644 index 00000000..c101a174 --- /dev/null +++ b/config/pkg/lib/freetype.yml @@ -0,0 +1,22 @@ +freetype: + type: library + artifact: + source: + type: ghtagtar + repo: freetype/freetype + match: VER-2-\d+-\d+ + metadata: + license-files: [LICENSE.TXT] + license: FTL + depends: + - zlib + suggests: + - bzip2 + - brotli + headers@unix: + - freetype2/freetype/freetype.h + - freetype2/ft2build.h + static-libs@unix: + - libfreetype.a + static-libs@windows: + - libfreetype_a.lib diff --git a/config/pkg/lib/gmssl.yml b/config/pkg/lib/gmssl.yml new file mode 100644 index 00000000..07623435 --- /dev/null +++ b/config/pkg/lib/gmssl.yml @@ -0,0 +1,15 @@ +gmssl: + type: library + artifact: + source: + type: ghtar + repo: guanzhi/GmSSL + metadata: + license-files: [LICENSE] + license: Apache-2.0 + frameworks: + - Security + static-libs@unix: + - libgmssl.a + static-libs@windows: + - gmssl.lib diff --git a/config/pkg/lib/grpc.yml b/config/pkg/lib/grpc.yml new file mode 100644 index 00000000..feb6068b --- /dev/null +++ b/config/pkg/lib/grpc.yml @@ -0,0 +1,19 @@ +grpc: + type: library + artifact: + source: + type: git + rev: v1.75.x + url: 'https://github.com/grpc/grpc.git' + metadata: + license-files: [LICENSE] + license: Apache-2.0 + depends: + - zlib + - openssl + - libcares + frameworks: + - CoreFoundation + lang: cpp + pkg-configs: + - grpc diff --git a/config/pkg/lib/icu.yml b/config/pkg/lib/icu.yml new file mode 100644 index 00000000..43328228 --- /dev/null +++ b/config/pkg/lib/icu.yml @@ -0,0 +1,16 @@ +icu: + type: library + artifact: + source: + type: ghrel + repo: unicode-org/icu + match: icu4c.+-src\.tgz + prefer-stable: true + metadata: + license-files: [LICENSE] + license: ICU + lang: cpp + pkg-configs: + - icu-uc + - icu-i18n + - icu-io diff --git a/spc.registry.json b/spc.registry.json index b731249b..cf49c6c8 100644 --- a/spc.registry.json +++ b/spc.registry.json @@ -1,6 +1,9 @@ { "name": "core", "autoload": "vendor/autoload.php", + "scripts": [ + "ext/" + ], "doctor": { "psr-4": { "StaticPHP\\Doctor\\Item": "src/StaticPHP/Doctor/Item" @@ -11,7 +14,6 @@ "Package": "src/Package" }, "config": [ - "config/pkg.ext.json", "config/pkg/lib/", "config/pkg/target/", "config/pkg/ext/", diff --git a/src/Package/Library/freetype.php b/src/Package/Library/freetype.php new file mode 100644 index 00000000..6cb05a90 --- /dev/null +++ b/src/Package/Library/freetype.php @@ -0,0 +1,36 @@ +optionalPackage('libpng', ...cmake_boolean_args('FT_DISABLE_PNG', true)) + ->optionalPackage('bzip2', ...cmake_boolean_args('FT_DISABLE_BZIP2', true)) + ->optionalPackage('brotli', ...cmake_boolean_args('FT_DISABLE_BROTLI', true)) + ->addConfigureArgs('-DFT_DISABLE_HARFBUZZ=ON'); + + // fix cmake 4.0 compatibility + if (version_compare(get_cmake_version(), '4.0.0', '>=')) { + $cmake->addConfigureArgs('-DCMAKE_POLICY_VERSION_MINIMUM=3.12'); + } + + $cmake->build(); + + $lib->patchPkgconfPrefix(['freetype2.pc']); + FileSystem::replaceFileStr("{$lib->getBuildRootPath()}/lib/pkgconfig/freetype2.pc", ' -L/lib ', " -L{$lib->getBuildRootPath()}/lib "); + } +} diff --git a/src/Package/Library/gmssl.php b/src/Package/Library/gmssl.php new file mode 100644 index 00000000..21b4ea66 --- /dev/null +++ b/src/Package/Library/gmssl.php @@ -0,0 +1,21 @@ +build(); + } +} diff --git a/src/Package/Library/grpc.php b/src/Package/Library/grpc.php new file mode 100644 index 00000000..86cddcc0 --- /dev/null +++ b/src/Package/Library/grpc.php @@ -0,0 +1,68 @@ +getSourceDir()}/third_party/re2/util/pcre.h", + ["#define UTIL_PCRE_H_\n#include ", '#define UTIL_PCRE_H_'], + ['#define UTIL_PCRE_H_', "#define UTIL_PCRE_H_\n#include "], + ); + return true; + } + + #[BuildFor('Linux')] + #[BuildFor('Darwin')] + public function buildUnix(ToolchainInterface $toolchain, LibraryPackage $lib): void + { + $cmake = UnixCMakeExecutor::create($lib) + ->setBuildDir("{$lib->getSourceDir()}/avoid_BUILD_file_conflict") + ->addConfigureArgs( + "-DgRPC_INSTALL_BINDIR={$lib->getBinDir()}", + "-DgRPC_INSTALL_LIBDIR={$lib->getLibDir()}", + "-DgRPC_INSTALL_SHAREDIR={$lib->getBuildRootPath()}/share/grpc", + "-DCMAKE_C_FLAGS=\"-DGRPC_POSIX_FORK_ALLOW_PTHREAD_ATFORK -L{$lib->getLibDir()} -I{$lib->getIncludeDir()}\"", + "-DCMAKE_CXX_FLAGS=\"-DGRPC_POSIX_FORK_ALLOW_PTHREAD_ATFORK -L{$lib->getLibDir()} -I{$lib->getIncludeDir()}\"", + '-DgRPC_BUILD_CODEGEN=OFF', + '-DgRPC_DOWNLOAD_ARCHIVES=OFF', + '-DgRPC_BUILD_TESTS=OFF', + // providers + '-DgRPC_ZLIB_PROVIDER=package', + '-DgRPC_CARES_PROVIDER=package', + '-DgRPC_SSL_PROVIDER=package', + ); + + if (PHP_OS_FAMILY === 'Linux' && $toolchain->isStatic() && !LinuxUtil::isMuslDist()) { + $cmake->addConfigureArgs( + '-DCMAKE_EXE_LINKER_FLAGS="-static-libgcc -static-libstdc++"', + '-DCMAKE_SHARED_LINKER_FLAGS="-static-libgcc -static-libstdc++"', + '-DCMAKE_CXX_STANDARD_LIBRARIES="-static-libgcc -static-libstdc++"', + ); + } + + $cmake->build(); + + $re2Content = file_get_contents("{$lib->getSourceDir()}/third_party/re2/re2.pc"); + $re2Content = "prefix={$lib->getBuildRootPath()}\nexec_prefix=\${prefix}\n{$re2Content}"; + file_put_contents("{$lib->getLibDir()}/pkgconfig/re2.pc", $re2Content); + $lib->patchPkgconfPrefix(['grpc++.pc', 'grpc.pc', 'grpc++_unsecure.pc', 'grpc_unsecure.pc', 're2.pc']); + } +} diff --git a/src/Package/Library/icu.php b/src/Package/Library/icu.php new file mode 100644 index 00000000..7364e94a --- /dev/null +++ b/src/Package/Library/icu.php @@ -0,0 +1,66 @@ +getBinDir()}/icu-config", '/default_prefix=.*/m', 'default_prefix="{BUILD_ROOT_PATH}"'); + } + + #[BuildFor('Linux')] + public function buildLinux(LibraryPackage $lib, ToolchainInterface $toolchain, PackageBuilder $builder): void + { + $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"' : ''; + shell()->cd($lib->getSourceDir() . '/source')->initializeEnv($lib) + ->exec( + "{$cppflags} {$cxxflags} {$ldflags} " . + './runConfigureICU Linux ' . + '--enable-static ' . + '--disable-shared ' . + '--with-data-packaging=static ' . + '--enable-release=yes ' . + '--enable-extras=no ' . + '--enable-icuio=yes ' . + '--enable-dyload=no ' . + '--enable-tools=yes ' . + '--enable-tests=no ' . + '--enable-samples=no ' . + '--prefix=' . $lib->getBuildRootPath() + ) + ->exec('make clean') + ->exec("make -j{$builder->concurrency}") + ->exec('make install'); + + $lib->patchPkgconfPrefix(patch_option: PKGCONF_PATCH_PREFIX); + FileSystem::removeDir("{$lib->getLibDir()}/icu"); + } + + #[BuildFor('Darwin')] + public function buildDarwin(LibraryPackage $lib, PackageBuilder $builder): void + { + shell()->cd($lib->getSourceDir() . '/source') + ->exec("./runConfigureICU MacOSX --enable-static --disable-shared --disable-extras --disable-samples --disable-tests --prefix={$lib->getBuildRootPath()}") + ->exec('make clean') + ->exec("make -j{$builder->concurrency}") + ->exec('make install'); + + $lib->patchPkgconfPrefix(patch_option: PKGCONF_PATCH_PREFIX); + FileSystem::removeDir("{$lib->getLibDir()}/icu"); + } +}