Compare commits

...

25 Commits

Author SHA1 Message Date
henderkes
637eadef0b phpstan 2026-03-10 08:36:30 +07:00
henderkes
3fee7deb6d force curl to absorb all k5 symbols 2026-03-10 08:36:30 +07:00
henderkes
d85f556a93 cs fix 2026-03-10 08:36:30 +07:00
henderkes
9564bae62b ld library path has to be set 2026-03-10 08:36:30 +07:00
henderkes
32678782fc cs fix 2026-03-10 08:36:30 +07:00
henderkes
1e6ddb86f2 support static-only libs 2026-03-10 08:36:30 +07:00
henderkes
fed477c81d lzma support was removed last year 2026-03-10 08:36:30 +07:00
henderkes
c3825a356b patch libxml2 for zig 2026-03-10 08:36:30 +07:00
henderkes
3d4b87b107 zig hasn't released 0.16 yet 2026-03-10 08:36:30 +07:00
henderkes
74906b89a2 libuuid fix 2026-03-10 08:36:30 +07:00
henderkes
1b2a09cb48 fix test 2026-03-10 08:36:30 +07:00
henderkes
7e9e3fb4fe fix krb5 liburing (no --enable-shared option) 2026-03-10 08:36:30 +07:00
henderkes
2511ee8a4c fix krb5 (can't do shared build with zig) 2026-03-10 08:36:30 +07:00
henderkes
17d699d4a5 fix xz shared build 2026-03-10 08:36:30 +07:00
henderkes
fa670cce4a fix pgsql shared build 2026-03-10 08:36:30 +07:00
henderkes
53385d5e2b cs fix 2026-03-10 08:36:30 +07:00
henderkes
ed1e02823a bring back setting, some libraries don't build a static version if the shared one should also be built... 2026-03-10 08:36:30 +07:00
henderkes
cc69a169a8 php-cs-fixer 2026-03-10 08:36:30 +07:00
henderkes
bae2eae2b0 bring back lib info 2026-03-10 08:36:30 +07:00
henderkes
b518237bb2 fix test 2026-03-10 08:36:30 +07:00
henderkes
17acb966de simplify 2026-03-10 08:36:30 +07:00
henderkes
101b4febb9 need to build zstd static 2026-03-10 08:36:30 +07:00
henderkes
7b8f1c4747 fixetyfix 2026-03-10 08:36:30 +07:00
henderkes
179626f989 need static libs because of lib.json 2026-03-10 08:36:30 +07:00
henderkes
cf69c02624 allow building and linking with shared instead of static libs 2026-03-10 08:36:30 +07:00
34 changed files with 166 additions and 97 deletions

View File

@@ -79,6 +79,7 @@ SPC_MICRO_PATCHES=static_extensions_win32,cli_checks,disable_huge_page,vcruntime
SPC_LIBC=musl SPC_LIBC=musl
; uncomment to link libc dynamically on musl ; uncomment to link libc dynamically on musl
; SPC_MUSL_DYNAMIC=true ; SPC_MUSL_DYNAMIC=true
SPC_LINK_STATIC=true
; Recommended: specify your target here. Zig toolchain will be used. ; Recommended: specify your target here. Zig toolchain will be used.
; examples: ; examples:
@@ -97,7 +98,7 @@ LD=${SPC_LINUX_DEFAULT_LD}
; default compiler flags, used in CMake toolchain file, openssl and pkg-config build ; default compiler flags, used in CMake toolchain file, openssl and pkg-config build
SPC_DEFAULT_C_FLAGS="-fPIC -Os" SPC_DEFAULT_C_FLAGS="-fPIC -Os"
SPC_DEFAULT_CXX_FLAGS="-fPIC -Os" SPC_DEFAULT_CXX_FLAGS="-fPIC -Os"
SPC_DEFAULT_LD_FLAGS="" SPC_DEFAULT_LD_FLAGS="-Wl,--as-needed"
; upx executable path ; upx executable path
UPX_EXEC=${PKG_ROOT_PATH}/bin/upx UPX_EXEC=${PKG_ROOT_PATH}/bin/upx
; phpmicro patches, for more info, see: https://github.com/easysoft/phpmicro/tree/master/patches ; 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 ; 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}" 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 ; 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. ; 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 ; default on Debian/Alpine: /etc/ssl, default on RHEL: /etc/pki/tls

View File

@@ -303,6 +303,9 @@
}, },
"krb5": { "krb5": {
"source": "krb5", "source": "krb5",
"target": [
"static"
],
"pkg-configs": [ "pkg-configs": [
"krb5-gssapi" "krb5-gssapi"
], ],
@@ -862,6 +865,9 @@
}, },
"openssl": { "openssl": {
"source": "openssl", "source": "openssl",
"pkg-configs": [
"openssl"
],
"static-libs-unix": [ "static-libs-unix": [
"libssl.a", "libssl.a",
"libcrypto.a" "libcrypto.a"
@@ -974,6 +980,11 @@
}, },
"unixodbc": { "unixodbc": {
"source": "unixodbc", "source": "unixodbc",
"pkg-configs": [
"odbc",
"odbccr",
"odbcinst"
],
"static-libs-unix": [ "static-libs-unix": [
"libodbc.a", "libodbc.a",
"libodbccr.a", "libodbccr.a",
@@ -1015,7 +1026,10 @@
}, },
"zlib": { "zlib": {
"source": "zlib", "source": "zlib",
"static-libs-unix": [ "pkg-configs": [
"zlib"
],
"static-libs": [
"libz.a" "libz.a"
], ],
"static-libs-windows": [ "static-libs-windows": [
@@ -1028,14 +1042,15 @@
}, },
"zstd": { "zstd": {
"source": "zstd", "source": "zstd",
"pkg-configs": [
"libzstd"
],
"static-libs-unix": [ "static-libs-unix": [
"libzstd.a" "libzstd.a"
], ],
"static-libs-windows": [ "static-libs-windows": [
[ "zstd.lib",
"zstd.lib", "zstd_static.lib"
"zstd_static.lib"
]
], ],
"headers-unix": [ "headers-unix": [
"zdict.h", "zdict.h",

View File

@@ -96,7 +96,8 @@ class Extension
fn ($x) => $x->getStaticLibFiles(), fn ($x) => $x->getStaticLibFiles(),
$this->getLibraryDependencies(recursive: true) $this->getLibraryDependencies(recursive: true)
); );
return implode(' ', $ret); $libs = implode(' ', $ret);
return deduplicate_flags($libs);
} }
/** /**

View File

@@ -365,8 +365,31 @@ abstract class LibraryBase
protected function isLibraryInstalled(): bool protected function isLibraryInstalled(): bool
{ {
$pkg_configs = Config::getLib(static::NAME, 'pkg-configs', []);
if (count($pkg_configs) !== 0) {
$pkg_config_path = getenv('PKG_CONFIG_PATH') ?: '';
$search_paths = array_unique(array_filter(explode(is_unix() ? ':' : ';', $pkg_config_path)));
foreach ($pkg_configs as $name) {
$found = false;
foreach ($search_paths as $path) {
if (file_exists($path . "/{$name}.pc")) {
$found = true;
break;
}
}
if (!$found) {
return false;
}
}
return true; // allow using system dependencies if pkg_config_path is explicitly defined
}
foreach (Config::getLib(static::NAME, 'static-libs', []) as $name) { foreach (Config::getLib(static::NAME, 'static-libs', []) as $name) {
if (!file_exists(BUILD_LIB_PATH . "/{$name}")) { if (!file_exists(BUILD_LIB_PATH . "/{$name}")) {
$sharedLib = str_replace('.a', '.so', $name);
if (!getenv('SPC_LINK_STATIC') && file_exists(BUILD_LIB_PATH . "/{$sharedLib}")) {
continue;
}
return false; return false;
} }
} }
@@ -375,20 +398,6 @@ abstract class LibraryBase
return false; return false;
} }
} }
$pkg_config_path = getenv('PKG_CONFIG_PATH') ?: '';
$search_paths = array_filter(explode(is_unix() ? ':' : ';', $pkg_config_path));
foreach (Config::getLib(static::NAME, 'pkg-configs', []) as $name) {
$found = false;
foreach ($search_paths as $path) {
if (file_exists($path . "/{$name}.pc")) {
$found = true;
break;
}
}
if (!$found) {
return false;
}
}
foreach (Config::getLib(static::NAME, 'bin', []) as $name) { foreach (Config::getLib(static::NAME, 'bin', []) as $name) {
if (!file_exists(BUILD_BIN_PATH . "/{$name}")) { if (!file_exists(BUILD_BIN_PATH . "/{$name}")) {
return false; return false;

View File

@@ -25,8 +25,8 @@ class pgsql extends Extension
{ {
if ($this->builder->getPHPVersionID() >= 80400) { if ($this->builder->getPHPVersionID() >= 80400) {
$libfiles = $this->getLibFilesString(); $libfiles = $this->getLibFilesString();
$libfiles = str_replace(BUILD_LIB_PATH . '/lib', '-l', $libfiles); $libfiles = deduplicate_flags($libfiles);
$libfiles = str_replace('.a', '', $libfiles); $libfiles = clean_spaces($libfiles);
return '--with-pgsql' . ($shared ? '=shared' : '') . return '--with-pgsql' . ($shared ? '=shared' : '') .
' PGSQL_CFLAGS=-I' . BUILD_INCLUDE_PATH . ' PGSQL_CFLAGS=-I' . BUILD_INCLUDE_PATH .
' PGSQL_LIBS="-L' . BUILD_LIB_PATH . ' ' . $libfiles . '"'; ' PGSQL_LIBS="-L' . BUILD_LIB_PATH . ' ' . $libfiles . '"';

View File

@@ -42,7 +42,7 @@ class openssl extends BSDLibraryBase
shell()->cd($this->source_dir)->initializeEnv($this) shell()->cd($this->source_dir)->initializeEnv($this)
->exec( ->exec(
"./Configure no-shared {$extra} " . "./Configure {$extra} " .
'--prefix=/ ' . // use prefix=/ '--prefix=/ ' . // use prefix=/
"--libdir={$lib} " . "--libdir={$lib} " .
'--openssldir=/etc/ssl ' . '--openssldir=/etc/ssl ' .

View File

@@ -94,6 +94,7 @@ class LinuxBuilder extends UnixBuilderBase
'CFLAGS' => getenv('SPC_CMD_VAR_PHP_MAKE_EXTRA_CFLAGS'), 'CFLAGS' => getenv('SPC_CMD_VAR_PHP_MAKE_EXTRA_CFLAGS'),
'CPPFLAGS' => '-I' . BUILD_INCLUDE_PATH, // . ' -Dsomethinghere', // . $musl_flag, 'CPPFLAGS' => '-I' . BUILD_INCLUDE_PATH, // . ' -Dsomethinghere', // . $musl_flag,
'LDFLAGS' => '-L' . BUILD_LIB_PATH, 'LDFLAGS' => '-L' . BUILD_LIB_PATH,
'LD_LIBRARY_PATH' => BUILD_LIB_PATH,
// 'LIBS' => SPCTarget::getRuntimeLibs(), // do not pass static libraries here yet, they may contain polyfills for libc functions! // 'LIBS' => SPCTarget::getRuntimeLibs(), // do not pass static libraries here yet, they may contain polyfills for libc functions!
]); ]);
@@ -316,7 +317,7 @@ class LinuxBuilder extends UnixBuilderBase
*/ */
private function getMakeExtraVars(): array 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' : ''; $static = SPCTarget::isStatic() ? '-all-static' : '';
$lib = BUILD_LIB_PATH; $lib = BUILD_LIB_PATH;
return array_filter([ return array_filter([

View File

@@ -35,10 +35,13 @@ class liburing extends LinuxLibraryBase
]); ]);
} }
$shared = getenv('SPC_LINK_STATIC') ? 'ENABLE_SHARED=0' : 'ENABLE_SHARED=1';
$make $make
->removeConfigureArgs( ->removeConfigureArgs(
'--disable-shared',
'--enable-static', '--enable-static',
'--disable-static',
'--enable-shared',
'--disable-shared',
'--with-pic', '--with-pic',
'--enable-pic', '--enable-pic',
) )
@@ -46,7 +49,7 @@ class liburing extends LinuxLibraryBase
$use_libc ? '--use-libc' : '', $use_libc ? '--use-libc' : '',
) )
->configure() ->configure()
->make('library ENABLE_SHARED=0', 'install ENABLE_SHARED=0', with_clean: false); ->make("library {$shared}", "install {$shared}", with_clean: false);
$this->patchPkgconfPrefix(); $this->patchPkgconfPrefix();
} }

View File

@@ -56,10 +56,11 @@ class openssl extends LinuxLibraryBase
// TODO: in v3 use the following: $openssl_dir ??= SystemUtil::getOSRelease()['dist'] === 'redhat' ? '/etc/pki/tls' : '/etc/ssl'; // TODO: in v3 use the following: $openssl_dir ??= SystemUtil::getOSRelease()['dist'] === 'redhat' ? '/etc/pki/tls' : '/etc/ssl';
$openssl_dir ??= '/etc/ssl'; $openssl_dir ??= '/etc/ssl';
$ex_lib = trim($ex_lib); $ex_lib = trim($ex_lib);
$noShared = getenv('SPC_LINK_STATIC') ? 'no-shared' : '';
shell()->cd($this->source_dir)->initializeEnv($this) shell()->cd($this->source_dir)->initializeEnv($this)
->exec( ->exec(
"{$env} ./Configure no-shared {$extra} " . "./Configure {$noShared} {$extra} " .
'--prefix=' . BUILD_ROOT_PATH . ' ' . '--prefix=' . BUILD_ROOT_PATH . ' ' .
'--libdir=' . BUILD_LIB_PATH . ' ' . '--libdir=' . BUILD_LIB_PATH . ' ' .
"--openssldir={$openssl_dir} " . "--openssldir={$openssl_dir} " .

View File

@@ -43,7 +43,7 @@ class openssl extends MacOSLibraryBase
shell()->cd($this->source_dir)->initializeEnv($this) shell()->cd($this->source_dir)->initializeEnv($this)
->exec( ->exec(
"./Configure no-shared {$extra} " . "./Configure {$extra} " .
'--prefix=' . BUILD_ROOT_PATH . ' ' . // use prefix=/ '--prefix=' . BUILD_ROOT_PATH . ' ' . // use prefix=/
'--libdir=lib ' . '--libdir=lib ' .
'--openssldir=/etc/ssl ' . '--openssldir=/etc/ssl ' .

View File

@@ -15,7 +15,7 @@ trait UnixLibraryTrait
{ {
$libs = $include_self ? [$this] : []; $libs = $include_self ? [$this] : [];
array_unshift($libs, ...array_values($this->getDependencies(recursive: true))); array_unshift($libs, ...array_values($this->getDependencies(recursive: true)));
$config = new SPCConfigUtil($this->builder, options: ['libs_only_deps' => true, 'absolute_libs' => true]); $config = new SPCConfigUtil($this->builder, options: ['libs_only_deps' => true]);
$res = $config->config(libraries: array_map(fn ($x) => $x->getName(), $libs)); $res = $config->config(libraries: array_map(fn ($x) => $x->getName(), $libs));
return $res['libs']; return $res['libs'];
} }

View File

@@ -7,6 +7,7 @@ namespace SPC\builder\traits;
use SPC\exception\ExecutionException; use SPC\exception\ExecutionException;
use SPC\exception\SPCInternalException; use SPC\exception\SPCInternalException;
use SPC\exception\WrongUsageException; use SPC\exception\WrongUsageException;
use SPC\store\pkg\Zig;
use SPC\toolchain\ToolchainManager; use SPC\toolchain\ToolchainManager;
use SPC\toolchain\ZigToolchain; use SPC\toolchain\ZigToolchain;
use SPC\util\SPCTarget; use SPC\util\SPCTarget;
@@ -73,6 +74,10 @@ trait UnixSystemUtilTrait
throw new SPCInternalException("The symbol file {$symbol_file} does not exist, please check if nm command is available."); throw new SPCInternalException("The symbol file {$symbol_file} does not exist, please check if nm command is available.");
} }
// macOS/zig // macOS/zig
// https://github.com/ziglang/zig/issues/24662
if (ToolchainManager::getToolchainClass() === ZigToolchain::class) {
return '-Wl,--export-dynamic'; // needs release 0.16, can be removed then
}
if (SPCTarget::getTargetOS() !== 'Linux' || ToolchainManager::getToolchainClass() === ZigToolchain::class) { if (SPCTarget::getTargetOS() !== 'Linux' || ToolchainManager::getToolchainClass() === ZigToolchain::class) {
return "-Wl,-exported_symbols_list,{$symbol_file}"; return "-Wl,-exported_symbols_list,{$symbol_file}";
} }

View File

@@ -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/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'); 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'); 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')) { if (file_exists(BUILD_BIN_PATH . '/brotli')) {
unlink(BUILD_BIN_PATH . '/brotli'); unlink(BUILD_BIN_PATH . '/brotli');

View File

@@ -5,6 +5,7 @@ declare(strict_types=1);
namespace SPC\builder\unix\library; namespace SPC\builder\unix\library;
use SPC\util\executor\UnixCMakeExecutor; use SPC\util\executor\UnixCMakeExecutor;
use SPC\util\SPCConfigUtil;
trait curl trait curl
{ {
@@ -12,6 +13,13 @@ trait curl
{ {
shell()->cd($this->source_dir)->exec('sed -i.save s@\${CMAKE_C_IMPLICIT_LINK_LIBRARIES}@@ ./CMakeLists.txt'); shell()->cd($this->source_dir)->exec('sed -i.save s@\${CMAKE_C_IMPLICIT_LINK_LIBRARIES}@@ ./CMakeLists.txt');
$linkerFlags = null;
if ($this->builder->getLib('krb5') && !getenv('SPC_LINK_STATIC')) {
$util = new SPCConfigUtil($this->builder, ['libs_only_deps' => true]);
$config = $util->config(libraries: ['krb5']);
$linkerFlags = $config['ldflags'] . ' -Wl,--whole-archive -lgssapi_krb5 -lkrb5 -lk5crypto -lcom_err -lkrb5support -Wl,--no-whole-archive -Wl,--no-undefined';
}
UnixCMakeExecutor::create($this) UnixCMakeExecutor::create($this)
->optionalLib('openssl', '-DCURL_USE_OPENSSL=ON -DCURL_CA_BUNDLE=OFF -DCURL_CA_PATH=OFF -DCURL_CA_FALLBACK=ON', '-DCURL_USE_OPENSSL=OFF -DCURL_ENABLE_SSL=OFF') ->optionalLib('openssl', '-DCURL_USE_OPENSSL=ON -DCURL_CA_BUNDLE=OFF -DCURL_CA_PATH=OFF -DCURL_CA_FALLBACK=ON', '-DCURL_USE_OPENSSL=OFF -DCURL_ENABLE_SSL=OFF')
->optionalLib('brotli', ...cmake_boolean_args('CURL_BROTLI')) ->optionalLib('brotli', ...cmake_boolean_args('CURL_BROTLI'))
@@ -29,6 +37,7 @@ trait curl
->addConfigureArgs( ->addConfigureArgs(
'-DBUILD_CURL_EXE=OFF', '-DBUILD_CURL_EXE=OFF',
'-DBUILD_LIBCURL_DOCS=OFF', '-DBUILD_LIBCURL_DOCS=OFF',
$linkerFlags ? "-DCMAKE_SHARED_LINKER_FLAGS='{$linkerFlags}'" : null
) )
->build(); ->build();

View File

@@ -40,6 +40,16 @@ trait krb5
->appendEnv($extraEnv) ->appendEnv($extraEnv)
->optionalLib('ldap', '--with-ldap', '--without-ldap') ->optionalLib('ldap', '--with-ldap', '--without-ldap')
->optionalLib('libedit', '--with-libedit', '--without-libedit') ->optionalLib('libedit', '--with-libedit', '--without-libedit')
->removeConfigureArgs(
'--enable-static',
'--disable-static',
'--enable-shared',
'--disable-shared'
)
->addConfigureArgs(
'--enable-static',
'--disable-shared'
)
->configure(...$args) ->configure(...$args)
->make(); ->make();
$this->patchPkgconfPrefix([ $this->patchPkgconfPrefix([

View File

@@ -4,8 +4,6 @@ declare(strict_types=1);
namespace SPC\builder\unix\library; namespace SPC\builder\unix\library;
use SPC\store\FileSystem;
trait libargon2 trait libargon2
{ {
protected function build() protected function build()
@@ -17,12 +15,6 @@ trait libargon2
$this->patchPkgconfPrefix(['libargon2.pc']); $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')) { if (file_exists(BUILD_BIN_PATH . '/argon2')) {
unlink(BUILD_BIN_PATH . '/argon2'); unlink(BUILD_BIN_PATH . '/argon2');
} }

View File

@@ -27,11 +27,5 @@ trait liblz4
->exec("make install PREFIX='' DESTDIR=" . BUILD_ROOT_PATH); ->exec("make install PREFIX='' DESTDIR=" . BUILD_ROOT_PATH);
$this->patchPkgconfPrefix(['liblz4.pc']); $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);
}
}
} }
} }

View File

@@ -13,6 +13,7 @@ trait libuuid
{ {
UnixCMakeExecutor::create($this)->toStep(2)->build(); UnixCMakeExecutor::create($this)->toStep(2)->build();
copy($this->source_dir . '/build/libuuid.a', BUILD_LIB_PATH . '/libuuid.a'); copy($this->source_dir . '/build/libuuid.a', BUILD_LIB_PATH . '/libuuid.a');
copy($this->source_dir . '/build/libuuid.so', BUILD_LIB_PATH . '/libuuid.so');
FileSystem::createDir(BUILD_INCLUDE_PATH . '/uuid'); FileSystem::createDir(BUILD_INCLUDE_PATH . '/uuid');
copy($this->source_dir . '/uuid.h', BUILD_INCLUDE_PATH . '/uuid/uuid.h'); copy($this->source_dir . '/uuid.h', BUILD_INCLUDE_PATH . '/uuid/uuid.h');
$pc = FileSystem::readFile($this->source_dir . '/uuid.pc.in'); $pc = FileSystem::readFile($this->source_dir . '/uuid.pc.in');

View File

@@ -11,7 +11,7 @@ trait libuv
protected function build(): void protected function build(): void
{ {
UnixCMakeExecutor::create($this) UnixCMakeExecutor::create($this)
->addConfigureArgs('-DLIBUV_BUILD_SHARED=OFF') ->addConfigureArgs('-DLIBUV_BUILD_SHARED=' . (getenv('SPC_LINK_STATIC') ? 'OFF' : 'ON'))
->build(); ->build();
// patch pkgconfig // patch pkgconfig
$this->patchPkgconfPrefix(['libuv-static.pc']); $this->patchPkgconfPrefix(['libuv-static.pc']);

View File

@@ -6,10 +6,29 @@ namespace SPC\builder\unix\library;
use SPC\builder\linux\library\LinuxLibraryBase; use SPC\builder\linux\library\LinuxLibraryBase;
use SPC\store\FileSystem; use SPC\store\FileSystem;
use SPC\toolchain\ToolchainManager;
use SPC\toolchain\ZigToolchain;
use SPC\util\executor\UnixCMakeExecutor; use SPC\util\executor\UnixCMakeExecutor;
trait libxml2 trait libxml2
{ {
public function patchBeforeBuild(): bool
{
if (ToolchainManager::getToolchainClass() !== ZigToolchain::class) {
return false;
}
$patched = (bool) FileSystem::replaceFileStr(
$this->source_dir . '/configure.ac',
'AX_APPEND_FLAG([-Wl,--version-script=], [VERSION_SCRIPT_FLAGS])',
'',
);
return $patched || FileSystem::replaceFileStr(
$this->source_dir . '/CMakeLists.txt',
'target_link_options(LibXml2 PRIVATE "LINKER:--version-script=${CMAKE_CURRENT_SOURCE_DIR}/libxml2.syms")',
'',
);
}
public function build(): void public function build(): void
{ {
$cmake = UnixCMakeExecutor::create($this) $cmake = UnixCMakeExecutor::create($this)
@@ -20,7 +39,6 @@ trait libxml2
"-DZLIB_INCLUDE_DIR={$this->getIncludeDir()}", "-DZLIB_INCLUDE_DIR={$this->getIncludeDir()}",
'-DLIBXML2_WITH_ZLIB=OFF', '-DLIBXML2_WITH_ZLIB=OFF',
) )
->optionalLib('xz', ...cmake_boolean_args('LIBXML2_WITH_LZMA'))
->addConfigureArgs( ->addConfigureArgs(
'-DLIBXML2_WITH_ICONV=ON', '-DLIBXML2_WITH_ICONV=ON',
'-DLIBXML2_WITH_ICU=OFF', // optional, but discouraged: https://gitlab.gnome.org/GNOME/libxml2/-/blob/master/README.md '-DLIBXML2_WITH_ICU=OFF', // optional, but discouraged: https://gitlab.gnome.org/GNOME/libxml2/-/blob/master/README.md

View File

@@ -13,7 +13,7 @@ trait mimalloc
{ {
$cmake = UnixCMakeExecutor::create($this) $cmake = UnixCMakeExecutor::create($this)
->addConfigureArgs( ->addConfigureArgs(
'-DMI_BUILD_SHARED=OFF', '-DMI_BUILD_SHARED=' . (getenv('SPC_LINK_STATIC') ? 'OFF' : 'ON'),
'-DMI_BUILD_OBJECT=OFF', '-DMI_BUILD_OBJECT=OFF',
'-DMI_INSTALL_TOPLEVEL=ON', '-DMI_INSTALL_TOPLEVEL=ON',
); );

View File

@@ -12,6 +12,9 @@ trait postgresql
{ {
public function patchBeforeBuild(): bool public function patchBeforeBuild(): bool
{ {
if (!getenv('SPC_LINK_STATIC')) {
return false;
}
// skip the test on platforms where libpq infrastructure may be provided by statically-linked libraries // skip the test on platforms where libpq infrastructure may be provided by statically-linked libraries
FileSystem::replaceFileStr("{$this->source_dir}/src/interfaces/libpq/Makefile", 'invokes exit\'; exit 1;', 'invokes exit\';'); FileSystem::replaceFileStr("{$this->source_dir}/src/interfaces/libpq/Makefile", 'invokes exit\'; exit 1;', 'invokes exit\';');
// disable shared libs build // disable shared libs build
@@ -92,11 +95,11 @@ trait postgresql
->exec('make -C src/interfaces/libpq install'); ->exec('make -C src/interfaces/libpq install');
// remove dynamic libs // remove dynamic libs
shell()->cd($this->source_dir . '/build') if (getenv('SPC_LINK_STATIC')) {
->exec("rm -rf {$this->getBuildRootPath()}/lib/*.so.*") 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"); ->exec("rm -rf {$this->getBuildRootPath()}/lib/*.dylib");
}
FileSystem::replaceFileStr("{$this->getLibDir()}/pkgconfig/libpq.pc", '-lldap', '-lldap -llber'); FileSystem::replaceFileStr("{$this->getLibDir()}/pkgconfig/libpq.pc", '-lldap', '-lldap -llber');
} }
} }

View File

@@ -14,7 +14,7 @@ trait tidy
->setBuildDir("{$this->source_dir}/build-dir") ->setBuildDir("{$this->source_dir}/build-dir")
->addConfigureArgs( ->addConfigureArgs(
'-DSUPPORT_CONSOLE_APP=OFF', '-DSUPPORT_CONSOLE_APP=OFF',
'-DBUILD_SHARED_LIB=OFF' '-DBUILD_SHARED_LIB=' . (getenv('SPC_LINK_STATIC') ? 'OFF' : 'ON')
); );
if (version_compare(get_cmake_version(), '4.0.0', '>=')) { if (version_compare(get_cmake_version(), '4.0.0', '>=')) {
$cmake->addConfigureArgs('-DCMAKE_POLICY_VERSION_MINIMUM=3.5'); $cmake->addConfigureArgs('-DCMAKE_POLICY_VERSION_MINIMUM=3.5');

View File

@@ -10,7 +10,14 @@ trait xz
{ {
public function build(): void public function build(): void
{ {
UnixAutoconfExecutor::create($this) $make = UnixAutoconfExecutor::create($this);
if (!getenv('SPC_LINK_STATIC')) {
// liblzma can only build one of static or shared at a time
$make
->removeConfigureArgs('--enable-static')
->addConfigureArgs('--disable-static');
}
$make
->configure( ->configure(
'--disable-scripts', '--disable-scripts',
'--disable-doc', '--disable-doc',

View File

@@ -10,7 +10,8 @@ trait zlib
{ {
protected function build(): void protected function build(): void
{ {
UnixAutoconfExecutor::create($this)->exec("./configure --static --prefix={$this->getBuildRootPath()}")->make(); $static = getenv('SPC_LINK_STATIC') ? '--static' : '';
UnixAutoconfExecutor::create($this)->exec("./configure {$static} --prefix={$this->getBuildRootPath()}")->make();
$this->patchPkgconfPrefix(['zlib.pc']); $this->patchPkgconfPrefix(['zlib.pc']);
} }
} }

View File

@@ -14,9 +14,9 @@ trait zstd
->setBuildDir("{$this->source_dir}/build/cmake/build") ->setBuildDir("{$this->source_dir}/build/cmake/build")
->addConfigureArgs( ->addConfigureArgs(
'-DZSTD_BUILD_STATIC=ON', '-DZSTD_BUILD_STATIC=ON',
'-DZSTD_BUILD_SHARED=OFF', '-DZSTD_BUILD_SHARED=' . (getenv('SPC_LINK_STATIC') ? 'OFF' : 'ON'),
) )
->build(); ->build();
$this->patchPkgconfPrefix(['libzstd.pc']); $this->patchPkgconfPrefix();
} }
} }

View File

@@ -33,7 +33,6 @@ class openssl extends WindowsLibraryBase
->execWithWrapper( ->execWithWrapper(
$this->builder->makeSimpleWrapper($this->perl), $this->builder->makeSimpleWrapper($this->perl),
'Configure zlib VC-WIN64A ' . 'Configure zlib VC-WIN64A ' .
'no-shared ' .
'--prefix=' . quote(BUILD_ROOT_PATH) . ' ' . '--prefix=' . quote(BUILD_ROOT_PATH) . ' ' .
'--with-zlib-lib=' . quote(BUILD_LIB_PATH) . ' ' . '--with-zlib-lib=' . quote(BUILD_LIB_PATH) . ' ' .
'--with-zlib-include=' . quote(BUILD_INCLUDE_PATH) . ' ' . '--with-zlib-include=' . quote(BUILD_INCLUDE_PATH) . ' ' .

View File

@@ -39,7 +39,6 @@ class SPCConfigCommand extends BaseCommand
$util = new SPCConfigUtil(options: [ $util = new SPCConfigUtil(options: [
'no_php' => $this->getOption('no-php'), 'no_php' => $this->getOption('no-php'),
'libs_only_deps' => $this->getOption('libs-only-deps'), 'libs_only_deps' => $this->getOption('libs-only-deps'),
'absolute_libs' => $this->getOption('absolute-libs'),
]); ]);
$config = $util->config($extensions, $libraries, $include_suggest_ext, $include_suggest_lib); $config = $util->config($extensions, $libraries, $include_suggest_ext, $include_suggest_lib);

View File

@@ -58,6 +58,10 @@ class ZigToolchain implements ToolchainInterface
GlobalEnvManager::putenv("SPC_CMD_VAR_PHP_MAKE_EXTRA_CFLAGS={$extraCflags}"); GlobalEnvManager::putenv("SPC_CMD_VAR_PHP_MAKE_EXTRA_CFLAGS={$extraCflags}");
GlobalEnvManager::putenv('RANLIB=zig-ranlib'); GlobalEnvManager::putenv('RANLIB=zig-ranlib');
GlobalEnvManager::putenv('OBJCOPY=zig-objcopy'); GlobalEnvManager::putenv('OBJCOPY=zig-objcopy');
$defaultLdFlags = getenv('SPC_DEFAULT_LD_FLAGS') ?: '';
if (!str_contains($defaultLdFlags, '-Wl,--undefined-version') && !getenv('SPC_LINK_STATIC')) {
GlobalEnvManager::putenv("SPC_DEFAULT_LD_FLAGS={$defaultLdFlags} -Wl,--undefined-version");
}
$extra_libs = getenv('SPC_EXTRA_LIBS') ?: ''; $extra_libs = getenv('SPC_EXTRA_LIBS') ?: '';
if (!str_contains($extra_libs, '-lunwind')) { if (!str_contains($extra_libs, '-lunwind')) {
// Add unwind library if not already present // Add unwind library if not already present

View File

@@ -38,6 +38,13 @@ class GlobalEnvManager
// Define env vars for unix // Define env vars for unix
if (is_unix()) { if (is_unix()) {
if (!getenv('SPC_LINK_STATIC')) {
$ldLibPath = getenv('LD_LIBRARY_PATH=' . BUILD_LIB_PATH);
if ($ldLibPath) {
$ldLibPath = ":{$ldLibPath}";
}
self::putenv('LD_LIBRARY_PATH=' . BUILD_LIB_PATH . $ldLibPath);
}
self::addPathIfNotExists(BUILD_BIN_PATH); self::addPathIfNotExists(BUILD_BIN_PATH);
self::addPathIfNotExists(PKG_ROOT_PATH . '/bin'); self::addPathIfNotExists(PKG_ROOT_PATH . '/bin');
$pkgConfigPath = getenv('PKG_CONFIG_PATH'); $pkgConfigPath = getenv('PKG_CONFIG_PATH');

View File

@@ -59,10 +59,10 @@ class PkgConfigUtil
* @param string $pkg_config_str .pc file string, accepts multiple files * @param string $pkg_config_str .pc file string, accepts multiple files
* @return string CFLAGS string, e.g. "-Wno-implicit-int-float-conversion ..." * @return string CFLAGS string, e.g. "-Wno-implicit-int-float-conversion ..."
*/ */
public static function getCflags(string $pkg_config_str): string public static function getCflags(string $pkg_config_str, string $extra = '--static'): string
{ {
// get other things // get other things
$result = self::execWithResult("pkg-config --static --cflags-only-other {$pkg_config_str}"); $result = self::execWithResult("pkg-config {$extra} --cflags-only-other {$pkg_config_str}");
return trim($result); return trim($result);
} }
@@ -75,14 +75,14 @@ class PkgConfigUtil
* @param string $pkg_config_str .pc file string, accepts multiple files * @param string $pkg_config_str .pc file string, accepts multiple files
* @return array Unique libs array, e.g. [-lz, -lxml, ...] * @return array Unique libs array, e.g. [-lz, -lxml, ...]
*/ */
public static function getLibsArray(string $pkg_config_str): array public static function getLibsArray(string $pkg_config_str, string $extra = '--static'): array
{ {
// Use this instead of shell() to avoid unnecessary outputs // Use this instead of shell() to avoid unnecessary outputs
$result = self::execWithResult("pkg-config --static --libs-only-l {$pkg_config_str}"); $result = self::execWithResult("pkg-config {$extra} --libs-only-l {$pkg_config_str}");
$libs = explode(' ', trim($result)); $libs = explode(' ', trim($result));
// get other things // get other things
$result = self::execWithResult("pkg-config --static --libs-only-other {$pkg_config_str}"); $result = self::execWithResult("pkg-config {$extra} --libs-only-other {$pkg_config_str}");
// convert libxxx.a to -L{path} -lxxx // convert libxxx.a to -L{path} -lxxx
$exp = explode(' ', trim($result)); $exp = explode(' ', trim($result));
foreach ($exp as $item) { foreach ($exp as $item) {

View File

@@ -20,13 +20,10 @@ class SPCConfigUtil
private bool $libs_only_deps; private bool $libs_only_deps;
private bool $absolute_libs;
/** /**
* @param array{ * @param array{
* no_php?: bool, * no_php?: bool,
* libs_only_deps?: bool, * libs_only_deps?: bool
* absolute_libs?: bool
* } $options Options pass to spc-config * } $options Options pass to spc-config
*/ */
public function __construct(?BuilderBase $builder = null, array $options = []) public function __construct(?BuilderBase $builder = null, array $options = [])
@@ -36,7 +33,6 @@ class SPCConfigUtil
} }
$this->no_php = $options['no_php'] ?? false; $this->no_php = $options['no_php'] ?? false;
$this->libs_only_deps = $options['libs_only_deps'] ?? 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(); ob_get_clean();
$ldflags = $this->getLdflagsString(); $ldflags = $this->getLdflagsString();
$cflags = $this->getIncludesString($libraries); $cflags = $this->getIncludesString($libraries);
$libs = $this->getLibsString($libraries, !$this->absolute_libs); $libs = $this->getLibsString($libraries);
// additional OS-specific libraries (e.g. macOS -lresolv) // additional OS-specific libraries (e.g. macOS -lresolv)
if ($extra_libs = SPCTarget::getRuntimeLibs()) { if ($extra_libs = SPCTarget::getRuntimeLibs()) {
@@ -239,7 +235,8 @@ class SPCConfigUtil
} }
} }
$pc_cflags = implode(' ', $pc); $pc_cflags = implode(' ', $pc);
if ($pc_cflags !== '' && ($pc_cflags = PkgConfigUtil::getCflags($pc_cflags)) !== '') { $static = getenv('SPC_LINK_STATIC') ? '--static' : '';
if ($pc_cflags !== '' && ($pc_cflags = PkgConfigUtil::getCflags($pc_cflags, $static)) !== '') {
$arr = explode(' ', $pc_cflags); $arr = explode(' ', $pc_cflags);
$arr = array_unique($arr); $arr = array_unique($arr);
$arr = array_filter($arr, fn ($x) => !str_starts_with($x, 'SHELL:-Xarch_')); $arr = array_filter($arr, fn ($x) => !str_starts_with($x, 'SHELL:-Xarch_'));
@@ -256,7 +253,7 @@ class SPCConfigUtil
return '-L' . BUILD_LIB_PATH; return '-L' . BUILD_LIB_PATH;
} }
private function getLibsString(array $libraries, bool $use_short_libs = true): string private function getLibsString(array $libraries): string
{ {
$lib_names = []; $lib_names = [];
$frameworks = []; $frameworks = [];
@@ -264,6 +261,11 @@ class SPCConfigUtil
foreach ($libraries as $library) { foreach ($libraries as $library) {
// add pkg-configs libs // add pkg-configs libs
$pkg_configs = Config::getLib($library, 'pkg-configs', []); $pkg_configs = Config::getLib($library, 'pkg-configs', []);
$static = getenv('SPC_LINK_STATIC') ? '--static' : null;
if (!$static) {
$target = Config::getLib($library, 'target');
$static = $target && !in_array('shared', $target) ? '--static' : '';
}
$pkg_config_path = getenv('PKG_CONFIG_PATH') ?: ''; $pkg_config_path = getenv('PKG_CONFIG_PATH') ?: '';
$search_paths = array_filter(explode(is_unix() ? ':' : ';', $pkg_config_path)); $search_paths = array_filter(explode(is_unix() ? ':' : ';', $pkg_config_path));
foreach ($pkg_configs as $file) { foreach ($pkg_configs as $file) {
@@ -280,14 +282,14 @@ class SPCConfigUtil
$pkg_configs = implode(' ', $pkg_configs); $pkg_configs = implode(' ', $pkg_configs);
if ($pkg_configs !== '') { if ($pkg_configs !== '') {
// static libs with dependencies come in reverse order, so reverse this too // static libs with dependencies come in reverse order, so reverse this too
$pc_libs = array_reverse(PkgConfigUtil::getLibsArray($pkg_configs)); $pc_libs = array_reverse(PkgConfigUtil::getLibsArray($static, $pkg_configs));
$lib_names = [...$lib_names, ...$pc_libs]; $lib_names = [...$lib_names, ...$pc_libs];
} }
// convert all static-libs to short names // convert all static-libs to short names
$libs = array_reverse(Config::getLib($library, 'static-libs', [])); $libs = array_reverse(Config::getLib($library, 'static-libs', []));
foreach ($libs as $lib) { foreach ($libs as $lib) {
// check file existence // check file existence
if (!file_exists(BUILD_LIB_PATH . "/{$lib}")) { if (!file_exists(BUILD_LIB_PATH . "/{$lib}") && getenv('SPC_LINK_STATIC')) {
throw new WrongUsageException("Library file '{$lib}' for lib [{$library}] does not exist in '" . BUILD_LIB_PATH . "'. Please build it first."); throw new WrongUsageException("Library file '{$lib}' for lib [{$library}] does not exist in '" . BUILD_LIB_PATH . "'. Please build it first.");
} }
$lib_names[] = $this->getShortLibName($lib); $lib_names[] = $this->getShortLibName($lib);
@@ -316,8 +318,8 @@ class SPCConfigUtil
if (in_array('imap', $libraries) && SPCTarget::getLibc() === 'glibc') { if (in_array('imap', $libraries) && SPCTarget::getLibc() === 'glibc') {
$lib_names[] = '-lcrypt'; $lib_names[] = '-lcrypt';
} }
if (!$use_short_libs) { if (getenv('SPC_LINK_STATIC')) {
$lib_names = array_map(fn ($l) => $this->getFullLibName($l), $lib_names); $lib_names = array_map(fn ($l) => $this->getStaticLibname($l), $lib_names);
} }
return implode(' ', $lib_names); return implode(' ', $lib_names);
} }
@@ -331,7 +333,7 @@ class SPCConfigUtil
return '-l' . substr($lib, 3, -2); return '-l' . substr($lib, 3, -2);
} }
private function getFullLibName(string $lib) private function getStaticLibname(string $lib)
{ {
if (!str_starts_with($lib, '-l')) { if (!str_starts_with($lib, '-l')) {
return $lib; return $lib;
@@ -339,7 +341,7 @@ class SPCConfigUtil
$libname = substr($lib, 2); $libname = substr($lib, 2);
$staticLib = BUILD_LIB_PATH . '/' . "lib{$libname}.a"; $staticLib = BUILD_LIB_PATH . '/' . "lib{$libname}.a";
if (file_exists($staticLib)) { if (file_exists($staticLib)) {
return $staticLib; return "-l:lib{$libname}.a";
} }
return $lib; return $lib;
} }

View File

@@ -16,12 +16,11 @@ class UnixAutoconfExecutor extends Executor
protected array $configure_args = []; protected array $configure_args = [];
protected array $ignore_args = [];
public function __construct(protected BSDLibraryBase|LinuxLibraryBase|MacOSLibraryBase $library) public function __construct(protected BSDLibraryBase|LinuxLibraryBase|MacOSLibraryBase $library)
{ {
parent::__construct($library); parent::__construct($library);
$this->initShell(); $this->initShell();
$this->configure_args = $this->getDefaultConfigureArgs();
} }
/** /**
@@ -29,19 +28,12 @@ class UnixAutoconfExecutor extends Executor
*/ */
public function configure(...$args): static public function configure(...$args): static
{ {
// remove all the ignored args $args = array_merge($args, $this->configure_args);
$args = array_merge($args, $this->getDefaultConfigureArgs(), $this->configure_args);
$args = array_diff($args, $this->ignore_args);
$configure_args = implode(' ', $args); $configure_args = implode(' ', $args);
return $this->seekLogFileOnException(fn () => $this->shell->exec("./configure {$configure_args}")); return $this->seekLogFileOnException(fn () => $this->shell->exec("./configure {$configure_args}"));
} }
public function getConfigureArgsString(): string
{
return implode(' ', array_merge($this->getDefaultConfigureArgs(), $this->configure_args));
}
/** /**
* Run make * Run make
* *
@@ -111,7 +103,7 @@ class UnixAutoconfExecutor extends Executor
*/ */
public function removeConfigureArgs(...$args): static public function removeConfigureArgs(...$args): static
{ {
$this->ignore_args = [...$this->ignore_args, ...$args]; $this->configure_args = array_diff($this->configure_args, $args);
return $this; return $this;
} }
@@ -133,8 +125,8 @@ class UnixAutoconfExecutor extends Executor
private function getDefaultConfigureArgs(): array private function getDefaultConfigureArgs(): array
{ {
return [ return [
'--disable-shared',
'--enable-static', '--enable-static',
getenv('SPC_LINK_STATIC') ? '--disable-shared' : '--enable-shared',
"--prefix={$this->library->getBuildRootPath()}", "--prefix={$this->library->getBuildRootPath()}",
'--with-pic', '--with-pic',
'--enable-pic', '--enable-pic',

View File

@@ -151,7 +151,7 @@ class UnixCMakeExecutor extends Executor
'-DCMAKE_INSTALL_LIBDIR=lib', '-DCMAKE_INSTALL_LIBDIR=lib',
'-DCMAKE_INSTALL_INCLUDEDIR=include', '-DCMAKE_INSTALL_INCLUDEDIR=include',
'-DPOSITION_INDEPENDENT_CODE=ON', '-DPOSITION_INDEPENDENT_CODE=ON',
'-DBUILD_SHARED_LIBS=OFF', '-DBUILD_SHARED_LIBS=' . (getenv('SPC_LINK_STATIC') ? 'OFF' : 'ON'),
"-DCMAKE_TOOLCHAIN_FILE={$this->makeCmakeToolchainFile()}", "-DCMAKE_TOOLCHAIN_FILE={$this->makeCmakeToolchainFile()}",
]); ]);
} }