From 861c49c9bc30278c6621ce7df96bfe842cd96c1a Mon Sep 17 00:00:00 2001 From: DubbleClick Date: Tue, 6 May 2025 16:24:57 +0700 Subject: [PATCH 01/50] make sure -fpic -fpie from CFLAGS bleeds through to libxslt compilation --- src/SPC/builder/unix/library/libxslt.php | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/src/SPC/builder/unix/library/libxslt.php b/src/SPC/builder/unix/library/libxslt.php index 17fb2f1e..4026b533 100644 --- a/src/SPC/builder/unix/library/libxslt.php +++ b/src/SPC/builder/unix/library/libxslt.php @@ -25,12 +25,14 @@ trait libxslt } } shell()->cd($this->source_dir) - ->exec( - 'CFLAGS="-I' . BUILD_INCLUDE_PATH . '" ' . + ->setEnv([ + 'CFLAGS' => trim($this->getLibExtraCFlags() . ' -I' . BUILD_INCLUDE_PATH), + 'LDFLAGS' => trim($this->getLibExtraLdFlags() . ' -L' . BUILD_LIB_PATH), + 'LIBS' => trim($this->getLibExtraLibs() . "{$required_libs} -lstdc++") + ]) + ->execWithEnv( "{$this->builder->getOption('library_path')} " . "{$this->builder->getOption('ld_library_path')} " . - 'LDFLAGS="-L' . BUILD_LIB_PATH . '" ' . - "LIBS='{$required_libs} -lstdc++' " . './configure ' . '--enable-static --disable-shared ' . '--without-python ' . @@ -41,9 +43,9 @@ trait libxslt '--with-libxml-prefix=' . escapeshellarg(BUILD_ROOT_PATH) . ' ' . '--prefix=' ) - ->exec('make clean') - ->exec("make -j{$this->builder->concurrency}") - ->exec('make install DESTDIR=' . escapeshellarg(BUILD_ROOT_PATH)); + ->execWithEnv('make clean') + ->execWithEnv("make -j{$this->builder->concurrency}") + ->execWithEnv('make install DESTDIR=' . escapeshellarg(BUILD_ROOT_PATH)); $this->patchPkgconfPrefix(['libexslt.pc']); } } From 16a36b8315015c770c2fb30798aee7245475c9f6 Mon Sep 17 00:00:00 2001 From: DubbleClick Date: Tue, 6 May 2025 16:39:02 +0700 Subject: [PATCH 02/50] damn comma --- src/SPC/builder/unix/library/libxslt.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/SPC/builder/unix/library/libxslt.php b/src/SPC/builder/unix/library/libxslt.php index 4026b533..799c87c2 100644 --- a/src/SPC/builder/unix/library/libxslt.php +++ b/src/SPC/builder/unix/library/libxslt.php @@ -28,7 +28,7 @@ trait libxslt ->setEnv([ 'CFLAGS' => trim($this->getLibExtraCFlags() . ' -I' . BUILD_INCLUDE_PATH), 'LDFLAGS' => trim($this->getLibExtraLdFlags() . ' -L' . BUILD_LIB_PATH), - 'LIBS' => trim($this->getLibExtraLibs() . "{$required_libs} -lstdc++") + 'LIBS' => trim($this->getLibExtraLibs() . "{$required_libs} -lstdc++"), ]) ->execWithEnv( "{$this->builder->getOption('library_path')} " . From a3ee3e5a24be0c2a944db9cdcc97ebc633a01a4a Mon Sep 17 00:00:00 2001 From: DubbleClick Date: Tue, 6 May 2025 16:41:35 +0700 Subject: [PATCH 03/50] add to tests --- src/globals/test-extensions.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/globals/test-extensions.php b/src/globals/test-extensions.php index ef2b6fa6..7915aef1 100644 --- a/src/globals/test-extensions.php +++ b/src/globals/test-extensions.php @@ -45,7 +45,7 @@ $prefer_pre_built = false; // If you want to test your added extensions and libs, add below (comma separated, example `bcmath,openssl`). $extensions = match (PHP_OS_FAMILY) { - 'Linux', 'Darwin' => 'pgsql', + 'Linux', 'Darwin' => 'xsl,simplexml,xslwriter', 'Windows' => 'xlswriter,openssl', }; From 14563417a767ad41528a120615992c82edcaf8fd Mon Sep 17 00:00:00 2001 From: DubbleClick Date: Tue, 6 May 2025 16:53:33 +0700 Subject: [PATCH 04/50] don't test on windows x) --- src/globals/test-extensions.php | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/globals/test-extensions.php b/src/globals/test-extensions.php index 7915aef1..7abe1aa0 100644 --- a/src/globals/test-extensions.php +++ b/src/globals/test-extensions.php @@ -21,15 +21,15 @@ $test_php_version = [ // test os (macos-13, macos-14, macos-15, ubuntu-latest, windows-latest are available) $test_os = [ - // 'macos-13', + 'macos-13', // 'macos-14', - // 'macos-15', - // 'ubuntu-latest', - // 'ubuntu-22.04', + 'macos-15', + 'ubuntu-latest', + 'ubuntu-22.04', // 'ubuntu-24.04', // 'ubuntu-22.04-arm', // 'ubuntu-24.04-arm', - 'windows-latest', + // 'windows-latest', ]; // whether enable thread safe From a65bc950916021e5ead0936d506c3c66f9c89553 Mon Sep 17 00:00:00 2001 From: DubbleClick Date: Tue, 6 May 2025 16:54:20 +0700 Subject: [PATCH 05/50] test arm64 too --- src/globals/test-extensions.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/globals/test-extensions.php b/src/globals/test-extensions.php index 7abe1aa0..ef3d0cc1 100644 --- a/src/globals/test-extensions.php +++ b/src/globals/test-extensions.php @@ -27,8 +27,8 @@ $test_os = [ 'ubuntu-latest', 'ubuntu-22.04', // 'ubuntu-24.04', - // 'ubuntu-22.04-arm', - // 'ubuntu-24.04-arm', + 'ubuntu-22.04-arm', + 'ubuntu-24.04-arm', // 'windows-latest', ]; From e4028da886752d940df0296683861caeb8290e91 Mon Sep 17 00:00:00 2001 From: DubbleClick Date: Tue, 6 May 2025 16:56:06 +0700 Subject: [PATCH 06/50] typo --- src/globals/test-extensions.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/globals/test-extensions.php b/src/globals/test-extensions.php index ef3d0cc1..2739d3ac 100644 --- a/src/globals/test-extensions.php +++ b/src/globals/test-extensions.php @@ -45,7 +45,7 @@ $prefer_pre_built = false; // If you want to test your added extensions and libs, add below (comma separated, example `bcmath,openssl`). $extensions = match (PHP_OS_FAMILY) { - 'Linux', 'Darwin' => 'xsl,simplexml,xslwriter', + 'Linux', 'Darwin' => 'xsl,simplexml,xlswriter', 'Windows' => 'xlswriter,openssl', }; From f5fffafd43028e73964d5d5df08c028771fc80af Mon Sep 17 00:00:00 2001 From: henderkes Date: Thu, 15 May 2025 14:45:51 +0700 Subject: [PATCH 07/50] =?UTF-8?q?format=20setEnv=C2=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/SPC/builder/linux/library/libffi.php | 6 +++++- src/SPC/builder/linux/library/openssl.php | 6 +++++- src/SPC/builder/macos/library/openssl.php | 6 +++++- src/SPC/builder/unix/library/brotli.php | 6 +++++- src/SPC/builder/unix/library/bzip2.php | 6 +++++- src/SPC/builder/unix/library/freetype.php | 6 +++++- src/SPC/builder/unix/library/gmp.php | 6 +++++- src/SPC/builder/unix/library/gmssl.php | 6 +++++- src/SPC/builder/unix/library/libargon2.php | 6 +++++- src/SPC/builder/unix/library/libavif.php | 6 +++++- src/SPC/builder/unix/library/libcares.php | 6 +++++- src/SPC/builder/unix/library/libevent.php | 6 +++++- src/SPC/builder/unix/library/libiconv.php | 6 +++++- src/SPC/builder/unix/library/liblz4.php | 6 +++++- src/SPC/builder/unix/library/libtiff.php | 6 +++++- src/SPC/builder/unix/library/ncurses.php | 6 +++++- src/SPC/builder/unix/library/nghttp2.php | 6 +++++- src/SPC/builder/unix/library/onig.php | 6 +++++- src/SPC/builder/unix/library/pkgconfig.php | 6 +++++- src/SPC/builder/unix/library/readline.php | 6 +++++- src/SPC/builder/unix/library/sqlite.php | 6 +++++- src/SPC/builder/unix/library/zlib.php | 6 +++++- 22 files changed, 110 insertions(+), 22 deletions(-) diff --git a/src/SPC/builder/linux/library/libffi.php b/src/SPC/builder/linux/library/libffi.php index 9d1c2d79..d7421425 100644 --- a/src/SPC/builder/linux/library/libffi.php +++ b/src/SPC/builder/linux/library/libffi.php @@ -21,7 +21,11 @@ class libffi extends LinuxLibraryBase $arch = getenv('SPC_ARCH'); shell()->cd($this->source_dir) - ->setEnv(['CFLAGS' => $this->getLibExtraCFlags(), 'LDFLAGS' => $this->getLibExtraLdFlags(), 'LIBS' => $this->getLibExtraLibs()]) + ->setEnv([ + 'CFLAGS' => $this->getLibExtraCFlags(), + 'LDFLAGS' => $this->getLibExtraLdFlags(), + 'LIBS' => $this->getLibExtraLibs(), + ]) ->execWithEnv( './configure ' . '--enable-static ' . diff --git a/src/SPC/builder/linux/library/openssl.php b/src/SPC/builder/linux/library/openssl.php index 5c07ec7e..55a238f9 100644 --- a/src/SPC/builder/linux/library/openssl.php +++ b/src/SPC/builder/linux/library/openssl.php @@ -65,7 +65,11 @@ class openssl extends LinuxLibraryBase $clang_postfix = SystemUtil::getCCType(getenv('CC')) === 'clang' ? '-clang' : ''; shell()->cd($this->source_dir) - ->setEnv(['CFLAGS' => $this->getLibExtraCFlags() ?: $this->builder->arch_c_flags, 'LDFLAGS' => $this->getLibExtraLdFlags(), 'LIBS' => $this->getLibExtraLibs()]) + ->setEnv([ + 'CFLAGS' => $this->getLibExtraCFlags(), + 'LDFLAGS' => $this->getLibExtraLdFlags(), + 'LIBS' => $this->getLibExtraLibs(), + ]) ->execWithEnv( "{$env} ./Configure no-shared {$extra} " . '--prefix=/ ' . diff --git a/src/SPC/builder/macos/library/openssl.php b/src/SPC/builder/macos/library/openssl.php index e0e3919f..28796d7c 100644 --- a/src/SPC/builder/macos/library/openssl.php +++ b/src/SPC/builder/macos/library/openssl.php @@ -50,7 +50,11 @@ class openssl extends MacOSLibraryBase $arch = getenv('SPC_ARCH'); shell()->cd($this->source_dir) - ->setEnv(['CFLAGS' => $this->getLibExtraCFlags(), 'LDFLAGS' => $this->getLibExtraLdFlags(), 'LIBS' => $this->getLibExtraLibs()]) + ->setEnv([ + 'CFLAGS' => $this->getLibExtraCFlags(), + 'LDFLAGS' => $this->getLibExtraLdFlags(), + 'LIBS' => $this->getLibExtraLibs(), + ]) ->exec( "./Configure no-shared {$extra} " . '--prefix=/ ' . // use prefix=/ diff --git a/src/SPC/builder/unix/library/brotli.php b/src/SPC/builder/unix/library/brotli.php index 9e764fcb..44be934d 100644 --- a/src/SPC/builder/unix/library/brotli.php +++ b/src/SPC/builder/unix/library/brotli.php @@ -18,7 +18,11 @@ trait brotli { FileSystem::resetDir($this->source_dir . '/build-dir'); shell()->cd($this->source_dir . '/build-dir') - ->setEnv(['CFLAGS' => $this->getLibExtraCFlags(), 'LDFLAGS' => $this->getLibExtraLdFlags(), 'LIBS' => $this->getLibExtraLibs()]) + ->setEnv([ + 'CFLAGS' => $this->getLibExtraCFlags(), + 'LDFLAGS' => $this->getLibExtraLdFlags(), + 'LIBS' => $this->getLibExtraLibs(), + ]) ->execWithEnv( 'cmake ' . '-DCMAKE_BUILD_TYPE=Release ' . diff --git a/src/SPC/builder/unix/library/bzip2.php b/src/SPC/builder/unix/library/bzip2.php index 0241fb1b..284783c9 100644 --- a/src/SPC/builder/unix/library/bzip2.php +++ b/src/SPC/builder/unix/library/bzip2.php @@ -17,7 +17,11 @@ trait bzip2 protected function build(): void { shell()->cd($this->source_dir) - ->setEnv(['CFLAGS' => $this->getLibExtraCFlags(), 'LDFLAGS' => $this->getLibExtraLdFlags(), 'LIBS' => $this->getLibExtraLibs()]) + ->setEnv([ + 'CFLAGS' => $this->getLibExtraCFlags(), + 'LDFLAGS' => $this->getLibExtraLdFlags(), + 'LIBS' => $this->getLibExtraLibs(), + ]) ->execWithEnv("make PREFIX='" . BUILD_ROOT_PATH . "' clean") ->execWithEnv("make -j{$this->builder->concurrency} {$this->builder->getEnvString()} PREFIX='" . BUILD_ROOT_PATH . "' libbz2.a") ->exec('cp libbz2.a ' . BUILD_LIB_PATH) diff --git a/src/SPC/builder/unix/library/freetype.php b/src/SPC/builder/unix/library/freetype.php index 42e8f91c..6fb24212 100644 --- a/src/SPC/builder/unix/library/freetype.php +++ b/src/SPC/builder/unix/library/freetype.php @@ -23,7 +23,11 @@ trait freetype $extra_libs .= $this->builder->getLib('brotli') ? '-DFT_DISABLE_BROTLI=OFF ' : '-DFT_DISABLE_BROTLI=ON '; FileSystem::resetDir($this->source_dir . '/build'); shell()->cd($this->source_dir . '/build') - ->setEnv(['CFLAGS' => $this->getLibExtraCFlags(), 'LDFLAGS' => $this->getLibExtraLdFlags(), 'LIBS' => $this->getLibExtraLibs()]) + ->setEnv([ + 'CFLAGS' => $this->getLibExtraCFlags(), + 'LDFLAGS' => $this->getLibExtraLdFlags(), + 'LIBS' => $this->getLibExtraLibs(), + ]) ->execWithEnv( "cmake {$this->builder->makeCmakeArgs()} -DFT_DISABLE_HARFBUZZ=ON " . '-DBUILD_SHARED_LIBS=OFF ' . diff --git a/src/SPC/builder/unix/library/gmp.php b/src/SPC/builder/unix/library/gmp.php index 49b207fb..c74251d6 100644 --- a/src/SPC/builder/unix/library/gmp.php +++ b/src/SPC/builder/unix/library/gmp.php @@ -16,7 +16,11 @@ trait gmp protected function build(): void { shell()->cd($this->source_dir) - ->setEnv(['CFLAGS' => $this->getLibExtraCFlags() ?: $this->builder->arch_c_flags, 'LDFLAGS' => $this->getLibExtraLdFlags(), 'LIBS' => $this->getLibExtraLibs()]) + ->setEnv([ + 'CFLAGS' => $this->getLibExtraCFlags(), + 'LDFLAGS' => $this->getLibExtraLdFlags(), + 'LIBS' => $this->getLibExtraLibs(), + ]) ->execWithEnv( './configure ' . '--enable-static --disable-shared ' . diff --git a/src/SPC/builder/unix/library/gmssl.php b/src/SPC/builder/unix/library/gmssl.php index 1d946621..792a1c93 100644 --- a/src/SPC/builder/unix/library/gmssl.php +++ b/src/SPC/builder/unix/library/gmssl.php @@ -20,7 +20,11 @@ trait gmssl FileSystem::resetDir($this->source_dir . '/build'); // Start build shell()->cd($this->source_dir . '/build') - ->setEnv(['CFLAGS' => $this->getLibExtraCFlags(), 'LDFLAGS' => $this->getLibExtraLdFlags(), 'LIBS' => $this->getLibExtraLibs()]) + ->setEnv([ + 'CFLAGS' => $this->getLibExtraCFlags(), + 'LDFLAGS' => $this->getLibExtraLdFlags(), + 'LIBS' => $this->getLibExtraLibs(), + ]) ->execWithEnv("cmake {$this->builder->makeCmakeArgs()} -DBUILD_SHARED_LIBS=OFF ..") ->execWithEnv("cmake --build . -j {$this->builder->concurrency}") ->execWithEnv('make install'); diff --git a/src/SPC/builder/unix/library/libargon2.php b/src/SPC/builder/unix/library/libargon2.php index e91b71f0..e2dba687 100644 --- a/src/SPC/builder/unix/library/libargon2.php +++ b/src/SPC/builder/unix/library/libargon2.php @@ -11,7 +11,11 @@ trait libargon2 protected function build() { shell()->cd($this->source_dir) - ->setEnv(['CFLAGS' => $this->getLibExtraCFlags(), 'LDFLAGS' => $this->getLibExtraLdFlags(), 'LIBS' => $this->getLibExtraLibs()]) + ->setEnv([ + 'CFLAGS' => $this->getLibExtraCFlags(), + 'LDFLAGS' => $this->getLibExtraLdFlags(), + 'LIBS' => $this->getLibExtraLibs(), + ]) ->exec("make PREFIX='' clean") ->execWithEnv("make -j{$this->builder->concurrency} PREFIX=''") ->execWithEnv("make install PREFIX='' DESTDIR=" . BUILD_ROOT_PATH); diff --git a/src/SPC/builder/unix/library/libavif.php b/src/SPC/builder/unix/library/libavif.php index c2aaafcd..ddcf1d57 100644 --- a/src/SPC/builder/unix/library/libavif.php +++ b/src/SPC/builder/unix/library/libavif.php @@ -22,7 +22,11 @@ trait libavif FileSystem::resetDir($this->source_dir . '/build'); // Start build shell()->cd($this->source_dir . '/build') - ->setEnv(['CFLAGS' => $this->getLibExtraCFlags(), 'LDFLAGS' => $this->getLibExtraLdFlags(), 'LIBS' => $this->getLibExtraLibs()]) + ->setEnv([ + 'CFLAGS' => $this->getLibExtraCFlags(), + 'LDFLAGS' => $this->getLibExtraLdFlags(), + 'LIBS' => $this->getLibExtraLibs(), + ]) ->execWithEnv("cmake {$this->builder->makeCmakeArgs()} -DBUILD_SHARED_LIBS=OFF -DAVIF_LIBYUV=OFF ..") ->execWithEnv("cmake --build . -j {$this->builder->concurrency}") ->execWithEnv('make install'); diff --git a/src/SPC/builder/unix/library/libcares.php b/src/SPC/builder/unix/library/libcares.php index d99cc685..94871927 100644 --- a/src/SPC/builder/unix/library/libcares.php +++ b/src/SPC/builder/unix/library/libcares.php @@ -25,7 +25,11 @@ trait libcares protected function build(): void { shell()->cd($this->source_dir) - ->setEnv(['CFLAGS' => $this->getLibExtraCFlags(), 'LDFLAGS' => $this->getLibExtraLdFlags(), 'LIBS' => $this->getLibExtraLibs()]) + ->setEnv([ + 'CFLAGS' => $this->getLibExtraCFlags(), + 'LDFLAGS' => $this->getLibExtraLdFlags(), + 'LIBS' => $this->getLibExtraLibs(), + ]) ->execWithEnv('./configure --prefix= --enable-static --disable-shared --disable-tests --with-pic') ->execWithEnv("make -j {$this->builder->concurrency}") ->execWithEnv('make install DESTDIR=' . BUILD_ROOT_PATH); diff --git a/src/SPC/builder/unix/library/libevent.php b/src/SPC/builder/unix/library/libevent.php index 2e80f32e..bd070fd5 100644 --- a/src/SPC/builder/unix/library/libevent.php +++ b/src/SPC/builder/unix/library/libevent.php @@ -44,7 +44,11 @@ trait libevent FileSystem::resetDir($this->source_dir . '/build'); // Start build shell()->cd($this->source_dir . '/build') - ->setEnv(['CFLAGS' => $this->getLibExtraCFlags(), 'LDFLAGS' => $this->getLibExtraLdFlags(), 'LIBS' => $this->getLibExtraLibs()]) + ->setEnv([ + 'CFLAGS' => $this->getLibExtraCFlags(), + 'LDFLAGS' => $this->getLibExtraLdFlags(), + 'LIBS' => $this->getLibExtraLibs(), + ]) ->execWithEnv( 'cmake ' . '-DCMAKE_INSTALL_PREFIX=' . BUILD_ROOT_PATH . ' ' . diff --git a/src/SPC/builder/unix/library/libiconv.php b/src/SPC/builder/unix/library/libiconv.php index a587c472..710e7425 100644 --- a/src/SPC/builder/unix/library/libiconv.php +++ b/src/SPC/builder/unix/library/libiconv.php @@ -11,7 +11,11 @@ trait libiconv [,,$destdir] = SEPARATED_PATH; shell()->cd($this->source_dir) - ->setEnv(['CFLAGS' => $this->getLibExtraCFlags(), 'LDFLAGS' => $this->getLibExtraLdFlags(), 'LIBS' => $this->getLibExtraLibs()]) + ->setEnv([ + 'CFLAGS' => $this->getLibExtraCFlags(), + 'LDFLAGS' => $this->getLibExtraLdFlags(), + 'LIBS' => $this->getLibExtraLibs(), + ]) ->execWithEnv( './configure ' . '--enable-static ' . diff --git a/src/SPC/builder/unix/library/liblz4.php b/src/SPC/builder/unix/library/liblz4.php index 45e803bf..39c24512 100644 --- a/src/SPC/builder/unix/library/liblz4.php +++ b/src/SPC/builder/unix/library/liblz4.php @@ -18,7 +18,11 @@ trait liblz4 protected function build(): void { shell()->cd($this->source_dir) - ->setEnv(['CFLAGS' => $this->getLibExtraCFlags(), 'LDFLAGS' => $this->getLibExtraLdFlags(), 'LIBS' => $this->getLibExtraLibs()]) + ->setEnv([ + 'CFLAGS' => $this->getLibExtraCFlags(), + 'LDFLAGS' => $this->getLibExtraLdFlags(), + 'LIBS' => $this->getLibExtraLibs(), + ]) ->execWithEnv("make PREFIX='' clean") ->execWithEnv("make -j{$this->builder->concurrency} PREFIX=''") ->execWithEnv("make install PREFIX='' DESTDIR=" . BUILD_ROOT_PATH); diff --git a/src/SPC/builder/unix/library/libtiff.php b/src/SPC/builder/unix/library/libtiff.php index 5d2cb4c1..b4ed21ad 100644 --- a/src/SPC/builder/unix/library/libtiff.php +++ b/src/SPC/builder/unix/library/libtiff.php @@ -23,7 +23,11 @@ trait libtiff $extra_libs .= ' --disable-lzma --disable-zstd --disable-webp --disable-libdeflate'; $shell = shell()->cd($this->source_dir) - ->setEnv(['CFLAGS' => $this->getLibExtraCFlags(), 'LDFLAGS' => $this->getLibExtraLdFlags(), 'LIBS' => $this->getLibExtraLibs()]) + ->setEnv([ + 'CFLAGS' => $this->getLibExtraCFlags(), + 'LDFLAGS' => $this->getLibExtraLdFlags(), + 'LIBS' => $this->getLibExtraLibs(), + ]) ->execWithEnv( './configure ' . '--enable-static --disable-shared ' . diff --git a/src/SPC/builder/unix/library/ncurses.php b/src/SPC/builder/unix/library/ncurses.php index a44ac175..0297afe2 100644 --- a/src/SPC/builder/unix/library/ncurses.php +++ b/src/SPC/builder/unix/library/ncurses.php @@ -12,7 +12,11 @@ trait ncurses { $filelist = FileSystem::scanDirFiles(BUILD_BIN_PATH, relative: true); shell()->cd($this->source_dir) - ->setEnv(['CFLAGS' => $this->getLibExtraCFlags(), 'LDFLAGS' => $this->getLibExtraLdFlags(), 'LIBS' => $this->getLibExtraLibs()]) + ->setEnv([ + 'CFLAGS' => $this->getLibExtraCFlags(), + 'LDFLAGS' => $this->getLibExtraLdFlags(), + 'LIBS' => $this->getLibExtraLibs(), + ]) ->execWithEnv( './configure ' . '--enable-static ' . diff --git a/src/SPC/builder/unix/library/nghttp2.php b/src/SPC/builder/unix/library/nghttp2.php index 8f764c2a..cd0c488f 100644 --- a/src/SPC/builder/unix/library/nghttp2.php +++ b/src/SPC/builder/unix/library/nghttp2.php @@ -36,7 +36,11 @@ trait nghttp2 [,,$destdir] = SEPARATED_PATH; shell()->cd($this->source_dir) - ->setEnv(['CFLAGS' => $this->getLibExtraCFlags(), 'LDFLAGS' => $this->getLibExtraLdFlags(), 'LIBS' => $this->getLibExtraLibs()]) + ->setEnv([ + 'CFLAGS' => $this->getLibExtraCFlags(), + 'LDFLAGS' => $this->getLibExtraLdFlags(), + 'LIBS' => $this->getLibExtraLibs(), + ]) ->execWithEnv( './configure ' . '--enable-static ' . diff --git a/src/SPC/builder/unix/library/onig.php b/src/SPC/builder/unix/library/onig.php index 60ea84fa..56f72413 100644 --- a/src/SPC/builder/unix/library/onig.php +++ b/src/SPC/builder/unix/library/onig.php @@ -18,7 +18,11 @@ trait onig [,,$destdir] = SEPARATED_PATH; shell()->cd($this->source_dir) - ->setEnv(['CFLAGS' => $this->getLibExtraCFlags() ?: $this->builder->arch_c_flags, 'LDFLAGS' => $this->getLibExtraLdFlags(), 'LIBS' => $this->getLibExtraLibs()]) + ->setEnv([ + 'CFLAGS' => $this->getLibExtraCFlags(), + 'LDFLAGS' => $this->getLibExtraLdFlags(), + 'LIBS' => $this->getLibExtraLibs(), + ]) ->execWithEnv('./configure --enable-static --disable-shared --prefix=') ->execWithEnv('make clean') ->execWithEnv("make -j{$this->builder->concurrency}") diff --git a/src/SPC/builder/unix/library/pkgconfig.php b/src/SPC/builder/unix/library/pkgconfig.php index b489bbba..9478d9ea 100644 --- a/src/SPC/builder/unix/library/pkgconfig.php +++ b/src/SPC/builder/unix/library/pkgconfig.php @@ -14,7 +14,11 @@ trait pkgconfig $ldflags = !($this instanceof LinuxLibraryBase) || getenv('SPC_LIBC') === 'glibc' ? '' : '--static'; shell()->cd($this->source_dir) - ->setEnv(['CFLAGS' => "{$this->getLibExtraCFlags()} {$cflags}", 'LDFLAGS' => "{$this->getLibExtraLdFlags()} {$ldflags}", 'LIBS' => $this->getLibExtraLibs()]) + ->setEnv([ + 'CFLAGS' => "{$this->getLibExtraCFlags()} {$cflags}", + 'LDFLAGS' => "{$this->getLibExtraLdFlags()} {$ldflags}", + 'LIBS' => $this->getLibExtraLibs(), + ]) ->execWithEnv( './configure ' . '--disable-shared ' . diff --git a/src/SPC/builder/unix/library/readline.php b/src/SPC/builder/unix/library/readline.php index d0369c1a..0e881e7c 100644 --- a/src/SPC/builder/unix/library/readline.php +++ b/src/SPC/builder/unix/library/readline.php @@ -16,7 +16,11 @@ trait readline protected function build(): void { shell()->cd($this->source_dir) - ->setEnv(['CFLAGS' => $this->getLibExtraCFlags(), 'LDFLAGS' => $this->getLibExtraLdFlags(), 'LIBS' => $this->getLibExtraLibs()]) + ->setEnv([ + 'CFLAGS' => $this->getLibExtraCFlags(), + 'LDFLAGS' => $this->getLibExtraLdFlags(), + 'LIBS' => $this->getLibExtraLibs(), + ]) ->execWithEnv( './configure ' . '--enable-static=yes ' . diff --git a/src/SPC/builder/unix/library/sqlite.php b/src/SPC/builder/unix/library/sqlite.php index ee814702..7f9f31bd 100644 --- a/src/SPC/builder/unix/library/sqlite.php +++ b/src/SPC/builder/unix/library/sqlite.php @@ -9,7 +9,11 @@ trait sqlite protected function build(): void { shell()->cd($this->source_dir) - ->setEnv(['CFLAGS' => $this->getLibExtraCFlags(), 'LDFLAGS' => $this->getLibExtraLdFlags(), 'LIBS' => $this->getLibExtraLibs()]) + ->setEnv([ + 'CFLAGS' => $this->getLibExtraCFlags(), + 'LDFLAGS' => $this->getLibExtraLdFlags(), + 'LIBS' => $this->getLibExtraLibs(), + ]) ->execWithEnv('./configure --enable-static --disable-shared --prefix=') ->execWithEnv('make clean') ->execWithEnv("make -j{$this->builder->concurrency}") diff --git a/src/SPC/builder/unix/library/zlib.php b/src/SPC/builder/unix/library/zlib.php index f764de91..42c46259 100644 --- a/src/SPC/builder/unix/library/zlib.php +++ b/src/SPC/builder/unix/library/zlib.php @@ -18,7 +18,11 @@ trait zlib [,,$destdir] = SEPARATED_PATH; shell()->cd($this->source_dir) - ->setEnv(['CFLAGS' => $this->getLibExtraCFlags(), 'LDFLAGS' => $this->getLibExtraLdFlags(), 'LIBS' => $this->getLibExtraLibs()]) + ->setEnv([ + 'CFLAGS' => $this->getLibExtraCFlags(), + 'LDFLAGS' => $this->getLibExtraLdFlags(), + 'LIBS' => $this->getLibExtraLibs(), + ]) ->execWithEnv('./configure --static --prefix=') ->execWithEnv('make clean') ->execWithEnv("make -j{$this->builder->concurrency}") From 2897fdda04b0729aaef343a180a50aabdf507eff Mon Sep 17 00:00:00 2001 From: henderkes Date: Thu, 15 May 2025 14:47:54 +0700 Subject: [PATCH 08/50] fix icu for relocatable objects (required by libphp.so building) --- src/SPC/builder/linux/library/icu.php | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/src/SPC/builder/linux/library/icu.php b/src/SPC/builder/linux/library/icu.php index 519c0734..0543c0d8 100644 --- a/src/SPC/builder/linux/library/icu.php +++ b/src/SPC/builder/linux/library/icu.php @@ -14,13 +14,19 @@ class icu extends LinuxLibraryBase protected function build(): void { - $cppflags = 'CPPFLAGS="-DU_CHARSET_IS_UTF8=1 -DU_USING_ICU_NAMESPACE=1 -DU_STATIC_IMPLEMENTATION=1 -fPIC -fPIE -fno-ident"'; - $cxxflags = 'CXXFLAGS="-std=c++17"'; + $cppflags = 'CPPFLAGS="-DU_CHARSET_IS_UTF8=1 -DU_USING_ICU_NAMESPACE=1 -DU_STATIC_IMPLEMENTATION=1 -DPIC -fPIC"'; + $cxxflags = 'CXXFLAGS="-std=c++17 -fPIC -fno-ident"'; $ldflags = getenv('SPC_LIBC') !== 'glibc' ? 'LDFLAGS="-static"' : ''; shell()->cd($this->source_dir . '/source') - ->exec( + ->setEnv([ + 'CFLAGS' => $this->getLibExtraCFlags(), + 'LDFLAGS' => $this->getLibExtraLdFlags(), + 'LIBS' => $this->getLibExtraLibs(), + ]) + ->execWithEnv( "{$cppflags} {$cxxflags} {$ldflags} " . './runConfigureICU Linux ' . + '--enable-pic ' . '--enable-static ' . '--disable-shared ' . '--with-data-packaging=static ' . @@ -33,9 +39,9 @@ class icu extends LinuxLibraryBase '--enable-samples=no ' . '--prefix=' . BUILD_ROOT_PATH ) - ->exec('make clean') - ->exec("make -j{$this->builder->concurrency}") - ->exec('make install'); + ->execWithEnv('make clean') + ->execWithEnv("make -j{$this->builder->concurrency}") + ->execWithEnv('make install'); $this->patchPkgconfPrefix(['icu-i18n.pc', 'icu-io.pc', 'icu-uc.pc'], PKGCONF_PATCH_PREFIX); FileSystem::removeDir(BUILD_LIB_PATH . '/icu'); From 03b634b9614efa00bad51708e7ed6086f80c7f6d Mon Sep 17 00:00:00 2001 From: henderkes Date: Thu, 15 May 2025 15:29:12 +0700 Subject: [PATCH 09/50] fix libsodium with -fPIC too --- src/SPC/builder/unix/library/libsodium.php | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/SPC/builder/unix/library/libsodium.php b/src/SPC/builder/unix/library/libsodium.php index b24d52b7..c6bc6168 100644 --- a/src/SPC/builder/unix/library/libsodium.php +++ b/src/SPC/builder/unix/library/libsodium.php @@ -9,10 +9,15 @@ trait libsodium protected function build(): void { shell()->cd($this->source_dir) - ->exec('./configure --enable-static --disable-shared --prefix=') - ->exec('make clean') - ->exec("make -j{$this->builder->concurrency}") - ->exec('make install DESTDIR=' . BUILD_ROOT_PATH); + ->setEnv([ + 'CFLAGS' => $this->getLibExtraCFlags(), + 'LDFLAGS' => $this->getLibExtraLdFlags(), + 'LIBS' => $this->getLibExtraLibs(), + ]) + ->execWithEnv('./configure --with-pic --enable-static --disable-shared --prefix=') + ->execWithEnv('make clean') + ->execWithEnv("make -j{$this->builder->concurrency}") + ->execWithEnv('make install DESTDIR=' . BUILD_ROOT_PATH); $this->patchPkgconfPrefix(['libsodium.pc'], PKGCONF_PATCH_PREFIX); } From 23ae3f60f3ccf8418308b45de6997077a4d3d1d8 Mon Sep 17 00:00:00 2001 From: henderkes Date: Thu, 15 May 2025 15:35:13 +0700 Subject: [PATCH 10/50] remove unused option --- src/SPC/builder/linux/library/icu.php | 1 - 1 file changed, 1 deletion(-) diff --git a/src/SPC/builder/linux/library/icu.php b/src/SPC/builder/linux/library/icu.php index 0543c0d8..ddcfe1b2 100644 --- a/src/SPC/builder/linux/library/icu.php +++ b/src/SPC/builder/linux/library/icu.php @@ -26,7 +26,6 @@ class icu extends LinuxLibraryBase ->execWithEnv( "{$cppflags} {$cxxflags} {$ldflags} " . './runConfigureICU Linux ' . - '--enable-pic ' . '--enable-static ' . '--disable-shared ' . '--with-data-packaging=static ' . From 6fe8b591ceeba17a78cbc009b12a79cf87593fcf Mon Sep 17 00:00:00 2001 From: henderkes Date: Thu, 15 May 2025 19:52:30 +0700 Subject: [PATCH 11/50] ld library path for shared extension building --- .gitignore | 3 +++ src/SPC/builder/Extension.php | 1 + 2 files changed, 4 insertions(+) diff --git a/.gitignore b/.gitignore index 0560542f..9d9289f6 100644 --- a/.gitignore +++ b/.gitignore @@ -10,6 +10,9 @@ docker/source/ # default source extract directory /source/ +# built by shared embed tests +/locale/ + # default source download directory /downloads/ diff --git a/src/SPC/builder/Extension.php b/src/SPC/builder/Extension.php index a3d08f09..92894054 100644 --- a/src/SPC/builder/Extension.php +++ b/src/SPC/builder/Extension.php @@ -297,6 +297,7 @@ class Extension 'CFLAGS' => $config['cflags'], 'LDFLAGS' => $config['ldflags'], 'LIBS' => $config['libs'], + 'LD_LIBRARY_PATH' => BUILD_LIB_PATH, ]; // prepare configure args shell()->cd($this->source_dir) From 9557c9ef21789e5a0eee13698958a37d1c61650e Mon Sep 17 00:00:00 2001 From: henderkes Date: Thu, 15 May 2025 21:50:35 +0700 Subject: [PATCH 12/50] remove static target for zip --- config/ext.json | 3 --- 1 file changed, 3 deletions(-) diff --git a/config/ext.json b/config/ext.json index 1df91d3b..a3018b2f 100644 --- a/config/ext.json +++ b/config/ext.json @@ -1055,9 +1055,6 @@ "support": { "BSD": "wip" }, - "target": [ - "static" - ], "type": "builtin", "arg-type": "with-prefix", "arg-type-windows": "enable", From 22001792cd7a5c6a306aa2c8bd9eaf375c3db8de Mon Sep 17 00:00:00 2001 From: henderkes Date: Thu, 15 May 2025 21:51:18 +0700 Subject: [PATCH 13/50] remove static target for swoole --- config/ext.json | 7 ------- 1 file changed, 7 deletions(-) diff --git a/config/ext.json b/config/ext.json index a3018b2f..47acef96 100644 --- a/config/ext.json +++ b/config/ext.json @@ -124,10 +124,6 @@ "Linux": "partial", "BSD": "wip" }, - "target": [ - "static", - "shared" - ], "notes": true, "arg-type": "custom", "type": "builtin", @@ -781,9 +777,6 @@ "Windows": "no", "BSD": "wip" }, - "target": [ - "static" - ], "notes": true, "type": "external", "source": "swoole", From b402b735d63a4de8bfa43c94314e2997ed10a5de Mon Sep 17 00:00:00 2001 From: henderkes Date: Thu, 15 May 2025 23:30:07 +0700 Subject: [PATCH 14/50] fix copy command with BUILD_MODULES_CONSTANT --- src/SPC/builder/Extension.php | 13 +++++++++++-- src/SPC/builder/extension/opcache.php | 11 +++++++++++ src/SPC/builder/extension/xdebug.php | 5 ++++- src/SPC/builder/unix/UnixBuilderBase.php | 4 ++-- src/globals/internal-env.php | 7 +++++++ 5 files changed, 35 insertions(+), 5 deletions(-) diff --git a/src/SPC/builder/Extension.php b/src/SPC/builder/Extension.php index 92894054..2ab50f98 100644 --- a/src/SPC/builder/Extension.php +++ b/src/SPC/builder/Extension.php @@ -194,7 +194,7 @@ class Extension */ public function runSharedExtensionCheckUnix(): void { - [$ret] = shell()->execWithResult(BUILD_BIN_PATH . '/php -n -d "extension=' . BUILD_LIB_PATH . '/' . $this->getName() . '.so" --ri ' . $this->getName()); + [$ret] = shell()->execWithResult(BUILD_BIN_PATH . '/php -n -d "extension=' . BUILD_MODULES_PATH . '/' . $this->getName() . '.so" --ri ' . $this->getName()); if ($ret !== 0) { throw new RuntimeException($this->getName() . '.so failed to load'); } @@ -308,7 +308,16 @@ class Extension ->execWithEnv('make -j' . $this->builder->concurrency); // copy shared library - copy($this->source_dir . '/modules/' . $this->getDistName() . '.so', BUILD_LIB_PATH . '/' . $this->getDistName() . '.so'); + FileSystem::createDir(BUILD_MODULES_PATH); + $extensionDirFile = (getenv('EXTENSION_DIR') ?: $this->source_dir . '/modules') . '/' . $this->getName() . '.so'; + $sourceDirFile = $this->source_dir . '/modules/' . $this->getName() . '.so'; + if (file_exists($extensionDirFile)) { + copy($extensionDirFile, BUILD_MODULES_PATH . '/' . $this->getName() . '.so'); + } elseif (file_exists($sourceDirFile)) { + copy($sourceDirFile, BUILD_MODULES_PATH . '/' . $this->getName() . '.so'); + } else { + throw new RuntimeException('extension ' . $this->getName() . ' built successfully, but into an unexpected location.'); + } // check shared extension with php-cli if (file_exists(BUILD_BIN_PATH . '/php')) { $this->runSharedExtensionCheckUnix(); diff --git a/src/SPC/builder/extension/opcache.php b/src/SPC/builder/extension/opcache.php index 5d9dda0a..5f406e16 100644 --- a/src/SPC/builder/extension/opcache.php +++ b/src/SPC/builder/extension/opcache.php @@ -24,6 +24,17 @@ class opcache extends Extension } } + public function runSharedExtensionCheckUnix(): void + { + [$ret, $out] = shell()->execWithResult(BUILD_BIN_PATH . '/php -v'); + if ($ret !== 0) { + throw new RuntimeException('opcache.so failed to load.'); + } + if (!str_contains(join($out), 'with Zend OPcache')) { + throw new RuntimeException('opcache.so failed to load.'); + } + } + public function patchBeforeBuildconf(): bool { if (file_exists(SOURCE_PATH . '/php-src/.opcache_patched')) { diff --git a/src/SPC/builder/extension/xdebug.php b/src/SPC/builder/extension/xdebug.php index ed592056..6b945f49 100644 --- a/src/SPC/builder/extension/xdebug.php +++ b/src/SPC/builder/extension/xdebug.php @@ -13,9 +13,12 @@ class xdebug extends Extension { public function runSharedExtensionCheckUnix(): void { - [$ret] = shell()->execWithResult(BUILD_BIN_PATH . '/php -n -d "zend_extension=' . BUILD_LIB_PATH . '/xdebug.so" --ri xdebug'); + [$ret, $out] = shell()->execWithResult(BUILD_BIN_PATH . '/php -v'); if ($ret !== 0) { throw new RuntimeException('xdebug.so failed to load.'); } + if (!str_contains(join($out), 'with Xdebug')) { + throw new RuntimeException('xdebug.so failed to load.'); + } } } diff --git a/src/SPC/builder/unix/UnixBuilderBase.php b/src/SPC/builder/unix/UnixBuilderBase.php index 4c8df333..9ffca22a 100644 --- a/src/SPC/builder/unix/UnixBuilderBase.php +++ b/src/SPC/builder/unix/UnixBuilderBase.php @@ -223,8 +223,8 @@ abstract class UnixBuilderBase extends BuilderBase default => throw new RuntimeException('Deployment does not accept type ' . $type), }; logger()->info('Deploying ' . $this->getBuildTypeName($type) . ' file'); - FileSystem::createDir(BUILD_ROOT_PATH . '/bin'); - shell()->exec('cp ' . escapeshellarg($src) . ' ' . escapeshellarg(BUILD_ROOT_PATH . '/bin/')); + FileSystem::createDir(BUILD_BIN_PATH); + shell()->exec('cp ' . escapeshellarg($src) . ' ' . escapeshellarg(BUILD_BIN_PATH)); return true; } diff --git a/src/globals/internal-env.php b/src/globals/internal-env.php index 34b1ed99..1046848e 100644 --- a/src/globals/internal-env.php +++ b/src/globals/internal-env.php @@ -9,10 +9,17 @@ use SPC\builder\windows\SystemUtil as WindowsSystemUtil; use SPC\store\FileSystem; use SPC\util\GlobalEnvManager; +// output path for everything, other paths are defined relative to this by default define('BUILD_ROOT_PATH', FileSystem::convertPath(is_string($a = getenv('BUILD_ROOT_PATH')) ? $a : (WORKING_DIR . '/buildroot'))); +// output path for header files for development define('BUILD_INCLUDE_PATH', FileSystem::convertPath(is_string($a = getenv('BUILD_INCLUDE_PATH')) ? $a : (BUILD_ROOT_PATH . '/include'))); +// output path for libraries and for libphp.so, if building shared embed define('BUILD_LIB_PATH', FileSystem::convertPath(is_string($a = getenv('BUILD_LIB_PATH')) ? $a : (BUILD_ROOT_PATH . '/lib'))); +// output path for binaries define('BUILD_BIN_PATH', FileSystem::convertPath(is_string($a = getenv('BUILD_BIN_PATH')) ? $a : (BUILD_ROOT_PATH . '/bin'))); +// output path for shared extensions +define('BUILD_MODULES_PATH', FileSystem::convertPath(is_string($a = getenv('BUILD_MODULES_PATH')) ? $a : (BUILD_ROOT_PATH . '/modules'))); + define('PKG_ROOT_PATH', FileSystem::convertPath(is_string($a = getenv('PKG_ROOT_PATH')) ? $a : (WORKING_DIR . '/pkgroot'))); define('SOURCE_PATH', FileSystem::convertPath(is_string($a = getenv('SOURCE_PATH')) ? $a : (WORKING_DIR . '/source'))); define('DOWNLOAD_PATH', FileSystem::convertPath(is_string($a = getenv('DOWNLOAD_PATH')) ? $a : (WORKING_DIR . '/downloads'))); From 1ae27c7b5a7292d8b5f5246812c41db2be6bdd7d Mon Sep 17 00:00:00 2001 From: Marc Date: Fri, 16 May 2025 00:24:18 +0700 Subject: [PATCH 15/50] oopsie --- src/SPC/builder/extension/xdebug.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/SPC/builder/extension/xdebug.php b/src/SPC/builder/extension/xdebug.php index 6b945f49..367eb420 100644 --- a/src/SPC/builder/extension/xdebug.php +++ b/src/SPC/builder/extension/xdebug.php @@ -13,7 +13,7 @@ class xdebug extends Extension { public function runSharedExtensionCheckUnix(): void { - [$ret, $out] = shell()->execWithResult(BUILD_BIN_PATH . '/php -v'); + [$ret, $out] = shell()->execWithResult(BUILD_BIN_PATH . '/php -n -d "zend_extension=' . BUILD_MODULES_PATH . '/xdebug.so" -v'); if ($ret !== 0) { throw new RuntimeException('xdebug.so failed to load.'); } From 872673655ee531d66b737583a2d9e97fed6dc1c2 Mon Sep 17 00:00:00 2001 From: Marc Date: Fri, 16 May 2025 00:26:23 +0700 Subject: [PATCH 16/50] oopsie in opcache --- src/SPC/builder/extension/opcache.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/SPC/builder/extension/opcache.php b/src/SPC/builder/extension/opcache.php index 5f406e16..ec468cb8 100644 --- a/src/SPC/builder/extension/opcache.php +++ b/src/SPC/builder/extension/opcache.php @@ -26,7 +26,7 @@ class opcache extends Extension public function runSharedExtensionCheckUnix(): void { - [$ret, $out] = shell()->execWithResult(BUILD_BIN_PATH . '/php -v'); + [$ret, $out] = shell()->execWithResult(BUILD_BIN_PATH . '/php -n -d "zend_extension=' . BUILD_MODULES_PATH . '/opcache.so" -v'); if ($ret !== 0) { throw new RuntimeException('opcache.so failed to load.'); } From 76a9be2167c22357a06994c60a3f9a0396b2c9a2 Mon Sep 17 00:00:00 2001 From: henderkes Date: Sat, 17 May 2025 19:00:57 +0700 Subject: [PATCH 17/50] fix shared bz2 build --- src/SPC/builder/Extension.php | 4 ++++ src/SPC/builder/extension/bz2.php | 5 +++++ 2 files changed, 9 insertions(+) diff --git a/src/SPC/builder/Extension.php b/src/SPC/builder/Extension.php index 2ab50f98..43e0a5e8 100644 --- a/src/SPC/builder/Extension.php +++ b/src/SPC/builder/Extension.php @@ -275,6 +275,10 @@ class Extension */ public function buildShared(): void { + if (file_exists(BUILD_MODULES_PATH . '/' . $this->getName() . '.so')) { + logger()->info('extension ' . $this->getName() . ' already built, skipping'); + return; + } match (PHP_OS_FAMILY) { 'Darwin', 'Linux' => $this->buildUnixShared(), default => throw new WrongUsageException(PHP_OS_FAMILY . ' build shared extensions is not supported yet'), diff --git a/src/SPC/builder/extension/bz2.php b/src/SPC/builder/extension/bz2.php index 88f22e56..ee3f2996 100644 --- a/src/SPC/builder/extension/bz2.php +++ b/src/SPC/builder/extension/bz2.php @@ -24,4 +24,9 @@ class bz2 extends Extension FileSystem::replaceFileRegex(SOURCE_PATH . '/php-src/configure', '/-lbz2/', $this->getLibFilesString() . $frameworks); return true; } + + public function getUnixConfigureArg(bool $shared = false): string + { + return $shared ? '--with-bz2=' . BUILD_ROOT_PATH : ''; + } } From 05e9129a66f7f4208e73e7bffda3c2b17ebf879a Mon Sep 17 00:00:00 2001 From: henderkes Date: Sat, 17 May 2025 19:01:32 +0700 Subject: [PATCH 18/50] refactor dom out to its own extension, fails shared build --- src/SPC/builder/extension/dom.php | 72 +++++++++++++++++++++++++++++++ src/SPC/builder/extension/xml.php | 1 - 2 files changed, 72 insertions(+), 1 deletion(-) create mode 100644 src/SPC/builder/extension/dom.php diff --git a/src/SPC/builder/extension/dom.php b/src/SPC/builder/extension/dom.php new file mode 100644 index 00000000..bb2f659f --- /dev/null +++ b/src/SPC/builder/extension/dom.php @@ -0,0 +1,72 @@ +builder))->config([$this->getName()]); + $env = [ + 'CFLAGS' => $config['cflags'] . ' -I' . SOURCE_PATH . '/php-src', + 'LDFLAGS' => $config['ldflags'], + 'LIBS' => $config['libs'], + 'LD_LIBRARY_PATH' => BUILD_LIB_PATH, + ]; + // prepare configure args + shell()->cd($this->source_dir) + ->setEnv($env) + ->execWithEnv(BUILD_BIN_PATH . '/phpize') + ->execWithEnv('./configure ' . $this->getUnixConfigureArg(true) . ' --with-php-config=' . BUILD_BIN_PATH . '/php-config --enable-shared --disable-static') + ->execWithEnv('make clean') + ->execWithEnv('make -j' . $this->builder->concurrency); + + // copy shared library + FileSystem::createDir(BUILD_MODULES_PATH); + $extensionDirFile = (getenv('EXTENSION_DIR') ?: $this->source_dir . '/modules') . '/' . $this->getName() . '.so'; + $sourceDirFile = $this->source_dir . '/modules/' . $this->getName() . '.so'; + if (file_exists($extensionDirFile)) { + copy($extensionDirFile, BUILD_MODULES_PATH . '/' . $this->getName() . '.so'); + } elseif (file_exists($sourceDirFile)) { + copy($sourceDirFile, BUILD_MODULES_PATH . '/' . $this->getName() . '.so'); + } else { + throw new RuntimeException('extension ' . $this->getName() . ' built successfully, but into an unexpected location.'); + } + // check shared extension with php-cli + if (file_exists(BUILD_BIN_PATH . '/php')) { + $this->runSharedExtensionCheckUnix(); + } + } +} diff --git a/src/SPC/builder/extension/xml.php b/src/SPC/builder/extension/xml.php index fc8bfc4d..544585ad 100644 --- a/src/SPC/builder/extension/xml.php +++ b/src/SPC/builder/extension/xml.php @@ -13,7 +13,6 @@ use SPC\util\CustomExt; #[CustomExt('soap')] #[CustomExt('xmlreader')] #[CustomExt('xmlwriter')] -#[CustomExt('dom')] #[CustomExt('simplexml')] class xml extends Extension { From c1e91e1ccb56c552d632bc76351fea1338861e1e Mon Sep 17 00:00:00 2001 From: henderkes Date: Sat, 17 May 2025 22:40:30 +0700 Subject: [PATCH 19/50] sockets doesn't install header?! --- src/SPC/builder/Extension.php | 10 ++++++++++ src/SPC/builder/extension/sockets.php | 21 +++++++++++++++++++++ src/SPC/builder/unix/library/gmp.php | 2 +- src/SPC/command/BuildPHPCommand.php | 4 +++- src/SPC/store/SourcePatcher.php | 9 +++++++++ 5 files changed, 44 insertions(+), 2 deletions(-) create mode 100644 src/SPC/builder/extension/sockets.php diff --git a/src/SPC/builder/Extension.php b/src/SPC/builder/Extension.php index 43e0a5e8..81f8cac9 100644 --- a/src/SPC/builder/Extension.php +++ b/src/SPC/builder/Extension.php @@ -423,4 +423,14 @@ class Extension return $deps; } + + /** + * Patch code before shared extension ./configure + * If you need to patch some code, overwrite this + * return true if you patched something, false if not + */ + public function patchBeforeSharedBuild(): bool + { + return false; + } } diff --git a/src/SPC/builder/extension/sockets.php b/src/SPC/builder/extension/sockets.php new file mode 100644 index 00000000..a0901415 --- /dev/null +++ b/src/SPC/builder/extension/sockets.php @@ -0,0 +1,21 @@ +execWithEnv( './configure ' . - '--enable-static --disable-shared ' . + '--enable-static --disable-shared --with-pic ' . '--prefix=' ) ->execWithEnv('make clean') diff --git a/src/SPC/command/BuildPHPCommand.php b/src/SPC/command/BuildPHPCommand.php index 49067b0b..8226b045 100644 --- a/src/SPC/command/BuildPHPCommand.php +++ b/src/SPC/command/BuildPHPCommand.php @@ -208,7 +208,9 @@ class BuildPHPCommand extends BuildCommand SourcePatcher::patchSPCVersionToPHP($this->getApplication()->getVersion()); // start to build - $builder->buildPHP($rule); + // $builder->buildPHP($rule); + + SourcePatcher::patchBeforeSharedBuild($builder); // build dynamic extensions if needed if (!empty($shared_extensions)) { diff --git a/src/SPC/store/SourcePatcher.php b/src/SPC/store/SourcePatcher.php index b5de166f..24ba666c 100644 --- a/src/SPC/store/SourcePatcher.php +++ b/src/SPC/store/SourcePatcher.php @@ -78,6 +78,15 @@ class SourcePatcher } } + public static function patchBeforeSharedBuild(BuilderBase $builder): void + { + foreach ($builder->getExts() as $ext) { + if ($ext->patchBeforeSharedBuild() === true) { + logger()->info('Extension [' . $ext->getName() . '] patched before shared build'); + } + } + } + /** * Source patcher runner before configure * From eab8c27e4ab54888d5adc2fd3e4de5832c5fbad5 Mon Sep 17 00:00:00 2001 From: henderkes Date: Sat, 17 May 2025 22:43:34 +0700 Subject: [PATCH 20/50] shared dom ext requires xml --- config/ext.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/ext.json b/config/ext.json index 47acef96..9c36a35e 100644 --- a/config/ext.json +++ b/config/ext.json @@ -75,7 +75,7 @@ "libxml2", "zlib" ], - "ext-depends-windows": [ + "ext-depends": [ "xml" ] }, From f88c10d4aa24dd9f237bdd773cb9f1c9c8454307 Mon Sep 17 00:00:00 2001 From: henderkes Date: Sun, 18 May 2025 08:57:07 +0700 Subject: [PATCH 21/50] restore buildphp command --- config/ext.json | 11 ++++++++++- src/SPC/builder/Extension.php | 20 ++++++++++---------- src/SPC/command/BuildPHPCommand.php | 2 +- 3 files changed, 21 insertions(+), 12 deletions(-) diff --git a/config/ext.json b/config/ext.json index 9c36a35e..d051526a 100644 --- a/config/ext.json +++ b/config/ext.json @@ -75,7 +75,7 @@ "libxml2", "zlib" ], - "ext-depends": [ + "ext-depends-windows": [ "xml" ] }, @@ -410,6 +410,9 @@ }, "mysqli": { "type": "builtin", + "target": [ + "static" + ], "arg-type": "with", "ext-depends": [ "mysqlnd" @@ -417,6 +420,9 @@ }, "mysqlnd": { "type": "builtin", + "target": [ + "static" + ], "arg-type-windows": "with", "lib-depends": [ "zlib" @@ -450,6 +456,9 @@ "openssl": { "notes": true, "type": "builtin", + "target": [ + "static" + ], "arg-type": "custom", "arg-type-windows": "with", "lib-depends": [ diff --git a/src/SPC/builder/Extension.php b/src/SPC/builder/Extension.php index 81f8cac9..808d8c54 100644 --- a/src/SPC/builder/Extension.php +++ b/src/SPC/builder/Extension.php @@ -188,6 +188,16 @@ class Extension return false; } + /** + * Patch code before shared extension ./configure + * If you need to patch some code, overwrite this + * return true if you patched something, false if not + */ + public function patchBeforeSharedBuild(): bool + { + return false; + } + /** * Run shared extension check when cli is enabled * @throws RuntimeException @@ -423,14 +433,4 @@ class Extension return $deps; } - - /** - * Patch code before shared extension ./configure - * If you need to patch some code, overwrite this - * return true if you patched something, false if not - */ - public function patchBeforeSharedBuild(): bool - { - return false; - } } diff --git a/src/SPC/command/BuildPHPCommand.php b/src/SPC/command/BuildPHPCommand.php index 8226b045..1da60f63 100644 --- a/src/SPC/command/BuildPHPCommand.php +++ b/src/SPC/command/BuildPHPCommand.php @@ -208,7 +208,7 @@ class BuildPHPCommand extends BuildCommand SourcePatcher::patchSPCVersionToPHP($this->getApplication()->getVersion()); // start to build - // $builder->buildPHP($rule); + $builder->buildPHP($rule); SourcePatcher::patchBeforeSharedBuild($builder); From 2ff300970a8ce1a3791fa006b7aa31d2ea7507d7 Mon Sep 17 00:00:00 2001 From: henderkes Date: Sun, 18 May 2025 12:19:26 +0700 Subject: [PATCH 22/50] -fPIC for unixodbc --- src/SPC/builder/unix/library/unixodbc.php | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/SPC/builder/unix/library/unixodbc.php b/src/SPC/builder/unix/library/unixodbc.php index f89eb0a4..be7e9297 100644 --- a/src/SPC/builder/unix/library/unixodbc.php +++ b/src/SPC/builder/unix/library/unixodbc.php @@ -16,19 +16,25 @@ trait unixodbc protected function build(): void { shell()->cd($this->source_dir) - ->exec( + ->setEnv([ + 'CFLAGS' => $this->getLibExtraCFlags(), + 'LDFLAGS' => $this->getLibExtraLdFlags(), + 'LIBS' => $this->getLibExtraLibs(), + ]) + ->execWithEnv( './configure ' . '--enable-static --disable-shared ' . '--disable-debug ' . + '--with-pic ' . '--disable-dependency-tracking ' . '--with-libiconv-prefix=' . BUILD_ROOT_PATH . ' ' . '--with-included-ltdl ' . '--enable-gui=no ' . '--prefix=' ) - ->exec('make clean') - ->exec("make -j{$this->builder->concurrency}") - ->exec('make install DESTDIR=' . BUILD_ROOT_PATH); + ->execWithEnv('make clean') + ->execWithEnv("make -j{$this->builder->concurrency}") + ->execWithEnv('make install DESTDIR=' . BUILD_ROOT_PATH); $this->patchPkgconfPrefix(['odbc.pc', 'odbccr.pc', 'odbcinst.pc']); $this->cleanLaFiles(); } From 1fbd2c1adcffbd8a834d87b4a79c296e5ca4974b Mon Sep 17 00:00:00 2001 From: henderkes Date: Sun, 18 May 2025 12:46:55 +0700 Subject: [PATCH 23/50] -fPIC for postgresql CFLAGS, but it's still erroring out --- src/SPC/builder/unix/library/postgresql.php | 27 ++++++++++++--------- 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/src/SPC/builder/unix/library/postgresql.php b/src/SPC/builder/unix/library/postgresql.php index 7885eca3..43efca38 100644 --- a/src/SPC/builder/unix/library/postgresql.php +++ b/src/SPC/builder/unix/library/postgresql.php @@ -42,7 +42,7 @@ trait postgresql if (!empty($output[1][0])) { $cppflags = $output[1][0]; $macos_15_bug_cflags = PHP_OS_FAMILY === 'Darwin' ? ' -Wno-unguarded-availability-new' : ''; - $envs .= " CPPFLAGS=\"{$cppflags} -fPIC -fPIE -fno-ident{$macos_15_bug_cflags}\""; + $envs .= " CPPFLAGS=\"{$cppflags} -DPIC -fpic -fPIC -fPIE -fno-ident{$macos_15_bug_cflags}\""; } $output = shell()->execWithResult("pkg-config --libs-only-L --static {$packages}"); $error_exec_cnt += $output[0] === 0 ? 0 : 1; @@ -78,9 +78,15 @@ trait postgresql throw new RuntimeException('Unsupported version for postgresql: ' . $version . ' !'); } + $env = [ + 'CFLAGS' => $this->getLibExtraCFlags() . ' -DPIC -fpic', + 'LDFLAGS' => $this->getLibExtraLdFlags(), + 'LIBS' => $this->getLibExtraLibs(), + ]; // configure shell()->cd($this->source_dir . '/build') - ->exec( + ->setEnv($env) + ->execWithEnv( "{$envs} ../configure " . "--prefix={$builddir} " . '--disable-thread-safety ' . @@ -89,6 +95,7 @@ trait postgresql '--with-readline ' . '--with-libxml ' . ($this->builder->getLib('icu') ? '--with-icu ' : '--without-icu ') . + // ($this->builder->getLib('ldap') ? '--with-ldap ' : '--without-ldap ') . '--without-ldap ' . ($this->builder->getLib('libxslt') ? '--with-libxslt ' : '--without-libxslt ') . ($this->builder->getLib('zstd') ? '--with-zstd ' : '--without-zstd ') . @@ -98,16 +105,12 @@ trait postgresql '--without-pam ' . '--without-bonjour ' . '--without-tcl ' - ); - // ($this->builder->getLib('ldap') ? '--with-ldap ' : '--without-ldap ') . - - // build - shell()->cd($this->source_dir . '/build') - ->exec($envs . ' make -C src/bin/pg_config install') - ->exec($envs . ' make -C src/include install') - ->exec($envs . ' make -C src/common install') - ->exec($envs . ' make -C src/port install') - ->exec($envs . ' make -C src/interfaces/libpq install'); + ) + ->execWithEnv($envs . ' make -C src/bin/pg_config install') + ->execWithEnv($envs . ' make -C src/include install') + ->execWithEnv($envs . ' make -C src/common install') + ->execWithEnv($envs . ' make -C src/port install') + ->execWithEnv($envs . ' make -C src/interfaces/libpq install'); // remove dynamic libs shell()->cd($this->source_dir . '/build') From bdd764218b4be21c81b36af96faa41ad288edfa1 Mon Sep 17 00:00:00 2001 From: henderkes Date: Sun, 18 May 2025 12:53:49 +0700 Subject: [PATCH 24/50] install headers and modules from shared extensions --- src/SPC/builder/BuilderBase.php | 10 ++++++++++ src/SPC/builder/Extension.php | 4 ++-- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/SPC/builder/BuilderBase.php b/src/SPC/builder/BuilderBase.php index 59f371ef..3d5648ef 100644 --- a/src/SPC/builder/BuilderBase.php +++ b/src/SPC/builder/BuilderBase.php @@ -233,8 +233,15 @@ abstract class BuilderBase */ abstract public function buildPHP(int $build_target = BUILD_TARGET_NONE); + /** + * @throws WrongUsageException + * @throws RuntimeException + * @throws FileSystemException + */ public function buildSharedExts(): void { + FileSystem::replaceFileLineContainsString(BUILD_BIN_PATH . '/php-config', 'extension_dir="', 'extension_dir="' . BUILD_MODULES_PATH . '"'); + FileSystem::createDir(BUILD_MODULES_PATH); foreach ($this->getExts() as $ext) { if (!$ext->isBuildShared()) { continue; @@ -242,6 +249,9 @@ abstract class BuilderBase logger()->info('Building extension [' . $ext->getName() . '] as shared extension (' . $ext->getName() . '.so)'); $ext->buildShared(); } + if (getenv('EXTENSION_DIR')) { + FileSystem::replaceFileLineContainsString(BUILD_BIN_PATH . '/php-config', 'extension_dir="', 'extension_dir="' . getenv('EXTENSION_DIR') . '"'); + } } /** diff --git a/src/SPC/builder/Extension.php b/src/SPC/builder/Extension.php index 808d8c54..1402bc58 100644 --- a/src/SPC/builder/Extension.php +++ b/src/SPC/builder/Extension.php @@ -319,10 +319,10 @@ class Extension ->execWithEnv(BUILD_BIN_PATH . '/phpize') ->execWithEnv('./configure ' . $this->getUnixConfigureArg(true) . ' --with-php-config=' . BUILD_BIN_PATH . '/php-config --enable-shared --disable-static') ->execWithEnv('make clean') - ->execWithEnv('make -j' . $this->builder->concurrency); + ->execWithEnv('make -j' . $this->builder->concurrency) + ->execWithEnv('make install'); // copy shared library - FileSystem::createDir(BUILD_MODULES_PATH); $extensionDirFile = (getenv('EXTENSION_DIR') ?: $this->source_dir . '/modules') . '/' . $this->getName() . '.so'; $sourceDirFile = $this->source_dir . '/modules/' . $this->getName() . '.so'; if (file_exists($extensionDirFile)) { From ea7c145c62a98e536c53359db065d318cd9687fb Mon Sep 17 00:00:00 2001 From: henderkes Date: Sun, 18 May 2025 15:52:15 +0700 Subject: [PATCH 25/50] libxml2 pic... --- src/SPC/builder/linux/library/libxml2.php | 12 +++++++++--- src/SPC/builder/unix/library/postgresql.php | 10 ++++++---- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/src/SPC/builder/linux/library/libxml2.php b/src/SPC/builder/linux/library/libxml2.php index 6f42d672..6d9470ae 100644 --- a/src/SPC/builder/linux/library/libxml2.php +++ b/src/SPC/builder/linux/library/libxml2.php @@ -24,13 +24,19 @@ class libxml2 extends LinuxLibraryBase FileSystem::resetDir($this->source_dir . '/build'); shell()->cd($this->source_dir . '/build') - ->exec( + ->setEnv([ + 'CFLAGS' => $this->getLibExtraCFlags(), + 'LDFLAGS' => $this->getLibExtraLdFlags(), + 'LIBS' => $this->getLibExtraLibs(), + ]) + ->execWithEnv( 'cmake ' . '-DCMAKE_BUILD_TYPE=Release ' . '-DCMAKE_INSTALL_PREFIX=' . BUILD_ROOT_PATH . ' ' . '-DCMAKE_INSTALL_LIBDIR=' . BUILD_LIB_PATH . ' ' . "-DCMAKE_TOOLCHAIN_FILE={$this->builder->cmake_toolchain_file} " . '-DBUILD_SHARED_LIBS=OFF ' . + '-DPOSITION_INDEPENDENT_CODE=ON ' . '-DIconv_IS_BUILT_IN=OFF ' . '-DLIBXML2_WITH_ICONV=ON ' . "-DLIBXML2_WITH_ZLIB={$enable_zlib} " . @@ -41,8 +47,8 @@ class libxml2 extends LinuxLibraryBase '-DLIBXML2_WITH_TESTS=OFF ' . '..' ) - ->exec("cmake --build . -j {$this->builder->concurrency}") - ->exec('make install'); + ->execWithEnv("cmake --build . -j {$this->builder->concurrency}") + ->execWithEnv('make install'); FileSystem::replaceFileStr( BUILD_LIB_PATH . '/pkgconfig/libxml-2.0.pc', diff --git a/src/SPC/builder/unix/library/postgresql.php b/src/SPC/builder/unix/library/postgresql.php index 43efca38..5a0da5de 100644 --- a/src/SPC/builder/unix/library/postgresql.php +++ b/src/SPC/builder/unix/library/postgresql.php @@ -39,10 +39,12 @@ trait postgresql $output = shell()->execWithResult("pkg-config --cflags-only-I --static {$packages}"); $error_exec_cnt += $output[0] === 0 ? 0 : 1; + $macos_15_bug_cflags = PHP_OS_FAMILY === 'Darwin' ? ' -Wno-unguarded-availability-new' : ''; + $cflags = ''; if (!empty($output[1][0])) { - $cppflags = $output[1][0]; - $macos_15_bug_cflags = PHP_OS_FAMILY === 'Darwin' ? ' -Wno-unguarded-availability-new' : ''; - $envs .= " CPPFLAGS=\"{$cppflags} -DPIC -fpic -fPIC -fPIE -fno-ident{$macos_15_bug_cflags}\""; + $cflags = $output[1][0]; + $envs .= ' CPPFLAGS="-DPIC"'; + $cflags = "{$cflags} -fno-ident{$macos_15_bug_cflags}"; } $output = shell()->execWithResult("pkg-config --libs-only-L --static {$packages}"); $error_exec_cnt += $output[0] === 0 ? 0 : 1; @@ -79,7 +81,7 @@ trait postgresql } $env = [ - 'CFLAGS' => $this->getLibExtraCFlags() . ' -DPIC -fpic', + 'CFLAGS' => $this->getLibExtraCFlags() . ' ' . $cflags, 'LDFLAGS' => $this->getLibExtraLdFlags(), 'LIBS' => $this->getLibExtraLibs(), ]; From 117923791ae1f6439ef56f6441e4ce649b9764e3 Mon Sep 17 00:00:00 2001 From: Marc Date: Sun, 18 May 2025 17:46:55 +0700 Subject: [PATCH 26/50] Update test-extensions.php --- src/globals/test-extensions.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/globals/test-extensions.php b/src/globals/test-extensions.php index 2739d3ac..e2f0ca12 100644 --- a/src/globals/test-extensions.php +++ b/src/globals/test-extensions.php @@ -51,7 +51,7 @@ $extensions = match (PHP_OS_FAMILY) { // If you want to test shared extensions, add them below (comma separated, example `bcmath,openssl`). $shared_extensions = match (PHP_OS_FAMILY) { - 'Linux' => 'xdebug', + 'Linux' => 'xdebug,intl,pgsql', 'Windows', 'Darwin' => '', }; From f708907d99b682ed98bec7037c6f916070c24777 Mon Sep 17 00:00:00 2001 From: henderkes Date: Sun, 18 May 2025 17:59:02 +0700 Subject: [PATCH 27/50] zstd pic --- src/SPC/builder/linux/library/libpng.php | 5 ++--- src/SPC/builder/unix/library/zstd.php | 6 ++++++ 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/SPC/builder/linux/library/libpng.php b/src/SPC/builder/linux/library/libpng.php index 56daee55..16fdca60 100644 --- a/src/SPC/builder/linux/library/libpng.php +++ b/src/SPC/builder/linux/library/libpng.php @@ -45,12 +45,11 @@ class libpng extends LinuxLibraryBase ->exec('chmod +x ./configure') ->exec('chmod +x ./install-sh') ->setEnv([ - 'CFLAGS' => trim($this->getLibExtraCFlags() . ' ' . $this->builder->arch_c_flags), - 'LDFLAGS' => $this->getLibExtraLdFlags(), + 'CFLAGS' => $this->getLibExtraCFlags(), + 'LDFLAGS' => $this->getLibExtraLdFlags() . ' -L' . BUILD_LIB_PATH, 'LIBS' => $this->getLibExtraLibs(), ]) ->execWithEnv( - 'LDFLAGS="-L' . BUILD_LIB_PATH . '" ' . './configure ' . '--disable-shared ' . '--enable-static ' . diff --git a/src/SPC/builder/unix/library/zstd.php b/src/SPC/builder/unix/library/zstd.php index 1990f658..939567f2 100644 --- a/src/SPC/builder/unix/library/zstd.php +++ b/src/SPC/builder/unix/library/zstd.php @@ -18,11 +18,17 @@ trait zstd { FileSystem::resetDir($this->source_dir . '/build/cmake/build'); shell()->cd($this->source_dir . '/build/cmake/build') + ->setEnv([ + 'CFLAGS' => $this->getLibExtraCFlags(), + 'LDFLAGS' => $this->getLibExtraLdFlags(), + 'LIBS' => $this->getLibExtraLibs(), + ]) ->exec( 'cmake ' . "{$this->builder->makeCmakeArgs()} " . '-DZSTD_BUILD_STATIC=ON ' . '-DZSTD_BUILD_SHARED=OFF ' . + '-DPOSITION_INDEPENDENT_CODE=ON ' . '..' ) ->exec("cmake --build . -j {$this->builder->concurrency}") From 6b50700d8c4fae4b138e40e4f3439e2f87420378 Mon Sep 17 00:00:00 2001 From: henderkes Date: Sun, 18 May 2025 18:24:09 +0700 Subject: [PATCH 28/50] remove dom extra cake --- src/SPC/builder/extension/dom.php | 34 ------------------------------- 1 file changed, 34 deletions(-) diff --git a/src/SPC/builder/extension/dom.php b/src/SPC/builder/extension/dom.php index bb2f659f..819a7787 100644 --- a/src/SPC/builder/extension/dom.php +++ b/src/SPC/builder/extension/dom.php @@ -35,38 +35,4 @@ class dom extends Extension { return '--with-dom --with-libxml'; } - - public function buildUnixShared(): void - { - $config = (new SPCConfigUtil($this->builder))->config([$this->getName()]); - $env = [ - 'CFLAGS' => $config['cflags'] . ' -I' . SOURCE_PATH . '/php-src', - 'LDFLAGS' => $config['ldflags'], - 'LIBS' => $config['libs'], - 'LD_LIBRARY_PATH' => BUILD_LIB_PATH, - ]; - // prepare configure args - shell()->cd($this->source_dir) - ->setEnv($env) - ->execWithEnv(BUILD_BIN_PATH . '/phpize') - ->execWithEnv('./configure ' . $this->getUnixConfigureArg(true) . ' --with-php-config=' . BUILD_BIN_PATH . '/php-config --enable-shared --disable-static') - ->execWithEnv('make clean') - ->execWithEnv('make -j' . $this->builder->concurrency); - - // copy shared library - FileSystem::createDir(BUILD_MODULES_PATH); - $extensionDirFile = (getenv('EXTENSION_DIR') ?: $this->source_dir . '/modules') . '/' . $this->getName() . '.so'; - $sourceDirFile = $this->source_dir . '/modules/' . $this->getName() . '.so'; - if (file_exists($extensionDirFile)) { - copy($extensionDirFile, BUILD_MODULES_PATH . '/' . $this->getName() . '.so'); - } elseif (file_exists($sourceDirFile)) { - copy($sourceDirFile, BUILD_MODULES_PATH . '/' . $this->getName() . '.so'); - } else { - throw new RuntimeException('extension ' . $this->getName() . ' built successfully, but into an unexpected location.'); - } - // check shared extension with php-cli - if (file_exists(BUILD_BIN_PATH . '/php')) { - $this->runSharedExtensionCheckUnix(); - } - } } From 81474336c10a54ddc3f9c07339fe5ca5c2cc728e Mon Sep 17 00:00:00 2001 From: Marc Date: Sun, 18 May 2025 18:29:43 +0700 Subject: [PATCH 29/50] Update dom.php --- src/SPC/builder/extension/dom.php | 1 - 1 file changed, 1 deletion(-) diff --git a/src/SPC/builder/extension/dom.php b/src/SPC/builder/extension/dom.php index 819a7787..a08fcd81 100644 --- a/src/SPC/builder/extension/dom.php +++ b/src/SPC/builder/extension/dom.php @@ -8,7 +8,6 @@ use SPC\builder\Extension; use SPC\exception\RuntimeException; use SPC\store\FileSystem; use SPC\util\CustomExt; -use SPC\util\SPCConfigUtil; #[CustomExt('dom')] class dom extends Extension From 54ff71798c9a8624019bdce6f62d6c532c9b2dab Mon Sep 17 00:00:00 2001 From: Marc Date: Sun, 18 May 2025 21:48:43 +0700 Subject: [PATCH 30/50] patch intl standard to c++17 --- src/SPC/builder/extension/intl.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/SPC/builder/extension/intl.php b/src/SPC/builder/extension/intl.php index 8130b5d3..819aee69 100644 --- a/src/SPC/builder/extension/intl.php +++ b/src/SPC/builder/extension/intl.php @@ -23,4 +23,9 @@ class intl extends Extension } return true; } + + public function patchBeforeSharedBuild(): bool + { + return $this->patchBeforeBuildconf(); + } } From bff99fa53712134a9eacc437eec3c611a74ed081 Mon Sep 17 00:00:00 2001 From: henderkes Date: Mon, 19 May 2025 13:15:03 +0700 Subject: [PATCH 31/50] fix imagick shared build --- src/SPC/builder/unix/library/imagemagick.php | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/SPC/builder/unix/library/imagemagick.php b/src/SPC/builder/unix/library/imagemagick.php index 56da92e5..345cf6f0 100644 --- a/src/SPC/builder/unix/library/imagemagick.php +++ b/src/SPC/builder/unix/library/imagemagick.php @@ -80,5 +80,17 @@ trait imagemagick 'includearchdir=${prefix}/include/ImageMagick-7' ); } + $filelist = [ + 'libMagick++-7.Q16HDRI.la', + 'libMagickCore-7.Q16HDRI.la', + 'libMagickWand-7.Q16HDRI.la', + ]; + foreach ($filelist as $file) { + FileSystem::replaceFileStr( + BUILD_LIB_PATH . '/' . $file, + ' /lib/', + ' ' . BUILD_LIB_PATH . '/', + ); + } } } From 5bd53ed7142bfc770629e630802a81d257d3a61e Mon Sep 17 00:00:00 2001 From: henderkes Date: Mon, 19 May 2025 13:23:19 +0700 Subject: [PATCH 32/50] skip php rebuild if we're only building shared libphp.so --- src/SPC/builder/linux/LinuxBuilder.php | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/SPC/builder/linux/LinuxBuilder.php b/src/SPC/builder/linux/LinuxBuilder.php index e38714f1..c06267d7 100644 --- a/src/SPC/builder/linux/LinuxBuilder.php +++ b/src/SPC/builder/linux/LinuxBuilder.php @@ -106,6 +106,18 @@ class LinuxBuilder extends UnixBuilderBase */ public function buildPHP(int $build_target = BUILD_TARGET_NONE): void { + if ($build_target === BUILD_TARGET_EMBED && + file_exists(BUILD_BIN_PATH . '/php-config') && + file_exists(BUILD_BIN_PATH . '/phpize') + ) { + $embed_type = getenv('SPC_CMD_VAR_PHP_EMBED_TYPE') ?: 'static'; + if ($embed_type === 'shared' && file_exists(BUILD_LIB_PATH . '/libphp.so')) { + return; + } + if (file_exists(BUILD_LIB_PATH . '/libphp.a')) { + return; + } + } // ---------- Update extra-libs ---------- $extra_libs = getenv('SPC_EXTRA_LIBS') ?: ''; // bloat means force-load all static libraries, even if they are not used From 7ba194810147bd476a438be205b2a2b36a741b60 Mon Sep 17 00:00:00 2001 From: henderkes Date: Mon, 19 May 2025 16:30:34 +0700 Subject: [PATCH 33/50] fix pdo_sqlsrv --- src/SPC/builder/Extension.php | 10 ------ src/SPC/builder/extension/pdo_sqlsrv.php | 40 ++++++++++++++++++++++++ 2 files changed, 40 insertions(+), 10 deletions(-) create mode 100644 src/SPC/builder/extension/pdo_sqlsrv.php diff --git a/src/SPC/builder/Extension.php b/src/SPC/builder/Extension.php index 1402bc58..d25f1f12 100644 --- a/src/SPC/builder/Extension.php +++ b/src/SPC/builder/Extension.php @@ -322,16 +322,6 @@ class Extension ->execWithEnv('make -j' . $this->builder->concurrency) ->execWithEnv('make install'); - // copy shared library - $extensionDirFile = (getenv('EXTENSION_DIR') ?: $this->source_dir . '/modules') . '/' . $this->getName() . '.so'; - $sourceDirFile = $this->source_dir . '/modules/' . $this->getName() . '.so'; - if (file_exists($extensionDirFile)) { - copy($extensionDirFile, BUILD_MODULES_PATH . '/' . $this->getName() . '.so'); - } elseif (file_exists($sourceDirFile)) { - copy($sourceDirFile, BUILD_MODULES_PATH . '/' . $this->getName() . '.so'); - } else { - throw new RuntimeException('extension ' . $this->getName() . ' built successfully, but into an unexpected location.'); - } // check shared extension with php-cli if (file_exists(BUILD_BIN_PATH . '/php')) { $this->runSharedExtensionCheckUnix(); diff --git a/src/SPC/builder/extension/pdo_sqlsrv.php b/src/SPC/builder/extension/pdo_sqlsrv.php new file mode 100644 index 00000000..bc1aacf5 --- /dev/null +++ b/src/SPC/builder/extension/pdo_sqlsrv.php @@ -0,0 +1,40 @@ +builder))->config([$this->getName()]); + $env = [ + 'CFLAGS' => $config['cflags'], + 'CXXFLAGS' => $config['cflags'], + 'LDFLAGS' => $config['ldflags'], + 'LIBS' => $config['libs'], + 'LD_LIBRARY_PATH' => BUILD_LIB_PATH, + ]; + // prepare configure args + shell()->cd($this->source_dir) + ->setEnv($env) + ->execWithEnv(BUILD_BIN_PATH . '/phpize') + ->execWithEnv('./configure ' . $this->getUnixConfigureArg(true) . ' --with-php-config=' . BUILD_BIN_PATH . '/php-config --enable-shared --disable-static') + ->execWithEnv('make clean') + ->execWithEnv('make -j' . $this->builder->concurrency) + ->execWithEnv('make install'); + + // check shared extension with php-cli + if (file_exists(BUILD_BIN_PATH . '/php')) { + $this->runSharedExtensionCheckUnix(); + } + } +} From 683371adaa54500f5b0b1a516dbf396c0cba658a Mon Sep 17 00:00:00 2001 From: henderkes Date: Tue, 20 May 2025 07:46:07 +0700 Subject: [PATCH 34/50] fix phar --- src/SPC/builder/extension/pdo_sqlsrv.php | 2 -- src/SPC/builder/extension/phar.php | 23 +++++++++++++++++++++++ 2 files changed, 23 insertions(+), 2 deletions(-) create mode 100644 src/SPC/builder/extension/phar.php diff --git a/src/SPC/builder/extension/pdo_sqlsrv.php b/src/SPC/builder/extension/pdo_sqlsrv.php index bc1aacf5..195eaffe 100644 --- a/src/SPC/builder/extension/pdo_sqlsrv.php +++ b/src/SPC/builder/extension/pdo_sqlsrv.php @@ -5,8 +5,6 @@ declare(strict_types=1); namespace SPC\builder\extension; use SPC\builder\Extension; -use SPC\exception\FileSystemException; -use SPC\store\FileSystem; use SPC\util\CustomExt; use SPC\util\SPCConfigUtil; diff --git a/src/SPC/builder/extension/phar.php b/src/SPC/builder/extension/phar.php new file mode 100644 index 00000000..a3563e07 --- /dev/null +++ b/src/SPC/builder/extension/phar.php @@ -0,0 +1,23 @@ +source_dir . '/config.m4', + ['$ext_dir/phar.1', '$ext_dir/phar.phar.1'], + ['${ext_dir}phar.1', '${ext_dir}phar.phar.1'] + ); + return true; + } +} From 38dfcdabd08fa1195ddf0f553a54a022273b749c Mon Sep 17 00:00:00 2001 From: henderkes Date: Tue, 20 May 2025 08:06:49 +0700 Subject: [PATCH 35/50] fix rdkafka --- src/SPC/builder/extension/rdkafka.php | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/SPC/builder/extension/rdkafka.php b/src/SPC/builder/extension/rdkafka.php index 50610325..7af34d72 100644 --- a/src/SPC/builder/extension/rdkafka.php +++ b/src/SPC/builder/extension/rdkafka.php @@ -33,4 +33,12 @@ class rdkafka extends Extension $pkgconf_libs = trim(implode('', $pkgconf_libs)); return '--with-rdkafka=' . BUILD_ROOT_PATH . ' LIBS="' . $pkgconf_libs . '"'; } + + public function getUnixConfigureArg(bool $shared = false): string + { + if ($shared) { + return '--with-rdkafka=' . BUILD_ROOT_PATH; + } + return parent::getUnixConfigureArg($shared); + } } From 14a0e1a6ccd147eadd41866b4976c0cf42432e71 Mon Sep 17 00:00:00 2001 From: henderkes Date: Tue, 20 May 2025 08:24:28 +0700 Subject: [PATCH 36/50] fix macos --- src/SPC/builder/extension/phar.php | 4 ++++ src/SPC/builder/extension/readline.php | 5 +++++ 2 files changed, 9 insertions(+) diff --git a/src/SPC/builder/extension/phar.php b/src/SPC/builder/extension/phar.php index a3563e07..2bffea45 100644 --- a/src/SPC/builder/extension/phar.php +++ b/src/SPC/builder/extension/phar.php @@ -5,6 +5,7 @@ declare(strict_types=1); namespace SPC\builder\extension; use SPC\builder\Extension; +use SPC\builder\linux\LinuxBuilder; use SPC\store\FileSystem; use SPC\util\CustomExt; @@ -13,6 +14,9 @@ class phar extends Extension { public function patchBeforeSharedBuild(): bool { + if (!$this->builder instanceof LinuxBuilder) { + return false; + } FileSystem::replaceFileStr( $this->source_dir . '/config.m4', ['$ext_dir/phar.1', '$ext_dir/phar.phar.1'], diff --git a/src/SPC/builder/extension/readline.php b/src/SPC/builder/extension/readline.php index c66e7afa..120fa42f 100644 --- a/src/SPC/builder/extension/readline.php +++ b/src/SPC/builder/extension/readline.php @@ -24,4 +24,9 @@ class readline extends Extension ); return true; } + + public function getUnixConfigureArg(bool $shared = false): string + { + return '--without-libedit --with-readline=' . BUILD_ROOT_PATH; + } } From 20b6870f903ce97bd6a08dbb099905f4e962095d Mon Sep 17 00:00:00 2001 From: henderkes Date: Tue, 20 May 2025 09:14:13 +0700 Subject: [PATCH 37/50] rewrite extension_dir --- src/SPC/builder/BuilderBase.php | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/SPC/builder/BuilderBase.php b/src/SPC/builder/BuilderBase.php index 3d5648ef..3b38019e 100644 --- a/src/SPC/builder/BuilderBase.php +++ b/src/SPC/builder/BuilderBase.php @@ -4,6 +4,7 @@ declare(strict_types=1); namespace SPC\builder; +use PharIo\FileSystem\File; use SPC\exception\ExceptionHandler; use SPC\exception\FileSystemException; use SPC\exception\InterruptException; @@ -240,7 +241,16 @@ abstract class BuilderBase */ public function buildSharedExts(): void { - FileSystem::replaceFileLineContainsString(BUILD_BIN_PATH . '/php-config', 'extension_dir="', 'extension_dir="' . BUILD_MODULES_PATH . '"'); + $lines = file(BUILD_BIN_PATH . '/php-config'); + $extension_dir_line = null; + foreach ($lines as $key => $value) { + if (str_starts_with($value, 'extension_dir=')) { + $lines[$key] = 'extension_dir="' . BUILD_MODULES_PATH . '"' . PHP_EOL; + $extension_dir_line = $value; + break; + } + } + file_put_contents(BUILD_BIN_PATH . '/php-config', implode('', $lines)); FileSystem::createDir(BUILD_MODULES_PATH); foreach ($this->getExts() as $ext) { if (!$ext->isBuildShared()) { @@ -249,9 +259,7 @@ abstract class BuilderBase logger()->info('Building extension [' . $ext->getName() . '] as shared extension (' . $ext->getName() . '.so)'); $ext->buildShared(); } - if (getenv('EXTENSION_DIR')) { - FileSystem::replaceFileLineContainsString(BUILD_BIN_PATH . '/php-config', 'extension_dir="', 'extension_dir="' . getenv('EXTENSION_DIR') . '"'); - } + FileSystem::replaceFileLineContainsString(BUILD_BIN_PATH . '/php-config', 'extension_dir=', $extension_dir_line); } /** From 545a653c0d1e0a2b8fdfd3df4b1dbcd1ec8e81ff Mon Sep 17 00:00:00 2001 From: henderkes Date: Tue, 20 May 2025 09:20:20 +0700 Subject: [PATCH 38/50] better phar handling --- src/SPC/builder/extension/phar.php | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/src/SPC/builder/extension/phar.php b/src/SPC/builder/extension/phar.php index 2bffea45..7396ba83 100644 --- a/src/SPC/builder/extension/phar.php +++ b/src/SPC/builder/extension/phar.php @@ -12,16 +12,26 @@ use SPC\util\CustomExt; #[CustomExt('phar')] class phar extends Extension { - public function patchBeforeSharedBuild(): bool + public function buildUnixShared(): void { if (!$this->builder instanceof LinuxBuilder) { - return false; + parent::buildUnixShared(); + return; } + FileSystem::replaceFileStr( $this->source_dir . '/config.m4', ['$ext_dir/phar.1', '$ext_dir/phar.phar.1'], ['${ext_dir}phar.1', '${ext_dir}phar.phar.1'] ); - return true; + try { + parent::buildUnixShared(); + } finally { + FileSystem::replaceFileStr( + $this->source_dir . '/config.m4', + ['${ext_dir}phar.1', '${ext_dir}phar.phar.1'], + ['$ext_dir/phar.1', '$ext_dir/phar.phar.1'] + ); + } } } From 1e50dac5a693a92b816bf33f5aeda9b9d8e6a9e3 Mon Sep 17 00:00:00 2001 From: Marc Date: Tue, 20 May 2025 10:50:41 +0700 Subject: [PATCH 39/50] Update BuildPHPCommand.php fix printed path --- src/SPC/command/BuildPHPCommand.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/SPC/command/BuildPHPCommand.php b/src/SPC/command/BuildPHPCommand.php index 1da60f63..edeb7c47 100644 --- a/src/SPC/command/BuildPHPCommand.php +++ b/src/SPC/command/BuildPHPCommand.php @@ -248,7 +248,7 @@ class BuildPHPCommand extends BuildCommand } if (!empty($shared_extensions)) { foreach ($shared_extensions as $ext) { - $path = FileSystem::convertPath("{$build_root_path}/lib/{$ext}.so"); + $path = FileSystem::convertPath("{$build_root_path}/modules/{$ext}.so"); logger()->info("Shared extension [{$ext}] path{$fixed}: {$path}"); } } From 93c692862490c705b04e83a71245f37ea1cf84ad Mon Sep 17 00:00:00 2001 From: DubbleClick Date: Tue, 20 May 2025 20:00:37 +0700 Subject: [PATCH 40/50] fix readline --- src/SPC/builder/Extension.php | 22 ++++++++++++++++++++-- src/SPC/builder/extension/mbregex.php | 5 +++++ src/SPC/builder/extension/mbstring.php | 11 +++++++++++ src/SPC/builder/extension/readline.php | 18 ++++++++++++++++++ 4 files changed, 54 insertions(+), 2 deletions(-) diff --git a/src/SPC/builder/Extension.php b/src/SPC/builder/Extension.php index d25f1f12..aea8ba8c 100644 --- a/src/SPC/builder/Extension.php +++ b/src/SPC/builder/Extension.php @@ -9,6 +9,7 @@ use SPC\exception\RuntimeException; use SPC\exception\WrongUsageException; use SPC\store\Config; use SPC\store\FileSystem; +use SPC\store\SourcePatcher; use SPC\util\SPCConfigUtil; class Extension @@ -189,7 +190,7 @@ class Extension } /** - * Patch code before shared extension ./configure + * Patch code before shared extension phpize * If you need to patch some code, overwrite this * return true if you patched something, false if not */ @@ -198,6 +199,16 @@ class Extension return false; } + /** + * Patch code before shared extension ./configure + * If you need to patch some code, overwrite this + * return true if you patched something, false if not + */ + public function patchBeforeSharedConfigure(): bool + { + return false; + } + /** * Run shared extension check when cli is enabled * @throws RuntimeException @@ -316,7 +327,14 @@ class Extension // prepare configure args shell()->cd($this->source_dir) ->setEnv($env) - ->execWithEnv(BUILD_BIN_PATH . '/phpize') + ->execWithEnv(BUILD_BIN_PATH . '/phpize'); + + if ($this->patchBeforeSharedConfigure()) { + logger()->info('ext [ . ' . $this->getName() . '] patching before shared configure'); + } + + shell()->cd($this->source_dir) + ->setEnv($env) ->execWithEnv('./configure ' . $this->getUnixConfigureArg(true) . ' --with-php-config=' . BUILD_BIN_PATH . '/php-config --enable-shared --disable-static') ->execWithEnv('make clean') ->execWithEnv('make -j' . $this->builder->concurrency) diff --git a/src/SPC/builder/extension/mbregex.php b/src/SPC/builder/extension/mbregex.php index 4bf28544..492c4fbb 100644 --- a/src/SPC/builder/extension/mbregex.php +++ b/src/SPC/builder/extension/mbregex.php @@ -21,6 +21,11 @@ class mbregex extends Extension return ''; } + public function buildUnixShared(): void + { + print('mbregex is already built as part of mbstring, skipping build' . PHP_EOL); + } + /** * mbregex is not an extension, we need to overwrite the default check. */ diff --git a/src/SPC/builder/extension/mbstring.php b/src/SPC/builder/extension/mbstring.php index 5fcb88bd..aa86ee53 100644 --- a/src/SPC/builder/extension/mbstring.php +++ b/src/SPC/builder/extension/mbstring.php @@ -20,4 +20,15 @@ class mbstring extends Extension } return $arg; } + + public function getUnixConfigureArg(bool $shared = false): string + { + $arg = '--enable-mbstring'; + if ($this->builder->getExt('mbregex') === null) { + $arg .= ' --disable-mbregex'; + } else { + $arg .= ' --enable-mbregex'; + } + return $arg; + } } diff --git a/src/SPC/builder/extension/readline.php b/src/SPC/builder/extension/readline.php index 120fa42f..71c82a8b 100644 --- a/src/SPC/builder/extension/readline.php +++ b/src/SPC/builder/extension/readline.php @@ -29,4 +29,22 @@ class readline extends Extension { return '--without-libedit --with-readline=' . BUILD_ROOT_PATH; } + + public function patchBeforeSharedConfigure(): bool + { + FileSystem::replaceFileStr($this->source_dir . '/configure', + 'test "$PHP_LIBEDIT" = "no" && PHP_LIBEDIT=yes', + '' + ); + return true; + } + + public function buildUnixShared(): void + { + if (!file_exists(BUILD_BIN_PATH . '/php') || !file_exists(BUILD_INCLUDE_PATH . '/php/sapi/cli/cli.h')) { + logger()->warning('CLI mode is not enabled, skipping readline build'); + return; + } + parent::buildUnixShared(); + } } From a9f81dd38ed3c69958ba59181922972bd730e45b Mon Sep 17 00:00:00 2001 From: DubbleClick Date: Tue, 20 May 2025 20:03:02 +0700 Subject: [PATCH 41/50] remove -fpic and -fpie (-fPIC and -fPIE are still there) --- config/env.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/env.ini b/config/env.ini index f70ad0a2..1a1fbaa7 100644 --- a/config/env.ini +++ b/config/env.ini @@ -97,7 +97,7 @@ SPC_CMD_VAR_PHP_CONFIGURE_LDFLAGS="-L${BUILD_LIB_PATH}" ; LIBS for configuring php SPC_CMD_VAR_PHP_CONFIGURE_LIBS="-ldl -lpthread -lm" ; EXTRA_CFLAGS for `make` php -SPC_CMD_VAR_PHP_MAKE_EXTRA_CFLAGS="-g -fstack-protector-strong -fpic -fpie -Os -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -fno-ident -fPIE -fPIC" +SPC_CMD_VAR_PHP_MAKE_EXTRA_CFLAGS="-g -fstack-protector-strong -Os -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -fno-ident -fPIE -fPIC" ; EXTRA_LIBS for `make` php SPC_CMD_VAR_PHP_MAKE_EXTRA_LIBS="-ldl -lpthread -lm" ; EXTRA_LDFLAGS_PROGRAM for `make` php From 03ca3f4f59951a2f438edfccfb04989b371513b5 Mon Sep 17 00:00:00 2001 From: DubbleClick Date: Tue, 20 May 2025 22:19:09 +0700 Subject: [PATCH 42/50] why do we have prefix= calls instead of prefix=BUILD_ROOT_DIR? --- config/ext.json | 3 - src/SPC/builder/extension/curl.php | 73 ++++++++++++++++++++ src/SPC/builder/macos/library/libpng.php | 1 + src/SPC/builder/traits/UnixLibraryTrait.php | 17 +++++ src/SPC/builder/unix/library/imagemagick.php | 11 +-- src/SPC/builder/unix/library/ldap.php | 1 + 6 files changed, 94 insertions(+), 12 deletions(-) diff --git a/config/ext.json b/config/ext.json index d051526a..ee1c68db 100644 --- a/config/ext.json +++ b/config/ext.json @@ -456,9 +456,6 @@ "openssl": { "notes": true, "type": "builtin", - "target": [ - "static" - ], "arg-type": "custom", "arg-type-windows": "with", "lib-depends": [ diff --git a/src/SPC/builder/extension/curl.php b/src/SPC/builder/extension/curl.php index d4f8b078..5ed224f6 100644 --- a/src/SPC/builder/extension/curl.php +++ b/src/SPC/builder/extension/curl.php @@ -5,6 +5,7 @@ declare(strict_types=1); namespace SPC\builder\extension; use SPC\builder\Extension; +use SPC\builder\linux\LinuxBuilder; use SPC\builder\macos\MacOSBuilder; use SPC\exception\FileSystemException; use SPC\exception\WrongUsageException; @@ -54,4 +55,76 @@ class curl extends Extension FileSystem::replaceFileRegex(SOURCE_PATH . '/php-src/configure', '/-lcurl/', $this->getLibFilesString() . $frameworks); return true; } + + public function patchBeforeSharedConfigure(): bool + { + $file = SOURCE_PATH . '/php-src/ext/curl/config.m4'; + $content = FileSystem::readFile($file); + + // Inject patch before it + $patch = ' save_LIBS="$LIBS" + LIBS="$LIBS $CURL_LIBS" +'; + // Check if already patched + if (str_contains($content, $patch)) { + return false; // Already patched + } + + // Match the line containing PHP_CHECK_LIBRARY for curl + $pattern = '/(PHP_CHECK_LIBRARY\(\[curl],\s*\[curl_easy_perform],)/'; + + + // Restore LIBS after the check — append this just after the macro block + $restore = ' + LIBS="$save_LIBS"'; + + // Apply patch + $patched = preg_replace_callback($pattern, function ($matches) use ($patch) { + return $patch . $matches[1]; + }, $content, 1); + + // Inject restore after the matching PHP_CHECK_LIBRARY block + $patched = preg_replace( + '/(PHP_CHECK_LIBRARY\(\[curl],\s*\[curl_easy_perform],.*?\)\n)/s', + "$1$restore\n", + $patched, + 1 + ); + + if ($patched === null) { + throw new \RuntimeException("Failed to patch config.m4 due to a regex error"); + } + + FileSystem::writeFile($file, $patched); + return true; + } + + + public function getUnixConfigureArg(bool $shared = false): string + { + return '--with-curl'; + } + + public function buildUnixShared(): void + { + if (!$this->builder instanceof LinuxBuilder) { + parent::buildUnixShared(); + return; + } + + FileSystem::replaceFileStr( + $this->source_dir . '/config.m4', + ['$ext_dir/phar.1', '$ext_dir/phar.phar.1'], + ['${ext_dir}phar.1', '${ext_dir}phar.phar.1'] + ); + try { + parent::buildUnixShared(); + } finally { + FileSystem::replaceFileStr( + $this->source_dir . '/config.m4', + ['${ext_dir}phar.1', '${ext_dir}phar.phar.1'], + ['$ext_dir/phar.1', '$ext_dir/phar.phar.1'] + ); + } + } } diff --git a/src/SPC/builder/macos/library/libpng.php b/src/SPC/builder/macos/library/libpng.php index b61cc898..f273bff6 100644 --- a/src/SPC/builder/macos/library/libpng.php +++ b/src/SPC/builder/macos/library/libpng.php @@ -59,6 +59,7 @@ class libpng extends MacOSLibraryBase ->cd(BUILD_LIB_PATH) ->exec('ln -sf libpng16.a libpng.a'); $this->patchPkgconfPrefix(['libpng16.pc'], PKGCONF_PATCH_PREFIX); + $this->patchLaDependencyPrefix(['libpng16.la']); $this->cleanLaFiles(); } } diff --git a/src/SPC/builder/traits/UnixLibraryTrait.php b/src/SPC/builder/traits/UnixLibraryTrait.php index 8e69f6d3..45de0cf4 100644 --- a/src/SPC/builder/traits/UnixLibraryTrait.php +++ b/src/SPC/builder/traits/UnixLibraryTrait.php @@ -84,6 +84,23 @@ trait UnixLibraryTrait } } + public function patchLaDependencyPrefix(array $files): void + { + logger()->info('Patching library [' . static::NAME . '] la files'); + foreach ($files as $name) { + $realpath = realpath(BUILD_LIB_PATH . '/' . $name); + if ($realpath === false) { + throw new RuntimeException('Cannot find library [' . static::NAME . '] la file [' . $name . '] !'); + } + logger()->debug('Patching ' . $realpath); + // replace prefix + $file = FileSystem::readFile($realpath); + $file = str_replace(' /lib/', ' ' . BUILD_LIB_PATH . '/', $file); + $file = preg_replace("/^libdir=.*$/m", "libdir='" . BUILD_LIB_PATH . "'", $file); + FileSystem::writeFile($realpath, $file); + } + } + /** * remove libtool archive files * diff --git a/src/SPC/builder/unix/library/imagemagick.php b/src/SPC/builder/unix/library/imagemagick.php index 345cf6f0..deb1e402 100644 --- a/src/SPC/builder/unix/library/imagemagick.php +++ b/src/SPC/builder/unix/library/imagemagick.php @@ -80,17 +80,10 @@ trait imagemagick 'includearchdir=${prefix}/include/ImageMagick-7' ); } - $filelist = [ + $this->patchLaDependencyPrefix([ 'libMagick++-7.Q16HDRI.la', 'libMagickCore-7.Q16HDRI.la', 'libMagickWand-7.Q16HDRI.la', - ]; - foreach ($filelist as $file) { - FileSystem::replaceFileStr( - BUILD_LIB_PATH . '/' . $file, - ' /lib/', - ' ' . BUILD_LIB_PATH . '/', - ); - } + ]); } } diff --git a/src/SPC/builder/unix/library/ldap.php b/src/SPC/builder/unix/library/ldap.php index 2831f094..93f889f0 100644 --- a/src/SPC/builder/unix/library/ldap.php +++ b/src/SPC/builder/unix/library/ldap.php @@ -50,5 +50,6 @@ trait ldap ->exec("make -j{$this->builder->concurrency}") ->exec('make install DESTDIR=' . BUILD_ROOT_PATH); $this->patchPkgconfPrefix(['ldap.pc', 'lber.pc']); + $this->patchLaDependencyPrefix(['libldap.la', 'liblber.la']); } } From f47daac3cc205e51bbf4ceb371bd26ea25e3ab83 Mon Sep 17 00:00:00 2001 From: DubbleClick Date: Tue, 20 May 2025 23:04:34 +0700 Subject: [PATCH 43/50] cs fix, xml building fails now, unsure why, doesn't seem to import expat_compat.h for some reason --- config/ext.json | 3 +++ src/SPC/builder/Extension.php | 12 +++++++++++- src/SPC/builder/extension/xml.php | 6 +++--- 3 files changed, 17 insertions(+), 4 deletions(-) diff --git a/config/ext.json b/config/ext.json index ee1c68db..1c74db74 100644 --- a/config/ext.json +++ b/config/ext.json @@ -77,6 +77,9 @@ ], "ext-depends-windows": [ "xml" + ], + "shared-ext-depends": [ + "xml" ] }, "ds": { diff --git a/src/SPC/builder/Extension.php b/src/SPC/builder/Extension.php index aea8ba8c..9322e49b 100644 --- a/src/SPC/builder/Extension.php +++ b/src/SPC/builder/Extension.php @@ -127,6 +127,9 @@ class Extension foreach (Config::getExt($this->name, 'ext-suggests', []) as $name) { $this->addExtensionDependency($name, true); } + foreach (Config::getExt($this->name, 'shared-ext-depends', []) as $name) { + $this->addExtensionDependency($name); + } return $this; } @@ -300,6 +303,13 @@ class Extension logger()->info('extension ' . $this->getName() . ' already built, skipping'); return; } + foreach (Config::getExt($this->name, 'shared-ext-depends', []) as $name) { + $dependencyExt = $this->builder->getExt($name); + if ($dependencyExt === null) { + throw new RuntimeException("extension {$this->name} requires shared extension {$name}"); + } + $dependencyExt->buildShared(); + } match (PHP_OS_FAMILY) { 'Darwin', 'Linux' => $this->buildUnixShared(), default => throw new WrongUsageException(PHP_OS_FAMILY . ' build shared extensions is not supported yet'), @@ -335,7 +345,7 @@ class Extension shell()->cd($this->source_dir) ->setEnv($env) - ->execWithEnv('./configure ' . $this->getUnixConfigureArg(true) . ' --with-php-config=' . BUILD_BIN_PATH . '/php-config --enable-shared --disable-static') + ->execWithEnv('./configure ' . $this->getUnixConfigureArg(true) . ' --with-php-config=' . BUILD_BIN_PATH . '/php-config --enable-shared --disable-static --with-pic') ->execWithEnv('make clean') ->execWithEnv('make -j' . $this->builder->concurrency) ->execWithEnv('make install'); diff --git a/src/SPC/builder/extension/xml.php b/src/SPC/builder/extension/xml.php index 544585ad..b1a8c5f3 100644 --- a/src/SPC/builder/extension/xml.php +++ b/src/SPC/builder/extension/xml.php @@ -26,11 +26,12 @@ class xml extends Extension 'soap' => '--enable-soap', 'xmlreader' => '--enable-xmlreader', 'xmlwriter' => '--enable-xmlwriter', - 'dom' => '--enable-dom', 'simplexml' => '--enable-simplexml', default => throw new RuntimeException('Not accept non-xml extension'), }; - $arg .= ' --with-libxml="' . BUILD_ROOT_PATH . '"'; + if (!$shared) { + $arg .= ' --with-libxml="' . BUILD_ROOT_PATH . '"'; + } return $arg; } @@ -47,7 +48,6 @@ class xml extends Extension 'soap' => '--enable-soap', 'xmlreader' => '--enable-xmlreader', 'xmlwriter' => '--enable-xmlwriter', - 'dom' => '--with-dom', 'simplexml' => '--with-simplexml', default => throw new RuntimeException('Not accept non-xml extension'), }; From fa285ecc82060159ec1b045ad7b77dfb46014b32 Mon Sep 17 00:00:00 2001 From: DubbleClick Date: Tue, 20 May 2025 23:16:36 +0700 Subject: [PATCH 44/50] more patching, xml still not working though --- src/SPC/builder/unix/library/gettext.php | 1 + src/SPC/builder/unix/library/libiconv.php | 1 + 2 files changed, 2 insertions(+) diff --git a/src/SPC/builder/unix/library/gettext.php b/src/SPC/builder/unix/library/gettext.php index 69736c36..16622560 100644 --- a/src/SPC/builder/unix/library/gettext.php +++ b/src/SPC/builder/unix/library/gettext.php @@ -37,5 +37,6 @@ trait gettext ->execWithEnv('make clean') ->execWithEnv("make -j{$this->builder->concurrency}") ->execWithEnv('make install'); + $this->patchLaDependencyPrefix(['libintl.la']); } } diff --git a/src/SPC/builder/unix/library/libiconv.php b/src/SPC/builder/unix/library/libiconv.php index 710e7425..72297646 100644 --- a/src/SPC/builder/unix/library/libiconv.php +++ b/src/SPC/builder/unix/library/libiconv.php @@ -30,5 +30,6 @@ trait libiconv if (file_exists(BUILD_BIN_PATH . '/iconv')) { unlink(BUILD_BIN_PATH . '/iconv'); } + $this->patchLaDependencyPrefix(['libiconv.la']); } } From c43423a7d0868e658ab1ca5e804b9a40b22c6a23 Mon Sep 17 00:00:00 2001 From: DubbleClick Date: Wed, 21 May 2025 11:19:28 +0700 Subject: [PATCH 45/50] replace root cause of the automatic enable --- src/SPC/builder/extension/readline.php | 9 --------- src/SPC/builder/linux/LinuxBuilder.php | 1 + src/SPC/builder/unix/UnixBuilderBase.php | 1 + 3 files changed, 2 insertions(+), 9 deletions(-) diff --git a/src/SPC/builder/extension/readline.php b/src/SPC/builder/extension/readline.php index 71c82a8b..dc4d15f7 100644 --- a/src/SPC/builder/extension/readline.php +++ b/src/SPC/builder/extension/readline.php @@ -30,15 +30,6 @@ class readline extends Extension return '--without-libedit --with-readline=' . BUILD_ROOT_PATH; } - public function patchBeforeSharedConfigure(): bool - { - FileSystem::replaceFileStr($this->source_dir . '/configure', - 'test "$PHP_LIBEDIT" = "no" && PHP_LIBEDIT=yes', - '' - ); - return true; - } - public function buildUnixShared(): void { if (!file_exists(BUILD_BIN_PATH . '/php') || !file_exists(BUILD_INCLUDE_PATH . '/php/sapi/cli/cli.h')) { diff --git a/src/SPC/builder/linux/LinuxBuilder.php b/src/SPC/builder/linux/LinuxBuilder.php index c06267d7..2db05b5e 100644 --- a/src/SPC/builder/linux/LinuxBuilder.php +++ b/src/SPC/builder/linux/LinuxBuilder.php @@ -184,6 +184,7 @@ class LinuxBuilder extends UnixBuilderBase shell()->cd(SOURCE_PATH . '/php-src') ->exec( getenv('SPC_CMD_PREFIX_PHP_CONFIGURE') . ' ' . + '--prefix=' . BUILD_ROOT_PATH . ' ' . ($enable_cli ? '--enable-cli ' : '--disable-cli ') . ($enable_fpm ? '--enable-fpm ' . ($this->getLib('libacl') !== null ? '--with-fpm-acl ' : '') : '--disable-fpm ') . ($enable_embed ? "--enable-embed={$embed_type} " : '--disable-embed ') . diff --git a/src/SPC/builder/unix/UnixBuilderBase.php b/src/SPC/builder/unix/UnixBuilderBase.php index 9ffca22a..48c82601 100644 --- a/src/SPC/builder/unix/UnixBuilderBase.php +++ b/src/SPC/builder/unix/UnixBuilderBase.php @@ -250,6 +250,7 @@ abstract class UnixBuilderBase extends BuilderBase logger()->debug('Patching phpize prefix'); FileSystem::replaceFileStr(BUILD_BIN_PATH . '/phpize', "prefix=''", "prefix='" . BUILD_ROOT_PATH . "'"); FileSystem::replaceFileStr(BUILD_BIN_PATH . '/phpize', 's##', 's#/usr/local#'); + FileSystem::replaceFileStr(BUILD_LIB_PATH . '/php/build/phpize.m4', 'test "[$]$1" = "no" && $1=yes', '# test "[$]$1" = "no" && $1=yes'); } // patch php-config if (file_exists(BUILD_BIN_PATH . '/php-config')) { From 95a2f4600bb0b2f183829d5723566e2eff7c939a Mon Sep 17 00:00:00 2001 From: DubbleClick Date: Wed, 21 May 2025 12:01:00 +0700 Subject: [PATCH 46/50] rework building of shared extensions so that builtin extensions are built at php-src/configure -> make time --- config/env.ini | 2 +- src/SPC/builder/BuilderBase.php | 18 ++++++++++--- src/SPC/builder/Extension.php | 36 +++++++++++-------------- src/SPC/builder/extension/amqp.php | 2 +- src/SPC/builder/extension/dba.php | 2 +- src/SPC/builder/extension/dom.php | 2 +- src/SPC/builder/extension/ffi.php | 2 +- src/SPC/builder/extension/glfw.php | 2 +- src/SPC/builder/extension/ldap.php | 5 ++++ src/SPC/builder/extension/mbregex.php | 2 +- src/SPC/builder/extension/mbstring.php | 2 +- src/SPC/builder/extension/openssl.php | 2 +- src/SPC/builder/extension/pdo_odbc.php | 2 +- src/SPC/builder/extension/pdo_pgsql.php | 2 +- src/SPC/builder/extension/pgsql.php | 2 +- src/SPC/builder/extension/rdkafka.php | 2 +- src/SPC/builder/extension/redis.php | 2 +- src/SPC/builder/extension/swow.php | 2 +- src/SPC/builder/extension/xlswriter.php | 2 +- src/SPC/builder/extension/xml.php | 2 +- src/SPC/builder/linux/LinuxBuilder.php | 2 +- 21 files changed, 53 insertions(+), 42 deletions(-) diff --git a/config/env.ini b/config/env.ini index 1a1fbaa7..49952645 100644 --- a/config/env.ini +++ b/config/env.ini @@ -81,7 +81,7 @@ SPC_MICRO_PATCHES=static_extensions_win32,cli_checks,disable_huge_page,vcruntime ; buildconf command 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-cgi --disable-phpdbg --with-pic" +SPC_CMD_PREFIX_PHP_CONFIGURE="./configure --prefix= --with-valgrind=no --enable-shared=yes --enable-static=no --disable-all --disable-cgi --disable-phpdbg --with-pic" ; make command SPC_CMD_PREFIX_PHP_MAKE="make -j${CPU_COUNT}" ; embed type for php, static (libphp.a) or shared (libphp.so) diff --git a/src/SPC/builder/BuilderBase.php b/src/SPC/builder/BuilderBase.php index 3b38019e..d32651f6 100644 --- a/src/SPC/builder/BuilderBase.php +++ b/src/SPC/builder/BuilderBase.php @@ -256,6 +256,10 @@ abstract class BuilderBase if (!$ext->isBuildShared()) { continue; } + if (Config::getExt($ext->getName(), 'type') === 'builtin') { + logger()->info('Shared extension [' . $ext->getName() . '] was already built by php-src/configure (' . $ext->getName() . '.so)'); + continue; + } logger()->info('Building extension [' . $ext->getName() . '] as shared extension (' . $ext->getName() . '.so)'); $ext->buildShared(); } @@ -272,9 +276,17 @@ abstract class BuilderBase public function makeStaticExtensionArgs(): string { $ret = []; - foreach ($this->getExts(false) as $ext) { - logger()->info($ext->getName() . ' is using ' . $ext->getConfigureArg()); - $ret[] = trim($ext->getConfigureArg()); + foreach ($this->getExts() as $ext) { + $arg = $ext->getConfigureArg(); + if ($ext->isBuildShared()) { + if (Config::getExt($ext->getName(), 'type') === 'builtin') { + $arg = $ext->getConfigureArg(true); + } else { + continue; + } + } + logger()->info($ext->getName() . ' is using ' . $arg); + $ret[] = trim($arg); } logger()->debug('Using configure: ' . implode(' ', $ret)); return implode(' ', $ret); diff --git a/src/SPC/builder/Extension.php b/src/SPC/builder/Extension.php index 9322e49b..6b00bfae 100644 --- a/src/SPC/builder/Extension.php +++ b/src/SPC/builder/Extension.php @@ -9,7 +9,6 @@ use SPC\exception\RuntimeException; use SPC\exception\WrongUsageException; use SPC\store\Config; use SPC\store\FileSystem; -use SPC\store\SourcePatcher; use SPC\util\SPCConfigUtil; class Extension @@ -60,20 +59,15 @@ class Extension * @throws FileSystemException * @throws WrongUsageException */ - public function getConfigureArg(): string + public function getConfigureArg(bool $shared = false): string { - $arg = $this->getEnableArg(); - switch (PHP_OS_FAMILY) { - case 'Windows': - $arg .= $this->getWindowsConfigureArg(); - break; - case 'Darwin': - case 'Linux': - case 'BSD': - $arg .= $this->getUnixConfigureArg(); - break; - } - return $arg; + return match (PHP_OS_FAMILY) { + 'Windows' => $this->getWindowsConfigureArg($shared), + 'Darwin', + 'Linux', + 'BSD' => $this->getUnixConfigureArg($shared), + default => throw new WrongUsageException(PHP_OS_FAMILY . ' build is not supported yet'), + }; } /** @@ -82,13 +76,13 @@ class Extension * @throws FileSystemException * @throws WrongUsageException */ - public function getEnableArg(): string + public function getEnableArg(bool $shared = false): string { $_name = str_replace('_', '-', $this->name); return match ($arg_type = Config::getExt($this->name, 'arg-type', 'enable')) { 'enable' => '--enable-' . $_name . ' ', - 'with' => '--with-' . $_name . ' ', - 'with-prefix' => '--with-' . $_name . '="' . BUILD_ROOT_PATH . '" ', + 'with' => '--with-' . $_name . ($shared ? '=shared' : '') . ' ', + 'with-prefix' => '--with-' . $_name . '=' . ($shared ? 'shared,' : '') . '"' . BUILD_ROOT_PATH . '" ', 'none', 'custom' => '', default => throw new WrongUsageException("argType does not accept {$arg_type}, use [enable/with/with-prefix] ."), }; @@ -151,15 +145,15 @@ class Extension return $this->name; } - public function getWindowsConfigureArg(): string + public function getWindowsConfigureArg(bool $shared = false): string { - return ''; + return $this->getEnableArg(); // Windows is not supported yet } public function getUnixConfigureArg(bool $shared = false): string { - return ''; + return $this->getEnableArg($shared); } /** @@ -345,7 +339,7 @@ class Extension shell()->cd($this->source_dir) ->setEnv($env) - ->execWithEnv('./configure ' . $this->getUnixConfigureArg(true) . ' --with-php-config=' . BUILD_BIN_PATH . '/php-config --enable-shared --disable-static --with-pic') + ->execWithEnv('./configure ' . $this->getUnixConfigureArg(true) . ' --with-php-config=' . BUILD_BIN_PATH . '/php-config --with-pic') ->execWithEnv('make clean') ->execWithEnv('make -j' . $this->builder->concurrency) ->execWithEnv('make install'); diff --git a/src/SPC/builder/extension/amqp.php b/src/SPC/builder/extension/amqp.php index 8fbfea24..40a6131c 100644 --- a/src/SPC/builder/extension/amqp.php +++ b/src/SPC/builder/extension/amqp.php @@ -28,7 +28,7 @@ class amqp extends Extension return '--with-amqp --with-librabbitmq-dir=' . BUILD_ROOT_PATH; } - public function getWindowsConfigureArg(): string + public function getWindowsConfigureArg($shared = false): string { return '--with-amqp'; } diff --git a/src/SPC/builder/extension/dba.php b/src/SPC/builder/extension/dba.php index bd7388f3..ec5a4d86 100644 --- a/src/SPC/builder/extension/dba.php +++ b/src/SPC/builder/extension/dba.php @@ -16,7 +16,7 @@ class dba extends Extension return '--enable-dba' . $qdbm; } - public function getWindowsConfigureArg(): string + public function getWindowsConfigureArg(bool $shared = false): string { $qdbm = $this->builder->getLib('qdbm') ? ' --with-qdbm' : ''; return '--with-dba' . $qdbm; diff --git a/src/SPC/builder/extension/dom.php b/src/SPC/builder/extension/dom.php index a08fcd81..2d69ac64 100644 --- a/src/SPC/builder/extension/dom.php +++ b/src/SPC/builder/extension/dom.php @@ -30,7 +30,7 @@ class dom extends Extension return true; } - public function getWindowsConfigureArg(): string + public function getWindowsConfigureArg($shared = false): string { return '--with-dom --with-libxml'; } diff --git a/src/SPC/builder/extension/ffi.php b/src/SPC/builder/extension/ffi.php index 51c3efac..1d55397b 100644 --- a/src/SPC/builder/extension/ffi.php +++ b/src/SPC/builder/extension/ffi.php @@ -15,7 +15,7 @@ class ffi extends Extension return '--with-ffi --enable-zend-signals'; } - public function getWindowsConfigureArg(): string + public function getWindowsConfigureArg(bool $shared = false): string { return '--with-ffi'; } diff --git a/src/SPC/builder/extension/glfw.php b/src/SPC/builder/extension/glfw.php index 444b5d93..3ebb5228 100644 --- a/src/SPC/builder/extension/glfw.php +++ b/src/SPC/builder/extension/glfw.php @@ -35,7 +35,7 @@ class glfw extends Extension return '--enable-glfw --with-glfw-dir=' . BUILD_ROOT_PATH; } - public function getWindowsConfigureArg(): string + public function getWindowsConfigureArg(bool $shared = false): string { return '--enable-glfw=static'; } diff --git a/src/SPC/builder/extension/ldap.php b/src/SPC/builder/extension/ldap.php index 4616bea8..18db78c1 100644 --- a/src/SPC/builder/extension/ldap.php +++ b/src/SPC/builder/extension/ldap.php @@ -20,4 +20,9 @@ class ldap extends Extension } return true; } + + public function getUnixConfigureArg(bool $shared = false): string + { + return '--with-ldap=' . BUILD_ROOT_PATH; + } } diff --git a/src/SPC/builder/extension/mbregex.php b/src/SPC/builder/extension/mbregex.php index 492c4fbb..b7d174ff 100644 --- a/src/SPC/builder/extension/mbregex.php +++ b/src/SPC/builder/extension/mbregex.php @@ -16,7 +16,7 @@ class mbregex extends Extension return 'mbstring'; } - public function getConfigureArg(): string + public function getConfigureArg(bool $shared = false): string { return ''; } diff --git a/src/SPC/builder/extension/mbstring.php b/src/SPC/builder/extension/mbstring.php index aa86ee53..42249509 100644 --- a/src/SPC/builder/extension/mbstring.php +++ b/src/SPC/builder/extension/mbstring.php @@ -10,7 +10,7 @@ use SPC\util\CustomExt; #[CustomExt('mbstring')] class mbstring extends Extension { - public function getConfigureArg(): string + public function getConfigureArg(bool $shared = false): string { $arg = '--enable-mbstring'; if ($this->builder->getExt('mbregex') === null) { diff --git a/src/SPC/builder/extension/openssl.php b/src/SPC/builder/extension/openssl.php index add1aede..fc4831f3 100644 --- a/src/SPC/builder/extension/openssl.php +++ b/src/SPC/builder/extension/openssl.php @@ -26,6 +26,6 @@ class openssl extends Extension public function getUnixConfigureArg(bool $shared = false): string { $openssl_dir = $this->builder->getPHPVersionID() >= 80400 ? '' : ' --with-openssl-dir=' . BUILD_ROOT_PATH; - return '--with-openssl=' . BUILD_ROOT_PATH . $openssl_dir; + return '--with-openssl=' . ($shared ? 'shared,' : '') . BUILD_ROOT_PATH . $openssl_dir; } } diff --git a/src/SPC/builder/extension/pdo_odbc.php b/src/SPC/builder/extension/pdo_odbc.php index e436f381..ac1b7456 100644 --- a/src/SPC/builder/extension/pdo_odbc.php +++ b/src/SPC/builder/extension/pdo_odbc.php @@ -22,7 +22,7 @@ class pdo_odbc extends Extension return '--with-pdo-odbc=unixODBC,' . BUILD_ROOT_PATH; } - public function getWindowsConfigureArg(): string + public function getWindowsConfigureArg(bool $shared = false): string { return '--with-pdo-odbc'; } diff --git a/src/SPC/builder/extension/pdo_pgsql.php b/src/SPC/builder/extension/pdo_pgsql.php index e29014cb..b1ca1a81 100644 --- a/src/SPC/builder/extension/pdo_pgsql.php +++ b/src/SPC/builder/extension/pdo_pgsql.php @@ -10,7 +10,7 @@ use SPC\util\CustomExt; #[CustomExt('pdo_pgsql')] class pdo_pgsql extends Extension { - public function getWindowsConfigureArg(): string + public function getWindowsConfigureArg(bool $shared = false): string { return '--with-pdo-pgsql=yes'; } diff --git a/src/SPC/builder/extension/pgsql.php b/src/SPC/builder/extension/pgsql.php index 1c63f163..e4ac8ebb 100644 --- a/src/SPC/builder/extension/pgsql.php +++ b/src/SPC/builder/extension/pgsql.php @@ -45,7 +45,7 @@ class pgsql extends Extension * @throws WrongUsageException * @throws RuntimeException */ - public function getWindowsConfigureArg(): string + public function getWindowsConfigureArg(bool $shared = false): string { if ($this->builder->getPHPVersionID() >= 80400) { return '--with-pgsql'; diff --git a/src/SPC/builder/extension/rdkafka.php b/src/SPC/builder/extension/rdkafka.php index 7af34d72..9f28c627 100644 --- a/src/SPC/builder/extension/rdkafka.php +++ b/src/SPC/builder/extension/rdkafka.php @@ -27,7 +27,7 @@ class rdkafka extends Extension return true; } - public function getConfigureArg(): string + public function getConfigureArg(bool $shared = false): string { $pkgconf_libs = shell()->execWithResult('pkg-config --libs --static rdkafka')[1]; $pkgconf_libs = trim(implode('', $pkgconf_libs)); diff --git a/src/SPC/builder/extension/redis.php b/src/SPC/builder/extension/redis.php index 0b60075c..75158ad7 100644 --- a/src/SPC/builder/extension/redis.php +++ b/src/SPC/builder/extension/redis.php @@ -24,7 +24,7 @@ class redis extends Extension return $arg; } - public function getWindowsConfigureArg(): string + public function getWindowsConfigureArg(bool $shared = false): string { $arg = '--enable-redis'; $arg .= $this->builder->getExt('session') ? ' --enable-redis-session' : ' --disable-redis-session'; diff --git a/src/SPC/builder/extension/swow.php b/src/SPC/builder/extension/swow.php index 27576635..390ec27f 100644 --- a/src/SPC/builder/extension/swow.php +++ b/src/SPC/builder/extension/swow.php @@ -18,7 +18,7 @@ class swow extends Extension } } - public function getConfigureArg(): string + public function getConfigureArg(bool $shared = false): string { $arg = '--enable-swow'; $arg .= $this->builder->getLib('openssl') ? ' --enable-swow-ssl' : ' --disable-swow-ssl'; diff --git a/src/SPC/builder/extension/xlswriter.php b/src/SPC/builder/extension/xlswriter.php index 2ceb8e5c..878168ad 100644 --- a/src/SPC/builder/extension/xlswriter.php +++ b/src/SPC/builder/extension/xlswriter.php @@ -20,7 +20,7 @@ class xlswriter extends Extension return $arg; } - public function getWindowsConfigureArg(): string + public function getWindowsConfigureArg(bool $shared = false): string { return '--with-xlswriter'; } diff --git a/src/SPC/builder/extension/xml.php b/src/SPC/builder/extension/xml.php index b1a8c5f3..d36df758 100644 --- a/src/SPC/builder/extension/xml.php +++ b/src/SPC/builder/extension/xml.php @@ -41,7 +41,7 @@ class xml extends Extension return true; } - public function getWindowsConfigureArg(): string + public function getWindowsConfigureArg(bool $shared = false): string { $arg = match ($this->name) { 'xml' => '--with-xml', diff --git a/src/SPC/builder/linux/LinuxBuilder.php b/src/SPC/builder/linux/LinuxBuilder.php index 2db05b5e..9b901460 100644 --- a/src/SPC/builder/linux/LinuxBuilder.php +++ b/src/SPC/builder/linux/LinuxBuilder.php @@ -184,7 +184,6 @@ class LinuxBuilder extends UnixBuilderBase shell()->cd(SOURCE_PATH . '/php-src') ->exec( getenv('SPC_CMD_PREFIX_PHP_CONFIGURE') . ' ' . - '--prefix=' . BUILD_ROOT_PATH . ' ' . ($enable_cli ? '--enable-cli ' : '--disable-cli ') . ($enable_fpm ? '--enable-fpm ' . ($this->getLib('libacl') !== null ? '--with-fpm-acl ' : '') : '--disable-fpm ') . ($enable_embed ? "--enable-embed={$embed_type} " : '--disable-embed ') . @@ -323,6 +322,7 @@ class LinuxBuilder extends UnixBuilderBase shell()->cd(SOURCE_PATH . '/php-src') ->exec('sed -i "s|//lib|/lib|g" Makefile') + ->exec('sed -i "s|^EXTENSION_DIR = .*|EXTENSION_DIR = ' . BUILD_MODULES_PATH . '|" Makefile') ->exec(getenv('SPC_CMD_PREFIX_PHP_MAKE') . ' INSTALL_ROOT=' . BUILD_ROOT_PATH . " {$vars} install"); $this->patchPhpScripts(); } From 495e868a7122d2be8b7ce9376ec1f4f6f905a675 Mon Sep 17 00:00:00 2001 From: DubbleClick Date: Wed, 21 May 2025 13:19:51 +0700 Subject: [PATCH 47/50] rework configure args --- config/ext.json | 15 +++++++++------ src/SPC/builder/BuilderBase.php | 6 +++++- src/SPC/builder/extension/bz2.php | 5 ----- src/SPC/builder/extension/curl.php | 7 +------ src/SPC/builder/extension/dba.php | 2 +- src/SPC/builder/extension/dom.php | 2 +- src/SPC/builder/extension/ffi.php | 2 +- src/SPC/builder/extension/gd.php | 2 +- src/SPC/builder/extension/ldap.php | 5 ----- src/SPC/builder/extension/mbstring.php | 2 +- src/SPC/builder/extension/xml.php | 4 +--- src/SPC/builder/linux/LinuxBuilder.php | 2 +- src/SPC/builder/unix/library/libxslt.php | 1 + src/SPC/store/SourcePatcher.php | 2 +- 14 files changed, 24 insertions(+), 33 deletions(-) diff --git a/config/ext.json b/config/ext.json index 1c74db74..89f17dc7 100644 --- a/config/ext.json +++ b/config/ext.json @@ -79,6 +79,9 @@ "xml" ], "shared-ext-depends": [ + "libxml", + "xmlreader", + "xmlwriter", "xml" ] }, @@ -413,22 +416,22 @@ }, "mysqli": { "type": "builtin", - "target": [ - "static" - ], "arg-type": "with", "ext-depends": [ "mysqlnd" + ], + "target": [ + "static" ] }, "mysqlnd": { "type": "builtin", - "target": [ - "static" - ], "arg-type-windows": "with", "lib-depends": [ "zlib" + ], + "target": [ + "static" ] }, "oci8": { diff --git a/src/SPC/builder/BuilderBase.php b/src/SPC/builder/BuilderBase.php index d32651f6..0e4c0603 100644 --- a/src/SPC/builder/BuilderBase.php +++ b/src/SPC/builder/BuilderBase.php @@ -257,7 +257,11 @@ abstract class BuilderBase continue; } if (Config::getExt($ext->getName(), 'type') === 'builtin') { - logger()->info('Shared extension [' . $ext->getName() . '] was already built by php-src/configure (' . $ext->getName() . '.so)'); + if (file_exists(BUILD_MODULES_PATH . '/' . $ext->getName() . '.so')) { + logger()->info('Shared extension [' . $ext->getName() . '] was already built by php-src/configure (' . $ext->getName() . '.so)'); + continue; + } + logger()->warning('Shared extension [' . $ext->getName() . '] was built statically by php-src/configure'); continue; } logger()->info('Building extension [' . $ext->getName() . '] as shared extension (' . $ext->getName() . '.so)'); diff --git a/src/SPC/builder/extension/bz2.php b/src/SPC/builder/extension/bz2.php index ee3f2996..88f22e56 100644 --- a/src/SPC/builder/extension/bz2.php +++ b/src/SPC/builder/extension/bz2.php @@ -24,9 +24,4 @@ class bz2 extends Extension FileSystem::replaceFileRegex(SOURCE_PATH . '/php-src/configure', '/-lbz2/', $this->getLibFilesString() . $frameworks); return true; } - - public function getUnixConfigureArg(bool $shared = false): string - { - return $shared ? '--with-bz2=' . BUILD_ROOT_PATH : ''; - } } diff --git a/src/SPC/builder/extension/curl.php b/src/SPC/builder/extension/curl.php index 5ed224f6..0fd2b90b 100644 --- a/src/SPC/builder/extension/curl.php +++ b/src/SPC/builder/extension/curl.php @@ -53,6 +53,7 @@ class curl extends Extension { $frameworks = $this->builder instanceof MacOSBuilder ? ' ' . $this->builder->getFrameworks(true) . ' ' : ''; FileSystem::replaceFileRegex(SOURCE_PATH . '/php-src/configure', '/-lcurl/', $this->getLibFilesString() . $frameworks); + $this->patchBeforeSharedConfigure(); return true; } @@ -99,12 +100,6 @@ class curl extends Extension return true; } - - public function getUnixConfigureArg(bool $shared = false): string - { - return '--with-curl'; - } - public function buildUnixShared(): void { if (!$this->builder instanceof LinuxBuilder) { diff --git a/src/SPC/builder/extension/dba.php b/src/SPC/builder/extension/dba.php index ec5a4d86..4a69c0a5 100644 --- a/src/SPC/builder/extension/dba.php +++ b/src/SPC/builder/extension/dba.php @@ -12,7 +12,7 @@ class dba extends Extension { public function getUnixConfigureArg(bool $shared = false): string { - $qdbm = $this->builder->getLib('qdbm') ? (' --with-qdbm=' . BUILD_ROOT_PATH) : ''; + $qdbm = $this->builder->getLib('qdbm') ? (' --with-qdbm=' . ($shared ? 'shared,' : '') . BUILD_ROOT_PATH) : ''; return '--enable-dba' . $qdbm; } diff --git a/src/SPC/builder/extension/dom.php b/src/SPC/builder/extension/dom.php index 2d69ac64..46dae9e2 100644 --- a/src/SPC/builder/extension/dom.php +++ b/src/SPC/builder/extension/dom.php @@ -17,7 +17,7 @@ class dom extends Extension */ public function getUnixConfigureArg(bool $shared = false): string { - $arg = '--enable-dom'; + $arg = '--enable-dom' . ($shared ? '=shared' : ''); if (!$shared) { $arg .= ' --with-libxml="' . BUILD_ROOT_PATH . '"'; } diff --git a/src/SPC/builder/extension/ffi.php b/src/SPC/builder/extension/ffi.php index 1d55397b..98547723 100644 --- a/src/SPC/builder/extension/ffi.php +++ b/src/SPC/builder/extension/ffi.php @@ -12,7 +12,7 @@ class ffi extends Extension { public function getUnixConfigureArg(bool $shared = false): string { - return '--with-ffi --enable-zend-signals'; + return '--with-ffi' . ($shared ? '=shared' : '') . ' --enable-zend-signals'; } public function getWindowsConfigureArg(bool $shared = false): string diff --git a/src/SPC/builder/extension/gd.php b/src/SPC/builder/extension/gd.php index f872733b..677b1522 100644 --- a/src/SPC/builder/extension/gd.php +++ b/src/SPC/builder/extension/gd.php @@ -12,7 +12,7 @@ class gd extends Extension { public function getUnixConfigureArg(bool $shared = false): string { - $arg = '--enable-gd'; + $arg = '--enable-gd' . ($shared ? '=shared' : ''); $arg .= $this->builder->getLib('freetype') ? ' --with-freetype' : ''; $arg .= $this->builder->getLib('libjpeg') ? ' --with-jpeg' : ''; $arg .= $this->builder->getLib('libwebp') ? ' --with-webp' : ''; diff --git a/src/SPC/builder/extension/ldap.php b/src/SPC/builder/extension/ldap.php index 18db78c1..4616bea8 100644 --- a/src/SPC/builder/extension/ldap.php +++ b/src/SPC/builder/extension/ldap.php @@ -20,9 +20,4 @@ class ldap extends Extension } return true; } - - public function getUnixConfigureArg(bool $shared = false): string - { - return '--with-ldap=' . BUILD_ROOT_PATH; - } } diff --git a/src/SPC/builder/extension/mbstring.php b/src/SPC/builder/extension/mbstring.php index 42249509..697ad3fe 100644 --- a/src/SPC/builder/extension/mbstring.php +++ b/src/SPC/builder/extension/mbstring.php @@ -23,7 +23,7 @@ class mbstring extends Extension public function getUnixConfigureArg(bool $shared = false): string { - $arg = '--enable-mbstring'; + $arg = '--enable-mbstring' . ($shared ? '=shared' : ''); if ($this->builder->getExt('mbregex') === null) { $arg .= ' --disable-mbregex'; } else { diff --git a/src/SPC/builder/extension/xml.php b/src/SPC/builder/extension/xml.php index d36df758..3c8b5dff 100644 --- a/src/SPC/builder/extension/xml.php +++ b/src/SPC/builder/extension/xml.php @@ -29,9 +29,7 @@ class xml extends Extension 'simplexml' => '--enable-simplexml', default => throw new RuntimeException('Not accept non-xml extension'), }; - if (!$shared) { - $arg .= ' --with-libxml="' . BUILD_ROOT_PATH . '"'; - } + $arg .= ($shared ? '=shared' : '' ) . ' --with-libxml="' . BUILD_ROOT_PATH . '"'; return $arg; } diff --git a/src/SPC/builder/linux/LinuxBuilder.php b/src/SPC/builder/linux/LinuxBuilder.php index 9b901460..0a827c85 100644 --- a/src/SPC/builder/linux/LinuxBuilder.php +++ b/src/SPC/builder/linux/LinuxBuilder.php @@ -322,7 +322,7 @@ class LinuxBuilder extends UnixBuilderBase shell()->cd(SOURCE_PATH . '/php-src') ->exec('sed -i "s|//lib|/lib|g" Makefile') - ->exec('sed -i "s|^EXTENSION_DIR = .*|EXTENSION_DIR = ' . BUILD_MODULES_PATH . '|" 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"); $this->patchPhpScripts(); } diff --git a/src/SPC/builder/unix/library/libxslt.php b/src/SPC/builder/unix/library/libxslt.php index 799c87c2..6de23e3e 100644 --- a/src/SPC/builder/unix/library/libxslt.php +++ b/src/SPC/builder/unix/library/libxslt.php @@ -47,5 +47,6 @@ trait libxslt ->execWithEnv("make -j{$this->builder->concurrency}") ->execWithEnv('make install DESTDIR=' . escapeshellarg(BUILD_ROOT_PATH)); $this->patchPkgconfPrefix(['libexslt.pc']); + $this->patchLaDependencyPrefix(['libxslt.la', 'libexslt.la']); } } diff --git a/src/SPC/store/SourcePatcher.php b/src/SPC/store/SourcePatcher.php index 24ba666c..0c02e155 100644 --- a/src/SPC/store/SourcePatcher.php +++ b/src/SPC/store/SourcePatcher.php @@ -95,7 +95,7 @@ class SourcePatcher */ public static function patchBeforeConfigure(BuilderBase $builder): void { - foreach ($builder->getExts(false) as $ext) { + foreach ($builder->getExts() as $ext) { if ($ext->patchBeforeConfigure() === true) { logger()->info('Extension [' . $ext->getName() . '] patched before configure'); } From 7698ceb10857051cd9a84fdfa55b40821bdb8c30 Mon Sep 17 00:00:00 2001 From: DubbleClick Date: Wed, 21 May 2025 14:10:56 +0700 Subject: [PATCH 48/50] fixes for more configure args --- config/ext.json | 16 ++++++------- src/SPC/builder/Extension.php | 2 +- src/SPC/builder/extension/dba.php | 2 +- src/SPC/builder/extension/dom.php | 4 +--- src/SPC/builder/extension/mbstring.php | 2 +- src/SPC/builder/extension/odbc.php | 2 +- src/SPC/builder/extension/pdo_odbc.php | 2 +- src/SPC/builder/extension/pgsql.php | 4 ++-- src/SPC/builder/extension/readline.php | 2 +- src/SPC/builder/extension/sqlsrv.php | 32 ++++++++++++++++++++++++++ src/SPC/builder/extension/xhprof.php | 32 ++++++++++++++++++++++++++ src/SPC/command/BuildPHPCommand.php | 6 ++++- 12 files changed, 86 insertions(+), 20 deletions(-) diff --git a/config/ext.json b/config/ext.json index 89f17dc7..290a079b 100644 --- a/config/ext.json +++ b/config/ext.json @@ -77,12 +77,6 @@ ], "ext-depends-windows": [ "xml" - ], - "shared-ext-depends": [ - "libxml", - "xmlreader", - "xmlwriter", - "xml" ] }, "ds": { @@ -331,13 +325,16 @@ }, "type": "builtin", "arg-type": "none", - "ext-depends": [ - "xml" + "target": [ + "static" ] }, "mbregex": { "type": "builtin", "arg-type": "custom", + "target": [ + "static" + ], "ext-depends": [ "mbstring" ], @@ -1083,6 +1080,9 @@ "arg-type-windows": "enable", "lib-depends": [ "zlib" + ], + "target": [ + "static" ] }, "zstd": { diff --git a/src/SPC/builder/Extension.php b/src/SPC/builder/Extension.php index 6b00bfae..3152dd3e 100644 --- a/src/SPC/builder/Extension.php +++ b/src/SPC/builder/Extension.php @@ -80,7 +80,7 @@ class Extension { $_name = str_replace('_', '-', $this->name); return match ($arg_type = Config::getExt($this->name, 'arg-type', 'enable')) { - 'enable' => '--enable-' . $_name . ' ', + 'enable' => '--enable-' . $_name . ($shared ? '=shared' : '') . ' ', 'with' => '--with-' . $_name . ($shared ? '=shared' : '') . ' ', 'with-prefix' => '--with-' . $_name . '=' . ($shared ? 'shared,' : '') . '"' . BUILD_ROOT_PATH . '" ', 'none', 'custom' => '', diff --git a/src/SPC/builder/extension/dba.php b/src/SPC/builder/extension/dba.php index 4a69c0a5..abda5651 100644 --- a/src/SPC/builder/extension/dba.php +++ b/src/SPC/builder/extension/dba.php @@ -13,7 +13,7 @@ class dba extends Extension public function getUnixConfigureArg(bool $shared = false): string { $qdbm = $this->builder->getLib('qdbm') ? (' --with-qdbm=' . ($shared ? 'shared,' : '') . BUILD_ROOT_PATH) : ''; - return '--enable-dba' . $qdbm; + return '--enable-dba' . ($shared ? '=shared' : '') . $qdbm; } public function getWindowsConfigureArg(bool $shared = false): string diff --git a/src/SPC/builder/extension/dom.php b/src/SPC/builder/extension/dom.php index 46dae9e2..fb1a4e15 100644 --- a/src/SPC/builder/extension/dom.php +++ b/src/SPC/builder/extension/dom.php @@ -18,9 +18,7 @@ class dom extends Extension public function getUnixConfigureArg(bool $shared = false): string { $arg = '--enable-dom' . ($shared ? '=shared' : ''); - if (!$shared) { - $arg .= ' --with-libxml="' . BUILD_ROOT_PATH . '"'; - } + $arg .= ' --with-libxml="' . BUILD_ROOT_PATH . '"'; return $arg; } diff --git a/src/SPC/builder/extension/mbstring.php b/src/SPC/builder/extension/mbstring.php index 697ad3fe..3576877f 100644 --- a/src/SPC/builder/extension/mbstring.php +++ b/src/SPC/builder/extension/mbstring.php @@ -12,7 +12,7 @@ class mbstring extends Extension { public function getConfigureArg(bool $shared = false): string { - $arg = '--enable-mbstring'; + $arg = '--enable-mbstring' . ($shared ? '=shared' : ''); if ($this->builder->getExt('mbregex') === null) { $arg .= ' --disable-mbregex'; } else { diff --git a/src/SPC/builder/extension/odbc.php b/src/SPC/builder/extension/odbc.php index ac5c3e8f..278b5865 100644 --- a/src/SPC/builder/extension/odbc.php +++ b/src/SPC/builder/extension/odbc.php @@ -12,6 +12,6 @@ class odbc extends Extension { public function getUnixConfigureArg(bool $shared = false): string { - return '--with-unixODBC=' . BUILD_ROOT_PATH; + return '--with-unixODBC=' . ($shared ? 'shared,' : '') . BUILD_ROOT_PATH; } } diff --git a/src/SPC/builder/extension/pdo_odbc.php b/src/SPC/builder/extension/pdo_odbc.php index ac1b7456..c47144fe 100644 --- a/src/SPC/builder/extension/pdo_odbc.php +++ b/src/SPC/builder/extension/pdo_odbc.php @@ -19,7 +19,7 @@ class pdo_odbc extends Extension public function getUnixConfigureArg(bool $shared = false): string { - return '--with-pdo-odbc=unixODBC,' . BUILD_ROOT_PATH; + return '--with-pdo-odbc=' . ($shared ? 'shared,' : '') . 'unixODBC,' . BUILD_ROOT_PATH; } public function getWindowsConfigureArg(bool $shared = false): string diff --git a/src/SPC/builder/extension/pgsql.php b/src/SPC/builder/extension/pgsql.php index e4ac8ebb..b45ba667 100644 --- a/src/SPC/builder/extension/pgsql.php +++ b/src/SPC/builder/extension/pgsql.php @@ -36,9 +36,9 @@ class pgsql extends Extension public function getUnixConfigureArg(bool $shared = false): string { if ($this->builder->getPHPVersionID() >= 80400) { - return '--with-pgsql PGSQL_CFLAGS=-I' . BUILD_INCLUDE_PATH . ' PGSQL_LIBS="-L' . BUILD_LIB_PATH . ' -lpq -lpgport -lpgcommon"'; + return '--with-pgsql' . ($shared ? '=shared' : '') . ' PGSQL_CFLAGS=-I' . BUILD_INCLUDE_PATH . ' PGSQL_LIBS="-L' . BUILD_LIB_PATH . ' -lpq -lpgport -lpgcommon"'; } - return '--with-pgsql=' . BUILD_ROOT_PATH; + return '--with-pgsql=' . ($shared ? 'shared,' : '') . BUILD_ROOT_PATH; } /** diff --git a/src/SPC/builder/extension/readline.php b/src/SPC/builder/extension/readline.php index dc4d15f7..5cb5eff3 100644 --- a/src/SPC/builder/extension/readline.php +++ b/src/SPC/builder/extension/readline.php @@ -27,7 +27,7 @@ class readline extends Extension public function getUnixConfigureArg(bool $shared = false): string { - return '--without-libedit --with-readline=' . BUILD_ROOT_PATH; + return '--without-libedit --with-readline=' . ($shared ? 'shared,' : '') . BUILD_ROOT_PATH; } public function buildUnixShared(): void diff --git a/src/SPC/builder/extension/sqlsrv.php b/src/SPC/builder/extension/sqlsrv.php index edf5d919..22aef95b 100644 --- a/src/SPC/builder/extension/sqlsrv.php +++ b/src/SPC/builder/extension/sqlsrv.php @@ -7,6 +7,7 @@ namespace SPC\builder\extension; use SPC\builder\Extension; use SPC\store\FileSystem; use SPC\util\CustomExt; +use SPC\util\SPCConfigUtil; #[CustomExt('sqlsrv')] class sqlsrv extends Extension @@ -33,4 +34,35 @@ class sqlsrv extends Extension } return false; } + + public function buildUnixShared(): void + { + $config = (new SPCConfigUtil($this->builder))->config([$this->getName()]); + $env = [ + 'CFLAGS' => $config['cflags'], + 'CXXFLAGS' => $config['cflags'], + 'LDFLAGS' => $config['ldflags'], + 'LIBS' => $config['libs'], + 'LD_LIBRARY_PATH' => BUILD_LIB_PATH, + ]; + // prepare configure args + shell()->cd($this->source_dir) + ->setEnv($env) + ->execWithEnv(BUILD_BIN_PATH . '/phpize'); + + if ($this->patchBeforeSharedConfigure()) { + logger()->info('ext [ . ' . $this->getName() . '] patching before shared configure'); + } + + shell()->cd($this->source_dir) + ->setEnv($env) + ->execWithEnv('./configure ' . $this->getUnixConfigureArg(true) . ' --with-php-config=' . BUILD_BIN_PATH . '/php-config --with-pic') + ->execWithEnv('make clean') + ->execWithEnv('make -j' . $this->builder->concurrency) + ->execWithEnv('make install'); + + // check shared extension with php-cli + if (file_exists(BUILD_BIN_PATH . '/php')) { + $this->runSharedExtensionCheckUnix(); + } } } diff --git a/src/SPC/builder/extension/xhprof.php b/src/SPC/builder/extension/xhprof.php index c3d98aac..118a34cd 100644 --- a/src/SPC/builder/extension/xhprof.php +++ b/src/SPC/builder/extension/xhprof.php @@ -7,6 +7,7 @@ namespace SPC\builder\extension; use SPC\builder\Extension; use SPC\store\FileSystem; use SPC\util\CustomExt; +use SPC\util\SPCConfigUtil; #[CustomExt('xhprof')] class xhprof extends Extension @@ -30,4 +31,35 @@ class xhprof extends Extension } return false; } + + public function buildUnixShared(): void + { + $config = (new SPCConfigUtil($this->builder))->config([$this->getName()]); + $env = [ + 'CFLAGS' => $config['cflags'], + 'LDFLAGS' => $config['ldflags'], + 'LIBS' => $config['libs'], + 'LD_LIBRARY_PATH' => BUILD_LIB_PATH, + ]; + // prepare configure args + shell()->cd($this->source_dir . '/extension') + ->setEnv($env) + ->execWithEnv(BUILD_BIN_PATH . '/phpize'); + + if ($this->patchBeforeSharedConfigure()) { + logger()->info('ext [ . ' . $this->getName() . '] patching before shared configure'); + } + + shell()->cd($this->source_dir . '/extension') + ->setEnv($env) + ->execWithEnv('./configure ' . $this->getUnixConfigureArg(true) . ' --with-php-config=' . BUILD_BIN_PATH . '/php-config --with-pic') + ->execWithEnv('make clean') + ->execWithEnv('make -j' . $this->builder->concurrency) + ->execWithEnv('make install'); + + // check shared extension with php-cli + if (file_exists(BUILD_BIN_PATH . '/php')) { + $this->runSharedExtensionCheckUnix(); + } + } } diff --git a/src/SPC/command/BuildPHPCommand.php b/src/SPC/command/BuildPHPCommand.php index edeb7c47..cd83c1c8 100644 --- a/src/SPC/command/BuildPHPCommand.php +++ b/src/SPC/command/BuildPHPCommand.php @@ -249,7 +249,11 @@ class BuildPHPCommand extends BuildCommand if (!empty($shared_extensions)) { foreach ($shared_extensions as $ext) { $path = FileSystem::convertPath("{$build_root_path}/modules/{$ext}.so"); - logger()->info("Shared extension [{$ext}] path{$fixed}: {$path}"); + if (file_exists("{$build_root_path}/modules/{$ext}.so")) { + logger()->info("Shared extension [{$ext}] path{$fixed}: {$path}"); + } else { + logger()->warning("Shared extension [{$ext}] not found, please check!"); + } } } From 3f8d297fb131ed1e66aa7ff7f42fd2c98f1396a1 Mon Sep 17 00:00:00 2001 From: DubbleClick Date: Wed, 21 May 2025 14:15:58 +0700 Subject: [PATCH 49/50] linter --- src/SPC/builder/Extension.php | 2 +- src/SPC/builder/extension/curl.php | 5 ++--- src/SPC/builder/extension/mbregex.php | 5 ----- src/SPC/builder/extension/sqlsrv.php | 3 ++- src/SPC/builder/extension/xml.php | 2 +- src/SPC/builder/traits/UnixLibraryTrait.php | 4 ++-- 6 files changed, 8 insertions(+), 13 deletions(-) diff --git a/src/SPC/builder/Extension.php b/src/SPC/builder/Extension.php index 3152dd3e..0cda99b6 100644 --- a/src/SPC/builder/Extension.php +++ b/src/SPC/builder/Extension.php @@ -336,7 +336,7 @@ class Extension if ($this->patchBeforeSharedConfigure()) { logger()->info('ext [ . ' . $this->getName() . '] patching before shared configure'); } - + shell()->cd($this->source_dir) ->setEnv($env) ->execWithEnv('./configure ' . $this->getUnixConfigureArg(true) . ' --with-php-config=' . BUILD_BIN_PATH . '/php-config --with-pic') diff --git a/src/SPC/builder/extension/curl.php b/src/SPC/builder/extension/curl.php index 0fd2b90b..4779e67c 100644 --- a/src/SPC/builder/extension/curl.php +++ b/src/SPC/builder/extension/curl.php @@ -74,7 +74,6 @@ class curl extends Extension // Match the line containing PHP_CHECK_LIBRARY for curl $pattern = '/(PHP_CHECK_LIBRARY\(\[curl],\s*\[curl_easy_perform],)/'; - // Restore LIBS after the check — append this just after the macro block $restore = ' LIBS="$save_LIBS"'; @@ -87,13 +86,13 @@ class curl extends Extension // Inject restore after the matching PHP_CHECK_LIBRARY block $patched = preg_replace( '/(PHP_CHECK_LIBRARY\(\[curl],\s*\[curl_easy_perform],.*?\)\n)/s', - "$1$restore\n", + "$1{$restore}\n", $patched, 1 ); if ($patched === null) { - throw new \RuntimeException("Failed to patch config.m4 due to a regex error"); + throw new \RuntimeException('Failed to patch config.m4 due to a regex error'); } FileSystem::writeFile($file, $patched); diff --git a/src/SPC/builder/extension/mbregex.php b/src/SPC/builder/extension/mbregex.php index b7d174ff..1f169e1a 100644 --- a/src/SPC/builder/extension/mbregex.php +++ b/src/SPC/builder/extension/mbregex.php @@ -21,11 +21,6 @@ class mbregex extends Extension return ''; } - public function buildUnixShared(): void - { - print('mbregex is already built as part of mbstring, skipping build' . PHP_EOL); - } - /** * mbregex is not an extension, we need to overwrite the default check. */ diff --git a/src/SPC/builder/extension/sqlsrv.php b/src/SPC/builder/extension/sqlsrv.php index 22aef95b..f6cd21a0 100644 --- a/src/SPC/builder/extension/sqlsrv.php +++ b/src/SPC/builder/extension/sqlsrv.php @@ -64,5 +64,6 @@ class sqlsrv extends Extension // check shared extension with php-cli if (file_exists(BUILD_BIN_PATH . '/php')) { $this->runSharedExtensionCheckUnix(); - } } + } + } } diff --git a/src/SPC/builder/extension/xml.php b/src/SPC/builder/extension/xml.php index 3c8b5dff..bd64d346 100644 --- a/src/SPC/builder/extension/xml.php +++ b/src/SPC/builder/extension/xml.php @@ -29,7 +29,7 @@ class xml extends Extension 'simplexml' => '--enable-simplexml', default => throw new RuntimeException('Not accept non-xml extension'), }; - $arg .= ($shared ? '=shared' : '' ) . ' --with-libxml="' . BUILD_ROOT_PATH . '"'; + $arg .= ($shared ? '=shared' : '') . ' --with-libxml="' . BUILD_ROOT_PATH . '"'; return $arg; } diff --git a/src/SPC/builder/traits/UnixLibraryTrait.php b/src/SPC/builder/traits/UnixLibraryTrait.php index 45de0cf4..962f257f 100644 --- a/src/SPC/builder/traits/UnixLibraryTrait.php +++ b/src/SPC/builder/traits/UnixLibraryTrait.php @@ -95,8 +95,8 @@ trait UnixLibraryTrait logger()->debug('Patching ' . $realpath); // replace prefix $file = FileSystem::readFile($realpath); - $file = str_replace(' /lib/', ' ' . BUILD_LIB_PATH . '/', $file); - $file = preg_replace("/^libdir=.*$/m", "libdir='" . BUILD_LIB_PATH . "'", $file); + $file = str_replace(' /lib/', ' ' . BUILD_LIB_PATH . '/', $file); + + $file = preg_replace('/^libdir=.*$/m', "libdir='" . BUILD_LIB_PATH . "'", $file); FileSystem::writeFile($realpath, $file); } } From d349627fa15b8a93c2fecb069762e651c6235515 Mon Sep 17 00:00:00 2001 From: DubbleClick Date: Wed, 21 May 2025 14:29:49 +0700 Subject: [PATCH 50/50] linter --- config/ext.json | 3 +++ src/SPC/builder/extension/readline.php | 2 +- src/SPC/builder/traits/UnixLibraryTrait.php | 2 +- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/config/ext.json b/config/ext.json index 290a079b..eaa27d1b 100644 --- a/config/ext.json +++ b/config/ext.json @@ -643,6 +643,9 @@ "arg-type": "with-prefix", "lib-depends": [ "readline" + ], + "target": [ + "static" ] }, "redis": { diff --git a/src/SPC/builder/extension/readline.php b/src/SPC/builder/extension/readline.php index 5cb5eff3..dc4d15f7 100644 --- a/src/SPC/builder/extension/readline.php +++ b/src/SPC/builder/extension/readline.php @@ -27,7 +27,7 @@ class readline extends Extension public function getUnixConfigureArg(bool $shared = false): string { - return '--without-libedit --with-readline=' . ($shared ? 'shared,' : '') . BUILD_ROOT_PATH; + return '--without-libedit --with-readline=' . BUILD_ROOT_PATH; } public function buildUnixShared(): void diff --git a/src/SPC/builder/traits/UnixLibraryTrait.php b/src/SPC/builder/traits/UnixLibraryTrait.php index 962f257f..869bf531 100644 --- a/src/SPC/builder/traits/UnixLibraryTrait.php +++ b/src/SPC/builder/traits/UnixLibraryTrait.php @@ -96,7 +96,7 @@ trait UnixLibraryTrait // replace prefix $file = FileSystem::readFile($realpath); $file = str_replace(' /lib/', ' ' . BUILD_LIB_PATH . '/', $file); - + $file = preg_replace('/^libdir=.*$/m', "libdir='" . BUILD_LIB_PATH . "'", $file); + $file = preg_replace('/^libdir=.*$/m', "libdir='" . BUILD_LIB_PATH . "'", $file); FileSystem::writeFile($realpath, $file); } }