findCommand('brew')) === null) { return CheckResult::fail('Homebrew is not installed', 'brew'); } if ($path !== '/opt/homebrew/bin/brew' && getenv('GNU_ARCH') === 'aarch64') { return CheckResult::fail('Current homebrew (/usr/local/bin/homebrew) is not installed for M1 Mac, please re-install homebrew in /opt/homebrew/ !'); } return CheckResult::ok(); } #[AsCheckItem('if necessary tools are installed', limit_os: 'Darwin')] public function checkCliTools(): ?CheckResult { $missing = []; foreach (self::REQUIRED_COMMANDS as $cmd) { if ($this->findCommand($cmd) === null) { $missing[] = $cmd; } } if (!empty($missing)) { return CheckResult::fail('missing system commands: ' . implode(', ', $missing), 'build-tools', [$missing]); } return CheckResult::ok(); } #[AsCheckItem('if bison version is 3.0 or later', limit_os: 'Darwin')] public function checkBisonVersion(array $command_path = []): ?CheckResult { // if the bison command is /usr/bin/bison, it is the system bison that may be too old if (($bison = $this->findCommand('bison', $command_path)) === null) { return CheckResult::fail('bison is not installed or too old', 'build-tools', [['bison']]); } // check version: bison (GNU Bison) x.y(.z) $version = shell()->execWithResult("{$bison} --version", false); if (preg_match('/bison \(GNU Bison\) (\d+)\.(\d+)(?:\.(\d+))?/', $version[1][0], $matches)) { $major = (int) $matches[1]; // major should be 3 or later if ($major < 3) { // find homebrew keg-only bison if ($command_path !== []) { return CheckResult::fail("Current {$bison} version is too old: " . $matches[0]); } return $this->checkBisonVersion(['/opt/homebrew/opt/bison/bin', '/usr/local/homebrew/opt/bison/bin']); } return CheckResult::ok($matches[0]); } return CheckResult::fail('bison version cannot be determined'); } #[AsFixItem('brew')] public function fixBrew(): bool { try { shell(true)->exec('/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"'); } catch (RuntimeException) { return false; } return true; } #[AsFixItem('build-tools')] public function fixBuildTools(array $missing): bool { $replacement = [ 'glibtoolize' => 'libtool', ]; foreach ($missing as $cmd) { try { if (isset($replacement[$cmd])) { $cmd = $replacement[$cmd]; } shell(true)->exec('brew install --formula ' . escapeshellarg($cmd)); } catch (RuntimeException) { return false; } } return true; } }