builder instanceof WindowsBuilder) { // not support windows yet throw new \RuntimeException('grpc extension does not support windows yet'); } if (!is_link(SOURCE_PATH . '/php-src/ext/grpc')) { if (is_dir($this->builder->getLib('grpc')->getSourceDir() . '/src/php/ext/grpc')) { shell()->exec('ln -s ' . $this->builder->getLib('grpc')->getSourceDir() . '/src/php/ext/grpc ' . SOURCE_PATH . '/php-src/ext/grpc'); } else { throw new \RuntimeException('Cannot find grpc source code'); } $macos = $this->builder instanceof MacOSBuilder ? "\n" . ' LDFLAGS="$LDFLAGS -framework CoreFoundation"' : ''; FileSystem::replaceFileRegex(SOURCE_PATH . '/php-src/ext/grpc/config.m4', '/GRPC_LIBDIR=.*$/m', 'GRPC_LIBDIR=' . BUILD_LIB_PATH . $macos); FileSystem::replaceFileRegex(SOURCE_PATH . '/php-src/ext/grpc/config.m4', '/SEARCH_PATH=.*$/m', 'SEARCH_PATH="' . BUILD_ROOT_PATH . '"'); return true; } return false; } public function patchBeforeConfigure(): bool { $libs = join(' ', $this->getLibraries()); FileSystem::replaceFileStr(SOURCE_PATH . '/php-src/configure', '-lgrpc', $libs); return true; } public function patchBeforeMake(): bool { $extra_libs = trim(getenv('SPC_EXTRA_LIBS')); $libs = array_map(function (string $lib) { if (str_starts_with($lib, '-l')) { $staticLib = substr($lib, 2); $staticLib = BUILD_LIB_PATH . '/lib' . $staticLib . '.a'; if (file_exists($staticLib)) { return $staticLib; } } return $lib; }, $this->getLibraries()); $extra_libs = str_replace(BUILD_LIB_PATH . '/libgrpc.a', join(' ', $libs), $extra_libs); f_putenv('SPC_EXTRA_LIBS=' . $extra_libs); // add -Wno-strict-prototypes GlobalEnvManager::putenv('SPC_CMD_VAR_PHP_MAKE_EXTRA_CFLAGS=' . getenv('SPC_CMD_VAR_PHP_MAKE_EXTRA_CFLAGS') . ' -Wno-strict-prototypes'); return true; } public function getUnixConfigureArg(bool $shared = false): string { return '--enable-grpc=' . ($shared ? 'shared,' : '') . BUILD_ROOT_PATH . '/grpc GRPC_LIB_SUBDIR=' . BUILD_LIB_PATH; } private function getLibraries(): array { $libs = shell()->execWithResult('$PKG_CONFIG --libs --static grpc')[1][0]; $filtered = preg_replace('/-L\S+/', '', $libs); $filtered = preg_replace('/(?:\S*\/)?lib([a-zA-Z0-9_+-]+)\.a\b/', '-l$1', $filtered); $out = preg_replace('/\s+/', ' ', $filtered); return explode(' ', trim($out)); } }