diff --git a/config/env.ini b/config/env.ini index a16bc160..0a7ca087 100644 --- a/config/env.ini +++ b/config/env.ini @@ -79,6 +79,7 @@ SPC_MICRO_PATCHES=static_extensions_win32,cli_checks,disable_huge_page,vcruntime SPC_LIBC=musl ; uncomment to link libc dynamically on musl ; SPC_MUSL_DYNAMIC=true +SPC_STATIC_LIBS=true ; Recommended: specify your target here. Zig toolchain will be used. ; examples: @@ -97,7 +98,7 @@ LD=${SPC_LINUX_DEFAULT_LD} ; default compiler flags, used in CMake toolchain file, openssl and pkg-config build SPC_DEFAULT_C_FLAGS="-fPIC -Os" SPC_DEFAULT_CXX_FLAGS="-fPIC -Os" -SPC_DEFAULT_LD_FLAGS="" +SPC_DEFAULT_LD_FLAGS="-Wl,--as-needed" ; upx executable path UPX_EXEC=${PKG_ROOT_PATH}/bin/upx ; phpmicro patches, for more info, see: https://github.com/easysoft/phpmicro/tree/master/patches @@ -115,7 +116,7 @@ SPC_CMD_VAR_PHP_EMBED_TYPE="static" ; EXTRA_CFLAGS for `configure` and `make` php SPC_CMD_VAR_PHP_MAKE_EXTRA_CFLAGS="-g -fstack-protector-strong -fno-ident -fPIE ${SPC_DEFAULT_C_FLAGS}" ; EXTRA_LDFLAGS for `make` php, can use -release to set a soname for libphp.so -SPC_CMD_VAR_PHP_MAKE_EXTRA_LDFLAGS="" +SPC_CMD_VAR_PHP_MAKE_EXTRA_LDFLAGS="-Wl,--as-needed" ; optional, path to openssl conf. This affects where openssl will look for the default CA. ; default on Debian/Alpine: /etc/ssl, default on RHEL: /etc/pki/tls diff --git a/config/lib.json b/config/lib.json index ebbf4b87..c326c6cf 100644 --- a/config/lib.json +++ b/config/lib.json @@ -862,17 +862,13 @@ }, "openssl": { "source": "openssl", - "static-libs-unix": [ - "libssl.a", - "libcrypto.a" + "pkg-configs": [ + "openssl" ], "static-libs-windows": [ "libssl.lib", "libcrypto.lib" ], - "headers": [ - "openssl" - ], "lib-depends": [ "zlib" ] @@ -974,10 +970,10 @@ }, "unixodbc": { "source": "unixodbc", - "static-libs-unix": [ - "libodbc.a", - "libodbccr.a", - "libodbcinst.a" + "pkg-configs": [ + "odbc", + "odbccr", + "odbcinst" ], "lib-depends": [ "libiconv" diff --git a/src/SPC/builder/freebsd/library/openssl.php b/src/SPC/builder/freebsd/library/openssl.php index 6c60b7d8..f870eba5 100644 --- a/src/SPC/builder/freebsd/library/openssl.php +++ b/src/SPC/builder/freebsd/library/openssl.php @@ -42,8 +42,9 @@ class openssl extends BSDLibraryBase shell()->cd($this->source_dir)->initializeEnv($this) ->exec( - "./Configure no-shared {$extra} " . - '--prefix=/ ' . // use prefix=/ + "./Configure " . + (getenv('SPC_STATIC_LIBS') ? 'no-shared' : '') . + " {$extra} " . '--prefix=/ ' . // use prefix=/ "--libdir={$lib} " . '--openssldir=/etc/ssl ' . 'BSD-' . arch2gnu($this->builder->getOption('arch')) diff --git a/src/SPC/builder/linux/LinuxBuilder.php b/src/SPC/builder/linux/LinuxBuilder.php index 004c37de..a4fab7e6 100644 --- a/src/SPC/builder/linux/LinuxBuilder.php +++ b/src/SPC/builder/linux/LinuxBuilder.php @@ -316,7 +316,7 @@ class LinuxBuilder extends UnixBuilderBase */ private function getMakeExtraVars(): array { - $config = (new SPCConfigUtil($this, ['libs_only_deps' => true, 'absolute_libs' => true]))->config($this->ext_list, $this->lib_list, $this->getOption('with-suggested-exts'), $this->getOption('with-suggested-libs')); + $config = (new SPCConfigUtil($this, ['libs_only_deps' => true]))->config($this->ext_list, $this->lib_list, $this->getOption('with-suggested-exts'), $this->getOption('with-suggested-libs')); $static = SPCTarget::isStatic() ? '-all-static' : ''; $lib = BUILD_LIB_PATH; return array_filter([ diff --git a/src/SPC/builder/linux/library/openssl.php b/src/SPC/builder/linux/library/openssl.php index bfc3936b..cb4639f3 100644 --- a/src/SPC/builder/linux/library/openssl.php +++ b/src/SPC/builder/linux/library/openssl.php @@ -59,8 +59,9 @@ class openssl extends LinuxLibraryBase shell()->cd($this->source_dir)->initializeEnv($this) ->exec( - "{$env} ./Configure no-shared {$extra} " . - '--prefix=' . BUILD_ROOT_PATH . ' ' . + "./Configure " . + (getenv('SPC_STATIC_LIBS') ? 'no-shared' : '') . + " {$extra} " . '--prefix=' . BUILD_ROOT_PATH . ' ' . '--libdir=' . BUILD_LIB_PATH . ' ' . "--openssldir={$openssl_dir} " . "{$zlib_extra}" . diff --git a/src/SPC/builder/macos/library/openssl.php b/src/SPC/builder/macos/library/openssl.php index 284083e2..0280c46e 100644 --- a/src/SPC/builder/macos/library/openssl.php +++ b/src/SPC/builder/macos/library/openssl.php @@ -43,7 +43,9 @@ class openssl extends MacOSLibraryBase shell()->cd($this->source_dir)->initializeEnv($this) ->exec( - "./Configure no-shared {$extra} " . + "./Configure " . + (getenv('SPC_STATIC_LIBS') ? 'no-shared' : '') . + " {$extra} " . '--prefix=' . BUILD_ROOT_PATH . ' ' . // use prefix=/ '--libdir=lib ' . '--openssldir=/etc/ssl ' . diff --git a/src/SPC/builder/unix/library/brotli.php b/src/SPC/builder/unix/library/brotli.php index 64331a56..8f42b83f 100644 --- a/src/SPC/builder/unix/library/brotli.php +++ b/src/SPC/builder/unix/library/brotli.php @@ -20,11 +20,6 @@ trait brotli FileSystem::replaceFileLineContainsString(BUILD_LIB_PATH . '/pkgconfig/libbrotlidec.pc', 'Libs: -L${libdir} -lbrotlidec', 'Libs: -L${libdir} -lbrotlidec -lbrotlicommon'); FileSystem::replaceFileLineContainsString(BUILD_LIB_PATH . '/pkgconfig/libbrotlienc.pc', 'Libs: -L${libdir} -lbrotlienc', 'Libs: -L${libdir} -lbrotlienc -lbrotlicommon'); shell()->cd(BUILD_ROOT_PATH . '/lib')->exec('ln -sf libbrotlicommon.a libbrotli.a'); - foreach (FileSystem::scanDirFiles(BUILD_ROOT_PATH . '/lib/', false, true) as $filename) { - if (str_starts_with($filename, 'libbrotli') && (str_contains($filename, '.so') || str_ends_with($filename, '.dylib'))) { - unlink(BUILD_ROOT_PATH . '/lib/' . $filename); - } - } if (file_exists(BUILD_BIN_PATH . '/brotli')) { unlink(BUILD_BIN_PATH . '/brotli'); diff --git a/src/SPC/builder/unix/library/libargon2.php b/src/SPC/builder/unix/library/libargon2.php index 4c760095..179fbc13 100644 --- a/src/SPC/builder/unix/library/libargon2.php +++ b/src/SPC/builder/unix/library/libargon2.php @@ -17,12 +17,6 @@ trait libargon2 $this->patchPkgconfPrefix(['libargon2.pc']); - foreach (FileSystem::scanDirFiles(BUILD_ROOT_PATH . '/lib/', false, true) as $filename) { - if (str_starts_with($filename, 'libargon2') && (str_contains($filename, '.so') || str_ends_with($filename, '.dylib'))) { - unlink(BUILD_ROOT_PATH . '/lib/' . $filename); - } - } - if (file_exists(BUILD_BIN_PATH . '/argon2')) { unlink(BUILD_BIN_PATH . '/argon2'); } diff --git a/src/SPC/builder/unix/library/liblz4.php b/src/SPC/builder/unix/library/liblz4.php index 2dc2b46f..4d1ec1b9 100644 --- a/src/SPC/builder/unix/library/liblz4.php +++ b/src/SPC/builder/unix/library/liblz4.php @@ -27,11 +27,5 @@ trait liblz4 ->exec("make install PREFIX='' DESTDIR=" . BUILD_ROOT_PATH); $this->patchPkgconfPrefix(['liblz4.pc']); - - foreach (FileSystem::scanDirFiles(BUILD_ROOT_PATH . '/lib/', false, true) as $filename) { - if (str_starts_with($filename, 'liblz4') && (str_contains($filename, '.so') || str_ends_with($filename, '.dylib'))) { - unlink(BUILD_ROOT_PATH . '/lib/' . $filename); - } - } } } diff --git a/src/SPC/builder/unix/library/postgresql.php b/src/SPC/builder/unix/library/postgresql.php index 2ad4f51b..6b596bec 100644 --- a/src/SPC/builder/unix/library/postgresql.php +++ b/src/SPC/builder/unix/library/postgresql.php @@ -93,8 +93,6 @@ trait postgresql // remove dynamic libs shell()->cd($this->source_dir . '/build') - ->exec("rm -rf {$this->getBuildRootPath()}/lib/*.so.*") - ->exec("rm -rf {$this->getBuildRootPath()}/lib/*.so") ->exec("rm -rf {$this->getBuildRootPath()}/lib/*.dylib"); FileSystem::replaceFileStr("{$this->getLibDir()}/pkgconfig/libpq.pc", '-lldap', '-lldap -llber'); diff --git a/src/SPC/builder/windows/library/openssl.php b/src/SPC/builder/windows/library/openssl.php index 491a33b4..fef02f7e 100644 --- a/src/SPC/builder/windows/library/openssl.php +++ b/src/SPC/builder/windows/library/openssl.php @@ -33,7 +33,7 @@ class openssl extends WindowsLibraryBase ->execWithWrapper( $this->builder->makeSimpleWrapper($this->perl), 'Configure zlib VC-WIN64A ' . - 'no-shared ' . + (getenv('SPC_STATIC_LIBS') ? 'no-shared' : '') . '--prefix=' . quote(BUILD_ROOT_PATH) . ' ' . '--with-zlib-lib=' . quote(BUILD_LIB_PATH) . ' ' . '--with-zlib-include=' . quote(BUILD_INCLUDE_PATH) . ' ' . diff --git a/src/SPC/util/PkgConfigUtil.php b/src/SPC/util/PkgConfigUtil.php index 25e0e1f2..4b7dfc4d 100644 --- a/src/SPC/util/PkgConfigUtil.php +++ b/src/SPC/util/PkgConfigUtil.php @@ -61,8 +61,9 @@ class PkgConfigUtil */ public static function getCflags(string $pkg_config_str): string { + $static = getenv('SPC_STATIC_LIBS') ? '--static' : ''; // get other things - $result = self::execWithResult("pkg-config --static --cflags-only-other {$pkg_config_str}"); + $result = self::execWithResult("pkg-config $static --cflags-only-other {$pkg_config_str}"); return trim($result); } @@ -78,11 +79,12 @@ class PkgConfigUtil public static function getLibsArray(string $pkg_config_str): array { // Use this instead of shell() to avoid unnecessary outputs - $result = self::execWithResult("pkg-config --static --libs-only-l {$pkg_config_str}"); + $static = getenv('SPC_STATIC_LIBS') ? '--static' : ''; + $result = self::execWithResult("pkg-config $static --libs-only-l {$pkg_config_str}"); $libs = explode(' ', trim($result)); // get other things - $result = self::execWithResult("pkg-config --static --libs-only-other {$pkg_config_str}"); + $result = self::execWithResult("pkg-config $static --libs-only-other {$pkg_config_str}"); // convert libxxx.a to -L{path} -lxxx $exp = explode(' ', trim($result)); foreach ($exp as $item) { diff --git a/src/SPC/util/SPCConfigUtil.php b/src/SPC/util/SPCConfigUtil.php index 8c4fa926..4f583851 100644 --- a/src/SPC/util/SPCConfigUtil.php +++ b/src/SPC/util/SPCConfigUtil.php @@ -20,13 +20,10 @@ class SPCConfigUtil private bool $libs_only_deps; - private bool $absolute_libs; - /** * @param array{ * no_php?: bool, - * libs_only_deps?: bool, - * absolute_libs?: bool + * libs_only_deps?: bool * } $options Options pass to spc-config */ public function __construct(?BuilderBase $builder = null, array $options = []) @@ -36,7 +33,6 @@ class SPCConfigUtil } $this->no_php = $options['no_php'] ?? false; $this->libs_only_deps = $options['libs_only_deps'] ?? false; - $this->absolute_libs = $options['absolute_libs'] ?? false; } /** @@ -77,7 +73,7 @@ class SPCConfigUtil ob_get_clean(); $ldflags = $this->getLdflagsString(); $cflags = $this->getIncludesString($libraries); - $libs = $this->getLibsString($libraries, !$this->absolute_libs); + $libs = $this->getLibsString($libraries); // additional OS-specific libraries (e.g. macOS -lresolv) if ($extra_libs = SPCTarget::getRuntimeLibs()) { @@ -256,7 +252,7 @@ class SPCConfigUtil return '-L' . BUILD_LIB_PATH; } - private function getLibsString(array $libraries, bool $use_short_libs = true): string + private function getLibsString(array $libraries): string { $lib_names = []; $frameworks = []; @@ -316,8 +312,8 @@ class SPCConfigUtil if (in_array('imap', $libraries) && SPCTarget::getLibc() === 'glibc') { $lib_names[] = '-lcrypt'; } - if (!$use_short_libs) { - $lib_names = array_map(fn ($l) => $this->getFullLibName($l), $lib_names); + if (getenv('SPC_STATIC_LIBS')) { + $lib_names = array_map(fn ($l) => $this->getStaticLibname($l), $lib_names); } return implode(' ', $lib_names); } @@ -331,7 +327,7 @@ class SPCConfigUtil return '-l' . substr($lib, 3, -2); } - private function getFullLibName(string $lib) + private function getStaticLibname(string $lib) { if (!str_starts_with($lib, '-l')) { return $lib; @@ -339,7 +335,7 @@ class SPCConfigUtil $libname = substr($lib, 2); $staticLib = BUILD_LIB_PATH . '/' . "lib{$libname}.a"; if (file_exists($staticLib)) { - return $staticLib; + return "-l:lib{$libname}.a"; } return $lib; } diff --git a/src/SPC/util/executor/UnixAutoconfExecutor.php b/src/SPC/util/executor/UnixAutoconfExecutor.php index e04fe4f9..877eeb30 100644 --- a/src/SPC/util/executor/UnixAutoconfExecutor.php +++ b/src/SPC/util/executor/UnixAutoconfExecutor.php @@ -133,8 +133,8 @@ class UnixAutoconfExecutor extends Executor private function getDefaultConfigureArgs(): array { return [ - '--disable-shared', - '--enable-static', + getenv('SPC_STATIC_LIBS') ? '--disable-shared' : '--enable-shared', + getenv('SPC_STATIC_LIBS') ? '--enable-static' : '--disable-static', "--prefix={$this->library->getBuildRootPath()}", '--with-pic', '--enable-pic', diff --git a/src/SPC/util/executor/UnixCMakeExecutor.php b/src/SPC/util/executor/UnixCMakeExecutor.php index eceab901..7477499e 100644 --- a/src/SPC/util/executor/UnixCMakeExecutor.php +++ b/src/SPC/util/executor/UnixCMakeExecutor.php @@ -151,7 +151,7 @@ class UnixCMakeExecutor extends Executor '-DCMAKE_INSTALL_LIBDIR=lib', '-DCMAKE_INSTALL_INCLUDEDIR=include', '-DPOSITION_INDEPENDENT_CODE=ON', - '-DBUILD_SHARED_LIBS=OFF', + '-DBUILD_SHARED_LIBS=' . getenv('SPC_STATIC_LIBS') ? 'OFF' : 'ON', "-DCMAKE_TOOLCHAIN_FILE={$this->makeCmakeToolchainFile()}", ]); }