[mixed] refactor with putenv, fix imagemagick and c++ build

This commit is contained in:
crazywhalecc 2023-10-23 00:37:28 +08:00
parent 5934e5e881
commit c84eb723ec
No known key found for this signature in database
GPG Key ID: 1F4BDD59391F2680
52 changed files with 205 additions and 168 deletions

View File

@ -146,7 +146,6 @@
}, },
"intl": { "intl": {
"type": "builtin", "type": "builtin",
"cpp-extension": true,
"lib-depends": [ "lib-depends": [
"icu" "icu"
] ]

View File

@ -111,6 +111,7 @@
}, },
"icu": { "icu": {
"source": "icu", "source": "icu",
"cpp-library": true,
"static-libs-unix": [ "static-libs-unix": [
"libicui18n.a", "libicui18n.a",
"libicuio.a", "libicuio.a",
@ -129,13 +130,13 @@
"zlib", "zlib",
"libpng", "libpng",
"libjpeg", "libjpeg",
"bzip2",
"libwebp", "libwebp",
"freetype" "freetype"
], ],
"lib-suggests": [ "lib-suggests": [
"zstd", "zstd",
"xz", "xz",
"bzip2",
"libzip", "libzip",
"libxml2" "libxml2"
] ]

View File

@ -112,6 +112,16 @@ abstract class BuilderBase
return $this->libs[$name] ?? null; return $this->libs[$name] ?? null;
} }
/**
* Get all library objects.
*
* @return LibraryBase[]
*/
public function getLibs(): array
{
return $this->libs;
}
/** /**
* Add extension to build. * Add extension to build.
*/ */
@ -139,12 +149,12 @@ abstract class BuilderBase
} }
/** /**
* Check if there is a cpp extension. * Check if there is a cpp extensions or libraries.
* *
* @throws FileSystemException * @throws FileSystemException
* @throws WrongUsageException * @throws WrongUsageException
*/ */
public function hasCppExtension(): bool public function hasCpp(): bool
{ {
// judge cpp-extension // judge cpp-extension
$exts = array_keys($this->getExts()); $exts = array_keys($this->getExts());
@ -153,6 +163,12 @@ abstract class BuilderBase
return true; return true;
} }
} }
$libs = array_keys($this->getLibs());
foreach ($libs as $lib) {
if (Config::getLib($lib, 'cpp-library', false) === true) {
return true;
}
}
return false; return false;
} }

View File

@ -14,7 +14,6 @@ class imagick extends Extension
{ {
// imagick may call omp_pause_all which requires -lgomp // imagick may call omp_pause_all which requires -lgomp
$extra_libs = $this->builder->getOption('extra-libs', ''); $extra_libs = $this->builder->getOption('extra-libs', '');
$extra_libs .= ' -lgomp ';
$this->builder->setOption('extra-libs', $extra_libs); $this->builder->setOption('extra-libs', $extra_libs);
return true; return true;
} }

View File

@ -31,9 +31,16 @@ class BSDBuilder extends BuilderBase
// ---------- set necessary options ---------- // ---------- set necessary options ----------
// set C Compiler (default: clang) // set C Compiler (default: clang)
$this->setOptionIfNotExist('cc', 'clang'); f_putenv('CC=' . $this->getOption('cc', 'clang'));
// set C++ Composer (default: clang++) // set C++ Composer (default: clang++)
$this->setOptionIfNotExist('cxx', 'clang++'); f_putenv('CXX=' . $this->getOption('cxx', 'clang++'));
// set PATH
f_putenv('PATH=' . BUILD_ROOT_PATH . '/bin:' . getenv('PATH'));
// set PKG_CONFIG
f_putenv('PKG_CONFIG=' . BUILD_ROOT_PATH . '/bin/pkg-config');
// set PKG_CONFIG_PATH
f_putenv('PKG_CONFIG_PATH=' . BUILD_LIB_PATH . '/pkgconfig/');
// set arch (default: current) // set arch (default: current)
$this->setOptionIfNotExist('arch', php_uname('m')); $this->setOptionIfNotExist('arch', php_uname('m'));
$this->setOptionIfNotExist('gnu-arch', arch2gnu($this->getOption('arch'))); $this->setOptionIfNotExist('gnu-arch', arch2gnu($this->getOption('arch')));
@ -46,16 +53,6 @@ class BSDBuilder extends BuilderBase
$this->arch_cxx_flags = SystemUtil::getArchCFlags($this->getOption('arch')); $this->arch_cxx_flags = SystemUtil::getArchCFlags($this->getOption('arch'));
// cmake toolchain // cmake toolchain
$this->cmake_toolchain_file = SystemUtil::makeCmakeToolchainFile('BSD', $this->getOption('arch'), $this->arch_c_flags); $this->cmake_toolchain_file = SystemUtil::makeCmakeToolchainFile('BSD', $this->getOption('arch'), $this->arch_c_flags);
// configure environment
$this->configure_env = SystemUtil::makeEnvVarString([
'PKG_CONFIG' => BUILD_ROOT_PATH . '/bin/pkg-config',
'PKG_CONFIG_PATH' => BUILD_LIB_PATH . '/pkgconfig/',
'CC' => $this->getOption('cc'),
'CXX' => $this->getOption('cxx'),
'CFLAGS' => "{$this->arch_c_flags} -Wimplicit-function-declaration -Os",
'LIBS' => '-ldl -lpthread',
'PATH' => BUILD_ROOT_PATH . '/bin:' . getenv('PATH'),
]);
// create pkgconfig and include dir (some libs cannot create them automatically) // create pkgconfig and include dir (some libs cannot create them automatically)
f_mkdir(BUILD_LIB_PATH . '/pkgconfig', recursive: true); f_mkdir(BUILD_LIB_PATH . '/pkgconfig', recursive: true);
@ -75,7 +72,7 @@ class BSDBuilder extends BuilderBase
// ---------- Update extra-libs ---------- // ---------- Update extra-libs ----------
$extra_libs = $this->getOption('extra-libs', ''); $extra_libs = $this->getOption('extra-libs', '');
// add libc++, some extensions or libraries need it (C++ cannot be linked statically) // add libc++, some extensions or libraries need it (C++ cannot be linked statically)
$extra_libs .= (empty($extra_libs) ? '' : ' ') . ($this->hasCppExtension() ? '-lc++ ' : ''); $extra_libs .= (empty($extra_libs) ? '' : ' ') . ($this->hasCpp() ? '-lc++ ' : '');
if (!$this->getOption('bloat', false)) { if (!$this->getOption('bloat', false)) {
$extra_libs .= (empty($extra_libs) ? '' : ' ') . implode(' ', $this->getAllStaticLibFiles()); $extra_libs .= (empty($extra_libs) ? '' : ' ') . implode(' ', $this->getAllStaticLibFiles());
} else { } else {
@ -115,8 +112,7 @@ class BSDBuilder extends BuilderBase
($enableMicro ? '--enable-micro ' : '--disable-micro ') . ($enableMicro ? '--enable-micro ' : '--disable-micro ') .
$json_74 . $json_74 .
$zts . $zts .
$this->makeExtensionArgs() . ' ' . $this->makeExtensionArgs()
$this->configure_env
); );
SourcePatcher::patchBeforeMake($this); SourcePatcher::patchBeforeMake($this);
@ -173,12 +169,14 @@ class BSDBuilder extends BuilderBase
/** /**
* Build phpmicro sapi * Build phpmicro sapi
* *
* @throws FileSystemException|RuntimeException * @throws FileSystemException
* @throws RuntimeException
* @throws WrongUsageException
*/ */
public function buildMicro(): void public function buildMicro(): void
{ {
if ($this->getPHPVersionID() < 80000) { if ($this->getPHPVersionID() < 80000) {
throw new RuntimeException('phpmicro only support PHP >= 8.0!'); throw new WrongUsageException('phpmicro only support PHP >= 8.0!');
} }
if ($this->getExt('phar')) { if ($this->getExt('phar')) {
$this->phar_patched = true; $this->phar_patched = true;
@ -228,6 +226,11 @@ class BSDBuilder extends BuilderBase
$this->deployBinary(BUILD_TARGET_FPM); $this->deployBinary(BUILD_TARGET_FPM);
} }
/**
* Build embed sapi
*
* @throws RuntimeException
*/
public function buildEmbed(): void public function buildEmbed(): void
{ {
$vars = SystemUtil::makeEnvVarString([ $vars = SystemUtil::makeEnvVarString([

View File

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

View File

@ -21,9 +21,6 @@ class LinuxBuilder extends BuilderBase
/** @var array Tune cflags */ /** @var array Tune cflags */
public array $tune_c_flags; public array $tune_c_flags;
/** @var string pkg-config env, including PKG_CONFIG_PATH, PKG_CONFIG */
public string $pkgconf_env;
/** @var bool Micro patch phar flag */ /** @var bool Micro patch phar flag */
private bool $phar_patched = false; private bool $phar_patched = false;
@ -39,21 +36,33 @@ class LinuxBuilder extends BuilderBase
// ---------- set necessary options ---------- // ---------- set necessary options ----------
// set C/C++ compilers (default: alpine: gcc, others: musl-cross-make) // set C/C++ compilers (default: alpine: gcc, others: musl-cross-make)
if (SystemUtil::isMuslDist()) { if (SystemUtil::isMuslDist()) {
$this->setOptionIfNotExist('cc', 'gcc'); f_putenv("CC={$this->getOption('cc', 'gcc')}");
$this->setOptionIfNotExist('cxx', 'g++'); f_putenv("CXX={$this->getOption('cxx', 'g++')}");
$this->setOptionIfNotExist('ar', 'ar'); f_putenv("AR={$this->getOption('ar', 'ar')}");
$this->setOptionIfNotExist('ld', 'ld.gold'); f_putenv("LD={$this->getOption('ld', 'ld.gold')}");
$this->setOptionIfNotExist('library_path', '');
$this->setOptionIfNotExist('ld_library_path', '');
} else { } else {
$arch = arch2gnu(php_uname('m')); $arch = arch2gnu(php_uname('m'));
$this->setOptionIfNotExist('cc', "{$arch}-linux-musl-gcc"); f_putenv("CC={$this->getOption('cc', "{$arch}-linux-musl-gcc")}");
$this->setOptionIfNotExist('cxx', "{$arch}-linux-musl-g++"); f_putenv("CXX={$this->getOption('cxx', "{$arch}-linux-musl-g++")}");
$this->setOptionIfNotExist('ar', "{$arch}-linux-musl-ar"); f_putenv("AR={$this->getOption('ar', "{$arch}-linux-musl-ar")}");
$this->setOptionIfNotExist('ld', "/usr/local/musl/{$arch}-linux-musl/bin/ld.gold"); f_putenv("LD={$this->getOption('ld', "/usr/local/musl/{$arch}-linux-musl/bin/ld.gold")}");
f_putenv('PATH=/usr/local/musl/bin:/usr/local/musl/' . $arch . '-linux-musl/bin:' . BUILD_ROOT_PATH . '/bin:' . getenv('PATH'));
// set library path, some libraries need it. (We cannot use `putenv` here, because cmake will be confused)
$this->setOptionIfNotExist('library_path', "LIBRARY_PATH=/usr/local/musl/{$arch}-linux-musl/lib"); $this->setOptionIfNotExist('library_path', "LIBRARY_PATH=/usr/local/musl/{$arch}-linux-musl/lib");
$this->setOptionIfNotExist('ld_library_path', "LD_LIBRARY_PATH=/usr/local/musl/{$arch}-linux-musl/lib"); $this->setOptionIfNotExist('ld_library_path', "LD_LIBRARY_PATH=/usr/local/musl/{$arch}-linux-musl/lib");
// check musl-cross make installed if we use musl-cross-make
if (str_ends_with(getenv('CC'), 'linux-musl-gcc') && !file_exists("/usr/local/musl/bin/{$arch}-linux-musl-gcc")) {
throw new WrongUsageException('musl-cross-make not installed, please install it first. (You can use `doctor` command to install it)');
}
} }
// set PKG_CONFIG
f_putenv('PKG_CONFIG=' . BUILD_ROOT_PATH . '/bin/pkg-config');
// set PKG_CONFIG_PATH
f_putenv('PKG_CONFIG_PATH=' . BUILD_LIB_PATH . '/pkgconfig');
// set arch (default: current) // set arch (default: current)
$this->setOptionIfNotExist('arch', php_uname('m')); $this->setOptionIfNotExist('arch', php_uname('m'));
$this->setOptionIfNotExist('gnu-arch', arch2gnu($this->getOption('arch'))); $this->setOptionIfNotExist('gnu-arch', arch2gnu($this->getOption('arch')));
@ -61,32 +70,18 @@ class LinuxBuilder extends BuilderBase
// concurrency // concurrency
$this->concurrency = SystemUtil::getCpuCount(); $this->concurrency = SystemUtil::getCpuCount();
// cflags // cflags
$this->arch_c_flags = SystemUtil::getArchCFlags($this->getOption('cc'), $this->getOption('arch')); $this->arch_c_flags = SystemUtil::getArchCFlags(getenv('CC'), $this->getOption('arch'));
$this->arch_cxx_flags = SystemUtil::getArchCFlags($this->getOption('cxx'), $this->getOption('arch')); $this->arch_cxx_flags = SystemUtil::getArchCFlags(getenv('CXX'), $this->getOption('arch'));
$this->tune_c_flags = SystemUtil::checkCCFlags(SystemUtil::getTuneCFlags($this->getOption('arch')), $this->getOption('cc')); $this->tune_c_flags = SystemUtil::checkCCFlags(SystemUtil::getTuneCFlags($this->getOption('arch')), getenv('CC'));
// cmake toolchain // cmake toolchain
$this->cmake_toolchain_file = SystemUtil::makeCmakeToolchainFile( $this->cmake_toolchain_file = SystemUtil::makeCmakeToolchainFile(
'Linux', 'Linux',
$this->getOption('arch'), $this->getOption('arch'),
$this->arch_c_flags, $this->arch_c_flags,
$this->getOption('cc'), getenv('CC'),
$this->getOption('cxx'), getenv('CXX'),
); );
// pkg-config
$vars = [
'PKG_CONFIG' => BUILD_ROOT_PATH . '/bin/pkg-config',
'PKG_CONFIG_PATH' => BUILD_LIB_PATH . '/pkgconfig',
];
$this->pkgconf_env = SystemUtil::makeEnvVarString($vars);
// configure environment
$this->configure_env = SystemUtil::makeEnvVarString([
...$vars,
'CC' => $this->getOption('cc'),
'CXX' => $this->getOption('cxx'),
'AR' => $this->getOption('ar'),
'LD' => $this->getOption('ld'),
'PATH' => BUILD_ROOT_PATH . '/bin:' . getenv('PATH'),
]);
// cross-compiling is not supported yet // cross-compiling is not supported yet
/*if (php_uname('m') !== $this->arch) { /*if (php_uname('m') !== $this->arch) {
$this->cross_compile_prefix = SystemUtil::getCrossCompilePrefix($this->cc, $this->arch); $this->cross_compile_prefix = SystemUtil::getCrossCompilePrefix($this->cc, $this->arch);
@ -141,23 +136,19 @@ class LinuxBuilder extends BuilderBase
$extra_libs .= (empty($extra_libs) ? '' : ' ') . implode(' ', array_map(fn ($x) => "-Xcompiler {$x}", array_filter($this->getAllStaticLibFiles()))); $extra_libs .= (empty($extra_libs) ? '' : ' ') . implode(' ', array_map(fn ($x) => "-Xcompiler {$x}", array_filter($this->getAllStaticLibFiles())));
} }
// add libstdc++, some extensions or libraries need it // add libstdc++, some extensions or libraries need it
$extra_libs .= (empty($extra_libs) ? '' : ' ') . ($this->hasCppExtension() ? '-lstdc++ ' : ''); $extra_libs .= (empty($extra_libs) ? '' : ' ') . ($this->hasCpp() ? '-lstdc++ ' : '');
$this->setOption('extra-libs', $extra_libs); $this->setOption('extra-libs', $extra_libs);
$cflags = $this->arch_c_flags; $cflags = $this->arch_c_flags;
$use_lld = ''; $use_lld = '';
if (str_ends_with($this->getOption('cc'), 'clang') && SystemUtil::findCommand('lld')) { if (str_ends_with(getenv('CC'), 'clang') && SystemUtil::findCommand('lld')) {
$use_lld = '-Xcompiler -fuse-ld=lld'; $use_lld = '-Xcompiler -fuse-ld=lld';
} }
$envs = $this->pkgconf_env . ' ' . SystemUtil::makeEnvVarString([ // prepare build php envs
'CC' => $this->getOption('cc'), $envs_build_php = SystemUtil::makeEnvVarString([
'CXX' => $this->getOption('cxx'),
'AR' => $this->getOption('ar'),
'LD' => $this->getOption('ld'),
'CFLAGS' => $cflags, 'CFLAGS' => $cflags,
'LIBS' => '-ldl -lpthread', 'LIBS' => '-ldl -lpthread',
'PATH' => BUILD_ROOT_PATH . '/bin:' . getenv('PATH'),
]); ]);
SourcePatcher::patchBeforeBuildconf($this); SourcePatcher::patchBeforeBuildconf($this);
@ -185,7 +176,6 @@ class LinuxBuilder extends BuilderBase
shell()->cd(SOURCE_PATH . '/php-src') shell()->cd(SOURCE_PATH . '/php-src')
->exec( ->exec(
"{$this->getOption('ld_library_path')} " .
'./configure ' . './configure ' .
'--prefix= ' . '--prefix= ' .
'--with-valgrind=no ' . '--with-valgrind=no ' .
@ -203,7 +193,7 @@ class LinuxBuilder extends BuilderBase
$zts . $zts .
$maxExecutionTimers . $maxExecutionTimers .
$this->makeExtensionArgs() . ' ' . $this->makeExtensionArgs() . ' ' .
$envs $envs_build_php
); );
SourcePatcher::patchBeforeMake($this); SourcePatcher::patchBeforeMake($this);
@ -262,13 +252,14 @@ class LinuxBuilder extends BuilderBase
/** /**
* Build phpmicro sapi * Build phpmicro sapi
* *
* @throws RuntimeException
* @throws FileSystemException * @throws FileSystemException
* @throws RuntimeException
* @throws WrongUsageException
*/ */
public function buildMicro(string $use_lld, string $cflags): void public function buildMicro(string $use_lld, string $cflags): void
{ {
if ($this->getPHPVersionID() < 80000) { if ($this->getPHPVersionID() < 80000) {
throw new RuntimeException('phpmicro only support PHP >= 8.0!'); throw new WrongUsageException('phpmicro only support PHP >= 8.0!');
} }
if ($this->getExt('phar')) { if ($this->getExt('phar')) {
$this->phar_patched = true; $this->phar_patched = true;
@ -321,6 +312,11 @@ class LinuxBuilder extends BuilderBase
$this->deployBinary(BUILD_TARGET_FPM); $this->deployBinary(BUILD_TARGET_FPM);
} }
/**
* Build embed sapi
*
* @throws RuntimeException
*/
public function buildEmbed(string $use_lld): void public function buildEmbed(string $use_lld): void
{ {
$vars = SystemUtil::makeEnvVarString([ $vars = SystemUtil::makeEnvVarString([

View File

@ -33,15 +33,4 @@ abstract class LinuxLibraryBase extends LibraryBase
{ {
return $this->builder; return $this->builder;
} }
protected function makeFakePkgconfs(): void
{
$workspace = BUILD_ROOT_PATH;
if ($workspace === '/') {
$workspace = '';
}
foreach ($this->pkgconfs as $name => $content) {
file_put_contents(BUILD_LIB_PATH . "/pkgconfig/{$name}", "prefix={$workspace}\n" . $content);
}
}
} }

View File

@ -15,7 +15,7 @@ class icu extends LinuxLibraryBase
$ldflags = 'LDFLAGS="-static"'; $ldflags = 'LDFLAGS="-static"';
shell()->cd($this->source_dir . '/source') shell()->cd($this->source_dir . '/source')
->exec( ->exec(
"{$this->builder->configure_env} {$cppflags} {$cxxflags} {$ldflags} " . "{$cppflags} {$cxxflags} {$ldflags} " .
'./runConfigureICU Linux ' . './runConfigureICU Linux ' .
'--enable-static ' . '--enable-static ' .
'--disable-shared ' . '--disable-shared ' .

View File

@ -0,0 +1,50 @@
<?php
declare(strict_types=1);
namespace SPC\builder\linux\library;
use SPC\exception\RuntimeException;
class libffi extends LinuxLibraryBase
{
public const NAME = 'libffi';
/**
* @throws RuntimeException
*/
public function build(): void
{
[$lib, , $destdir] = SEPARATED_PATH;
/*$env = $this->builder->pkgconf_env . ' CFLAGS="' . $this->builder->arch_c_flags . '"';
$env .= match ($this->builder->libc) {
'musl_wrapper' => " CC='{$this->builder->getOption('cc')} --static -idirafter " . BUILD_INCLUDE_PATH .
($this->builder->getOption('arch') === php_uname('m') ? '-idirafter /usr/include/ ' : '') .
"-idirafter /usr/include/{$this->builder->getOption('arch')}-linux-gnu/'",
'musl', 'glibc' => " CC='{$this->builder->getOption('cc')}'",
default => throw new RuntimeException('unsupported libc: ' . $this->builder->libc),
};*/
shell()->cd($this->source_dir)
->exec(
'./configure ' .
'--enable-static ' .
'--disable-shared ' .
"--host={$this->builder->getOption('arch')}-unknown-linux " .
"--target={$this->builder->getOption('arch')}-unknown-linux " .
'--prefix= ' . // use prefix=/
"--libdir={$lib}"
)
->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');
unlink(BUILD_ROOT_PATH . '/lib64/libffi.a');
}
$this->patchPkgconfPrefix(['libffi.pc']);
}
}

View File

@ -66,7 +66,7 @@ class libpng extends LinuxLibraryBase
->exec('chmod +x ./configure') ->exec('chmod +x ./configure')
->exec('chmod +x ./install-sh') ->exec('chmod +x ./install-sh')
->exec( ->exec(
"{$this->builder->configure_env} ./configure " . './configure ' .
'--disable-shared ' . '--disable-shared ' .
'--enable-static ' . '--enable-static ' .
'--enable-hardware-optimizations ' . '--enable-hardware-optimizations ' .

View File

@ -25,7 +25,7 @@ class libxml2 extends LinuxLibraryBase
FileSystem::resetDir($this->source_dir . '/build'); FileSystem::resetDir($this->source_dir . '/build');
shell()->cd($this->source_dir . '/build') shell()->cd($this->source_dir . '/build')
->exec( ->exec(
"{$this->builder->configure_env} " . ' cmake ' . 'cmake ' .
"{$this->builder->makeCmakeArgs()} " . "{$this->builder->makeCmakeArgs()} " .
'-DBUILD_SHARED_LIBS=OFF ' . '-DBUILD_SHARED_LIBS=OFF ' .
'-DIconv_IS_BUILT_IN=OFF ' . '-DIconv_IS_BUILT_IN=OFF ' .

View File

@ -55,7 +55,7 @@ class nghttp2 extends LinuxLibraryBase
shell()->cd($this->source_dir) shell()->cd($this->source_dir)
->exec( ->exec(
"{$this->builder->configure_env} ./configure " . './configure ' .
'--enable-static ' . '--enable-static ' .
'--disable-shared ' . '--disable-shared ' .
"--host={$this->builder->getOption('gnu-arch')}-unknown-linux " . "--host={$this->builder->getOption('gnu-arch')}-unknown-linux " .

View File

@ -41,8 +41,8 @@ class openssl extends LinuxLibraryBase
$extra = ''; $extra = '';
$ex_lib = '-ldl -pthread'; $ex_lib = '-ldl -pthread';
$env = $this->builder->pkgconf_env . " CFLAGS='{$this->builder->arch_c_flags}'"; $env = "CFLAGS='{$this->builder->arch_c_flags}'";
$env .= " CC='{$this->builder->getOption('cc')} -static -idirafter " . BUILD_INCLUDE_PATH . $env .= " CC='" . getenv('CC') . ' -static -idirafter ' . BUILD_INCLUDE_PATH .
' -idirafter /usr/include/ ' . ' -idirafter /usr/include/ ' .
' -idirafter /usr/include/' . $this->builder->getOption('arch') . '-linux-gnu/ ' . ' -idirafter /usr/include/' . $this->builder->getOption('arch') . '-linux-gnu/ ' .
"' "; "' ";
@ -60,11 +60,11 @@ class openssl extends LinuxLibraryBase
$ex_lib = trim($ex_lib); $ex_lib = trim($ex_lib);
$clang_postfix = SystemUtil::getCCType($this->builder->getOption('cc')) === 'clang' ? '-clang' : ''; $clang_postfix = SystemUtil::getCCType(getenv('CC')) === 'clang' ? '-clang' : '';
shell()->cd($this->source_dir) shell()->cd($this->source_dir)
->exec( ->exec(
"{$this->builder->configure_env} {$env} ./Configure no-shared {$extra} " . "{$env} ./Configure no-shared {$extra} " .
'--prefix=/ ' . '--prefix=/ ' .
'--libdir=lib ' . '--libdir=lib ' .
'-static ' . '-static ' .

View File

@ -32,9 +32,16 @@ class MacOSBuilder extends BuilderBase
// ---------- set necessary options ---------- // ---------- set necessary options ----------
// set C Compiler (default: clang) // set C Compiler (default: clang)
$this->setOptionIfNotExist('cc', 'clang'); f_putenv('CC=' . $this->getOption('cc', 'clang'));
// set C++ Composer (default: clang++) // set C++ Composer (default: clang++)
$this->setOptionIfNotExist('cxx', 'clang++'); f_putenv('CXX=' . $this->getOption('cxx', 'clang++'));
// set PATH
f_putenv('PATH=' . BUILD_ROOT_PATH . '/bin:' . getenv('PATH'));
// set PKG_CONFIG
f_putenv('PKG_CONFIG=' . BUILD_ROOT_PATH . '/bin/pkg-config');
// set PKG_CONFIG_PATH
f_putenv('PKG_CONFIG_PATH=' . BUILD_LIB_PATH . '/pkgconfig/');
// set arch (default: current) // set arch (default: current)
$this->setOptionIfNotExist('arch', php_uname('m')); $this->setOptionIfNotExist('arch', php_uname('m'));
$this->setOptionIfNotExist('gnu-arch', arch2gnu($this->getOption('arch'))); $this->setOptionIfNotExist('gnu-arch', arch2gnu($this->getOption('arch')));
@ -47,15 +54,6 @@ class MacOSBuilder extends BuilderBase
$this->arch_cxx_flags = SystemUtil::getArchCFlags($this->getOption('arch')); $this->arch_cxx_flags = SystemUtil::getArchCFlags($this->getOption('arch'));
// cmake toolchain // cmake toolchain
$this->cmake_toolchain_file = SystemUtil::makeCmakeToolchainFile('Darwin', $this->getOption('arch'), $this->arch_c_flags); $this->cmake_toolchain_file = SystemUtil::makeCmakeToolchainFile('Darwin', $this->getOption('arch'), $this->arch_c_flags);
// configure environment
$this->configure_env = SystemUtil::makeEnvVarString([
'PKG_CONFIG' => BUILD_ROOT_PATH . '/bin/pkg-config',
'PKG_CONFIG_PATH' => BUILD_LIB_PATH . '/pkgconfig/',
'CC' => $this->getOption('cc'),
'CXX' => $this->getOption('cxx'),
'CFLAGS' => "{$this->arch_c_flags} -Wimplicit-function-declaration -Os",
'PATH' => BUILD_ROOT_PATH . '/bin:' . getenv('PATH'),
]);
// create pkgconfig and include dir (some libs cannot create them automatically) // create pkgconfig and include dir (some libs cannot create them automatically)
f_mkdir(BUILD_LIB_PATH . '/pkgconfig', recursive: true); f_mkdir(BUILD_LIB_PATH . '/pkgconfig', recursive: true);
@ -134,7 +132,7 @@ class MacOSBuilder extends BuilderBase
// add macOS frameworks // add macOS frameworks
$extra_libs .= (empty($extra_libs) ? '' : ' ') . $this->getFrameworks(true); $extra_libs .= (empty($extra_libs) ? '' : ' ') . $this->getFrameworks(true);
// add libc++, some extensions or libraries need it (C++ cannot be linked statically) // add libc++, some extensions or libraries need it (C++ cannot be linked statically)
$extra_libs .= (empty($extra_libs) ? '' : ' ') . ($this->hasCppExtension() ? '-lc++ ' : ''); $extra_libs .= (empty($extra_libs) ? '' : ' ') . ($this->hasCpp() ? '-lc++ ' : '');
if (!$this->getOption('bloat', false)) { if (!$this->getOption('bloat', false)) {
$extra_libs .= (empty($extra_libs) ? '' : ' ') . implode(' ', $this->getAllStaticLibFiles()); $extra_libs .= (empty($extra_libs) ? '' : ' ') . implode(' ', $this->getAllStaticLibFiles());
} else { } else {
@ -174,8 +172,7 @@ class MacOSBuilder extends BuilderBase
($enableMicro ? '--enable-micro ' : '--disable-micro ') . ($enableMicro ? '--enable-micro ' : '--disable-micro ') .
$json_74 . $json_74 .
$zts . $zts .
$this->makeExtensionArgs() . ' ' . $this->makeExtensionArgs()
$this->configure_env
); );
SourcePatcher::patchBeforeMake($this); SourcePatcher::patchBeforeMake($this);
@ -231,12 +228,14 @@ class MacOSBuilder extends BuilderBase
/** /**
* Build phpmicro sapi * Build phpmicro sapi
* *
* @throws FileSystemException|RuntimeException * @throws FileSystemException
* @throws RuntimeException
* @throws WrongUsageException
*/ */
public function buildMicro(): void public function buildMicro(): void
{ {
if ($this->getPHPVersionID() < 80000) { if ($this->getPHPVersionID() < 80000) {
throw new RuntimeException('phpmicro only support PHP >= 8.0!'); throw new WrongUsageException('phpmicro only support PHP >= 8.0!');
} }
if ($this->getExt('phar')) { if ($this->getExt('phar')) {
$this->phar_patched = true; $this->phar_patched = true;
@ -285,6 +284,11 @@ class MacOSBuilder extends BuilderBase
$this->deployBinary(BUILD_TARGET_FPM); $this->deployBinary(BUILD_TARGET_FPM);
} }
/**
* Build embed sapi
*
* @throws RuntimeException
*/
public function buildEmbed(): void public function buildEmbed(): void
{ {
$vars = SystemUtil::makeEnvVarString([ $vars = SystemUtil::makeEnvVarString([

View File

@ -19,7 +19,7 @@ class glfw extends MacOSLibraryBase
{ {
// compile // compile
shell()->cd(SOURCE_PATH . '/ext-glfw/vendor/glfw') shell()->cd(SOURCE_PATH . '/ext-glfw/vendor/glfw')
->exec("{$this->builder->configure_env} cmake . {$this->builder->makeCmakeArgs()} -DBUILD_SHARED_LIBS=OFF -DGLFW_BUILD_EXAMPLES=OFF -DGLFW_BUILD_TESTS=OFF") ->exec("cmake . {$this->builder->makeCmakeArgs()} -DBUILD_SHARED_LIBS=OFF -DGLFW_BUILD_EXAMPLES=OFF -DGLFW_BUILD_TESTS=OFF")
->exec("make -j{$this->builder->concurrency}") ->exec("make -j{$this->builder->concurrency}")
->exec('make install DESTDIR=' . BUILD_ROOT_PATH); ->exec('make install DESTDIR=' . BUILD_ROOT_PATH);
// patch pkgconf // patch pkgconf

View File

@ -12,7 +12,7 @@ class icu extends MacOSLibraryBase
{ {
$root = BUILD_ROOT_PATH; $root = BUILD_ROOT_PATH;
shell()->cd($this->source_dir . '/source') shell()->cd($this->source_dir . '/source')
->exec("{$this->builder->configure_env} ./runConfigureICU MacOSX --enable-static --disable-shared --prefix={$root}") ->exec("./runConfigureICU MacOSX --enable-static --disable-shared --prefix={$root}")
->exec('make clean') ->exec('make clean')
->exec("make -j{$this->builder->concurrency}") ->exec("make -j{$this->builder->concurrency}")
->exec('make install'); ->exec('make install');

View File

@ -20,7 +20,7 @@ class libffi extends MacOSLibraryBase
[, , $destdir] = SEPARATED_PATH; [, , $destdir] = SEPARATED_PATH;
shell()->cd($this->source_dir) shell()->cd($this->source_dir)
->exec( ->exec(
"{$this->builder->configure_env} ./configure " . './configure ' .
'--enable-static ' . '--enable-static ' .
'--disable-shared ' . '--disable-shared ' .
"--host={$this->builder->getOption('arch')}-apple-darwin " . "--host={$this->builder->getOption('arch')}-apple-darwin " .

View File

@ -18,7 +18,7 @@ class libmemcached extends MacOSLibraryBase
shell()->cd($this->source_dir) shell()->cd($this->source_dir)
->exec('chmod +x configure') ->exec('chmod +x configure')
->exec( ->exec(
"{$this->builder->configure_env} ./configure " . './configure ' .
'--enable-static --disable-shared ' . '--enable-static --disable-shared ' .
'--disable-sasl ' . '--disable-sasl ' .
"--prefix={$rootdir}" "--prefix={$rootdir}"

View File

@ -44,7 +44,7 @@ class libpng extends MacOSLibraryBase
->exec('chmod +x ./configure') ->exec('chmod +x ./configure')
->exec('chmod +x ./install-sh') ->exec('chmod +x ./install-sh')
->exec( ->exec(
"{$this->builder->configure_env} ./configure " . './configure ' .
"--host={$this->builder->getOption('gnu-arch')}-apple-darwin " . "--host={$this->builder->getOption('gnu-arch')}-apple-darwin " .
'--disable-shared ' . '--disable-shared ' .
'--enable-static ' . '--enable-static ' .

View File

@ -25,7 +25,7 @@ class libxml2 extends MacOSLibraryBase
FileSystem::resetDir($this->source_dir . '/build'); FileSystem::resetDir($this->source_dir . '/build');
shell()->cd($this->source_dir . '/build') shell()->cd($this->source_dir . '/build')
->exec( ->exec(
"{$this->builder->configure_env} " . ' cmake ' . 'cmake ' .
// '--debug-find ' . // '--debug-find ' .
"{$this->builder->makeCmakeArgs()} " . "{$this->builder->makeCmakeArgs()} " .
'-DBUILD_SHARED_LIBS=OFF ' . '-DBUILD_SHARED_LIBS=OFF ' .

View File

@ -53,7 +53,7 @@ class nghttp2 extends MacOSLibraryBase
shell()->cd($this->source_dir) shell()->cd($this->source_dir)
->exec( ->exec(
"{$this->builder->configure_env} " . ' ./configure ' . './configure ' .
'--enable-static ' . '--enable-static ' .
'--disable-shared ' . '--disable-shared ' .
"--host={$this->builder->getOption('gnu-arch')}-apple-darwin " . "--host={$this->builder->getOption('gnu-arch')}-apple-darwin " .

View File

@ -48,7 +48,7 @@ class openssl extends MacOSLibraryBase
shell()->cd($this->source_dir) shell()->cd($this->source_dir)
->exec( ->exec(
"{$this->builder->configure_env} ./Configure no-shared {$extra} " . "./Configure no-shared {$extra} " .
'--prefix=/ ' . // use prefix=/ '--prefix=/ ' . // use prefix=/
"--libdir={$lib} " . "--libdir={$lib} " .
'--openssldir=/System/Library/OpenSSL ' . '--openssldir=/System/Library/OpenSSL ' .

View File

@ -21,9 +21,6 @@ trait UnixBuilderTrait
/** @var string cmake toolchain file */ /** @var string cmake toolchain file */
public string $cmake_toolchain_file; public string $cmake_toolchain_file;
/** @var string configure environments */
public string $configure_env;
/** /**
* @throws WrongUsageException * @throws WrongUsageException
* @throws FileSystemException * @throws FileSystemException
@ -145,7 +142,7 @@ trait UnixBuilderTrait
*/ */
public function makeCmakeArgs(): string public function makeCmakeArgs(): string
{ {
$extra = $this instanceof LinuxBuilder ? '-DCMAKE_C_COMPILER=' . $this->getOption('cc') . ' ' : ''; $extra = $this instanceof LinuxBuilder ? '-DCMAKE_C_COMPILER=' . getenv('CC') . ' ' : '';
return $extra . return $extra .
'-DCMAKE_BUILD_TYPE=Release ' . '-DCMAKE_BUILD_TYPE=Release ' .
'-DCMAKE_INSTALL_PREFIX=/ ' . '-DCMAKE_INSTALL_PREFIX=/ ' .

View File

@ -19,7 +19,7 @@ trait brotli
FileSystem::resetDir($this->source_dir . '/build-dir'); FileSystem::resetDir($this->source_dir . '/build-dir');
shell()->cd($this->source_dir . '/build-dir') shell()->cd($this->source_dir . '/build-dir')
->exec( ->exec(
$this->builder->configure_env . ' cmake ' . 'cmake ' .
"{$this->builder->makeCmakeArgs()} " . "{$this->builder->makeCmakeArgs()} " .
'-DBUILD_SHARED_LIBS=OFF ' . '-DBUILD_SHARED_LIBS=OFF ' .
'..' '..'

View File

@ -9,8 +9,8 @@ trait bzip2
protected function build(): void protected function build(): void
{ {
shell()->cd($this->source_dir) shell()->cd($this->source_dir)
->exec("make {$this->builder->configure_env} PREFIX='" . BUILD_ROOT_PATH . "' clean") ->exec("make PREFIX='" . BUILD_ROOT_PATH . "' clean")
->exec("make -j{$this->builder->concurrency} {$this->builder->configure_env} PREFIX='" . BUILD_ROOT_PATH . "' libbz2.a") ->exec("make -j{$this->builder->concurrency} PREFIX='" . BUILD_ROOT_PATH . "' libbz2.a")
->exec('cp libbz2.a ' . BUILD_LIB_PATH) ->exec('cp libbz2.a ' . BUILD_LIB_PATH)
->exec('cp bzlib.h ' . BUILD_INCLUDE_PATH); ->exec('cp bzlib.h ' . BUILD_INCLUDE_PATH);
} }

View File

@ -52,7 +52,7 @@ trait curl
// compile // compile
shell()->cd($this->source_dir . '/build') shell()->cd($this->source_dir . '/build')
->exec('sed -i.save s@\${CMAKE_C_IMPLICIT_LINK_LIBRARIES}@@ ../CMakeLists.txt') ->exec('sed -i.save s@\${CMAKE_C_IMPLICIT_LINK_LIBRARIES}@@ ../CMakeLists.txt')
->exec("{$this->builder->configure_env} cmake {$this->builder->makeCmakeArgs()} -DBUILD_SHARED_LIBS=OFF -DBUILD_CURL_EXE=OFF {$extra} ..") ->exec("cmake {$this->builder->makeCmakeArgs()} -DBUILD_SHARED_LIBS=OFF -DBUILD_CURL_EXE=OFF {$extra} ..")
->exec("make -j{$this->builder->concurrency}") ->exec("make -j{$this->builder->concurrency}")
->exec('make install DESTDIR=' . BUILD_ROOT_PATH); ->exec('make install DESTDIR=' . BUILD_ROOT_PATH);
// patch pkgconf // patch pkgconf

View File

@ -27,7 +27,7 @@ trait freetype
shell()->cd($this->source_dir) shell()->cd($this->source_dir)
->exec( ->exec(
"{$this->builder->configure_env} ./configure " . './configure ' .
'--enable-static --disable-shared --without-harfbuzz --prefix= ' . '--enable-static --disable-shared --without-harfbuzz --prefix= ' .
$suggested $suggested
) )

View File

@ -17,7 +17,7 @@ trait gmp
{ {
shell()->cd($this->source_dir) shell()->cd($this->source_dir)
->exec( ->exec(
"{$this->builder->configure_env} ./configure " . './configure ' .
'--enable-static --disable-shared ' . '--enable-static --disable-shared ' .
'--prefix=' '--prefix='
) )

View File

@ -5,6 +5,7 @@ declare(strict_types=1);
namespace SPC\builder\unix\library; namespace SPC\builder\unix\library;
use SPC\builder\linux\library\LinuxLibraryBase; use SPC\builder\linux\library\LinuxLibraryBase;
use SPC\builder\linux\LinuxBuilder;
use SPC\exception\FileSystemException; use SPC\exception\FileSystemException;
use SPC\exception\RuntimeException; use SPC\exception\RuntimeException;
use SPC\store\FileSystem; use SPC\store\FileSystem;
@ -17,7 +18,8 @@ trait imagemagick
*/ */
protected function build(): void protected function build(): void
{ {
$extra = '--without-jxl --without-x --disable-openmp '; // TODO: imagemagick build with bzip2 failed with bugs, we need to fix it in the future
$extra = '--without-jxl --without-x --disable-openmp --without-bzlib ';
$required_libs = ''; $required_libs = '';
$optional_libs = [ $optional_libs = [
'libzip' => 'zip', 'libzip' => 'zip',
@ -26,6 +28,7 @@ trait imagemagick
'libwebp' => 'webp', 'libwebp' => 'webp',
'libxml2' => 'xml', 'libxml2' => 'xml',
'zlib' => 'zlib', 'zlib' => 'zlib',
'xz' => 'lzma',
'zstd' => 'zstd', 'zstd' => 'zstd',
'freetype' => 'freetype', 'freetype' => 'freetype',
]; ];
@ -38,8 +41,7 @@ trait imagemagick
shell()->cd($this->source_dir) shell()->cd($this->source_dir)
->exec( ->exec(
"{$this->builder->configure_env} " . ($this->builder instanceof LinuxBuilder ? ('LDFLAGS="-static -L' . BUILD_LIB_PATH . '" ') : '') .
'LDFLAGS="-static" ' .
"LIBS='{$required_libs}' " . "LIBS='{$required_libs}' " .
'./configure ' . './configure ' .
'--enable-static --disable-shared ' . '--enable-static --disable-shared ' .

View File

@ -17,7 +17,6 @@ trait ldap
$alt .= $this->builder->getLib('libsodium') ? '--with-argon2=libsodium ' : ''; $alt .= $this->builder->getLib('libsodium') ? '--with-argon2=libsodium ' : '';
shell()->cd($this->source_dir) shell()->cd($this->source_dir)
->exec( ->exec(
$this->builder->configure_env . ' ' .
$this->builder->makeAutoconfFlags(AUTOCONF_LDFLAGS | AUTOCONF_CPPFLAGS) . $this->builder->makeAutoconfFlags(AUTOCONF_LDFLAGS | AUTOCONF_CPPFLAGS) .
' ./configure ' . ' ./configure ' .
'--enable-static ' . '--enable-static ' .

View File

@ -22,12 +22,7 @@ trait libavif
FileSystem::resetDir($this->source_dir . '/build'); FileSystem::resetDir($this->source_dir . '/build');
// Start build // Start build
shell()->cd($this->source_dir . '/build') shell()->cd($this->source_dir . '/build')
->exec( ->exec("cmake {$this->builder->makeCmakeArgs()} -DBUILD_SHARED_LIBS=OFF ..")
"{$this->builder->configure_env} cmake " .
$this->builder->makeCmakeArgs() . ' ' .
'-DBUILD_SHARED_LIBS=OFF ' .
'..'
)
->exec("cmake --build . -j {$this->builder->concurrency}") ->exec("cmake --build . -j {$this->builder->concurrency}")
->exec('make install DESTDIR=' . BUILD_ROOT_PATH); ->exec('make install DESTDIR=' . BUILD_ROOT_PATH);
// patch pkgconfig // patch pkgconfig

View File

@ -21,7 +21,7 @@ trait libevent
// Start build // Start build
shell()->cd($this->source_dir . '/build') shell()->cd($this->source_dir . '/build')
->exec( ->exec(
"{$this->builder->configure_env} cmake " . 'cmake ' .
'-DCMAKE_INSTALL_PREFIX=' . BUILD_ROOT_PATH . ' ' . '-DCMAKE_INSTALL_PREFIX=' . BUILD_ROOT_PATH . ' ' .
"-DCMAKE_TOOLCHAIN_FILE={$this->builder->cmake_toolchain_file} " . "-DCMAKE_TOOLCHAIN_FILE={$this->builder->cmake_toolchain_file} " .
'-DCMAKE_BUILD_TYPE=Release ' . '-DCMAKE_BUILD_TYPE=Release ' .

View File

@ -12,7 +12,7 @@ trait libiconv
shell()->cd($this->source_dir) shell()->cd($this->source_dir)
->exec( ->exec(
"{$this->builder->configure_env} ./configure " . './configure ' .
'--enable-static ' . '--enable-static ' .
'--disable-shared ' . '--disable-shared ' .
'--prefix=' '--prefix='

View File

@ -23,7 +23,7 @@ trait libjpeg
// Start build // Start build
shell()->cd($this->source_dir . '/build') shell()->cd($this->source_dir . '/build')
->exec( ->exec(
"{$this->builder->configure_env} cmake {$this->builder->makeCmakeArgs()} " . "cmake {$this->builder->makeCmakeArgs()} " .
'-DENABLE_STATIC=ON ' . '-DENABLE_STATIC=ON ' .
'-DENABLE_SHARED=OFF ' . '-DENABLE_SHARED=OFF ' .
'..' '..'

View File

@ -10,7 +10,7 @@ trait libsodium
{ {
$root = BUILD_ROOT_PATH; $root = BUILD_ROOT_PATH;
shell()->cd($this->source_dir) shell()->cd($this->source_dir)
->exec("{$this->builder->configure_env} ./configure --enable-static --disable-shared --prefix={$root}") ->exec("./configure --enable-static --disable-shared --prefix={$root}")
->exec('make clean') ->exec('make clean')
->exec("make -j{$this->builder->concurrency}") ->exec("make -j{$this->builder->concurrency}")
->exec('make install'); ->exec('make install');

View File

@ -21,7 +21,7 @@ trait libssh2
FileSystem::resetDir($this->source_dir . '/build'); FileSystem::resetDir($this->source_dir . '/build');
shell()->cd($this->source_dir . '/build') shell()->cd($this->source_dir . '/build')
->exec( ->exec(
"{$this->builder->configure_env} " . ' cmake ' . 'cmake ' .
"{$this->builder->makeCmakeArgs()} " . "{$this->builder->makeCmakeArgs()} " .
'-DBUILD_SHARED_LIBS=OFF ' . '-DBUILD_SHARED_LIBS=OFF ' .
'-DBUILD_EXAMPLES=OFF ' . '-DBUILD_EXAMPLES=OFF ' .

View File

@ -23,7 +23,7 @@ trait libwebp
// Start build // Start build
shell()->cd($this->source_dir . '/build') shell()->cd($this->source_dir . '/build')
->exec( ->exec(
"{$this->builder->configure_env} cmake " . 'cmake ' .
$this->builder->makeCmakeArgs() . ' ' . $this->builder->makeCmakeArgs() . ' ' .
'-DBUILD_SHARED_LIBS=OFF ' . '-DBUILD_SHARED_LIBS=OFF ' .
'-DWEBP_BUILD_EXTRAS=ON ' . '-DWEBP_BUILD_EXTRAS=ON ' .

View File

@ -26,7 +26,6 @@ trait libxslt
} }
shell()->cd($this->source_dir) shell()->cd($this->source_dir)
->exec( ->exec(
"{$this->builder->configure_env} " .
'CFLAGS="-I' . BUILD_INCLUDE_PATH . '" ' . 'CFLAGS="-I' . BUILD_INCLUDE_PATH . '" ' .
"{$this->builder->getOption('library_path')} " . "{$this->builder->getOption('library_path')} " .
"{$this->builder->getOption('ld_library_path')} " . "{$this->builder->getOption('ld_library_path')} " .

View File

@ -60,7 +60,7 @@ EOF
FileSystem::resetDir($this->source_dir . '/build'); FileSystem::resetDir($this->source_dir . '/build');
shell()->cd($this->source_dir . '/build') shell()->cd($this->source_dir . '/build')
->exec( ->exec(
"{$this->builder->configure_env} cmake " . 'cmake ' .
// '--debug-find ' . // '--debug-find ' .
'-DCMAKE_BUILD_TYPE=Release ' . '-DCMAKE_BUILD_TYPE=Release ' .
'-DBUILD_TESTING=OFF ' . '-DBUILD_TESTING=OFF ' .

View File

@ -29,7 +29,7 @@ trait libzip
FileSystem::resetDir($this->source_dir . '/build'); FileSystem::resetDir($this->source_dir . '/build');
shell()->cd($this->source_dir . '/build') shell()->cd($this->source_dir . '/build')
->exec( ->exec(
"{$this->builder->configure_env} " . ' cmake ' . 'cmake ' .
"{$this->builder->makeCmakeArgs()} " . "{$this->builder->makeCmakeArgs()} " .
'-DENABLE_GNUTLS=OFF ' . '-DENABLE_GNUTLS=OFF ' .
'-DENABLE_MBEDTLS=OFF ' . '-DENABLE_MBEDTLS=OFF ' .

View File

@ -10,7 +10,7 @@ trait ncurses
{ {
shell()->cd($this->source_dir) shell()->cd($this->source_dir)
->exec( ->exec(
"{$this->builder->configure_env} ./configure " . './configure ' .
'--enable-static ' . '--enable-static ' .
'--disable-shared ' . '--disable-shared ' .
'--enable-overwrite ' . '--enable-overwrite ' .

View File

@ -18,12 +18,7 @@ trait onig
[,,$destdir] = SEPARATED_PATH; [,,$destdir] = SEPARATED_PATH;
shell()->cd($this->source_dir) shell()->cd($this->source_dir)
->exec( ->exec('./configure --enable-static --disable-shared --prefix=')
"{$this->builder->configure_env} " . ' ./configure ' .
'--enable-static ' .
'--disable-shared ' .
'--prefix='
)
->exec('make clean') ->exec('make clean')
->exec("make -j{$this->builder->concurrency}") ->exec("make -j{$this->builder->concurrency}")
->exec("make install DESTDIR={$destdir}"); ->exec("make install DESTDIR={$destdir}");

View File

@ -8,13 +8,8 @@ trait pkgconfig
{ {
protected function build(): void protected function build(): void
{ {
$macos_env = 'PKG_CONFIG_PATH="' . BUILD_LIB_PATH . '/pkgconfig/" ' . $macos_env = "CFLAGS='{$this->builder->arch_c_flags} -Wimplicit-function-declaration' ";
"CC='{$this->builder->getOption('cc')}' " . $linux_env = 'LDFLAGS=--static ';
"CXX='{$this->builder->getOption('cxx')}' " .
"CFLAGS='{$this->builder->arch_c_flags} -Wimplicit-function-declaration' ";
$linux_env = 'PKG_CONFIG_PATH="' . BUILD_LIB_PATH . '/pkgconfig" ' .
"CC='{$this->builder->getOption('cc')}' " .
"CXX='{$this->builder->getOption('cxx')}' ";
shell()->cd($this->source_dir) shell()->cd($this->source_dir)
->exec( ->exec(

View File

@ -18,8 +18,7 @@ trait postgresql
protected function build(): void protected function build(): void
{ {
$builddir = BUILD_ROOT_PATH; $builddir = BUILD_ROOT_PATH;
$env = $this->builder->configure_env; $envs = '';
$envs = $env;
$packages = 'openssl zlib readline libxml-2.0 zlib'; $packages = 'openssl zlib readline libxml-2.0 zlib';
$optional_packages = [ $optional_packages = [
'zstd' => 'libzstd', 'zstd' => 'libzstd',
@ -34,18 +33,17 @@ trait postgresql
} }
} }
$pkgconfig_executable = $builddir . '/bin/pkg-config'; $output = shell()->execWithResult("pkg-config --cflags-only-I --static {$packages}");
$output = shell()->execWithResult($env . " {$pkgconfig_executable} --cflags-only-I --static " . $packages);
if (!empty($output[1][0])) { if (!empty($output[1][0])) {
$cppflags = $output[1][0]; $cppflags = $output[1][0];
$envs .= " CPPFLAGS=\"{$cppflags}\""; $envs .= " CPPFLAGS=\"{$cppflags}\"";
} }
$output = shell()->execWithResult($env . " {$pkgconfig_executable} --libs-only-L --static " . $packages); $output = shell()->execWithResult("pkg-config --libs-only-L --static {$packages}");
if (!empty($output[1][0])) { if (!empty($output[1][0])) {
$ldflags = $output[1][0]; $ldflags = $output[1][0];
$envs .= $this instanceof MacOSLibraryBase ? " LDFLAGS=\"{$ldflags}\" " : " LDFLAGS=\"{$ldflags} -static\" "; $envs .= $this instanceof MacOSLibraryBase ? " LDFLAGS=\"{$ldflags}\" " : " LDFLAGS=\"{$ldflags} -static\" ";
} }
$output = shell()->execWithResult($env . " {$pkgconfig_executable} --libs-only-l --static " . $packages); $output = shell()->execWithResult("pkg-config --libs-only-l --static {$packages}");
if (!empty($output[1][0])) { if (!empty($output[1][0])) {
$libs = $output[1][0]; $libs = $output[1][0];
$envs .= " LIBS=\"{$libs} -lstdc++\" "; $envs .= " LIBS=\"{$libs} -lstdc++\" ";

View File

@ -17,7 +17,7 @@ trait readline
{ {
shell()->cd($this->source_dir) shell()->cd($this->source_dir)
->exec( ->exec(
"{$this->builder->configure_env} ./configure " . './configure ' .
'--enable-static=yes ' . '--enable-static=yes ' .
'--enable-shared=no ' . '--enable-shared=no ' .
'--prefix= ' . '--prefix= ' .

View File

@ -20,7 +20,7 @@ trait snappy
shell()->cd($this->source_dir . '/cmake/build') shell()->cd($this->source_dir . '/cmake/build')
->exec( ->exec(
"{$this->builder->configure_env} cmake " . 'cmake ' .
"-DCMAKE_TOOLCHAIN_FILE={$this->builder->cmake_toolchain_file} " . "-DCMAKE_TOOLCHAIN_FILE={$this->builder->cmake_toolchain_file} " .
"{$this->builder->makeCmakeArgs()} " . "{$this->builder->makeCmakeArgs()} " .
'-DSNAPPY_BUILD_TESTS=OFF ' . '-DSNAPPY_BUILD_TESTS=OFF ' .

View File

@ -9,7 +9,7 @@ trait sqlite
protected function build(): void protected function build(): void
{ {
shell()->cd($this->source_dir) shell()->cd($this->source_dir)
->exec("{$this->builder->configure_env} ./configure --enable-static --disable-shared --prefix=") ->exec('./configure --enable-static --disable-shared --prefix=')
->exec('make clean') ->exec('make clean')
->exec("make -j{$this->builder->concurrency}") ->exec("make -j{$this->builder->concurrency}")
->exec('make install DESTDIR=' . BUILD_ROOT_PATH); ->exec('make install DESTDIR=' . BUILD_ROOT_PATH);

View File

@ -17,7 +17,7 @@ trait xz
{ {
shell()->cd($this->source_dir) shell()->cd($this->source_dir)
->exec( ->exec(
"{$this->builder->configure_env} ./configure " . './configure ' .
'--enable-static ' . '--enable-static ' .
'--disable-shared ' . '--disable-shared ' .
"--host={$this->builder->getOption('gnu-arch')}-unknown-linux " . "--host={$this->builder->getOption('gnu-arch')}-unknown-linux " .

View File

@ -18,7 +18,7 @@ trait zlib
[,,$destdir] = SEPARATED_PATH; [,,$destdir] = SEPARATED_PATH;
shell()->cd($this->source_dir) shell()->cd($this->source_dir)
->exec("{$this->builder->configure_env} ./configure --static --prefix=") ->exec('./configure --static --prefix=')
->exec('make clean') ->exec('make clean')
->exec("make -j{$this->builder->concurrency}") ->exec("make -j{$this->builder->concurrency}")
->exec("make install DESTDIR={$destdir}"); ->exec("make install DESTDIR={$destdir}");

View File

@ -19,7 +19,7 @@ trait zstd
FileSystem::resetDir($this->source_dir . '/build/cmake/build'); FileSystem::resetDir($this->source_dir . '/build/cmake/build');
shell()->cd($this->source_dir . '/build/cmake/build') shell()->cd($this->source_dir . '/build/cmake/build')
->exec( ->exec(
"{$this->builder->configure_env} cmake " . 'cmake ' .
"{$this->builder->makeCmakeArgs()} " . "{$this->builder->makeCmakeArgs()} " .
'-DZSTD_BUILD_STATIC=ON ' . '-DZSTD_BUILD_STATIC=ON ' .
'-DZSTD_BUILD_SHARED=OFF ' . '-DZSTD_BUILD_SHARED=OFF ' .

View File

@ -19,11 +19,11 @@ abstract class BuildCommand extends BaseCommand
$this->addOption('arch', null, InputOption::VALUE_REQUIRED, 'architecture, "x64" or "arm64"', 'x64'); $this->addOption('arch', null, InputOption::VALUE_REQUIRED, 'architecture, "x64" or "arm64"', 'x64');
break; break;
case 'Linux': case 'Linux':
$this->addOption('no-system-static', null, null, 'do not use system static libraries');
// no break
case 'Darwin': case 'Darwin':
$this->addOption('cc', null, InputOption::VALUE_REQUIRED, 'C compiler'); $this->addOption('cc', null, InputOption::VALUE_REQUIRED, 'C compiler');
$this->addOption('cxx', null, InputOption::VALUE_REQUIRED, 'C++ compiler'); $this->addOption('cxx', null, InputOption::VALUE_REQUIRED, 'C++ compiler');
$this->addOption('ar', null, InputOption::VALUE_REQUIRED, 'ar');
$this->addOption('ld', null, InputOption::VALUE_REQUIRED, 'ld');
$this->addOption('arch', null, InputOption::VALUE_REQUIRED, 'architecture', php_uname('m')); $this->addOption('arch', null, InputOption::VALUE_REQUIRED, 'architecture', php_uname('m'));
break; break;
} }