From 123cc92756fa9f530892e3d820224533cafc7e09 Mon Sep 17 00:00:00 2001 From: crazywhalecc Date: Mon, 9 Jun 2025 10:24:06 +0800 Subject: [PATCH 1/8] Extract default build env to unix shell --- src/SPC/builder/Extension.php | 8 ++-- src/SPC/builder/linux/library/libffi.php | 10 ++--- src/SPC/builder/linux/library/libpng.php | 15 +++---- src/SPC/builder/linux/library/openssl.php | 7 ++- src/SPC/builder/macos/library/openssl.php | 5 +-- src/SPC/builder/unix/library/attr.php | 16 +++---- src/SPC/builder/unix/library/bzip2.php | 7 ++- src/SPC/builder/unix/library/gettext.php | 16 +++---- src/SPC/builder/unix/library/gmp.php | 9 ++-- src/SPC/builder/unix/library/imagemagick.php | 11 ++--- src/SPC/builder/unix/library/ldap.php | 11 ++--- src/SPC/builder/unix/library/libacl.php | 16 +++---- src/SPC/builder/unix/library/libargon2.php | 7 ++- src/SPC/builder/unix/library/libcares.php | 9 ++-- src/SPC/builder/unix/library/libiconv.php | 11 +++-- src/SPC/builder/unix/library/liblz4.php | 9 ++-- src/SPC/builder/unix/library/libtiff.php | 11 +++-- src/SPC/builder/unix/library/libxslt.php | 18 ++++---- src/SPC/builder/unix/library/ncurses.php | 11 +++-- src/SPC/builder/unix/library/nghttp2.php | 11 +++-- src/SPC/builder/unix/library/nghttp3.php | 15 +++---- src/SPC/builder/unix/library/ngtcp2.php | 15 +++---- src/SPC/builder/unix/library/onig.php | 9 ++-- src/SPC/builder/unix/library/pkgconfig.php | 10 ++--- src/SPC/builder/unix/library/readline.php | 11 +++-- src/SPC/builder/unix/library/sqlite.php | 11 +++-- src/SPC/builder/unix/library/zlib.php | 11 +++-- src/SPC/util/UnixShell.php | 47 ++++++++++++++++---- src/SPC/util/executor/UnixCMakeExecutor.php | 15 ++----- 29 files changed, 166 insertions(+), 196 deletions(-) diff --git a/src/SPC/builder/Extension.php b/src/SPC/builder/Extension.php index a3d08f09..79c0a957 100644 --- a/src/SPC/builder/Extension.php +++ b/src/SPC/builder/Extension.php @@ -301,10 +301,10 @@ class Extension // 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); + ->exec(BUILD_BIN_PATH . '/phpize') + ->exec('./configure ' . $this->getUnixConfigureArg(true) . ' --with-php-config=' . BUILD_BIN_PATH . '/php-config --enable-shared --disable-static') + ->exec('make clean') + ->exec('make -j' . $this->builder->concurrency); // copy shared library copy($this->source_dir . '/modules/' . $this->getDistName() . '.so', BUILD_LIB_PATH . '/' . $this->getDistName() . '.so'); diff --git a/src/SPC/builder/linux/library/libffi.php b/src/SPC/builder/linux/library/libffi.php index 9d1c2d79..0324f92c 100644 --- a/src/SPC/builder/linux/library/libffi.php +++ b/src/SPC/builder/linux/library/libffi.php @@ -21,8 +21,8 @@ class libffi extends LinuxLibraryBase $arch = getenv('SPC_ARCH'); shell()->cd($this->source_dir) - ->setEnv(['CFLAGS' => $this->getLibExtraCFlags(), 'LDFLAGS' => $this->getLibExtraLdFlags(), 'LIBS' => $this->getLibExtraLibs()]) - ->execWithEnv( + ->initLibBuildEnv($this) + ->exec( './configure ' . '--enable-static ' . '--disable-shared ' . @@ -31,9 +31,9 @@ class libffi extends LinuxLibraryBase '--prefix= ' . "--libdir={$lib}" ) - ->execWithEnv('make clean') - ->execWithEnv("make -j{$this->builder->concurrency}") - ->execWithEnv("make install DESTDIR={$destdir}"); + ->exec('make clean') + ->exec("make -j{$this->builder->concurrency}") + ->exec("make install DESTDIR={$destdir}"); if (is_file(BUILD_ROOT_PATH . '/lib64/libffi.a')) { copy(BUILD_ROOT_PATH . '/lib64/libffi.a', BUILD_ROOT_PATH . '/lib/libffi.a'); diff --git a/src/SPC/builder/linux/library/libpng.php b/src/SPC/builder/linux/library/libpng.php index 56daee55..fc8c8099 100644 --- a/src/SPC/builder/linux/library/libpng.php +++ b/src/SPC/builder/linux/library/libpng.php @@ -41,15 +41,10 @@ class libpng extends LinuxLibraryBase 'aarch64' => '--enable-arm-neon ', default => '', }; - shell()->cd($this->source_dir) + shell()->cd($this->source_dir)->initLibBuildEnv($this) ->exec('chmod +x ./configure') ->exec('chmod +x ./install-sh') - ->setEnv([ - 'CFLAGS' => trim($this->getLibExtraCFlags() . ' ' . $this->builder->arch_c_flags), - 'LDFLAGS' => $this->getLibExtraLdFlags(), - 'LIBS' => $this->getLibExtraLibs(), - ]) - ->execWithEnv( + ->exec( 'LDFLAGS="-L' . BUILD_LIB_PATH . '" ' . './configure ' . '--disable-shared ' . @@ -59,9 +54,9 @@ class libpng extends LinuxLibraryBase $optimizations . '--prefix=' ) - ->execWithEnv('make clean') - ->execWithEnv("make -j{$this->builder->concurrency} DEFAULT_INCLUDES='-I{$this->source_dir} -I" . BUILD_INCLUDE_PATH . "' LIBS= libpng16.la") - ->execWithEnv('make install-libLTLIBRARIES install-data-am DESTDIR=' . BUILD_ROOT_PATH); + ->exec('make clean') + ->exec("make -j{$this->builder->concurrency} DEFAULT_INCLUDES='-I{$this->source_dir} -I" . BUILD_INCLUDE_PATH . "' LIBS= libpng16.la") + ->exec('make install-libLTLIBRARIES install-data-am DESTDIR=' . BUILD_ROOT_PATH); $this->patchPkgconfPrefix(['libpng16.pc'], PKGCONF_PATCH_PREFIX); $this->cleanLaFiles(); } diff --git a/src/SPC/builder/linux/library/openssl.php b/src/SPC/builder/linux/library/openssl.php index d57265dd..576396e6 100644 --- a/src/SPC/builder/linux/library/openssl.php +++ b/src/SPC/builder/linux/library/openssl.php @@ -64,9 +64,8 @@ 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()]) - ->execWithEnv( + shell()->cd($this->source_dir)->initLibBuildEnv($this) + ->exec( "{$env} ./Configure no-shared {$extra} " . '--prefix=/ ' . '--libdir=lib ' . @@ -76,7 +75,7 @@ class openssl extends LinuxLibraryBase "linux-{$arch}{$clang_postfix}" ) ->exec('make clean') - ->execWithEnv("make -j{$this->builder->concurrency} CNF_EX_LIBS=\"{$ex_lib}\"") + ->exec("make -j{$this->builder->concurrency} CNF_EX_LIBS=\"{$ex_lib}\"") ->exec("make install_sw DESTDIR={$destdir}"); $this->patchPkgconfPrefix(['libssl.pc', 'openssl.pc', 'libcrypto.pc']); // patch for openssl 3.3.0+ diff --git a/src/SPC/builder/macos/library/openssl.php b/src/SPC/builder/macos/library/openssl.php index e0e3919f..f4512871 100644 --- a/src/SPC/builder/macos/library/openssl.php +++ b/src/SPC/builder/macos/library/openssl.php @@ -49,8 +49,7 @@ class openssl extends MacOSLibraryBase } $arch = getenv('SPC_ARCH'); - shell()->cd($this->source_dir) - ->setEnv(['CFLAGS' => $this->getLibExtraCFlags(), 'LDFLAGS' => $this->getLibExtraLdFlags(), 'LIBS' => $this->getLibExtraLibs()]) + shell()->cd($this->source_dir)->initLibBuildEnv($this) ->exec( "./Configure no-shared {$extra} " . '--prefix=/ ' . // use prefix=/ @@ -59,7 +58,7 @@ class openssl extends MacOSLibraryBase "darwin64-{$arch}-cc" ) ->exec('make clean') - ->execWithEnv("make -j{$this->builder->concurrency} CNF_EX_LIBS=\"{$ex_lib}\"") + ->exec("make -j{$this->builder->concurrency} CNF_EX_LIBS=\"{$ex_lib}\"") ->exec("make install_sw DESTDIR={$destdir}"); $this->patchPkgconfPrefix(['libssl.pc', 'openssl.pc', 'libcrypto.pc']); // patch for openssl 3.3.0+ diff --git a/src/SPC/builder/unix/library/attr.php b/src/SPC/builder/unix/library/attr.php index ce542ddd..26278cb0 100644 --- a/src/SPC/builder/unix/library/attr.php +++ b/src/SPC/builder/unix/library/attr.php @@ -13,16 +13,12 @@ trait attr */ protected function build(): void { - shell()->cd($this->source_dir) - ->setEnv([ - 'CFLAGS' => trim('-I' . BUILD_INCLUDE_PATH . ' ' . $this->getLibExtraCFlags()), - 'LDFLAGS' => trim('-L' . BUILD_LIB_PATH . ' ' . $this->getLibExtraLdFlags()), - 'LIBS' => $this->getLibExtraLibs(), - ]) - ->execWithEnv('libtoolize --force --copy') - ->execWithEnv('./autogen.sh || autoreconf -if') - ->execWithEnv('./configure --prefix= --enable-static --disable-shared --with-pic --disable-nls') - ->execWithEnv("make -j {$this->builder->concurrency}") + shell()->cd($this->source_dir)->initLibBuildEnv($this) + ->appendEnv(['CFLAGS' => "-I{$this->getIncludeDir()}", 'LDFLAGS' => "-L{$this->getLibDir()}"]) + ->exec('libtoolize --force --copy') + ->exec('./autogen.sh || autoreconf -if') + ->exec('./configure --prefix= --enable-static --disable-shared --with-pic --disable-nls') + ->exec("make -j {$this->builder->concurrency}") ->exec('make install DESTDIR=' . BUILD_ROOT_PATH); $this->patchPkgconfPrefix(['libattr.pc'], PKGCONF_PATCH_PREFIX); diff --git a/src/SPC/builder/unix/library/bzip2.php b/src/SPC/builder/unix/library/bzip2.php index 0241fb1b..7315f4e1 100644 --- a/src/SPC/builder/unix/library/bzip2.php +++ b/src/SPC/builder/unix/library/bzip2.php @@ -16,10 +16,9 @@ trait bzip2 protected function build(): void { - shell()->cd($this->source_dir) - ->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") + shell()->cd($this->source_dir)->initLibBuildEnv($this) + ->exec("make PREFIX='" . BUILD_ROOT_PATH . "' clean") + ->exec("make -j{$this->builder->concurrency} {$this->builder->getEnvString()} PREFIX='" . BUILD_ROOT_PATH . "' libbz2.a") ->exec('cp libbz2.a ' . BUILD_LIB_PATH) ->exec('cp bzlib.h ' . BUILD_INCLUDE_PATH); } diff --git a/src/SPC/builder/unix/library/gettext.php b/src/SPC/builder/unix/library/gettext.php index 69736c36..b3800ac5 100644 --- a/src/SPC/builder/unix/library/gettext.php +++ b/src/SPC/builder/unix/library/gettext.php @@ -16,13 +16,9 @@ trait gettext $cflags = $this->builder->getOption('enable-zts') ? '-lpthread -D_REENTRANT' : ''; $ldflags = $this->builder->getOption('enable-zts') ? '-lpthread' : ''; - shell()->cd($this->source_dir) - ->setEnv([ - 'CFLAGS' => "{$this->getLibExtraCFlags()} {$cflags}", - 'LDFLAGS' => $this->getLibExtraLdFlags() ?: $ldflags, - 'LIBS' => $this->getLibExtraLibs(), - ]) - ->execWithEnv( + shell()->cd($this->source_dir)->initLibBuildEnv($this) + ->appendEnv(['CFLAGS' => $cflags, 'LDFLAGS' => $ldflags]) + ->exec( './configure ' . '--enable-static ' . '--disable-shared ' . @@ -34,8 +30,8 @@ trait gettext '--with-libiconv-prefix=' . BUILD_ROOT_PATH . ' ' . '--prefix=' . BUILD_ROOT_PATH ) - ->execWithEnv('make clean') - ->execWithEnv("make -j{$this->builder->concurrency}") - ->execWithEnv('make install'); + ->exec('make clean') + ->exec("make -j{$this->builder->concurrency}") + ->exec('make install'); } } diff --git a/src/SPC/builder/unix/library/gmp.php b/src/SPC/builder/unix/library/gmp.php index 49b207fb..40cf71d5 100644 --- a/src/SPC/builder/unix/library/gmp.php +++ b/src/SPC/builder/unix/library/gmp.php @@ -15,15 +15,14 @@ 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()]) - ->execWithEnv( + shell()->cd($this->source_dir)->initLibBuildEnv($this) + ->exec( './configure ' . '--enable-static --disable-shared ' . '--prefix=' ) - ->execWithEnv('make clean') - ->execWithEnv("make -j{$this->builder->concurrency}") + ->exec('make clean') + ->exec("make -j{$this->builder->concurrency}") ->exec('make install DESTDIR=' . BUILD_ROOT_PATH); $this->patchPkgconfPrefix(['gmp.pc']); } diff --git a/src/SPC/builder/unix/library/imagemagick.php b/src/SPC/builder/unix/library/imagemagick.php index 56da92e5..6f39385c 100644 --- a/src/SPC/builder/unix/library/imagemagick.php +++ b/src/SPC/builder/unix/library/imagemagick.php @@ -46,14 +46,9 @@ trait imagemagick // libxml iconv patch $required_libs .= $this instanceof MacOSLibraryBase ? ('-liconv') : ''; - shell()->cd($this->source_dir) - ->setEnv([ - 'CFLAGS' => $this->getLibExtraCFlags(), - 'LDFLAGS' => $this->getLibExtraLdFlags() ?: $ldflags, - 'LIBS' => $this->getLibExtraLibs() ?: $required_libs, - 'PKG_CONFIG' => '$PKG_CONFIG --static', - ]) - ->execWithEnv( + shell()->cd($this->source_dir)->initLibBuildEnv($this) + ->appendEnv(['LDFLAGS' => $ldflags, 'LIBS' => $required_libs, 'PKG_CONFIG' => '$PKG_CONFIG --static']) + ->exec( './configure ' . '--enable-static --disable-shared ' . $extra . diff --git a/src/SPC/builder/unix/library/ldap.php b/src/SPC/builder/unix/library/ldap.php index 2831f094..0d1b1ad2 100644 --- a/src/SPC/builder/unix/library/ldap.php +++ b/src/SPC/builder/unix/library/ldap.php @@ -26,14 +26,9 @@ trait ldap $alt .= $this->builder->getLib('libsodium') ? '--with-argon2=libsodium ' : '--enable-argon2=no '; f_putenv('PKG_CONFIG=' . BUILD_ROOT_PATH . '/bin/pkg-config'); f_putenv('PKG_CONFIG_PATH=' . BUILD_LIB_PATH . '/pkgconfig'); - $ldflags = '-L' . BUILD_LIB_PATH; - shell()->cd($this->source_dir) - ->setEnv([ - 'CFLAGS' => $this->getLibExtraCFlags(), - 'LDFLAGS' => $this->getLibExtraLdFlags() ?: $ldflags, - 'LIBS' => $this->getLibExtraLibs(), - ]) - ->execWithEnv( + shell()->cd($this->source_dir)->initLibBuildEnv($this) + ->appendEnv(['LDFLAGS' => "-L{$this->getLibDir()}"]) + ->exec( $this->builder->makeAutoconfFlags(AUTOCONF_CPPFLAGS) . ' ./configure ' . '--enable-static ' . diff --git a/src/SPC/builder/unix/library/libacl.php b/src/SPC/builder/unix/library/libacl.php index 6abfbb5b..0522786f 100644 --- a/src/SPC/builder/unix/library/libacl.php +++ b/src/SPC/builder/unix/library/libacl.php @@ -29,16 +29,12 @@ trait libacl */ protected function build(): void { - shell()->cd($this->source_dir) - ->setEnv([ - 'CFLAGS' => trim('-I' . BUILD_INCLUDE_PATH . ' ' . $this->getLibExtraCFlags()), - 'LDFLAGS' => trim('-L' . BUILD_LIB_PATH . ' ' . $this->getLibExtraLdFlags()), - 'LIBS' => $this->getLibExtraLibs(), - ]) - ->execWithEnv('libtoolize --force --copy') - ->execWithEnv('./autogen.sh || autoreconf -if') - ->execWithEnv('./configure --prefix= --enable-static --disable-shared --disable-tests --disable-nls') - ->execWithEnv("make -j {$this->builder->concurrency}") + shell()->cd($this->source_dir)->initLibBuildEnv($this) + ->appendEnv(['CFLAGS' => "-I{$this->getIncludeDir()}", 'LDFLAGS' => "-L{$this->getLibDir()}"]) + ->exec('libtoolize --force --copy') + ->exec('./autogen.sh || autoreconf -if') + ->exec('./configure --prefix= --enable-static --disable-shared --disable-tests --disable-nls') + ->exec("make -j {$this->builder->concurrency}") ->exec('make install DESTDIR=' . BUILD_ROOT_PATH); $this->patchPkgconfPrefix(['libacl.pc'], PKGCONF_PATCH_PREFIX); diff --git a/src/SPC/builder/unix/library/libargon2.php b/src/SPC/builder/unix/library/libargon2.php index e91b71f0..e235f575 100644 --- a/src/SPC/builder/unix/library/libargon2.php +++ b/src/SPC/builder/unix/library/libargon2.php @@ -10,11 +10,10 @@ trait libargon2 { protected function build() { - shell()->cd($this->source_dir) - ->setEnv(['CFLAGS' => $this->getLibExtraCFlags(), 'LDFLAGS' => $this->getLibExtraLdFlags(), 'LIBS' => $this->getLibExtraLibs()]) + shell()->cd($this->source_dir)->initLibBuildEnv($this) ->exec("make PREFIX='' clean") - ->execWithEnv("make -j{$this->builder->concurrency} PREFIX=''") - ->execWithEnv("make install PREFIX='' DESTDIR=" . BUILD_ROOT_PATH); + ->exec("make -j{$this->builder->concurrency} PREFIX=''") + ->exec("make install PREFIX='' DESTDIR=" . BUILD_ROOT_PATH); $this->patchPkgconfPrefix(['libargon2.pc']); diff --git a/src/SPC/builder/unix/library/libcares.php b/src/SPC/builder/unix/library/libcares.php index d99cc685..3acd9814 100644 --- a/src/SPC/builder/unix/library/libcares.php +++ b/src/SPC/builder/unix/library/libcares.php @@ -24,11 +24,10 @@ trait libcares */ protected function build(): void { - shell()->cd($this->source_dir) - ->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); + shell()->cd($this->source_dir)->initLibBuildEnv($this) + ->exec('./configure --prefix= --enable-static --disable-shared --disable-tests --with-pic') + ->exec("make -j {$this->builder->concurrency}") + ->exec('make install DESTDIR=' . BUILD_ROOT_PATH); $this->patchPkgconfPrefix(['libcares.pc'], PKGCONF_PATCH_PREFIX); } diff --git a/src/SPC/builder/unix/library/libiconv.php b/src/SPC/builder/unix/library/libiconv.php index a587c472..6037d5d0 100644 --- a/src/SPC/builder/unix/library/libiconv.php +++ b/src/SPC/builder/unix/library/libiconv.php @@ -10,18 +10,17 @@ trait libiconv { [,,$destdir] = SEPARATED_PATH; - shell()->cd($this->source_dir) - ->setEnv(['CFLAGS' => $this->getLibExtraCFlags(), 'LDFLAGS' => $this->getLibExtraLdFlags(), 'LIBS' => $this->getLibExtraLibs()]) - ->execWithEnv( + shell()->cd($this->source_dir)->initLibBuildEnv($this) + ->exec( './configure ' . '--enable-static ' . '--disable-shared ' . '--enable-extra-encodings ' . '--prefix=' ) - ->execWithEnv('make clean') - ->execWithEnv("make -j{$this->builder->concurrency}") - ->execWithEnv('make install DESTDIR=' . $destdir); + ->exec('make clean') + ->exec("make -j{$this->builder->concurrency}") + ->exec('make install DESTDIR=' . $destdir); if (file_exists(BUILD_BIN_PATH . '/iconv')) { unlink(BUILD_BIN_PATH . '/iconv'); diff --git a/src/SPC/builder/unix/library/liblz4.php b/src/SPC/builder/unix/library/liblz4.php index 45e803bf..d5283cbe 100644 --- a/src/SPC/builder/unix/library/liblz4.php +++ b/src/SPC/builder/unix/library/liblz4.php @@ -17,11 +17,10 @@ trait liblz4 protected function build(): void { - shell()->cd($this->source_dir) - ->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); + shell()->cd($this->source_dir)->initLibBuildEnv($this) + ->exec("make PREFIX='' clean") + ->exec("make -j{$this->builder->concurrency} PREFIX=''") + ->exec("make install PREFIX='' DESTDIR=" . BUILD_ROOT_PATH); $this->patchPkgconfPrefix(['liblz4.pc']); diff --git a/src/SPC/builder/unix/library/libtiff.php b/src/SPC/builder/unix/library/libtiff.php index 5d2cb4c1..5561adcb 100644 --- a/src/SPC/builder/unix/library/libtiff.php +++ b/src/SPC/builder/unix/library/libtiff.php @@ -22,9 +22,8 @@ trait libtiff // We disabled lzma, zstd, webp, libdeflate by default to reduce the size of the binary $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()]) - ->execWithEnv( + $shell = shell()->cd($this->source_dir)->initLibBuildEnv($this) + ->exec( './configure ' . '--enable-static --disable-shared ' . "{$extra_libs} " . @@ -34,12 +33,12 @@ trait libtiff // TODO: Remove this check when https://gitlab.com/libtiff/libtiff/-/merge_requests/635 will be merged and released if (file_exists($this->source_dir . '/html')) { - $shell->execWithEnv('make clean'); + $shell->exec('make clean'); } $shell - ->execWithEnv("make -j{$this->builder->concurrency}") - ->execWithEnv('make install DESTDIR=' . BUILD_ROOT_PATH); + ->exec("make -j{$this->builder->concurrency}") + ->exec('make install DESTDIR=' . BUILD_ROOT_PATH); $this->patchPkgconfPrefix(['libtiff-4.pc']); } } diff --git a/src/SPC/builder/unix/library/libxslt.php b/src/SPC/builder/unix/library/libxslt.php index 799c87c2..f0d2592f 100644 --- a/src/SPC/builder/unix/library/libxslt.php +++ b/src/SPC/builder/unix/library/libxslt.php @@ -24,13 +24,13 @@ trait libxslt $required_libs .= ' ' . $dep->getStaticLibFiles(); } } - shell()->cd($this->source_dir) - ->setEnv([ - 'CFLAGS' => trim($this->getLibExtraCFlags() . ' -I' . BUILD_INCLUDE_PATH), - 'LDFLAGS' => trim($this->getLibExtraLdFlags() . ' -L' . BUILD_LIB_PATH), - 'LIBS' => trim($this->getLibExtraLibs() . "{$required_libs} -lstdc++"), + shell()->cd($this->source_dir)->initLibBuildEnv($this) + ->appendEnv([ + 'CFLAGS' => "-I{$this->getIncludeDir()}", + 'LDFLAGS' => "-L{$this->getLibDir()}", + 'LIBS' => "{$required_libs} -lstdc++", ]) - ->execWithEnv( + ->exec( "{$this->builder->getOption('library_path')} " . "{$this->builder->getOption('ld_library_path')} " . './configure ' . @@ -43,9 +43,9 @@ trait libxslt '--with-libxml-prefix=' . escapeshellarg(BUILD_ROOT_PATH) . ' ' . '--prefix=' ) - ->execWithEnv('make clean') - ->execWithEnv("make -j{$this->builder->concurrency}") - ->execWithEnv('make install DESTDIR=' . escapeshellarg(BUILD_ROOT_PATH)); + ->exec('make clean') + ->exec("make -j{$this->builder->concurrency}") + ->exec('make install DESTDIR=' . escapeshellarg(BUILD_ROOT_PATH)); $this->patchPkgconfPrefix(['libexslt.pc']); } } diff --git a/src/SPC/builder/unix/library/ncurses.php b/src/SPC/builder/unix/library/ncurses.php index a44ac175..42b4f2d3 100644 --- a/src/SPC/builder/unix/library/ncurses.php +++ b/src/SPC/builder/unix/library/ncurses.php @@ -11,9 +11,8 @@ trait ncurses protected function build(): void { $filelist = FileSystem::scanDirFiles(BUILD_BIN_PATH, relative: true); - shell()->cd($this->source_dir) - ->setEnv(['CFLAGS' => $this->getLibExtraCFlags(), 'LDFLAGS' => $this->getLibExtraLdFlags(), 'LIBS' => $this->getLibExtraLibs()]) - ->execWithEnv( + shell()->cd($this->source_dir)->initLibBuildEnv($this) + ->exec( './configure ' . '--enable-static ' . '--disable-shared ' . @@ -33,9 +32,9 @@ trait ncurses '--libdir=' . BUILD_ROOT_PATH . '/lib ' . '--prefix=' . BUILD_ROOT_PATH ) - ->execWithEnv('make clean') - ->execWithEnv("make -j{$this->builder->concurrency}") - ->execWithEnv('make install'); + ->exec('make clean') + ->exec("make -j{$this->builder->concurrency}") + ->exec('make install'); $final = FileSystem::scanDirFiles(BUILD_BIN_PATH, relative: true); // Remove the new files diff --git a/src/SPC/builder/unix/library/nghttp2.php b/src/SPC/builder/unix/library/nghttp2.php index 202b2959..d8f4dc29 100644 --- a/src/SPC/builder/unix/library/nghttp2.php +++ b/src/SPC/builder/unix/library/nghttp2.php @@ -40,9 +40,8 @@ trait nghttp2 [,,$destdir] = SEPARATED_PATH; - shell()->cd($this->source_dir) - ->setEnv(['CFLAGS' => $this->getLibExtraCFlags(), 'LDFLAGS' => $this->getLibExtraLdFlags(), 'LIBS' => $this->getLibExtraLibs()]) - ->execWithEnv( + shell()->cd($this->source_dir)->initLibBuildEnv($this) + ->exec( './configure ' . '--enable-static ' . '--disable-shared ' . @@ -51,9 +50,9 @@ trait nghttp2 $args . ' ' . '--prefix=' ) - ->execWithEnv('make clean') - ->execWithEnv("make -j{$this->builder->concurrency}") - ->execWithEnv("make install DESTDIR={$destdir}"); + ->exec('make clean') + ->exec("make -j{$this->builder->concurrency}") + ->exec("make install DESTDIR={$destdir}"); $this->patchPkgconfPrefix(['libnghttp2.pc']); } } diff --git a/src/SPC/builder/unix/library/nghttp3.php b/src/SPC/builder/unix/library/nghttp3.php index 03d4d481..4c1c8284 100644 --- a/src/SPC/builder/unix/library/nghttp3.php +++ b/src/SPC/builder/unix/library/nghttp3.php @@ -15,13 +15,8 @@ trait nghttp3 */ protected function build(): void { - shell()->cd($this->source_dir) - ->setEnv([ - 'CFLAGS' => $this->getLibExtraCFlags(), - 'LDFLAGS' => $this->getLibExtraLdFlags(), - 'LIBS' => $this->getLibExtraLibs(), - ]) - ->execWithEnv( + shell()->cd($this->source_dir)->initLibBuildEnv($this) + ->exec( './configure ' . '--enable-static ' . '--disable-shared ' . @@ -29,9 +24,9 @@ trait nghttp3 '--enable-lib-only ' . '--prefix=' ) - ->execWithEnv('make clean') - ->execWithEnv("make -j{$this->builder->concurrency}") - ->execWithEnv('make install DESTDIR=' . BUILD_ROOT_PATH); + ->exec('make clean') + ->exec("make -j{$this->builder->concurrency}") + ->exec('make install DESTDIR=' . BUILD_ROOT_PATH); $this->patchPkgconfPrefix(['libnghttp3.pc']); } } diff --git a/src/SPC/builder/unix/library/ngtcp2.php b/src/SPC/builder/unix/library/ngtcp2.php index 8ea280a8..66ba1306 100644 --- a/src/SPC/builder/unix/library/ngtcp2.php +++ b/src/SPC/builder/unix/library/ngtcp2.php @@ -30,13 +30,8 @@ trait ngtcp2 $args .= ' --with-libbrotlienc=yes LIBBROTLIENC_CFLAGS="-I' . BUILD_ROOT_PATH . '/include" LIBBROTLIENC_LIBS="' . $brotli->getStaticLibFiles() . '"'; } - shell()->cd($this->source_dir) - ->setEnv([ - 'CFLAGS' => $this->getLibExtraCFlags(), - 'LDFLAGS' => $this->getLibExtraLdFlags(), - 'LIBS' => $this->getLibExtraLibs(), - ]) - ->execWithEnv( + shell()->cd($this->source_dir)->initLibBuildEnv($this) + ->exec( './configure ' . '--enable-static ' . '--disable-shared ' . @@ -45,9 +40,9 @@ trait ngtcp2 $args . ' ' . '--prefix=' ) - ->execWithEnv('make clean') - ->execWithEnv("make -j{$this->builder->concurrency}") - ->execWithEnv('make install DESTDIR=' . BUILD_ROOT_PATH); + ->exec('make clean') + ->exec("make -j{$this->builder->concurrency}") + ->exec('make install DESTDIR=' . BUILD_ROOT_PATH); $this->patchPkgconfPrefix(['libngtcp2.pc', 'libngtcp2_crypto_ossl.pc']); // on macOS, the static library may contain other static libraries? diff --git a/src/SPC/builder/unix/library/onig.php b/src/SPC/builder/unix/library/onig.php index 60ea84fa..380e05b2 100644 --- a/src/SPC/builder/unix/library/onig.php +++ b/src/SPC/builder/unix/library/onig.php @@ -17,11 +17,10 @@ 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()]) - ->execWithEnv('./configure --enable-static --disable-shared --prefix=') - ->execWithEnv('make clean') - ->execWithEnv("make -j{$this->builder->concurrency}") + shell()->cd($this->source_dir)->initLibBuildEnv($this) + ->exec('./configure --enable-static --disable-shared --prefix=') + ->exec('make clean') + ->exec("make -j{$this->builder->concurrency}") ->exec("make install DESTDIR={$destdir}"); $this->patchPkgconfPrefix(['oniguruma.pc']); } diff --git a/src/SPC/builder/unix/library/pkgconfig.php b/src/SPC/builder/unix/library/pkgconfig.php index b489bbba..5fc89113 100644 --- a/src/SPC/builder/unix/library/pkgconfig.php +++ b/src/SPC/builder/unix/library/pkgconfig.php @@ -13,9 +13,9 @@ trait pkgconfig $cflags = PHP_OS_FAMILY !== 'Linux' ? "{$this->builder->arch_c_flags} -Wimplicit-function-declaration -Wno-int-conversion" : ''; $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()]) - ->execWithEnv( + shell()->cd($this->source_dir)->initLibBuildEnv($this) + ->appendEnv(['CFLAGS' => $cflags, 'LDFLAGS' => $ldflags]) + ->exec( './configure ' . '--disable-shared ' . '--enable-static ' . @@ -29,8 +29,8 @@ trait pkgconfig '--without-pc-path' ) ->exec('make clean') - ->execWithEnv("make -j{$this->builder->concurrency}") - ->execWithEnv('make install-exec'); + ->exec("make -j{$this->builder->concurrency}") + ->exec('make install-exec'); shell()->exec('strip ' . BUILD_ROOT_PATH . '/bin/pkg-config'); } } diff --git a/src/SPC/builder/unix/library/readline.php b/src/SPC/builder/unix/library/readline.php index d0369c1a..a7339d60 100644 --- a/src/SPC/builder/unix/library/readline.php +++ b/src/SPC/builder/unix/library/readline.php @@ -15,9 +15,8 @@ trait readline */ protected function build(): void { - shell()->cd($this->source_dir) - ->setEnv(['CFLAGS' => $this->getLibExtraCFlags(), 'LDFLAGS' => $this->getLibExtraLdFlags(), 'LIBS' => $this->getLibExtraLibs()]) - ->execWithEnv( + shell()->cd($this->source_dir)->initLibBuildEnv($this) + ->exec( './configure ' . '--enable-static=yes ' . '--enable-shared=no ' . @@ -25,9 +24,9 @@ trait readline '--with-curses ' . '--enable-multibyte=yes' ) - ->execWithEnv('make clean') - ->execWithEnv("make -j{$this->builder->concurrency}") - ->execWithEnv('make install DESTDIR=' . BUILD_ROOT_PATH); + ->exec('make clean') + ->exec("make -j{$this->builder->concurrency}") + ->exec('make install DESTDIR=' . BUILD_ROOT_PATH); $this->patchPkgconfPrefix(['readline.pc']); } } diff --git a/src/SPC/builder/unix/library/sqlite.php b/src/SPC/builder/unix/library/sqlite.php index ee814702..42e23679 100644 --- a/src/SPC/builder/unix/library/sqlite.php +++ b/src/SPC/builder/unix/library/sqlite.php @@ -8,12 +8,11 @@ trait sqlite { protected function build(): void { - shell()->cd($this->source_dir) - ->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}") - ->execWithEnv('make install DESTDIR=' . BUILD_ROOT_PATH); + shell()->cd($this->source_dir)->initLibBuildEnv($this) + ->exec('./configure --enable-static --disable-shared --prefix=') + ->exec('make clean') + ->exec("make -j{$this->builder->concurrency}") + ->exec('make install DESTDIR=' . BUILD_ROOT_PATH); $this->patchPkgconfPrefix(['sqlite3.pc']); } } diff --git a/src/SPC/builder/unix/library/zlib.php b/src/SPC/builder/unix/library/zlib.php index f764de91..f2490a6c 100644 --- a/src/SPC/builder/unix/library/zlib.php +++ b/src/SPC/builder/unix/library/zlib.php @@ -17,12 +17,11 @@ trait zlib { [,,$destdir] = SEPARATED_PATH; - shell()->cd($this->source_dir) - ->setEnv(['CFLAGS' => $this->getLibExtraCFlags(), 'LDFLAGS' => $this->getLibExtraLdFlags(), 'LIBS' => $this->getLibExtraLibs()]) - ->execWithEnv('./configure --static --prefix=') - ->execWithEnv('make clean') - ->execWithEnv("make -j{$this->builder->concurrency}") - ->execWithEnv("make install DESTDIR={$destdir}"); + shell()->cd($this->source_dir)->initLibBuildEnv($this) + ->exec('./configure --static --prefix=') + ->exec('make clean') + ->exec("make -j{$this->builder->concurrency}") + ->exec("make install DESTDIR={$destdir}"); $this->patchPkgconfPrefix(['zlib.pc']); } } diff --git a/src/SPC/util/UnixShell.php b/src/SPC/util/UnixShell.php index 44e97bfe..9dd779a7 100644 --- a/src/SPC/util/UnixShell.php +++ b/src/SPC/util/UnixShell.php @@ -4,6 +4,9 @@ declare(strict_types=1); namespace SPC\util; +use SPC\builder\freebsd\library\BSDLibraryBase; +use SPC\builder\linux\library\LinuxLibraryBase; +use SPC\builder\macos\library\MacOSLibraryBase; use SPC\exception\RuntimeException; use ZM\Logger\ConsoleColor; @@ -48,7 +51,41 @@ class UnixShell if (!$this->debug) { $cmd .= ' 1>/dev/null 2>&1'; } - f_passthru($cmd); + $env_str = $this->getEnvString(); + if (!empty($env_str)) { + $env_str = "{$env_str} "; + } + f_passthru("{$env_str}{$cmd}"); + return $this; + } + + /** + * Init the environment variable that common build will be used. + * + * @param BSDLibraryBase|LinuxLibraryBase|MacOSLibraryBase $library Library class + */ + public function initLibBuildEnv(BSDLibraryBase|LinuxLibraryBase|MacOSLibraryBase $library): UnixShell + { + $this->setEnv([ + 'CFLAGS' => $library->getLibExtraCFlags(), + 'LDFLAGS' => $library->getLibExtraLdFlags(), + 'LIBS' => $library->getLibExtraLibs(), + ]); + return $this; + } + + public function appendEnv(array $env): UnixShell + { + foreach ($env as $k => $v) { + if ($v === '') { + continue; + } + if (!isset($this->env[$k])) { + $this->env[$k] = $v; + } else { + $this->env[$k] = "{$v} {$this->env[$k]}"; + } + } return $this; } @@ -80,14 +117,6 @@ class UnixShell return $this; } - /** - * @throws RuntimeException - */ - public function execWithEnv(string $cmd): UnixShell - { - return $this->exec($this->getEnvString() . ' ' . $cmd); - } - private function getEnvString(): string { $str = ''; diff --git a/src/SPC/util/executor/UnixCMakeExecutor.php b/src/SPC/util/executor/UnixCMakeExecutor.php index 71319fa0..9cb0d52d 100644 --- a/src/SPC/util/executor/UnixCMakeExecutor.php +++ b/src/SPC/util/executor/UnixCMakeExecutor.php @@ -33,24 +33,17 @@ class UnixCMakeExecutor extends Executor FileSystem::resetDir($this->build_dir); } - // prepare environment variables - $env = [ - 'CFLAGS' => $this->library->getLibExtraCFlags(), - 'LDFLAGS' => $this->library->getLibExtraLdFlags(), - 'LIBS' => $this->library->getLibExtraLibs(), - ]; - // prepare shell - $shell = shell()->cd($this->build_dir)->setEnv($env); + $shell = shell()->cd($this->build_dir)->initLibBuildEnv($this->library); // config - $this->steps >= 1 && $shell->execWithEnv("cmake {$this->getConfigureArgs()} {$this->getDefaultCMakeArgs()} {$build_pos}"); + $this->steps >= 1 && $shell->exec("cmake {$this->getConfigureArgs()} {$this->getDefaultCMakeArgs()} {$build_pos}"); // make - $this->steps >= 2 && $shell->execWithEnv("cmake --build . -j {$this->library->getBuilder()->concurrency}"); + $this->steps >= 2 && $shell->exec("cmake --build . -j {$this->library->getBuilder()->concurrency}"); // install - $this->steps >= 3 && $shell->execWithEnv('make install'); + $this->steps >= 3 && $shell->exec('make install'); } /** From 0558d67240e0304b8ec5ee181e0a22ab1f86a80d Mon Sep 17 00:00:00 2001 From: crazywhalecc Date: Mon, 9 Jun 2025 11:12:34 +0800 Subject: [PATCH 2/8] Rename initBuildEnv to initializeEnv --- src/SPC/builder/linux/library/libffi.php | 2 +- src/SPC/builder/linux/library/libpng.php | 2 +- src/SPC/builder/linux/library/openssl.php | 2 +- src/SPC/builder/macos/library/openssl.php | 2 +- src/SPC/builder/unix/library/attr.php | 2 +- src/SPC/builder/unix/library/bzip2.php | 2 +- src/SPC/builder/unix/library/gettext.php | 2 +- src/SPC/builder/unix/library/gmp.php | 2 +- src/SPC/builder/unix/library/imagemagick.php | 2 +- src/SPC/builder/unix/library/ldap.php | 2 +- src/SPC/builder/unix/library/libacl.php | 2 +- src/SPC/builder/unix/library/libargon2.php | 2 +- src/SPC/builder/unix/library/libcares.php | 2 +- src/SPC/builder/unix/library/libiconv.php | 2 +- src/SPC/builder/unix/library/liblz4.php | 2 +- src/SPC/builder/unix/library/libtiff.php | 2 +- src/SPC/builder/unix/library/libxslt.php | 2 +- src/SPC/builder/unix/library/ncurses.php | 2 +- src/SPC/builder/unix/library/nghttp2.php | 2 +- src/SPC/builder/unix/library/nghttp3.php | 2 +- src/SPC/builder/unix/library/ngtcp2.php | 2 +- src/SPC/builder/unix/library/onig.php | 2 +- src/SPC/builder/unix/library/pkgconfig.php | 2 +- src/SPC/builder/unix/library/readline.php | 2 +- src/SPC/builder/unix/library/sqlite.php | 2 +- src/SPC/builder/unix/library/zlib.php | 2 +- src/SPC/util/UnixShell.php | 2 +- src/SPC/util/executor/UnixCMakeExecutor.php | 2 +- 28 files changed, 28 insertions(+), 28 deletions(-) diff --git a/src/SPC/builder/linux/library/libffi.php b/src/SPC/builder/linux/library/libffi.php index 0324f92c..e64581bc 100644 --- a/src/SPC/builder/linux/library/libffi.php +++ b/src/SPC/builder/linux/library/libffi.php @@ -21,7 +21,7 @@ class libffi extends LinuxLibraryBase $arch = getenv('SPC_ARCH'); shell()->cd($this->source_dir) - ->initLibBuildEnv($this) + ->initializeEnv($this) ->exec( './configure ' . '--enable-static ' . diff --git a/src/SPC/builder/linux/library/libpng.php b/src/SPC/builder/linux/library/libpng.php index fc8c8099..8c33ef0f 100644 --- a/src/SPC/builder/linux/library/libpng.php +++ b/src/SPC/builder/linux/library/libpng.php @@ -41,7 +41,7 @@ class libpng extends LinuxLibraryBase 'aarch64' => '--enable-arm-neon ', default => '', }; - shell()->cd($this->source_dir)->initLibBuildEnv($this) + shell()->cd($this->source_dir)->initializeEnv($this) ->exec('chmod +x ./configure') ->exec('chmod +x ./install-sh') ->exec( diff --git a/src/SPC/builder/linux/library/openssl.php b/src/SPC/builder/linux/library/openssl.php index 576396e6..11c60067 100644 --- a/src/SPC/builder/linux/library/openssl.php +++ b/src/SPC/builder/linux/library/openssl.php @@ -64,7 +64,7 @@ class openssl extends LinuxLibraryBase $clang_postfix = SystemUtil::getCCType(getenv('CC')) === 'clang' ? '-clang' : ''; - shell()->cd($this->source_dir)->initLibBuildEnv($this) + shell()->cd($this->source_dir)->initializeEnv($this) ->exec( "{$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 f4512871..d641fc1d 100644 --- a/src/SPC/builder/macos/library/openssl.php +++ b/src/SPC/builder/macos/library/openssl.php @@ -49,7 +49,7 @@ class openssl extends MacOSLibraryBase } $arch = getenv('SPC_ARCH'); - shell()->cd($this->source_dir)->initLibBuildEnv($this) + shell()->cd($this->source_dir)->initializeEnv($this) ->exec( "./Configure no-shared {$extra} " . '--prefix=/ ' . // use prefix=/ diff --git a/src/SPC/builder/unix/library/attr.php b/src/SPC/builder/unix/library/attr.php index 26278cb0..b6254720 100644 --- a/src/SPC/builder/unix/library/attr.php +++ b/src/SPC/builder/unix/library/attr.php @@ -13,7 +13,7 @@ trait attr */ protected function build(): void { - shell()->cd($this->source_dir)->initLibBuildEnv($this) + shell()->cd($this->source_dir)->initializeEnv($this) ->appendEnv(['CFLAGS' => "-I{$this->getIncludeDir()}", 'LDFLAGS' => "-L{$this->getLibDir()}"]) ->exec('libtoolize --force --copy') ->exec('./autogen.sh || autoreconf -if') diff --git a/src/SPC/builder/unix/library/bzip2.php b/src/SPC/builder/unix/library/bzip2.php index 7315f4e1..32d87270 100644 --- a/src/SPC/builder/unix/library/bzip2.php +++ b/src/SPC/builder/unix/library/bzip2.php @@ -16,7 +16,7 @@ trait bzip2 protected function build(): void { - shell()->cd($this->source_dir)->initLibBuildEnv($this) + shell()->cd($this->source_dir)->initializeEnv($this) ->exec("make PREFIX='" . BUILD_ROOT_PATH . "' clean") ->exec("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/gettext.php b/src/SPC/builder/unix/library/gettext.php index b3800ac5..75f50d1b 100644 --- a/src/SPC/builder/unix/library/gettext.php +++ b/src/SPC/builder/unix/library/gettext.php @@ -16,7 +16,7 @@ trait gettext $cflags = $this->builder->getOption('enable-zts') ? '-lpthread -D_REENTRANT' : ''; $ldflags = $this->builder->getOption('enable-zts') ? '-lpthread' : ''; - shell()->cd($this->source_dir)->initLibBuildEnv($this) + shell()->cd($this->source_dir)->initializeEnv($this) ->appendEnv(['CFLAGS' => $cflags, 'LDFLAGS' => $ldflags]) ->exec( './configure ' . diff --git a/src/SPC/builder/unix/library/gmp.php b/src/SPC/builder/unix/library/gmp.php index 40cf71d5..2f4ba1a4 100644 --- a/src/SPC/builder/unix/library/gmp.php +++ b/src/SPC/builder/unix/library/gmp.php @@ -15,7 +15,7 @@ trait gmp */ protected function build(): void { - shell()->cd($this->source_dir)->initLibBuildEnv($this) + shell()->cd($this->source_dir)->initializeEnv($this) ->exec( './configure ' . '--enable-static --disable-shared ' . diff --git a/src/SPC/builder/unix/library/imagemagick.php b/src/SPC/builder/unix/library/imagemagick.php index 6f39385c..5ace2296 100644 --- a/src/SPC/builder/unix/library/imagemagick.php +++ b/src/SPC/builder/unix/library/imagemagick.php @@ -46,7 +46,7 @@ trait imagemagick // libxml iconv patch $required_libs .= $this instanceof MacOSLibraryBase ? ('-liconv') : ''; - shell()->cd($this->source_dir)->initLibBuildEnv($this) + shell()->cd($this->source_dir)->initializeEnv($this) ->appendEnv(['LDFLAGS' => $ldflags, 'LIBS' => $required_libs, 'PKG_CONFIG' => '$PKG_CONFIG --static']) ->exec( './configure ' . diff --git a/src/SPC/builder/unix/library/ldap.php b/src/SPC/builder/unix/library/ldap.php index 0d1b1ad2..bad3a65b 100644 --- a/src/SPC/builder/unix/library/ldap.php +++ b/src/SPC/builder/unix/library/ldap.php @@ -26,7 +26,7 @@ trait ldap $alt .= $this->builder->getLib('libsodium') ? '--with-argon2=libsodium ' : '--enable-argon2=no '; f_putenv('PKG_CONFIG=' . BUILD_ROOT_PATH . '/bin/pkg-config'); f_putenv('PKG_CONFIG_PATH=' . BUILD_LIB_PATH . '/pkgconfig'); - shell()->cd($this->source_dir)->initLibBuildEnv($this) + shell()->cd($this->source_dir)->initializeEnv($this) ->appendEnv(['LDFLAGS' => "-L{$this->getLibDir()}"]) ->exec( $this->builder->makeAutoconfFlags(AUTOCONF_CPPFLAGS) . diff --git a/src/SPC/builder/unix/library/libacl.php b/src/SPC/builder/unix/library/libacl.php index 0522786f..8f61be1b 100644 --- a/src/SPC/builder/unix/library/libacl.php +++ b/src/SPC/builder/unix/library/libacl.php @@ -29,7 +29,7 @@ trait libacl */ protected function build(): void { - shell()->cd($this->source_dir)->initLibBuildEnv($this) + shell()->cd($this->source_dir)->initializeEnv($this) ->appendEnv(['CFLAGS' => "-I{$this->getIncludeDir()}", 'LDFLAGS' => "-L{$this->getLibDir()}"]) ->exec('libtoolize --force --copy') ->exec('./autogen.sh || autoreconf -if') diff --git a/src/SPC/builder/unix/library/libargon2.php b/src/SPC/builder/unix/library/libargon2.php index e235f575..4c760095 100644 --- a/src/SPC/builder/unix/library/libargon2.php +++ b/src/SPC/builder/unix/library/libargon2.php @@ -10,7 +10,7 @@ trait libargon2 { protected function build() { - shell()->cd($this->source_dir)->initLibBuildEnv($this) + shell()->cd($this->source_dir)->initializeEnv($this) ->exec("make PREFIX='' clean") ->exec("make -j{$this->builder->concurrency} PREFIX=''") ->exec("make install PREFIX='' DESTDIR=" . BUILD_ROOT_PATH); diff --git a/src/SPC/builder/unix/library/libcares.php b/src/SPC/builder/unix/library/libcares.php index 3acd9814..61683bbf 100644 --- a/src/SPC/builder/unix/library/libcares.php +++ b/src/SPC/builder/unix/library/libcares.php @@ -24,7 +24,7 @@ trait libcares */ protected function build(): void { - shell()->cd($this->source_dir)->initLibBuildEnv($this) + shell()->cd($this->source_dir)->initializeEnv($this) ->exec('./configure --prefix= --enable-static --disable-shared --disable-tests --with-pic') ->exec("make -j {$this->builder->concurrency}") ->exec('make install DESTDIR=' . BUILD_ROOT_PATH); diff --git a/src/SPC/builder/unix/library/libiconv.php b/src/SPC/builder/unix/library/libiconv.php index 6037d5d0..89c8e5bf 100644 --- a/src/SPC/builder/unix/library/libiconv.php +++ b/src/SPC/builder/unix/library/libiconv.php @@ -10,7 +10,7 @@ trait libiconv { [,,$destdir] = SEPARATED_PATH; - shell()->cd($this->source_dir)->initLibBuildEnv($this) + shell()->cd($this->source_dir)->initializeEnv($this) ->exec( './configure ' . '--enable-static ' . diff --git a/src/SPC/builder/unix/library/liblz4.php b/src/SPC/builder/unix/library/liblz4.php index d5283cbe..73108d95 100644 --- a/src/SPC/builder/unix/library/liblz4.php +++ b/src/SPC/builder/unix/library/liblz4.php @@ -17,7 +17,7 @@ trait liblz4 protected function build(): void { - shell()->cd($this->source_dir)->initLibBuildEnv($this) + shell()->cd($this->source_dir)->initializeEnv($this) ->exec("make PREFIX='' clean") ->exec("make -j{$this->builder->concurrency} PREFIX=''") ->exec("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 5561adcb..17862a79 100644 --- a/src/SPC/builder/unix/library/libtiff.php +++ b/src/SPC/builder/unix/library/libtiff.php @@ -22,7 +22,7 @@ trait libtiff // We disabled lzma, zstd, webp, libdeflate by default to reduce the size of the binary $extra_libs .= ' --disable-lzma --disable-zstd --disable-webp --disable-libdeflate'; - $shell = shell()->cd($this->source_dir)->initLibBuildEnv($this) + $shell = shell()->cd($this->source_dir)->initializeEnv($this) ->exec( './configure ' . '--enable-static --disable-shared ' . diff --git a/src/SPC/builder/unix/library/libxslt.php b/src/SPC/builder/unix/library/libxslt.php index f0d2592f..b241d715 100644 --- a/src/SPC/builder/unix/library/libxslt.php +++ b/src/SPC/builder/unix/library/libxslt.php @@ -24,7 +24,7 @@ trait libxslt $required_libs .= ' ' . $dep->getStaticLibFiles(); } } - shell()->cd($this->source_dir)->initLibBuildEnv($this) + shell()->cd($this->source_dir)->initializeEnv($this) ->appendEnv([ 'CFLAGS' => "-I{$this->getIncludeDir()}", 'LDFLAGS' => "-L{$this->getLibDir()}", diff --git a/src/SPC/builder/unix/library/ncurses.php b/src/SPC/builder/unix/library/ncurses.php index 42b4f2d3..7d33c76a 100644 --- a/src/SPC/builder/unix/library/ncurses.php +++ b/src/SPC/builder/unix/library/ncurses.php @@ -11,7 +11,7 @@ trait ncurses protected function build(): void { $filelist = FileSystem::scanDirFiles(BUILD_BIN_PATH, relative: true); - shell()->cd($this->source_dir)->initLibBuildEnv($this) + shell()->cd($this->source_dir)->initializeEnv($this) ->exec( './configure ' . '--enable-static ' . diff --git a/src/SPC/builder/unix/library/nghttp2.php b/src/SPC/builder/unix/library/nghttp2.php index d8f4dc29..03c883bf 100644 --- a/src/SPC/builder/unix/library/nghttp2.php +++ b/src/SPC/builder/unix/library/nghttp2.php @@ -40,7 +40,7 @@ trait nghttp2 [,,$destdir] = SEPARATED_PATH; - shell()->cd($this->source_dir)->initLibBuildEnv($this) + shell()->cd($this->source_dir)->initializeEnv($this) ->exec( './configure ' . '--enable-static ' . diff --git a/src/SPC/builder/unix/library/nghttp3.php b/src/SPC/builder/unix/library/nghttp3.php index 4c1c8284..95cc22bf 100644 --- a/src/SPC/builder/unix/library/nghttp3.php +++ b/src/SPC/builder/unix/library/nghttp3.php @@ -15,7 +15,7 @@ trait nghttp3 */ protected function build(): void { - shell()->cd($this->source_dir)->initLibBuildEnv($this) + shell()->cd($this->source_dir)->initializeEnv($this) ->exec( './configure ' . '--enable-static ' . diff --git a/src/SPC/builder/unix/library/ngtcp2.php b/src/SPC/builder/unix/library/ngtcp2.php index 66ba1306..97a0a8af 100644 --- a/src/SPC/builder/unix/library/ngtcp2.php +++ b/src/SPC/builder/unix/library/ngtcp2.php @@ -30,7 +30,7 @@ trait ngtcp2 $args .= ' --with-libbrotlienc=yes LIBBROTLIENC_CFLAGS="-I' . BUILD_ROOT_PATH . '/include" LIBBROTLIENC_LIBS="' . $brotli->getStaticLibFiles() . '"'; } - shell()->cd($this->source_dir)->initLibBuildEnv($this) + shell()->cd($this->source_dir)->initializeEnv($this) ->exec( './configure ' . '--enable-static ' . diff --git a/src/SPC/builder/unix/library/onig.php b/src/SPC/builder/unix/library/onig.php index 380e05b2..0ff844db 100644 --- a/src/SPC/builder/unix/library/onig.php +++ b/src/SPC/builder/unix/library/onig.php @@ -17,7 +17,7 @@ trait onig { [,,$destdir] = SEPARATED_PATH; - shell()->cd($this->source_dir)->initLibBuildEnv($this) + shell()->cd($this->source_dir)->initializeEnv($this) ->exec('./configure --enable-static --disable-shared --prefix=') ->exec('make clean') ->exec("make -j{$this->builder->concurrency}") diff --git a/src/SPC/builder/unix/library/pkgconfig.php b/src/SPC/builder/unix/library/pkgconfig.php index 5fc89113..51fa586b 100644 --- a/src/SPC/builder/unix/library/pkgconfig.php +++ b/src/SPC/builder/unix/library/pkgconfig.php @@ -13,7 +13,7 @@ trait pkgconfig $cflags = PHP_OS_FAMILY !== 'Linux' ? "{$this->builder->arch_c_flags} -Wimplicit-function-declaration -Wno-int-conversion" : ''; $ldflags = !($this instanceof LinuxLibraryBase) || getenv('SPC_LIBC') === 'glibc' ? '' : '--static'; - shell()->cd($this->source_dir)->initLibBuildEnv($this) + shell()->cd($this->source_dir)->initializeEnv($this) ->appendEnv(['CFLAGS' => $cflags, 'LDFLAGS' => $ldflags]) ->exec( './configure ' . diff --git a/src/SPC/builder/unix/library/readline.php b/src/SPC/builder/unix/library/readline.php index a7339d60..c0fe9078 100644 --- a/src/SPC/builder/unix/library/readline.php +++ b/src/SPC/builder/unix/library/readline.php @@ -15,7 +15,7 @@ trait readline */ protected function build(): void { - shell()->cd($this->source_dir)->initLibBuildEnv($this) + shell()->cd($this->source_dir)->initializeEnv($this) ->exec( './configure ' . '--enable-static=yes ' . diff --git a/src/SPC/builder/unix/library/sqlite.php b/src/SPC/builder/unix/library/sqlite.php index 42e23679..c6219171 100644 --- a/src/SPC/builder/unix/library/sqlite.php +++ b/src/SPC/builder/unix/library/sqlite.php @@ -8,7 +8,7 @@ trait sqlite { protected function build(): void { - shell()->cd($this->source_dir)->initLibBuildEnv($this) + shell()->cd($this->source_dir)->initializeEnv($this) ->exec('./configure --enable-static --disable-shared --prefix=') ->exec('make clean') ->exec("make -j{$this->builder->concurrency}") diff --git a/src/SPC/builder/unix/library/zlib.php b/src/SPC/builder/unix/library/zlib.php index f2490a6c..8accaf66 100644 --- a/src/SPC/builder/unix/library/zlib.php +++ b/src/SPC/builder/unix/library/zlib.php @@ -17,7 +17,7 @@ trait zlib { [,,$destdir] = SEPARATED_PATH; - shell()->cd($this->source_dir)->initLibBuildEnv($this) + shell()->cd($this->source_dir)->initializeEnv($this) ->exec('./configure --static --prefix=') ->exec('make clean') ->exec("make -j{$this->builder->concurrency}") diff --git a/src/SPC/util/UnixShell.php b/src/SPC/util/UnixShell.php index 9dd779a7..957d66a6 100644 --- a/src/SPC/util/UnixShell.php +++ b/src/SPC/util/UnixShell.php @@ -64,7 +64,7 @@ class UnixShell * * @param BSDLibraryBase|LinuxLibraryBase|MacOSLibraryBase $library Library class */ - public function initLibBuildEnv(BSDLibraryBase|LinuxLibraryBase|MacOSLibraryBase $library): UnixShell + public function initializeEnv(BSDLibraryBase|LinuxLibraryBase|MacOSLibraryBase $library): UnixShell { $this->setEnv([ 'CFLAGS' => $library->getLibExtraCFlags(), diff --git a/src/SPC/util/executor/UnixCMakeExecutor.php b/src/SPC/util/executor/UnixCMakeExecutor.php index 9cb0d52d..ed9331e6 100644 --- a/src/SPC/util/executor/UnixCMakeExecutor.php +++ b/src/SPC/util/executor/UnixCMakeExecutor.php @@ -34,7 +34,7 @@ class UnixCMakeExecutor extends Executor } // prepare shell - $shell = shell()->cd($this->build_dir)->initLibBuildEnv($this->library); + $shell = shell()->cd($this->build_dir)->initializeEnv($this->library); // config $this->steps >= 1 && $shell->exec("cmake {$this->getConfigureArgs()} {$this->getDefaultCMakeArgs()} {$build_pos}"); From 1c1f7b19dd8ce933354e46084f80e23e2f94424a Mon Sep 17 00:00:00 2001 From: crazywhalecc Date: Mon, 9 Jun 2025 11:13:54 +0800 Subject: [PATCH 3/8] Add XXX_CXXFLAGS for common build --- src/SPC/builder/traits/UnixLibraryTrait.php | 9 +++++++++ src/SPC/util/UnixShell.php | 1 + 2 files changed, 10 insertions(+) diff --git a/src/SPC/builder/traits/UnixLibraryTrait.php b/src/SPC/builder/traits/UnixLibraryTrait.php index 8e69f6d3..f302bbfa 100644 --- a/src/SPC/builder/traits/UnixLibraryTrait.php +++ b/src/SPC/builder/traits/UnixLibraryTrait.php @@ -118,4 +118,13 @@ trait UnixLibraryTrait { return getenv($this->getSnakeCaseName() . '_LIBS') ?: ''; } + + public function getLibExtraCXXFlags(): string + { + $env = getenv($this->getSnakeCaseName() . '_CXXFLAGS') ?: ''; + if (!str_contains($env, $this->builder->arch_cxx_flags)) { + $env .= $this->builder->arch_cxx_flags; + } + return $env; + } } diff --git a/src/SPC/util/UnixShell.php b/src/SPC/util/UnixShell.php index 957d66a6..be80cb4c 100644 --- a/src/SPC/util/UnixShell.php +++ b/src/SPC/util/UnixShell.php @@ -70,6 +70,7 @@ class UnixShell 'CFLAGS' => $library->getLibExtraCFlags(), 'LDFLAGS' => $library->getLibExtraLdFlags(), 'LIBS' => $library->getLibExtraLibs(), + 'CXXFLAGS' => $library->getLibExtraCXXFlags(), ]); return $this; } From 936c4d8696476f6463a19d6663d1daf74d5973e6 Mon Sep 17 00:00:00 2001 From: crazywhalecc Date: Mon, 9 Jun 2025 12:12:22 +0800 Subject: [PATCH 4/8] Change env string inject order --- src/SPC/util/UnixShell.php | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/SPC/util/UnixShell.php b/src/SPC/util/UnixShell.php index be80cb4c..a53f423d 100644 --- a/src/SPC/util/UnixShell.php +++ b/src/SPC/util/UnixShell.php @@ -45,17 +45,17 @@ class UnixShell /* @phpstan-ignore-next-line */ logger()->info(ConsoleColor::yellow('[EXEC] ') . ConsoleColor::green($cmd)); logger()->debug('Executed at: ' . debug_backtrace()[0]['file'] . ':' . debug_backtrace()[0]['line']); + $env_str = $this->getEnvString(); + if (!empty($env_str)) { + $cmd = "{$env_str} {$cmd}"; + } if ($this->cd !== null) { $cmd = 'cd ' . escapeshellarg($this->cd) . ' && ' . $cmd; } if (!$this->debug) { $cmd .= ' 1>/dev/null 2>&1'; } - $env_str = $this->getEnvString(); - if (!empty($env_str)) { - $env_str = "{$env_str} "; - } - f_passthru("{$env_str}{$cmd}"); + f_passthru($cmd); return $this; } From 0ca71b62db421d2d12d891aa26ab4f4c80d5fa50 Mon Sep 17 00:00:00 2001 From: crazywhalecc Date: Mon, 9 Jun 2025 12:13:14 +0800 Subject: [PATCH 5/8] Fix gitignore --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 814b9020..8c6b75ac 100644 --- a/.gitignore +++ b/.gitignore @@ -11,7 +11,7 @@ docker/source/ /source/ # default source download directory -/downloads/ +/downloads/* # default source build root directory /buildroot/ From e6c9a82cd3978804557d8f4ec4fb0d085a02c04e Mon Sep 17 00:00:00 2001 From: crazywhalecc Date: Mon, 9 Jun 2025 12:14:25 +0800 Subject: [PATCH 6/8] Fix gitignore --- .gitignore | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/.gitignore b/.gitignore index 8c6b75ac..7f5ea9b7 100644 --- a/.gitignore +++ b/.gitignore @@ -5,22 +5,22 @@ docker/extensions/ docker/source/ # Vendor files -/vendor/ +/vendor/** # default source extract directory -/source/ +/source/** # default source download directory -/downloads/* +/downloads/** # default source build root directory -/buildroot/ +/buildroot/** # default package root directory -/pkgroot/ +/pkgroot/** # default pack:lib and release directory -/dist/ +/dist/** packlib_files.txt # tools cache files From 48df491c317d9b5cd0feb50b141082798120ad22 Mon Sep 17 00:00:00 2001 From: crazywhalecc Date: Mon, 9 Jun 2025 13:00:43 +0800 Subject: [PATCH 7/8] Fix brotli build on macOS --- src/SPC/builder/unix/library/brotli.php | 1 + 1 file changed, 1 insertion(+) diff --git a/src/SPC/builder/unix/library/brotli.php b/src/SPC/builder/unix/library/brotli.php index 7f5f4dbb..34a10086 100644 --- a/src/SPC/builder/unix/library/brotli.php +++ b/src/SPC/builder/unix/library/brotli.php @@ -19,6 +19,7 @@ trait brotli { UnixCMakeExecutor::create($this) ->setBuildDir("{$this->getSourceDir()}/build-dir") + ->addConfigureArgs("-DSHARE_INSTALL_PREFIX={$this->getBuildRootPath()}") ->build(); $this->patchPkgconfPrefix(['libbrotlicommon.pc', 'libbrotlidec.pc', 'libbrotlienc.pc']); From 13540c8008758ce637fd32eed3da354ba9239c36 Mon Sep 17 00:00:00 2001 From: crazywhalecc Date: Mon, 9 Jun 2025 13:08:28 +0800 Subject: [PATCH 8/8] Remove shared tidy --- src/SPC/builder/unix/library/tidy.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/SPC/builder/unix/library/tidy.php b/src/SPC/builder/unix/library/tidy.php index 1d05a060..d842dc6d 100644 --- a/src/SPC/builder/unix/library/tidy.php +++ b/src/SPC/builder/unix/library/tidy.php @@ -18,7 +18,10 @@ trait tidy { UnixCMakeExecutor::create($this) ->setBuildDir("{$this->source_dir}/build-dir") - ->addConfigureArgs('-DSUPPORT_CONSOLE_APP=OFF') + ->addConfigureArgs( + '-DSUPPORT_CONSOLE_APP=OFF', + '-DBUILD_SHARED_LIB=OFF' + ) ->build(); $this->patchPkgconfPrefix(['tidy.pc']); }