Files
static-php-cli/src/SPC/builder/extension/grpc.php

93 lines
3.0 KiB
PHP
Raw Normal View History

2024-11-09 22:07:52 +08:00
<?php
declare(strict_types=1);
namespace SPC\builder\extension;
use SPC\builder\Extension;
use SPC\builder\windows\WindowsBuilder;
use SPC\exception\ValidationException;
2024-11-09 22:07:52 +08:00
use SPC\store\FileSystem;
use SPC\util\CustomExt;
use SPC\util\GlobalEnvManager;
2025-07-23 13:55:09 +07:00
use SPC\util\SPCConfigUtil;
2024-11-09 22:07:52 +08:00
#[CustomExt('grpc')]
class grpc extends Extension
{
public function patchBeforeBuildconf(): bool
{
if ($this->builder instanceof WindowsBuilder) {
throw new ValidationException('grpc extension does not support windows yet');
2024-11-09 22:07:52 +08:00
}
// Fix deprecated PHP API usage in call.c
2025-12-28 12:44:24 +01:00
FileSystem::replaceFileStr(
"{$this->source_dir}/src/php/ext/grpc/call.c",
2025-12-28 12:44:24 +01:00
'zend_exception_get_default(TSRMLS_C),',
'zend_ce_exception,',
);
$config_m4 = <<<'M4'
PHP_ARG_ENABLE(grpc, [whether to enable grpc support], [AS_HELP_STRING([--enable-grpc], [Enable grpc support])])
if test "$PHP_GRPC" != "no"; then
PHP_ADD_INCLUDE(PHP_EXT_SRCDIR()/include)
PHP_ADD_INCLUDE(PHP_EXT_SRCDIR()/src/php/ext/grpc)
GRPC_LIBDIR=@@build_lib_path@@
PHP_ADD_LIBPATH($GRPC_LIBDIR)
PHP_ADD_LIBRARY(grpc,,GRPC_SHARED_LIBADD)
LIBS="-lpthread $LIBS"
PHP_ADD_LIBRARY(pthread)
case $host in
*darwin*)
PHP_ADD_LIBRARY(c++,1,GRPC_SHARED_LIBADD)
;;
*)
PHP_ADD_LIBRARY(stdc++,1,GRPC_SHARED_LIBADD)
PHP_ADD_LIBRARY(rt,,GRPC_SHARED_LIBADD)
PHP_ADD_LIBRARY(rt)
;;
esac
PHP_NEW_EXTENSION(grpc, @grpc_c_files@, $ext_shared, , -DGRPC_POSIX_FORK_ALLOW_PTHREAD_ATFORK=1)
PHP_SUBST(GRPC_SHARED_LIBADD)
PHP_INSTALL_HEADERS([ext/grpc], [php_grpc.h])
fi
M4;
$replace = get_pack_replace();
// load grpc c files from src/php/ext/grpc
$c_files = glob($this->source_dir . '/src/php/ext/grpc/*.c');
$replace['@grpc_c_files@'] = implode(" \\\n ", array_map(fn ($f) => 'src/php/ext/grpc/' . basename($f), $c_files));
$config_m4 = str_replace(array_keys($replace), array_values($replace), $config_m4);
file_put_contents($this->source_dir . '/config.m4', $config_m4);
copy($this->source_dir . '/src/php/ext/grpc/php_grpc.h', $this->source_dir . '/php_grpc.h');
return true;
2024-11-09 22:07:52 +08:00
}
2025-07-21 09:41:36 +07:00
public function patchBeforeConfigure(): bool
{
2025-07-23 14:10:28 +07:00
$util = new SPCConfigUtil($this->builder, ['libs_only_deps' => true]);
2025-11-04 13:36:29 +08:00
$config = $util->getExtensionConfig($this);
2025-07-23 13:55:09 +07:00
$libs = $config['libs'];
FileSystem::replaceFileStr(SOURCE_PATH . '/php-src/configure', '-lgrpc', $libs);
return true;
2024-11-09 22:07:52 +08:00
}
public function patchBeforeMake(): bool
{
parent::patchBeforeMake();
2024-11-09 22:07:52 +08:00
GlobalEnvManager::putenv('SPC_CMD_VAR_PHP_MAKE_EXTRA_CFLAGS=' . getenv('SPC_CMD_VAR_PHP_MAKE_EXTRA_CFLAGS') . ' -Wno-strict-prototypes');
return true;
}
protected function getSharedExtensionEnv(): array
{
$env = parent::getSharedExtensionEnv();
2025-09-18 21:29:46 +02:00
$env['CPPFLAGS'] = $env['CXXFLAGS'] . ' -Wno-attributes';
2025-09-18 18:17:48 +02:00
return $env;
}
2024-11-09 22:07:52 +08:00
}