2025-06-28 16:36:05 +08:00
< ? php
declare ( strict_types = 1 );
2025-06-29 16:00:17 +08:00
namespace SPC\toolchain ;
2025-06-28 16:36:05 +08:00
2025-08-06 20:43:23 +08:00
use SPC\exception\EnvironmentException ;
2025-06-28 16:36:05 +08:00
use SPC\util\GlobalEnvManager ;
class MuslToolchain implements ToolchainInterface
{
2025-06-29 16:00:17 +08:00
public function initEnv () : void
2025-06-28 16:36:05 +08:00
{
$arch = getenv ( 'GNU_ARCH' );
// Set environment variables for musl toolchain
GlobalEnvManager :: putenv ( " SPC_LINUX_DEFAULT_CC= { $arch } -linux-musl-gcc " );
GlobalEnvManager :: putenv ( " SPC_LINUX_DEFAULT_CXX= { $arch } -linux-musl-g++ " );
GlobalEnvManager :: putenv ( " SPC_LINUX_DEFAULT_AR= { $arch } -linux-musl-ar " );
2026-05-07 10:29:12 +07:00
GlobalEnvManager :: putenv ( " SPC_LINUX_DEFAULT_RANLIB= { $arch } -linux-musl-ranlib " );
2025-06-28 16:36:05 +08:00
GlobalEnvManager :: putenv ( " SPC_LINUX_DEFAULT_LD= { $arch } -linux-musl-ld " );
GlobalEnvManager :: addPathIfNotExists ( '/usr/local/musl/bin' );
GlobalEnvManager :: addPathIfNotExists ( " /usr/local/musl/ { $arch } -linux-musl/bin " );
2025-07-01 14:01:48 +07:00
GlobalEnvManager :: putenv ( " SPC_LD_LIBRARY_PATH=/usr/local/musl/lib:/usr/local/musl/ { $arch } -linux-musl/lib " );
GlobalEnvManager :: putenv ( " SPC_LIBRARY_PATH=/usr/local/musl/lib:/usr/local/musl/ { $arch } -linux-musl/lib " );
2025-06-28 16:36:05 +08:00
}
2025-06-29 16:00:17 +08:00
public function afterInit () : void
2025-06-28 16:36:05 +08:00
{
$arch = getenv ( 'GNU_ARCH' );
// append LD_LIBRARY_PATH to $configure = getenv('SPC_CMD_PREFIX_PHP_CONFIGURE');
$configure = getenv ( 'SPC_CMD_PREFIX_PHP_CONFIGURE' );
2025-07-01 14:01:48 +07:00
$ld_library_path = getenv ( 'SPC_LD_LIBRARY_PATH' );
2025-06-28 16:36:05 +08:00
GlobalEnvManager :: putenv ( " SPC_CMD_PREFIX_PHP_CONFIGURE=LD_LIBRARY_PATH= \" { $ld_library_path } \" { $configure } " );
if ( ! file_exists ( " /usr/local/musl/ { $arch } -linux-musl/lib/libc.a " )) {
2025-08-06 20:43:23 +08:00
throw new EnvironmentException ( 'You are building with musl-libc target in glibc distro, but musl-toolchain is not installed, please install musl-toolchain first. (You can use `doctor` command to install it)' );
2025-06-28 16:36:05 +08:00
}
}
2025-08-01 12:48:48 +08:00
public function getCompilerInfo () : ? string
{
$compiler = getenv ( 'CC' ) ? : getenv ( 'SPC_LINUX_DEFAULT_CC' );
$version = shell ( false ) -> execWithResult ( " { $compiler } --version " , false );
$head = pathinfo ( $compiler , PATHINFO_BASENAME );
if ( $version [ 0 ] === 0 && preg_match ( '/linux-musl-cc.*(\d+.\d+.\d+)/' , $version [ 1 ][ 0 ], $match )) {
return " { $head } { $match [ 1 ] } " ;
}
return $head ;
}
2025-06-28 16:36:05 +08:00
}