mirror of
https://github.com/crazywhalecc/static-php-cli.git
synced 2026-07-02 14:25:41 +08:00
Compare commits
32 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4318ef8fa3 | ||
|
|
8630fd57e2 | ||
|
|
0a3c56ba49 | ||
|
|
b1a77b01e2 | ||
|
|
f39d77dde0 | ||
|
|
cc7a22922c | ||
|
|
1a395a2b0f | ||
|
|
bfe4a012b8 | ||
|
|
ab17fbe288 | ||
|
|
7a65135c68 | ||
|
|
f57986ccbf | ||
|
|
9bcb809117 | ||
|
|
2073652744 | ||
|
|
1440f104bb | ||
|
|
834cc4d16e | ||
|
|
a9c16b74d7 | ||
|
|
c532b9e893 | ||
|
|
73dd885342 | ||
|
|
be24fd9467 | ||
|
|
bf1f54a091 | ||
|
|
1c3dc91845 | ||
|
|
565ff27b71 | ||
|
|
f48961c72d | ||
|
|
a0c2fefd24 | ||
|
|
f585cc446a | ||
|
|
f43e915341 | ||
|
|
93f68b209f | ||
|
|
3fb68f3989 | ||
|
|
4f27d2d9d1 | ||
|
|
562fbf2a9c | ||
|
|
cbf1ed7662 | ||
|
|
4bba584e88 |
@@ -74,6 +74,19 @@
|
||||
"qdbm"
|
||||
]
|
||||
},
|
||||
"decimal": {
|
||||
"type": "external",
|
||||
"source": "ext-decimal",
|
||||
"arg-type": "custom",
|
||||
"lib-depends": [
|
||||
"libmpdec"
|
||||
]
|
||||
},
|
||||
"deepclone": {
|
||||
"type": "external",
|
||||
"source": "deepclone",
|
||||
"arg-type": "enable"
|
||||
},
|
||||
"dio": {
|
||||
"support": {
|
||||
"BSD": "wip"
|
||||
|
||||
@@ -528,6 +528,18 @@
|
||||
"maxminddb_config.h"
|
||||
]
|
||||
},
|
||||
"libmpdec": {
|
||||
"source": "libmpdec",
|
||||
"static-libs-unix": [
|
||||
"libmpdec.a"
|
||||
],
|
||||
"static-libs-windows": [
|
||||
"libmpdec_a.lib"
|
||||
],
|
||||
"headers": [
|
||||
"mpdecimal.h"
|
||||
]
|
||||
},
|
||||
"libmemcached": {
|
||||
"source": "libmemcached",
|
||||
"cpp-library": true,
|
||||
|
||||
@@ -84,6 +84,25 @@
|
||||
"path": "COPYING"
|
||||
}
|
||||
},
|
||||
"ext-decimal": {
|
||||
"type": "ghtagtar",
|
||||
"repo": "php-decimal/ext-decimal",
|
||||
"match": "v2\\.\\d.*",
|
||||
"path": "php-src/ext/decimal",
|
||||
"license": {
|
||||
"type": "file",
|
||||
"path": "LICENSE"
|
||||
}
|
||||
},
|
||||
"deepclone": {
|
||||
"type": "ghtagtar",
|
||||
"repo": "symfony/php-ext-deepclone",
|
||||
"path": "php-src/ext/deepclone",
|
||||
"license": {
|
||||
"type": "file",
|
||||
"path": "LICENSE"
|
||||
}
|
||||
},
|
||||
"dio": {
|
||||
"type": "url",
|
||||
"url": "https://pecl.php.net/get/dio",
|
||||
@@ -681,6 +700,14 @@
|
||||
"path": "LICENSE"
|
||||
}
|
||||
},
|
||||
"libmpdec": {
|
||||
"type": "url",
|
||||
"url": "https://www.bytereef.org/software/mpdecimal/releases/mpdecimal-4.0.1.tar.gz",
|
||||
"license": {
|
||||
"type": "file",
|
||||
"path": "COPYRIGHT.txt"
|
||||
}
|
||||
},
|
||||
"libmemcached": {
|
||||
"type": "ghtagtar",
|
||||
"repo": "awesomized/libmemcached",
|
||||
@@ -973,7 +1000,7 @@
|
||||
"openssl": {
|
||||
"type": "ghrel",
|
||||
"repo": "openssl/openssl",
|
||||
"match": "openssl.+\\.tar\\.gz",
|
||||
"match": "openssl-3.+\\.tar\\.gz",
|
||||
"prefer-stable": true,
|
||||
"alt": {
|
||||
"type": "filelist",
|
||||
|
||||
@@ -14,6 +14,7 @@ parameters:
|
||||
- PHP_OS_FAMILY
|
||||
excludePaths:
|
||||
analyseAndScan:
|
||||
- ./src/globals/ext-tests/decimal.php
|
||||
- ./src/globals/ext-tests/swoole.php
|
||||
- ./src/globals/ext-tests/swoole.phpt
|
||||
- ./src/globals/test-extensions.php
|
||||
|
||||
@@ -11,6 +11,9 @@ use SPC\exception\ValidationException;
|
||||
use SPC\exception\WrongUsageException;
|
||||
use SPC\store\Config;
|
||||
use SPC\store\FileSystem;
|
||||
use SPC\toolchain\ToolchainManager;
|
||||
use SPC\toolchain\ZigToolchain;
|
||||
use SPC\util\GlobalEnvManager;
|
||||
use SPC\util\SPCConfigUtil;
|
||||
use SPC\util\SPCTarget;
|
||||
|
||||
@@ -231,7 +234,7 @@ class Extension
|
||||
if (preg_match('/^(.*_SHARED_LIBADD\s*=\s*)(.*)$/m', $makefileContent, $matches)) {
|
||||
$prefix = $matches[1];
|
||||
$currentLibs = trim($matches[2]);
|
||||
$newLibs = trim("{$currentLibs} {$staticLibs} {$lstdcpp}");
|
||||
$newLibs = clean_spaces("{$currentLibs} {$staticLibs} {$lstdcpp}");
|
||||
$deduplicatedLibs = deduplicate_flags($newLibs);
|
||||
|
||||
FileSystem::replaceFileRegex(
|
||||
@@ -543,6 +546,11 @@ class Extension
|
||||
*/
|
||||
protected function getSharedExtensionEnv(): array
|
||||
{
|
||||
$compiler_extra = getenv('SPC_COMPILER_EXTRA') ?: '';
|
||||
if (!str_contains($compiler_extra, '-lcompiler_rt') && ToolchainManager::getToolchainClass() === ZigToolchain::class) {
|
||||
$compiler_extra = trim($compiler_extra . ' -lcompiler_rt');
|
||||
GlobalEnvManager::putenv("SPC_COMPILER_EXTRA={$compiler_extra}");
|
||||
}
|
||||
$config = (new SPCConfigUtil($this->builder, ['no_php' => true]))->getExtensionConfig($this);
|
||||
[$staticLibs, $sharedLibs] = $this->splitLibsIntoStaticAndShared($config['libs']);
|
||||
$preStatic = PHP_OS_FAMILY === 'Darwin' ? '' : '-Wl,--start-group ';
|
||||
|
||||
46
src/SPC/builder/extension/decimal.php
Normal file
46
src/SPC/builder/extension/decimal.php
Normal file
@@ -0,0 +1,46 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace SPC\builder\extension;
|
||||
|
||||
use SPC\builder\Extension;
|
||||
use SPC\store\FileSystem;
|
||||
use SPC\util\CustomExt;
|
||||
|
||||
#[CustomExt('decimal')]
|
||||
class decimal extends Extension
|
||||
{
|
||||
// TODO: remove this when https://github.com/php-decimal/ext-decimal/issues/92 is merged
|
||||
public function patchBeforeBuildconf(): bool
|
||||
{
|
||||
FileSystem::replaceFileStr(
|
||||
$this->source_dir . '/php_decimal.c',
|
||||
[
|
||||
'zend_module_entry decimal_module_entry',
|
||||
'ZEND_GET_MODULE(decimal)',
|
||||
],
|
||||
[
|
||||
'zend_module_entry php_decimal_module_entry',
|
||||
'ZEND_GET_MODULE(php_decimal)',
|
||||
]
|
||||
);
|
||||
FileSystem::replaceFileStr(
|
||||
$this->source_dir . '/config.w32',
|
||||
'ARG_WITH("decimal", "for decimal support", "no");',
|
||||
'ARG_WITH("decimal", "for decimal support", "no");' . "\n" .
|
||||
'ADD_EXTENSION_DEP("decimal", "json");'
|
||||
);
|
||||
return true;
|
||||
}
|
||||
|
||||
public function getUnixConfigureArg(bool $shared = false): string
|
||||
{
|
||||
return '--enable-decimal --with-libmpdec-path="' . BUILD_ROOT_PATH . '"';
|
||||
}
|
||||
|
||||
public function getWindowsConfigureArg(bool $shared = false): string
|
||||
{
|
||||
return '--with-decimal';
|
||||
}
|
||||
}
|
||||
12
src/SPC/builder/freebsd/library/libmpdec.php
Normal file
12
src/SPC/builder/freebsd/library/libmpdec.php
Normal file
@@ -0,0 +1,12 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace SPC\builder\freebsd\library;
|
||||
|
||||
class libmpdec extends BSDLibraryBase
|
||||
{
|
||||
use \SPC\builder\unix\library\libmpdec;
|
||||
|
||||
public const NAME = 'libmpdec';
|
||||
}
|
||||
@@ -11,6 +11,8 @@ use SPC\store\Config;
|
||||
use SPC\store\DirDiff;
|
||||
use SPC\store\FileSystem;
|
||||
use SPC\store\SourcePatcher;
|
||||
use SPC\toolchain\ToolchainManager;
|
||||
use SPC\toolchain\ZigToolchain;
|
||||
use SPC\util\GlobalEnvManager;
|
||||
use SPC\util\SPCConfigUtil;
|
||||
use SPC\util\SPCTarget;
|
||||
@@ -65,7 +67,8 @@ class LinuxBuilder extends UnixBuilderBase
|
||||
// php 8.5 contains opcache extension by default,
|
||||
// if opcache_jit is enabled for 8.5 or opcache enabled,
|
||||
// we need to disable undefined behavior sanitizer.
|
||||
f_putenv('SPC_COMPILER_EXTRA=-fno-sanitize=undefined');
|
||||
$compiler_extra = getenv('SPC_COMPILER_EXTRA') ?: '';
|
||||
f_putenv('SPC_COMPILER_EXTRA=' . trim($compiler_extra . ' -fno-sanitize=undefined'));
|
||||
}
|
||||
|
||||
if ($this->getOption('enable-zts', false)) {
|
||||
@@ -266,6 +269,11 @@ class LinuxBuilder extends UnixBuilderBase
|
||||
*/
|
||||
protected function buildEmbed(): void
|
||||
{
|
||||
$compiler_extra = getenv('SPC_COMPILER_EXTRA') ?: '';
|
||||
if (!str_contains($compiler_extra, '-lcompiler_rt') && ToolchainManager::getToolchainClass() === ZigToolchain::class) {
|
||||
$compiler_extra = trim($compiler_extra . ' -lcompiler_rt');
|
||||
GlobalEnvManager::putenv("SPC_COMPILER_EXTRA={$compiler_extra}");
|
||||
}
|
||||
$sharedExts = array_filter($this->exts, static fn ($ext) => $ext->isBuildShared());
|
||||
$sharedExts = array_filter($sharedExts, static function ($ext) {
|
||||
return Config::getExt($ext->getName(), 'build-with-php') === true;
|
||||
|
||||
12
src/SPC/builder/linux/library/libmpdec.php
Normal file
12
src/SPC/builder/linux/library/libmpdec.php
Normal file
@@ -0,0 +1,12 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace SPC\builder\linux\library;
|
||||
|
||||
class libmpdec extends LinuxLibraryBase
|
||||
{
|
||||
use \SPC\builder\unix\library\libmpdec;
|
||||
|
||||
public const NAME = 'libmpdec';
|
||||
}
|
||||
12
src/SPC/builder/macos/library/libmpdec.php
Normal file
12
src/SPC/builder/macos/library/libmpdec.php
Normal file
@@ -0,0 +1,12 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace SPC\builder\macos\library;
|
||||
|
||||
class libmpdec extends MacOSLibraryBase
|
||||
{
|
||||
use \SPC\builder\unix\library\libmpdec;
|
||||
|
||||
public const NAME = 'libmpdec';
|
||||
}
|
||||
@@ -50,7 +50,7 @@ trait UnixSystemUtilTrait
|
||||
$defined = array_unique($defined);
|
||||
sort($defined);
|
||||
// export
|
||||
if (SPCTarget::getTargetOS() === 'Linux') {
|
||||
if (SPCTarget::getTargetOS() === 'Linux' && ToolchainManager::getToolchainClass() !== ZigToolchain::class) {
|
||||
file_put_contents("{$lib_file}.dynsym", "{\n" . implode("\n", array_map(fn ($x) => " {$x};", $defined)) . "};\n");
|
||||
} else {
|
||||
file_put_contents("{$lib_file}.dynsym", implode("\n", $defined) . "\n");
|
||||
@@ -72,10 +72,6 @@ trait UnixSystemUtilTrait
|
||||
if (!is_file($symbol_file)) {
|
||||
throw new SPCInternalException("The symbol file {$symbol_file} does not exist, please check if nm command is available.");
|
||||
}
|
||||
// https://github.com/ziglang/zig/issues/24662
|
||||
if (ToolchainManager::getToolchainClass() === ZigToolchain::class) {
|
||||
return '-Wl,--export-dynamic'; // needs release 0.16, can be removed then
|
||||
}
|
||||
// macOS/zig
|
||||
if (SPCTarget::getTargetOS() !== 'Linux' || ToolchainManager::getToolchainClass() === ZigToolchain::class) {
|
||||
return "-Wl,-exported_symbols_list,{$symbol_file}";
|
||||
|
||||
@@ -4,6 +4,8 @@ declare(strict_types=1);
|
||||
|
||||
namespace SPC\builder\unix\library;
|
||||
|
||||
use SPC\toolchain\ToolchainManager;
|
||||
use SPC\toolchain\ZigToolchain;
|
||||
use SPC\util\executor\UnixAutoconfExecutor;
|
||||
use SPC\util\SPCConfigUtil;
|
||||
|
||||
@@ -39,12 +41,16 @@ trait krb5
|
||||
$extraEnv['LDFLAGS'] = '-framework Kerberos';
|
||||
$args[] = 'ac_cv_func_secure_getenv=no';
|
||||
}
|
||||
UnixAutoconfExecutor::create($this)
|
||||
$make = UnixAutoconfExecutor::create($this)
|
||||
->appendEnv($extraEnv)
|
||||
->optionalLib('ldap', '--with-ldap', '--without-ldap')
|
||||
->optionalLib('libedit', '--with-libedit', '--without-libedit')
|
||||
->configure(...$args)
|
||||
->make();
|
||||
->configure(...$args);
|
||||
|
||||
if (ToolchainManager::getToolchainClass() === ZigToolchain::class) {
|
||||
$make->exec('find . -name Makefile -exec sed -i "s/-Werror=incompatible-pointer-types//g" {} +');
|
||||
}
|
||||
$make->make();
|
||||
$this->patchPkgconfPrefix([
|
||||
'krb5-gssapi.pc',
|
||||
'krb5.pc',
|
||||
|
||||
17
src/SPC/builder/unix/library/libmpdec.php
Normal file
17
src/SPC/builder/unix/library/libmpdec.php
Normal file
@@ -0,0 +1,17 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace SPC\builder\unix\library;
|
||||
|
||||
use SPC\util\executor\UnixAutoconfExecutor;
|
||||
|
||||
trait libmpdec
|
||||
{
|
||||
protected function build(): void
|
||||
{
|
||||
UnixAutoconfExecutor::create($this)
|
||||
->configure('--disable-cxx --disable-shared --enable-static')
|
||||
->make();
|
||||
}
|
||||
}
|
||||
31
src/SPC/builder/windows/library/libmpdec.php
Normal file
31
src/SPC/builder/windows/library/libmpdec.php
Normal file
@@ -0,0 +1,31 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace SPC\builder\windows\library;
|
||||
|
||||
class libmpdec extends WindowsLibraryBase
|
||||
{
|
||||
public const NAME = 'libmpdec';
|
||||
|
||||
protected function build(): void
|
||||
{
|
||||
$makefile_dir = $this->source_dir . '\libmpdec';
|
||||
$nmake = $this->builder->makeSimpleWrapper('nmake /nologo');
|
||||
|
||||
cmd()->cd($makefile_dir)
|
||||
->exec('copy /y Makefile.vc Makefile')
|
||||
->execWithWrapper($nmake, 'clean')
|
||||
->execWithWrapper($nmake, 'MACHINE=x64');
|
||||
|
||||
// Copy static lib (rename from versioned name to libmpdec_a.lib)
|
||||
$libs = glob($makefile_dir . '\libmpdec-*.lib');
|
||||
foreach ($libs as $lib) {
|
||||
if (!str_contains($lib, '.dll.')) {
|
||||
copy($lib, BUILD_LIB_PATH . '\libmpdec_a.lib');
|
||||
break;
|
||||
}
|
||||
}
|
||||
copy($makefile_dir . '\mpdecimal.h', BUILD_INCLUDE_PATH . '\mpdecimal.h');
|
||||
}
|
||||
}
|
||||
@@ -10,9 +10,9 @@ class postgresql_win extends WindowsLibraryBase
|
||||
|
||||
protected function build(): void
|
||||
{
|
||||
copy($this->source_dir . '\pgsql\lib\libpq.lib', BUILD_LIB_PATH . '\libpq.lib');
|
||||
copy($this->source_dir . '\pgsql\lib\libpgport.lib', BUILD_LIB_PATH . '\libpgport.lib');
|
||||
copy($this->source_dir . '\pgsql\lib\libpgcommon.lib', BUILD_LIB_PATH . '\libpgcommon.lib');
|
||||
copy($this->source_dir . '\lib\libpq.lib', BUILD_LIB_PATH . '\libpq.lib');
|
||||
copy($this->source_dir . '\lib\libpgport.lib', BUILD_LIB_PATH . '\libpgport.lib');
|
||||
copy($this->source_dir . '\lib\libpgcommon.lib', BUILD_LIB_PATH . '\libpgcommon.lib');
|
||||
|
||||
// create libpq folder in buildroot/includes/libpq
|
||||
if (!file_exists(BUILD_INCLUDE_PATH . '\libpq')) {
|
||||
@@ -21,7 +21,7 @@ class postgresql_win extends WindowsLibraryBase
|
||||
|
||||
$headerFiles = ['libpq-fe.h', 'postgres_ext.h', 'pg_config_ext.h', 'libpq\libpq-fs.h'];
|
||||
foreach ($headerFiles as $header) {
|
||||
copy($this->source_dir . '\pgsql\include\\' . $header, BUILD_INCLUDE_PATH . '\\' . $header);
|
||||
copy($this->source_dir . '\include\\' . $header, BUILD_INCLUDE_PATH . '\\' . $header);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -109,7 +109,7 @@ class LinuxToolCheckList
|
||||
public function fixBuildTools(array $distro, array $missing): bool
|
||||
{
|
||||
$install_cmd = match ($distro['dist']) {
|
||||
'ubuntu', 'debian', 'Deepin' => 'apt-get install -y',
|
||||
'ubuntu', 'debian', 'linuxmint', 'Deepin' => 'apt-get install -y',
|
||||
'alpine' => 'apk add',
|
||||
'redhat' => 'dnf install -y',
|
||||
'centos' => 'yum install -y',
|
||||
|
||||
@@ -1,17 +1,12 @@
|
||||
#include <sapi/embed/php_embed.h>
|
||||
|
||||
int main(int argc,char **argv){
|
||||
|
||||
PHP_EMBED_START_BLOCK(argc,argv)
|
||||
|
||||
int main(int argc, char **argv) {
|
||||
PHP_EMBED_START_BLOCK(argc, argv)
|
||||
zend_file_handle file_handle;
|
||||
|
||||
zend_stream_init_filename(&file_handle,"embed.php");
|
||||
|
||||
if(!php_execute_script(&file_handle)){
|
||||
zend_stream_init_filename(&file_handle, "embed.php");
|
||||
if(!php_execute_script(&file_handle)) {
|
||||
php_printf("Failed to execute PHP script.\n");
|
||||
}
|
||||
|
||||
PHP_EMBED_END_BLOCK()
|
||||
return 0;
|
||||
}
|
||||
|
||||
10
src/globals/ext-tests/decimal.php
Normal file
10
src/globals/ext-tests/decimal.php
Normal file
@@ -0,0 +1,10 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
assert(class_exists('Decimal\Decimal'));
|
||||
assert(method_exists('Decimal\Decimal', 'valueOf'));
|
||||
assert(0.1 + 0.2 !== 0.3);
|
||||
$result = Decimal\Decimal::valueOf('0.1') + Decimal\Decimal::valueOf('0.2');
|
||||
$expected = Decimal\Decimal::valueOf('0.3');
|
||||
assert($result == $expected);
|
||||
@@ -15,7 +15,7 @@ declare(strict_types=1);
|
||||
$test_php_version = [
|
||||
// '8.1',
|
||||
// '8.2',
|
||||
'8.3',
|
||||
// '8.3',
|
||||
// '8.4',
|
||||
'8.5',
|
||||
// 'git',
|
||||
@@ -23,7 +23,7 @@ $test_php_version = [
|
||||
|
||||
// test os (macos-15-intel, macos-15, ubuntu-latest, windows-latest are available)
|
||||
$test_os = [
|
||||
'macos-15-intel', // bin/spc for x86_64
|
||||
// 'macos-15-intel', // bin/spc for x86_64
|
||||
'macos-15', // bin/spc for arm64
|
||||
// 'ubuntu-latest', // bin/spc-alpine-docker for x86_64
|
||||
'ubuntu-22.04', // bin/spc-gnu-docker for x86_64
|
||||
@@ -43,20 +43,20 @@ $no_strip = false;
|
||||
$upx = false;
|
||||
|
||||
// whether to test frankenphp build, only available for macOS and linux
|
||||
$frankenphp = false;
|
||||
$frankenphp = true;
|
||||
|
||||
// prefer downloading pre-built packages to speed up the build process
|
||||
$prefer_pre_built = false;
|
||||
$prefer_pre_built = true;
|
||||
|
||||
// If you want to test your added extensions and libs, add below (comma separated, example `bcmath,openssl`).
|
||||
$extensions = match (PHP_OS_FAMILY) {
|
||||
'Linux', 'Darwin' => 'curl,swoole',
|
||||
'Windows' => 'intl',
|
||||
'Linux', 'Darwin' => 'openssl,brotli',
|
||||
'Windows' => 'bcmath,brotli,bz2,ctype,curl,dom,exif,fileinfo,filter,ftp,gd,iconv,intl,mbregex,mbstring,mysqli,mysqlnd,opcache,openssl,pdo,pdo_mysql,pdo_pgsql,pgsql,session,simdjson,simplexml,sodium,sqlite3,tokenizer,xml,xmlreader,xmlwriter,zip,zlib',
|
||||
};
|
||||
|
||||
// If you want to test shared extensions, add them below (comma separated, example `bcmath,openssl`).
|
||||
$shared_extensions = match (PHP_OS_FAMILY) {
|
||||
'Linux' => '',
|
||||
'Linux' => 'zstd',
|
||||
'Darwin' => '',
|
||||
'Windows' => '',
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user