From 96ab2de4b1dd53395867bf2c339e26f6acd87378 Mon Sep 17 00:00:00 2001 From: Kevin Boyd Date: Thu, 28 May 2026 22:38:56 -0700 Subject: [PATCH] Add preliminary MacPorts support --- src/Package/Library/unixodbc.php | 4 +- src/StaticPHP/Doctor/Item/MacOSToolCheck.php | 44 ++++++++++++++++++- .../Toolchain/ClangPortsToolchain.php | 20 +++++++++ src/StaticPHP/Util/GlobalEnvManager.php | 4 +- 4 files changed, 66 insertions(+), 6 deletions(-) create mode 100644 src/StaticPHP/Toolchain/ClangPortsToolchain.php diff --git a/src/Package/Library/unixodbc.php b/src/Package/Library/unixodbc.php index e482e68b..78debadf 100644 --- a/src/Package/Library/unixodbc.php +++ b/src/Package/Library/unixodbc.php @@ -20,8 +20,8 @@ class unixodbc extends LibraryPackage { $sysconf_selector = match ($os = SystemTarget::getTargetOS()) { 'Darwin' => match (SystemTarget::getTargetArch()) { - 'x86_64' => '/usr/local/etc', - 'aarch64' => '/opt/homebrew/etc', + 'x86_64' => is_dir('/usr/local/etc') ? '/usr/local/etc' : '/opt/local/etc', + 'aarch64' => is_dir('/opt/homebrew/etc') ? '/opt/homebrew/etc' : '/opt/local/etc', default => throw new WrongUsageException('Unsupported architecture: ' . GNU_ARCH), }, 'Linux' => '/etc', diff --git a/src/StaticPHP/Doctor/Item/MacOSToolCheck.php b/src/StaticPHP/Doctor/Item/MacOSToolCheck.php index 9a256c08..d1e81a01 100644 --- a/src/StaticPHP/Doctor/Item/MacOSToolCheck.php +++ b/src/StaticPHP/Doctor/Item/MacOSToolCheck.php @@ -45,6 +45,18 @@ class MacOSToolCheck return CheckResult::ok(); } + #[CheckItem('if macports has installed', limit_os: 'Darwin', level: 998)] + public function checkPorts(): ?CheckResult + { + if (($path = MacOSUtil::findCommand('port')) === null) { + return CheckResult::fail('MacPorts is not installed', 'port'); + } + if ($path !== '/opt/local/bin/port' && getenv('GNU_ARCH') === 'aarch64') { + return CheckResult::fail('Current macports (/opt/local/bin/port) is not installed for M1 Mac, please re-install macports!'); + } + return CheckResult::ok(); + } + #[CheckItem('if necessary tools are installed', limit_os: 'Darwin')] public function checkCliTools(): ?CheckResult { @@ -74,6 +86,20 @@ class MacOSToolCheck return null; } + #[CheckItem('if macports llvm are installed', limit_os: 'Darwin')] + public function checkPortsLLVM(): ?CheckResult + { + if (getenv('SPC_USE_LLVM') === 'port') { + $macports_prefix = getenv('MACPORTS_PREFIX') ?: '/opt/local'; + + if (($path = MacOSUtil::findCommand('clang', ["{$macports_prefix}/bin"])) === null) { + return CheckResult::fail('MacPorts llvm is not installed', 'build-tools', ['missing' => ['llvm']]); + } + return CheckResult::ok($path); + } + return null; + } + #[CheckItem('if bison version is 3.0 or later', limit_os: 'Darwin')] public function checkBisonVersion(array $command_path = []): ?CheckResult { @@ -91,7 +117,7 @@ class MacOSToolCheck if ($command_path !== []) { return CheckResult::fail("Current {$bison} version is too old: " . $matches[0]); } - return $this->checkBisonVersion(['/opt/homebrew/opt/bison/bin', '/usr/local/opt/bison/bin']); + return $this->checkBisonVersion(['/opt/homebrew/opt/bison/bin', '/usr/local/opt/bison/bin', '/opt/local/bin']); } return CheckResult::ok($matches[0]); } @@ -108,6 +134,9 @@ class MacOSToolCheck #[FixItem('build-tools')] public function fixBuildTools(array $missing): bool { + $hasBrew = $this->checkBrew()?->isOK(); + $hasMacports = $this->checkPorts()?->isOK(); + $replacement = [ 'glibtoolize' => 'libtool', ]; @@ -115,7 +144,18 @@ class MacOSToolCheck if (isset($replacement[$cmd])) { $cmd = $replacement[$cmd]; } - shell()->exec('brew install --formula ' . escapeshellarg($cmd)); + + if ($hasBrew) { + shell()->exec('brew install --formula ' . escapeshellarg($cmd)); + continue; + } + + if ($hasMacports) { + shell()->exec('port install ' . escapeshellarg($cmd)); + continue; + } + + return false; } return true; } diff --git a/src/StaticPHP/Toolchain/ClangPortsToolchain.php b/src/StaticPHP/Toolchain/ClangPortsToolchain.php new file mode 100644 index 00000000..088a538a --- /dev/null +++ b/src/StaticPHP/Toolchain/ClangPortsToolchain.php @@ -0,0 +1,20 @@ +