mirror of
https://github.com/crazywhalecc/static-php-cli.git
synced 2026-07-02 22:35:43 +08:00
Compare commits
17 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1ae1c81f9c | ||
|
|
eff698cbe8 | ||
|
|
036e4f52b7 | ||
|
|
d258417afb | ||
|
|
3057d02e37 | ||
|
|
af8204fbf0 | ||
|
|
968b3acbce | ||
|
|
5d2bd93bd7 | ||
|
|
4ba92b08ca | ||
|
|
11076b1355 | ||
|
|
71770a0a5f | ||
|
|
98d3766fe8 | ||
|
|
1fdb6b439e | ||
|
|
3136d6edc1 | ||
|
|
3e84becf77 | ||
|
|
1632c25223 | ||
|
|
e6c308c242 |
11
.github/workflows/release-build.yml
vendored
11
.github/workflows/release-build.yml
vendored
@@ -11,7 +11,7 @@ on:
|
|||||||
jobs:
|
jobs:
|
||||||
build-release-artifacts:
|
build-release-artifacts:
|
||||||
name: "Build SPC Binary"
|
name: "Build SPC Binary"
|
||||||
runs-on: ubuntu-latest
|
runs-on: macos-14
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
php-version:
|
php-version:
|
||||||
@@ -45,7 +45,7 @@ jobs:
|
|||||||
echo "dir=$(composer config cache-files-dir)" >> $GITHUB_OUTPUT
|
echo "dir=$(composer config cache-files-dir)" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
- name: "Cache Composer dependencies"
|
- name: "Cache Composer dependencies"
|
||||||
uses: "actions/cache@v3"
|
uses: "actions/cache@v4"
|
||||||
with:
|
with:
|
||||||
path: "${{ steps.composer-cache.outputs.dir }}"
|
path: "${{ steps.composer-cache.outputs.dir }}"
|
||||||
key: "php-${{ matrix.php-version }}-locked-composer-${{ hashFiles('**/composer.lock') }}"
|
key: "php-${{ matrix.php-version }}-locked-composer-${{ hashFiles('**/composer.lock') }}"
|
||||||
@@ -76,6 +76,9 @@ jobs:
|
|||||||
else
|
else
|
||||||
chmod +x spc
|
chmod +x spc
|
||||||
fi
|
fi
|
||||||
|
if [ "${{ matrix.operating-system }}" = "macos-aarch64" ] || [ "${{ matrix.operating-system }}" = "macos-x86_64" ]; then
|
||||||
|
sudo xattr -cr ./spc
|
||||||
|
fi
|
||||||
|
|
||||||
- name: "Archive Executable"
|
- name: "Archive Executable"
|
||||||
run: |
|
run: |
|
||||||
@@ -83,7 +86,7 @@ jobs:
|
|||||||
tar -czf spc-${{ matrix.operating-system }}.tar.gz spc
|
tar -czf spc-${{ matrix.operating-system }}.tar.gz spc
|
||||||
echo "filename=spc-${{ matrix.operating-system }}.tar.gz" >> $GITHUB_ENV
|
echo "filename=spc-${{ matrix.operating-system }}.tar.gz" >> $GITHUB_ENV
|
||||||
echo "OS=${{ matrix.operating-system }}" >> $GITHUB_ENV
|
echo "OS=${{ matrix.operating-system }}" >> $GITHUB_ENV
|
||||||
if [ "${{ matrix.operating-system }}" == "linux-x86_64" ]; then
|
if [ "${{ matrix.operating-system }}" == "macos-aarch64" ]; then
|
||||||
./spc dev:extensions
|
./spc dev:extensions
|
||||||
fi
|
fi
|
||||||
else
|
else
|
||||||
@@ -119,7 +122,7 @@ jobs:
|
|||||||
TARGET: ${{ secrets.DEPLOY_SERVER_TARGET_SPC_NIGHTLY }}
|
TARGET: ${{ secrets.DEPLOY_SERVER_TARGET_SPC_NIGHTLY }}
|
||||||
|
|
||||||
- name: "Upload Artifact"
|
- name: "Upload Artifact"
|
||||||
uses: actions/upload-artifact@v3
|
uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
path: spc${{ env.SUFFIX }}
|
path: spc${{ env.SUFFIX }}
|
||||||
name: spc-${{ matrix.operating-system }}${{ env.SUFFIX }}
|
name: spc-${{ matrix.operating-system }}${{ env.SUFFIX }}
|
||||||
|
|||||||
36
.github/workflows/tests.yml
vendored
36
.github/workflows/tests.yml
vendored
@@ -48,7 +48,7 @@ jobs:
|
|||||||
|
|
||||||
- name: "Cache Composer packages"
|
- name: "Cache Composer packages"
|
||||||
id: composer-cache
|
id: composer-cache
|
||||||
uses: actions/cache@v3
|
uses: actions/cache@v4
|
||||||
with:
|
with:
|
||||||
path: vendor
|
path: vendor
|
||||||
key: ${{ runner.os }}-phpstan-${{ hashFiles('**/composer.lock') }}
|
key: ${{ runner.os }}-phpstan-${{ hashFiles('**/composer.lock') }}
|
||||||
@@ -86,7 +86,7 @@ jobs:
|
|||||||
|
|
||||||
- name: "Cache Composer packages"
|
- name: "Cache Composer packages"
|
||||||
id: composer-cache
|
id: composer-cache
|
||||||
uses: actions/cache@v3
|
uses: actions/cache@v4
|
||||||
with:
|
with:
|
||||||
path: vendor
|
path: vendor
|
||||||
key: ${{ runner.os }}-php-${{ hashFiles('**/composer.lock') }}
|
key: ${{ runner.os }}-php-${{ hashFiles('**/composer.lock') }}
|
||||||
@@ -113,7 +113,7 @@ jobs:
|
|||||||
- "8.3"
|
- "8.3"
|
||||||
os:
|
os:
|
||||||
- ubuntu-latest
|
- ubuntu-latest
|
||||||
- macos-latest
|
- macos-13
|
||||||
- windows-latest
|
- windows-latest
|
||||||
- macos-14
|
- macos-14
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
@@ -136,9 +136,9 @@ jobs:
|
|||||||
echo "GITHUB_TOKEN=${{ secrets.TEST_GH_TOKEN }}" >> $GITHUB_ENV
|
echo "GITHUB_TOKEN=${{ secrets.TEST_GH_TOKEN }}" >> $GITHUB_ENV
|
||||||
fi
|
fi
|
||||||
|
|
||||||
- name: "Cache Composer packages"
|
- name: "Cache composer packages"
|
||||||
id: composer-cache
|
id: composer-cache
|
||||||
uses: actions/cache@v3
|
uses: actions/cache@v4
|
||||||
with:
|
with:
|
||||||
path: vendor
|
path: vendor
|
||||||
key: ${{ runner.os }}-php-${{ hashFiles('**/composer.lock') }}
|
key: ${{ runner.os }}-php-${{ hashFiles('**/composer.lock') }}
|
||||||
@@ -147,7 +147,7 @@ jobs:
|
|||||||
|
|
||||||
# Cache downloaded source
|
# Cache downloaded source
|
||||||
- id: cache-download
|
- id: cache-download
|
||||||
uses: actions/cache@v3
|
uses: actions/cache@v4
|
||||||
with:
|
with:
|
||||||
path: downloads
|
path: downloads
|
||||||
key: php-${{ matrix.php }}-dependencies
|
key: php-${{ matrix.php }}-dependencies
|
||||||
@@ -158,6 +158,19 @@ jobs:
|
|||||||
- name: "Run Build Tests (doctor)"
|
- name: "Run Build Tests (doctor)"
|
||||||
run: bin/spc doctor --auto-fix
|
run: bin/spc doctor --auto-fix
|
||||||
|
|
||||||
|
- name: "Prepare UPX for Windows"
|
||||||
|
if: matrix.os == 'windows-latest'
|
||||||
|
run: |
|
||||||
|
bin/spc install-pkg upx
|
||||||
|
echo "UPX_CMD=$(php src/globals/test-extensions.php upx)" >> $env:GITHUB_ENV
|
||||||
|
|
||||||
|
- name: "Prepare UPX for Linux"
|
||||||
|
if: matrix.os == 'ubunut-latest'
|
||||||
|
run: |
|
||||||
|
bin/spc install-pkg upx
|
||||||
|
echo "UPX_CMD=$(php src/globals/test-extensions.php upx)" >> $GITHUB_ENV
|
||||||
|
|
||||||
|
|
||||||
- name: "Run Build Tests (download)"
|
- name: "Run Build Tests (download)"
|
||||||
uses: nick-fields/retry@v3
|
uses: nick-fields/retry@v3
|
||||||
with:
|
with:
|
||||||
@@ -165,7 +178,12 @@ jobs:
|
|||||||
max_attempts: 3
|
max_attempts: 3
|
||||||
retry_on: error
|
retry_on: error
|
||||||
command: |
|
command: |
|
||||||
bin/spc download --for-extensions="$(php src/globals/test-extensions.php extensions)" --for-libs="$(php src/globals/test-extensions.php libs)" --with-php=${{ matrix.php }} --ignore-cache-sources=php-src --debug --retry=3
|
bin/spc download --for-extensions="$(php src/globals/test-extensions.php extensions)" --for-libs="$(php src/globals/test-extensions.php libs)" --with-php=${{ matrix.php }} --ignore-cache-sources=php-src,libcares --debug --retry=3
|
||||||
|
|
||||||
- name: "Run Build Tests (build)"
|
- name: "Run Build Tests (build, *nix)"
|
||||||
run: bin/spc build "$(php src/globals/test-extensions.php extensions)" --with-libs="$(php src/globals/test-extensions.php libs)" --build-cli --build-micro --build-fpm --debug
|
if: matrix.os != 'windows-latest'
|
||||||
|
run: bin/spc build "$(php src/globals/test-extensions.php extensions)" $(php src/globals/test-extensions.php zts) $(php src/globals/test-extensions.php no_strip) $UPX_CMD --with-libs="$(php src/globals/test-extensions.php libs)" --build-cli --build-micro --build-fpm --debug
|
||||||
|
|
||||||
|
- name: "Run Build Tests (build, windows)"
|
||||||
|
if: matrix.os == 'windows-latest'
|
||||||
|
run: bin/spc build "$(php src/globals/test-extensions.php extensions)" $(php src/globals/test-extensions.php zts) $(php src/globals/test-extensions.php no_strip) $env:UPX_CMD --with-libs="$(php src/globals/test-extensions.php libs)" --build-cli --build-micro --build-fpm --debug
|
||||||
33
.github/workflows/update-docs-config.yml
vendored
33
.github/workflows/update-docs-config.yml
vendored
@@ -15,9 +15,6 @@ jobs:
|
|||||||
steps:
|
steps:
|
||||||
- name: "Checkout static-php-cli"
|
- name: "Checkout static-php-cli"
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
with:
|
|
||||||
ref: main
|
|
||||||
path: static-php-cli
|
|
||||||
|
|
||||||
- name: "Checkout static-php-cli-docs"
|
- name: "Checkout static-php-cli-docs"
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
@@ -33,7 +30,35 @@ jobs:
|
|||||||
git config --global user.name "GitHub Actions"
|
git config --global user.name "GitHub Actions"
|
||||||
|
|
||||||
- name: "Copy Config Files"
|
- name: "Copy Config Files"
|
||||||
run: cp -r static-php-cli/config/* static-php-cli-docs/docs/.vitepress/config/
|
run: cp -r config/* static-php-cli-docs/docs/.vitepress/config/
|
||||||
|
|
||||||
|
- name: "Install PHP for official runners"
|
||||||
|
uses: "shivammathur/setup-php@v2"
|
||||||
|
with:
|
||||||
|
coverage: none
|
||||||
|
tools: composer:v2
|
||||||
|
php-version: 8.2
|
||||||
|
ini-values: memory_limit=-1
|
||||||
|
|
||||||
|
- name: "Get Composer Cache Directory"
|
||||||
|
id: composer-cache
|
||||||
|
run: |
|
||||||
|
echo "dir=$(composer config cache-files-dir)" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
|
- name: "Cache Composer dependencies"
|
||||||
|
uses: "actions/cache@v4"
|
||||||
|
with:
|
||||||
|
path: "${{ steps.composer-cache.outputs.dir }}"
|
||||||
|
key: "php-8.2-locked-composer-${{ hashFiles('**/composer.lock') }}"
|
||||||
|
restore-keys: |
|
||||||
|
php-8.2-locked-composer
|
||||||
|
|
||||||
|
- name: "Install Locked Dependencies"
|
||||||
|
run: "composer install --no-interaction --no-progress"
|
||||||
|
|
||||||
|
- name: "Generate Extension Support List"
|
||||||
|
run: |
|
||||||
|
bin/spc dev:gen-ext-docs > static-php-cli-docs/docs/extensions.md
|
||||||
|
|
||||||
- name: "Commit and Push Changes"
|
- name: "Commit and Push Changes"
|
||||||
run: |
|
run: |
|
||||||
|
|||||||
13
README-zh.md
13
README-zh.md
@@ -43,9 +43,12 @@ static-php-cli(简称 `spc`)有许多特性:
|
|||||||
|
|
||||||
如果你不想自行编译 PHP,可以从本项目现有的示例 Action 下载 Artifact,也可以从自托管的服务器下载。
|
如果你不想自行编译 PHP,可以从本项目现有的示例 Action 下载 Artifact,也可以从自托管的服务器下载。
|
||||||
|
|
||||||
- [扩展组合 - common](https://dl.static-php.dev/static-php-cli/common/):common 组合包含了约 [30+](https://dl.static-php.dev/static-php-cli/common/README.txt) 个常用扩展,体积为 22MB 左右。
|
- [扩展组合 - common](https://dl.static-php.dev/static-php-cli/common/):common 组合包含了约 [30+](https://dl.static-php.dev/static-php-cli/common/README.txt) 个常用扩展,体积为 7.5MB 左右。
|
||||||
- [扩展组合 - bulk](https://dl.static-php.dev/static-php-cli/bulk/):bulk 组合包含了 [50+](https://dl.static-php.dev/static-php-cli/bulk/README.txt) 个扩展,体积为 70MB 左右。
|
- [扩展组合 - bulk](https://dl.static-php.dev/static-php-cli/bulk/):bulk 组合包含了 [50+](https://dl.static-php.dev/static-php-cli/bulk/README.txt) 个扩展,体积为 25MB 左右。
|
||||||
- [扩展组合 - minimal](https://dl.static-php.dev/static-php-cli/minimal/):minimal 组合包含了 [5](https://dl.static-php.dev/static-php-cli/minimal/README.txt) 个扩展,体积为 6MB 左右。
|
- [扩展组合 - minimal](https://dl.static-php.dev/static-php-cli/minimal/):minimal 组合包含了 [5](https://dl.static-php.dev/static-php-cli/minimal/README.txt) 个扩展,体积为 3MB 左右。
|
||||||
|
|
||||||
|
> Linux 和 Windows 默认启用了 UPX 压缩,可减小 30~50% 的 PHP 二进制体积。
|
||||||
|
> macOS 当前不支持 UPX,所以上述预编译的 macOS 版本体积可能较大。
|
||||||
|
|
||||||
对于 Windows 系统,目前支持的扩展较少,故仅提供 SPC 自身运行的最小扩展组合的 `cli` 和 `micro`:[扩展组合 - spc-min](https://dl.static-php.dev/static-php-cli/windows/spc-min/)。
|
对于 Windows 系统,目前支持的扩展较少,故仅提供 SPC 自身运行的最小扩展组合的 `cli` 和 `micro`:[扩展组合 - spc-min](https://dl.static-php.dev/static-php-cli/windows/spc-min/)。
|
||||||
|
|
||||||
@@ -71,7 +74,7 @@ static-php-cli(简称 `spc`)有许多特性:
|
|||||||
|
|
||||||
当前支持编译的 PHP 版本:
|
当前支持编译的 PHP 版本:
|
||||||
|
|
||||||
> :warning: 支持,但可能不再提供修复
|
> :warning: 支持,但 static-php-cli 作者可能不再提供补丁修复
|
||||||
>
|
>
|
||||||
> :heavy_check_mark: 支持
|
> :heavy_check_mark: 支持
|
||||||
>
|
>
|
||||||
@@ -83,7 +86,7 @@ static-php-cli(简称 `spc`)有许多特性:
|
|||||||
| 7.3 | :warning: | phpmicro 和许多扩展不支持 7.3、7.4 版本 |
|
| 7.3 | :warning: | phpmicro 和许多扩展不支持 7.3、7.4 版本 |
|
||||||
| 7.4 | :warning: | phpmicro 和许多扩展不支持 7.3、7.4 版本 |
|
| 7.4 | :warning: | phpmicro 和许多扩展不支持 7.3、7.4 版本 |
|
||||||
| 8.0 | :heavy_check_mark: | PHP 官方已停止 8.0 的维护 |
|
| 8.0 | :heavy_check_mark: | PHP 官方已停止 8.0 的维护 |
|
||||||
| 8.1 | :heavy_check_mark: | |
|
| 8.1 | :heavy_check_mark: | PHP 官方仅对 8.1 提供安全更新 |
|
||||||
| 8.2 | :heavy_check_mark: | |
|
| 8.2 | :heavy_check_mark: | |
|
||||||
| 8.3 | :heavy_check_mark: | |
|
| 8.3 | :heavy_check_mark: | |
|
||||||
|
|
||||||
|
|||||||
13
README.md
13
README.md
@@ -49,9 +49,12 @@ If you don't want to build or want to test first, you can download example pre-c
|
|||||||
Below are several precompiled static-php binaries with different extension combinations,
|
Below are several precompiled static-php binaries with different extension combinations,
|
||||||
which can be downloaded directly according to your needs.
|
which can be downloaded directly according to your needs.
|
||||||
|
|
||||||
- [Extension-Combination - common](https://dl.static-php.dev/static-php-cli/common/): `common` contains about [30+](https://dl.static-php.dev/static-php-cli/common/README.txt) commonly used extensions, and the size is about 22MB.
|
- [Extension-Combination - common](https://dl.static-php.dev/static-php-cli/common/): `common` contains about [30+](https://dl.static-php.dev/static-php-cli/common/README.txt) commonly used extensions, and the size is about 7.5MB.
|
||||||
- [Extension-Combination - bulk](https://dl.static-php.dev/static-php-cli/bulk/): `bulk` contains [50+](https://dl.static-php.dev/static-php-cli/bulk/README.txt) extensions and is about 70MB in size.
|
- [Extension-Combination - bulk](https://dl.static-php.dev/static-php-cli/bulk/): `bulk` contains [50+](https://dl.static-php.dev/static-php-cli/bulk/README.txt) extensions and is about 25MB in size.
|
||||||
- [Extension-Combination - minimal](https://dl.static-php.dev/static-php-cli/minimal/): `minimal` contains [5](https://dl.static-php.dev/static-php-cli/minimal/README.txt) extensions and is about 6MB in size.
|
- [Extension-Combination - minimal](https://dl.static-php.dev/static-php-cli/minimal/): `minimal` contains [5](https://dl.static-php.dev/static-php-cli/minimal/README.txt) extensions and is about 3MB in size.
|
||||||
|
|
||||||
|
> Linux and Windows supports UPX compression for binaries, which can reduce the size of the binary by 30% to 50%.
|
||||||
|
> macOS does not support UPX compression, so the size of the pre-built binaries for mac is larger.
|
||||||
|
|
||||||
For Windows systems, there are currently fewer extensions supported,
|
For Windows systems, there are currently fewer extensions supported,
|
||||||
so only `cli` and `micro` that run the minimum extension combination of SPC itself are provided: [Extension-Combination - spc-min](https://dl.static-php.dev/static-php-cli/windows/spc-min/).
|
so only `cli` and `micro` that run the minimum extension combination of SPC itself are provided: [Extension-Combination - spc-min](https://dl.static-php.dev/static-php-cli/windows/spc-min/).
|
||||||
@@ -79,7 +82,7 @@ Here is the supported OS and arch, where :octocat: represents support for GitHub
|
|||||||
|
|
||||||
Currently supported PHP versions for compilation:
|
Currently supported PHP versions for compilation:
|
||||||
|
|
||||||
> :warning: supported but not maintained
|
> :warning: supported but not maintained by static-php-cli authors
|
||||||
>
|
>
|
||||||
> :heavy_check_mark: supported
|
> :heavy_check_mark: supported
|
||||||
>
|
>
|
||||||
@@ -91,7 +94,7 @@ Currently supported PHP versions for compilation:
|
|||||||
| 7.3 | :warning: | phpmicro and some extensions not supported on 7.x |
|
| 7.3 | :warning: | phpmicro and some extensions not supported on 7.x |
|
||||||
| 7.4 | :warning: | phpmicro and some extensions not supported on 7.x |
|
| 7.4 | :warning: | phpmicro and some extensions not supported on 7.x |
|
||||||
| 8.0 | :heavy_check_mark: | PHP official has stopped maintenance of 8.0 |
|
| 8.0 | :heavy_check_mark: | PHP official has stopped maintenance of 8.0 |
|
||||||
| 8.1 | :heavy_check_mark: | |
|
| 8.1 | :heavy_check_mark: | PHP official has security fixes only |
|
||||||
| 8.2 | :heavy_check_mark: | |
|
| 8.2 | :heavy_check_mark: | |
|
||||||
| 8.3 | :heavy_check_mark: | |
|
| 8.3 | :heavy_check_mark: | |
|
||||||
|
|
||||||
|
|||||||
1
box.json
1
box.json
@@ -4,6 +4,7 @@
|
|||||||
"blacklist": [
|
"blacklist": [
|
||||||
".github"
|
".github"
|
||||||
],
|
],
|
||||||
|
"compression": "GZ",
|
||||||
"directories": [
|
"directories": [
|
||||||
"config",
|
"config",
|
||||||
"src",
|
"src",
|
||||||
|
|||||||
@@ -16,8 +16,8 @@
|
|||||||
"zhamao/logger": "^1.0"
|
"zhamao/logger": "^1.0"
|
||||||
},
|
},
|
||||||
"require-dev": {
|
"require-dev": {
|
||||||
"captainhook/captainhook": "^5.10",
|
"captainhook/captainhook-phar": "^5.23",
|
||||||
"captainhook/plugin-composer": "^5.3",
|
"captainhook/hook-installer": "^1.0",
|
||||||
"friendsofphp/php-cs-fixer": "^3.25",
|
"friendsofphp/php-cs-fixer": "^3.25",
|
||||||
"humbug/box": "^4.5",
|
"humbug/box": "^4.5",
|
||||||
"nunomaduro/collision": "^7.8",
|
"nunomaduro/collision": "^7.8",
|
||||||
@@ -50,7 +50,9 @@
|
|||||||
"config": {
|
"config": {
|
||||||
"allow-plugins": {
|
"allow-plugins": {
|
||||||
"phpstan/extension-installer": true,
|
"phpstan/extension-installer": true,
|
||||||
"captainhook/plugin-composer": true
|
"captainhook/hook-installer": true,
|
||||||
|
"captainhook/plugin-composer": true,
|
||||||
|
"captainhook/captainhook-phar": true
|
||||||
},
|
},
|
||||||
"optimize-autoloader": true,
|
"optimize-autoloader": true,
|
||||||
"sort-packages": true
|
"sort-packages": true
|
||||||
|
|||||||
1688
composer.lock
generated
1688
composer.lock
generated
File diff suppressed because it is too large
Load Diff
303
config/ext.json
303
config/ext.json
@@ -1,5 +1,8 @@
|
|||||||
{
|
{
|
||||||
"amqp": {
|
"amqp": {
|
||||||
|
"support": {
|
||||||
|
"BSD": "wip"
|
||||||
|
},
|
||||||
"type": "external",
|
"type": "external",
|
||||||
"arg-type": "custom",
|
"arg-type": "custom",
|
||||||
"source": "amqp",
|
"source": "amqp",
|
||||||
@@ -18,6 +21,9 @@
|
|||||||
"type": "builtin"
|
"type": "builtin"
|
||||||
},
|
},
|
||||||
"bz2": {
|
"bz2": {
|
||||||
|
"support": {
|
||||||
|
"Windows": "wip"
|
||||||
|
},
|
||||||
"type": "builtin",
|
"type": "builtin",
|
||||||
"arg-type": "with-prefix",
|
"arg-type": "with-prefix",
|
||||||
"lib-depends": [
|
"lib-depends": [
|
||||||
@@ -31,6 +37,7 @@
|
|||||||
"type": "builtin"
|
"type": "builtin"
|
||||||
},
|
},
|
||||||
"curl": {
|
"curl": {
|
||||||
|
"notes": true,
|
||||||
"type": "builtin",
|
"type": "builtin",
|
||||||
"arg-type": "with",
|
"arg-type": "with",
|
||||||
"lib-depends": [
|
"lib-depends": [
|
||||||
@@ -49,6 +56,9 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"dom": {
|
"dom": {
|
||||||
|
"support": {
|
||||||
|
"BSD": "wip"
|
||||||
|
},
|
||||||
"type": "builtin",
|
"type": "builtin",
|
||||||
"arg-type": "custom",
|
"arg-type": "custom",
|
||||||
"arg-type-windows": "with",
|
"arg-type-windows": "with",
|
||||||
@@ -64,7 +74,21 @@
|
|||||||
"type": "external",
|
"type": "external",
|
||||||
"source": "ext-ds"
|
"source": "ext-ds"
|
||||||
},
|
},
|
||||||
|
"enchant": {
|
||||||
|
"support": {
|
||||||
|
"Windows": "wip",
|
||||||
|
"BSD": "wip",
|
||||||
|
"Darwin": "wip",
|
||||||
|
"Linux": "wip"
|
||||||
|
},
|
||||||
|
"type": "wip"
|
||||||
|
},
|
||||||
"event": {
|
"event": {
|
||||||
|
"support": {
|
||||||
|
"Windows": "wip",
|
||||||
|
"BSD": "wip"
|
||||||
|
},
|
||||||
|
"notes": true,
|
||||||
"type": "external",
|
"type": "external",
|
||||||
"source": "ext-event",
|
"source": "ext-event",
|
||||||
"arg-type": "custom",
|
"arg-type": "custom",
|
||||||
@@ -82,6 +106,11 @@
|
|||||||
"type": "builtin"
|
"type": "builtin"
|
||||||
},
|
},
|
||||||
"ffi": {
|
"ffi": {
|
||||||
|
"support": {
|
||||||
|
"Linux": "no",
|
||||||
|
"BSD": "wip"
|
||||||
|
},
|
||||||
|
"notes": true,
|
||||||
"arg-type": "custom",
|
"arg-type": "custom",
|
||||||
"type": "builtin",
|
"type": "builtin",
|
||||||
"lib-depends-unix": [
|
"lib-depends-unix": [
|
||||||
@@ -104,6 +133,11 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"gd": {
|
"gd": {
|
||||||
|
"support": {
|
||||||
|
"Windows": "wip",
|
||||||
|
"BSD": "wip"
|
||||||
|
},
|
||||||
|
"notes": true,
|
||||||
"type": "builtin",
|
"type": "builtin",
|
||||||
"arg-type": "custom",
|
"arg-type": "custom",
|
||||||
"arg-type-windows": "with",
|
"arg-type-windows": "with",
|
||||||
@@ -122,6 +156,10 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"gettext": {
|
"gettext": {
|
||||||
|
"support": {
|
||||||
|
"Windows": "wip",
|
||||||
|
"BSD": "wip"
|
||||||
|
},
|
||||||
"type": "builtin",
|
"type": "builtin",
|
||||||
"arg-type": "with-prefix",
|
"arg-type": "with-prefix",
|
||||||
"lib-depends": [
|
"lib-depends": [
|
||||||
@@ -129,6 +167,12 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"glfw": {
|
"glfw": {
|
||||||
|
"support": {
|
||||||
|
"Windows": "wip",
|
||||||
|
"BSD": "no",
|
||||||
|
"Linux": "no"
|
||||||
|
},
|
||||||
|
"notes": true,
|
||||||
"type": "external",
|
"type": "external",
|
||||||
"arg-type": "custom",
|
"arg-type": "custom",
|
||||||
"source": "ext-glfw",
|
"source": "ext-glfw",
|
||||||
@@ -138,6 +182,10 @@
|
|||||||
"lib-depends-windows": []
|
"lib-depends-windows": []
|
||||||
},
|
},
|
||||||
"gmp": {
|
"gmp": {
|
||||||
|
"support": {
|
||||||
|
"Windows": "wip",
|
||||||
|
"BSD": "wip"
|
||||||
|
},
|
||||||
"type": "builtin",
|
"type": "builtin",
|
||||||
"arg-type": "with-prefix",
|
"arg-type": "with-prefix",
|
||||||
"lib-depends": [
|
"lib-depends": [
|
||||||
@@ -145,6 +193,9 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"iconv": {
|
"iconv": {
|
||||||
|
"support": {
|
||||||
|
"BSD": "wip"
|
||||||
|
},
|
||||||
"type": "builtin",
|
"type": "builtin",
|
||||||
"arg-type": "with-prefix",
|
"arg-type": "with-prefix",
|
||||||
"arg-type-windows": "with",
|
"arg-type-windows": "with",
|
||||||
@@ -156,10 +207,18 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"igbinary": {
|
"igbinary": {
|
||||||
|
"support": {
|
||||||
|
"Windows": "wip",
|
||||||
|
"BSD": "wip"
|
||||||
|
},
|
||||||
"type": "external",
|
"type": "external",
|
||||||
"source": "igbinary"
|
"source": "igbinary"
|
||||||
},
|
},
|
||||||
"imagick": {
|
"imagick": {
|
||||||
|
"support": {
|
||||||
|
"Windows": "wip",
|
||||||
|
"BSD": "wip"
|
||||||
|
},
|
||||||
"type": "external",
|
"type": "external",
|
||||||
"source": "ext-imagick",
|
"source": "ext-imagick",
|
||||||
"arg-type": "custom",
|
"arg-type": "custom",
|
||||||
@@ -168,26 +227,44 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"imap": {
|
"imap": {
|
||||||
|
"support": {
|
||||||
|
"Windows": "wip",
|
||||||
|
"BSD": "wip"
|
||||||
|
},
|
||||||
|
"notes": true,
|
||||||
"type": "builtin",
|
"type": "builtin",
|
||||||
"arg-type": "custom",
|
"arg-type": "custom",
|
||||||
"lib-depends": [
|
"lib-depends": [
|
||||||
"imap"
|
"imap"
|
||||||
],
|
],
|
||||||
"lib-suggests": [
|
"ext-suggests": [
|
||||||
"openssl"
|
"openssl"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"inotify": {
|
"inotify": {
|
||||||
|
"support": {
|
||||||
|
"Windows": "no",
|
||||||
|
"BSD": "wip",
|
||||||
|
"Darwin": "no"
|
||||||
|
},
|
||||||
"type": "external",
|
"type": "external",
|
||||||
"source": "inotify"
|
"source": "inotify"
|
||||||
},
|
},
|
||||||
"intl": {
|
"intl": {
|
||||||
|
"support": {
|
||||||
|
"Windows": "no",
|
||||||
|
"BSD": "wip"
|
||||||
|
},
|
||||||
"type": "builtin",
|
"type": "builtin",
|
||||||
"lib-depends": [
|
"lib-depends": [
|
||||||
"icu"
|
"icu"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"ldap": {
|
"ldap": {
|
||||||
|
"support": {
|
||||||
|
"Windows": "wip",
|
||||||
|
"BSD": "wip"
|
||||||
|
},
|
||||||
"type": "builtin",
|
"type": "builtin",
|
||||||
"arg-type": "with-prefix",
|
"arg-type": "with-prefix",
|
||||||
"lib-depends": [
|
"lib-depends": [
|
||||||
@@ -201,6 +278,16 @@
|
|||||||
"openssl"
|
"openssl"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
"libxml": {
|
||||||
|
"support": {
|
||||||
|
"BSD": "wip"
|
||||||
|
},
|
||||||
|
"type": "builtin",
|
||||||
|
"arg-type": "none",
|
||||||
|
"ext-depends": [
|
||||||
|
"xml"
|
||||||
|
]
|
||||||
|
},
|
||||||
"mbregex": {
|
"mbregex": {
|
||||||
"type": "builtin",
|
"type": "builtin",
|
||||||
"arg-type": "custom",
|
"arg-type": "custom",
|
||||||
@@ -215,7 +302,21 @@
|
|||||||
"type": "builtin",
|
"type": "builtin",
|
||||||
"arg-type": "custom"
|
"arg-type": "custom"
|
||||||
},
|
},
|
||||||
|
"mcrypt": {
|
||||||
|
"type": "wip",
|
||||||
|
"support": {
|
||||||
|
"Windows": "no",
|
||||||
|
"BSD": "no",
|
||||||
|
"Darwin": "no",
|
||||||
|
"Linux": "no"
|
||||||
|
},
|
||||||
|
"notes": true
|
||||||
|
},
|
||||||
"memcache": {
|
"memcache": {
|
||||||
|
"support": {
|
||||||
|
"Windows": "wip",
|
||||||
|
"BSD": "wip"
|
||||||
|
},
|
||||||
"type": "external",
|
"type": "external",
|
||||||
"source": "ext-memcache",
|
"source": "ext-memcache",
|
||||||
"arg-type": "custom",
|
"arg-type": "custom",
|
||||||
@@ -227,6 +328,11 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"memcached": {
|
"memcached": {
|
||||||
|
"support": {
|
||||||
|
"Windows": "wip",
|
||||||
|
"BSD": "wip",
|
||||||
|
"Linux": "no"
|
||||||
|
},
|
||||||
"type": "external",
|
"type": "external",
|
||||||
"source": "memcached",
|
"source": "memcached",
|
||||||
"arg-type": "custom",
|
"arg-type": "custom",
|
||||||
@@ -240,6 +346,12 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"mongodb": {
|
"mongodb": {
|
||||||
|
"support": {
|
||||||
|
"Darwin": "no",
|
||||||
|
"BSD": "wip",
|
||||||
|
"Windows": "wip"
|
||||||
|
},
|
||||||
|
"notes": true,
|
||||||
"type": "external",
|
"type": "external",
|
||||||
"source": "mongodb",
|
"source": "mongodb",
|
||||||
"arg-type": "custom",
|
"arg-type": "custom",
|
||||||
@@ -264,11 +376,22 @@
|
|||||||
"zlib"
|
"zlib"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
"oci8": {
|
||||||
|
"type": "wip",
|
||||||
|
"support": {
|
||||||
|
"Windows": "wip",
|
||||||
|
"BSD": "no",
|
||||||
|
"Darwin": "no",
|
||||||
|
"Linux": "no"
|
||||||
|
},
|
||||||
|
"notes": true
|
||||||
|
},
|
||||||
"opcache": {
|
"opcache": {
|
||||||
"type": "builtin",
|
"type": "builtin",
|
||||||
"arg-type": "custom"
|
"arg-type": "custom"
|
||||||
},
|
},
|
||||||
"openssl": {
|
"openssl": {
|
||||||
|
"notes": true,
|
||||||
"type": "builtin",
|
"type": "builtin",
|
||||||
"arg-type": "custom",
|
"arg-type": "custom",
|
||||||
"arg-type-windows": "with",
|
"arg-type-windows": "with",
|
||||||
@@ -280,7 +403,24 @@
|
|||||||
"zlib"
|
"zlib"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
"parallel": {
|
||||||
|
"support": {
|
||||||
|
"BSD": "wip"
|
||||||
|
},
|
||||||
|
"notes": true,
|
||||||
|
"type": "external",
|
||||||
|
"source": "parallel",
|
||||||
|
"arg-type-windows": "with",
|
||||||
|
"lib-depends-windows": [
|
||||||
|
"pthreads4w"
|
||||||
|
]
|
||||||
|
},
|
||||||
"password-argon2": {
|
"password-argon2": {
|
||||||
|
"support": {
|
||||||
|
"Windows": "wip",
|
||||||
|
"BSD": "wip"
|
||||||
|
},
|
||||||
|
"notes": true,
|
||||||
"type": "builtin",
|
"type": "builtin",
|
||||||
"arg-type": "with-prefix",
|
"arg-type": "with-prefix",
|
||||||
"lib-depends": [
|
"lib-depends": [
|
||||||
@@ -288,6 +428,9 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"pcntl": {
|
"pcntl": {
|
||||||
|
"support": {
|
||||||
|
"Windows": "no"
|
||||||
|
},
|
||||||
"type": "builtin",
|
"type": "builtin",
|
||||||
"unix-only": true
|
"unix-only": true
|
||||||
},
|
},
|
||||||
@@ -303,6 +446,10 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"pdo_pgsql": {
|
"pdo_pgsql": {
|
||||||
|
"support": {
|
||||||
|
"Windows": "wip",
|
||||||
|
"BSD": "wip"
|
||||||
|
},
|
||||||
"type": "builtin",
|
"type": "builtin",
|
||||||
"arg-type": "with-prefix",
|
"arg-type": "with-prefix",
|
||||||
"ext-depends": [
|
"ext-depends": [
|
||||||
@@ -314,6 +461,9 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"pdo_sqlite": {
|
"pdo_sqlite": {
|
||||||
|
"support": {
|
||||||
|
"BSD": "wip"
|
||||||
|
},
|
||||||
"type": "builtin",
|
"type": "builtin",
|
||||||
"arg-type": "with",
|
"arg-type": "with",
|
||||||
"ext-depends": [
|
"ext-depends": [
|
||||||
@@ -325,6 +475,10 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"pdo_sqlsrv": {
|
"pdo_sqlsrv": {
|
||||||
|
"support": {
|
||||||
|
"Windows": "wip",
|
||||||
|
"BSD": "wip"
|
||||||
|
},
|
||||||
"type": "external",
|
"type": "external",
|
||||||
"source": "pdo_sqlsrv",
|
"source": "pdo_sqlsrv",
|
||||||
"arg-type": "with",
|
"arg-type": "with",
|
||||||
@@ -334,6 +488,11 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"pgsql": {
|
"pgsql": {
|
||||||
|
"support": {
|
||||||
|
"Windows": "wip",
|
||||||
|
"BSD": "wip"
|
||||||
|
},
|
||||||
|
"notes": true,
|
||||||
"type": "builtin",
|
"type": "builtin",
|
||||||
"arg-type": "with-prefix",
|
"arg-type": "with-prefix",
|
||||||
"lib-depends": [
|
"lib-depends": [
|
||||||
@@ -347,19 +506,36 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"posix": {
|
"posix": {
|
||||||
|
"support": {
|
||||||
|
"Windows": "no"
|
||||||
|
},
|
||||||
"type": "builtin",
|
"type": "builtin",
|
||||||
"unix-only": true
|
"unix-only": true
|
||||||
},
|
},
|
||||||
"protobuf": {
|
"protobuf": {
|
||||||
|
"support": {
|
||||||
|
"Windows": "wip",
|
||||||
|
"BSD": "wip"
|
||||||
|
},
|
||||||
"type": "external",
|
"type": "external",
|
||||||
"source": "protobuf"
|
"source": "protobuf"
|
||||||
},
|
},
|
||||||
"rar": {
|
"rar": {
|
||||||
|
"support": {
|
||||||
|
"Windows": "wip",
|
||||||
|
"BSD": "wip",
|
||||||
|
"Darwin": "partial"
|
||||||
|
},
|
||||||
|
"notes": true,
|
||||||
"type": "external",
|
"type": "external",
|
||||||
"source": "rar",
|
"source": "rar",
|
||||||
"cpp-extension": true
|
"cpp-extension": true
|
||||||
},
|
},
|
||||||
"readline": {
|
"readline": {
|
||||||
|
"support": {
|
||||||
|
"Windows": "wip",
|
||||||
|
"BSD": "wip"
|
||||||
|
},
|
||||||
"type": "builtin",
|
"type": "builtin",
|
||||||
"arg-type": "with-prefix",
|
"arg-type": "with-prefix",
|
||||||
"lib-depends": [
|
"lib-depends": [
|
||||||
@@ -367,6 +543,10 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"redis": {
|
"redis": {
|
||||||
|
"support": {
|
||||||
|
"Windows": "wip",
|
||||||
|
"BSD": "wip"
|
||||||
|
},
|
||||||
"type": "external",
|
"type": "external",
|
||||||
"source": "redis",
|
"source": "redis",
|
||||||
"arg-type": "custom",
|
"arg-type": "custom",
|
||||||
@@ -391,6 +571,9 @@
|
|||||||
"cpp-extension": true
|
"cpp-extension": true
|
||||||
},
|
},
|
||||||
"simplexml": {
|
"simplexml": {
|
||||||
|
"support": {
|
||||||
|
"BSD": "wip"
|
||||||
|
},
|
||||||
"type": "builtin",
|
"type": "builtin",
|
||||||
"arg-type": "custom",
|
"arg-type": "custom",
|
||||||
"lib-depends": [
|
"lib-depends": [
|
||||||
@@ -401,6 +584,10 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"snappy": {
|
"snappy": {
|
||||||
|
"support": {
|
||||||
|
"Windows": "wip",
|
||||||
|
"BSD": "wip"
|
||||||
|
},
|
||||||
"type": "external",
|
"type": "external",
|
||||||
"source": "ext-snappy",
|
"source": "ext-snappy",
|
||||||
"cpp-extension": true,
|
"cpp-extension": true,
|
||||||
@@ -413,6 +600,9 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"soap": {
|
"soap": {
|
||||||
|
"support": {
|
||||||
|
"BSD": "wip"
|
||||||
|
},
|
||||||
"type": "builtin",
|
"type": "builtin",
|
||||||
"arg-type": "custom",
|
"arg-type": "custom",
|
||||||
"lib-depends": [
|
"lib-depends": [
|
||||||
@@ -426,6 +616,10 @@
|
|||||||
"type": "builtin"
|
"type": "builtin"
|
||||||
},
|
},
|
||||||
"sodium": {
|
"sodium": {
|
||||||
|
"support": {
|
||||||
|
"Windows": "wip",
|
||||||
|
"BSD": "wip"
|
||||||
|
},
|
||||||
"type": "builtin",
|
"type": "builtin",
|
||||||
"arg-type": "with",
|
"arg-type": "with",
|
||||||
"lib-depends": [
|
"lib-depends": [
|
||||||
@@ -433,6 +627,9 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"sqlite3": {
|
"sqlite3": {
|
||||||
|
"support": {
|
||||||
|
"BSD": "wip"
|
||||||
|
},
|
||||||
"type": "builtin",
|
"type": "builtin",
|
||||||
"arg-type": "with-prefix",
|
"arg-type": "with-prefix",
|
||||||
"arg-type-windows": "with",
|
"arg-type-windows": "with",
|
||||||
@@ -441,6 +638,10 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"sqlsrv": {
|
"sqlsrv": {
|
||||||
|
"support": {
|
||||||
|
"Windows": "wip",
|
||||||
|
"BSD": "wip"
|
||||||
|
},
|
||||||
"type": "external",
|
"type": "external",
|
||||||
"source": "sqlsrv",
|
"source": "sqlsrv",
|
||||||
"lib-depends": [
|
"lib-depends": [
|
||||||
@@ -452,6 +653,9 @@
|
|||||||
"cpp-extension": true
|
"cpp-extension": true
|
||||||
},
|
},
|
||||||
"ssh2": {
|
"ssh2": {
|
||||||
|
"support": {
|
||||||
|
"BSD": "wip"
|
||||||
|
},
|
||||||
"type": "external",
|
"type": "external",
|
||||||
"source": "ext-ssh2",
|
"source": "ext-ssh2",
|
||||||
"arg-type": "with-prefix",
|
"arg-type": "with-prefix",
|
||||||
@@ -465,6 +669,11 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"swoole": {
|
"swoole": {
|
||||||
|
"support": {
|
||||||
|
"Windows": "no",
|
||||||
|
"BSD": "wip"
|
||||||
|
},
|
||||||
|
"notes": true,
|
||||||
"type": "external",
|
"type": "external",
|
||||||
"source": "swoole",
|
"source": "swoole",
|
||||||
"arg-type": "custom",
|
"arg-type": "custom",
|
||||||
@@ -487,6 +696,11 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"swoole-hook-mysql": {
|
"swoole-hook-mysql": {
|
||||||
|
"support": {
|
||||||
|
"Windows": "no",
|
||||||
|
"BSD": "wip"
|
||||||
|
},
|
||||||
|
"notes": true,
|
||||||
"type": "addon",
|
"type": "addon",
|
||||||
"arg-type": "custom",
|
"arg-type": "custom",
|
||||||
"ext-depends": [
|
"ext-depends": [
|
||||||
@@ -499,6 +713,12 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"swoole-hook-pgsql": {
|
"swoole-hook-pgsql": {
|
||||||
|
"support": {
|
||||||
|
"Windows": "no",
|
||||||
|
"BSD": "wip",
|
||||||
|
"Darwin": "partial"
|
||||||
|
},
|
||||||
|
"notes": true,
|
||||||
"type": "addon",
|
"type": "addon",
|
||||||
"arg-type": "custom",
|
"arg-type": "custom",
|
||||||
"ext-depends": [
|
"ext-depends": [
|
||||||
@@ -507,6 +727,11 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"swoole-hook-sqlite": {
|
"swoole-hook-sqlite": {
|
||||||
|
"support": {
|
||||||
|
"Windows": "no",
|
||||||
|
"BSD": "wip"
|
||||||
|
},
|
||||||
|
"notes": true,
|
||||||
"type": "addon",
|
"type": "addon",
|
||||||
"arg-type": "custom",
|
"arg-type": "custom",
|
||||||
"ext-depends": [
|
"ext-depends": [
|
||||||
@@ -515,6 +740,11 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"swow": {
|
"swow": {
|
||||||
|
"support": {
|
||||||
|
"Windows": "wip",
|
||||||
|
"BSD": "wip"
|
||||||
|
},
|
||||||
|
"notes": true,
|
||||||
"type": "external",
|
"type": "external",
|
||||||
"source": "swow",
|
"source": "swow",
|
||||||
"arg-type": "custom",
|
"arg-type": "custom",
|
||||||
@@ -528,17 +758,32 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"sysvmsg": {
|
"sysvmsg": {
|
||||||
|
"support": {
|
||||||
|
"Windows": "no",
|
||||||
|
"BSD": "wip"
|
||||||
|
},
|
||||||
"type": "builtin",
|
"type": "builtin",
|
||||||
"unix-only": true
|
"unix-only": true
|
||||||
},
|
},
|
||||||
"sysvsem": {
|
"sysvsem": {
|
||||||
|
"support": {
|
||||||
|
"Windows": "no",
|
||||||
|
"BSD": "wip"
|
||||||
|
},
|
||||||
"type": "builtin",
|
"type": "builtin",
|
||||||
"unix-only": true
|
"unix-only": true
|
||||||
},
|
},
|
||||||
"sysvshm": {
|
"sysvshm": {
|
||||||
|
"support": {
|
||||||
|
"BSD": "wip"
|
||||||
|
},
|
||||||
"type": "builtin"
|
"type": "builtin"
|
||||||
},
|
},
|
||||||
"tidy": {
|
"tidy": {
|
||||||
|
"support": {
|
||||||
|
"Windows": "wip",
|
||||||
|
"BSD": "wip"
|
||||||
|
},
|
||||||
"type": "builtin",
|
"type": "builtin",
|
||||||
"arg-type": "with-prefix",
|
"arg-type": "with-prefix",
|
||||||
"lib-depends": [
|
"lib-depends": [
|
||||||
@@ -549,6 +794,10 @@
|
|||||||
"type": "builtin"
|
"type": "builtin"
|
||||||
},
|
},
|
||||||
"uuid": {
|
"uuid": {
|
||||||
|
"support": {
|
||||||
|
"Windows": "wip",
|
||||||
|
"BSD": "wip"
|
||||||
|
},
|
||||||
"type": "external",
|
"type": "external",
|
||||||
"source": "ext-uuid",
|
"source": "ext-uuid",
|
||||||
"arg-type": "with-prefix",
|
"arg-type": "with-prefix",
|
||||||
@@ -557,6 +806,10 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"uv": {
|
"uv": {
|
||||||
|
"support": {
|
||||||
|
"Windows": "wip",
|
||||||
|
"BSD": "wip"
|
||||||
|
},
|
||||||
"type": "external",
|
"type": "external",
|
||||||
"source": "ext-uv",
|
"source": "ext-uv",
|
||||||
"arg-type": "with-prefix",
|
"arg-type": "with-prefix",
|
||||||
@@ -567,7 +820,22 @@
|
|||||||
"sockets"
|
"sockets"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
"xdebug": {
|
||||||
|
"type": "builtin",
|
||||||
|
"support": {
|
||||||
|
"Windows": "wip",
|
||||||
|
"BSD": "no",
|
||||||
|
"Darwin": "no",
|
||||||
|
"Linux": "no"
|
||||||
|
},
|
||||||
|
"notes": true
|
||||||
|
},
|
||||||
"xhprof": {
|
"xhprof": {
|
||||||
|
"support": {
|
||||||
|
"Windows": "wip",
|
||||||
|
"BSD": "wip"
|
||||||
|
},
|
||||||
|
"notes": true,
|
||||||
"type": "external",
|
"type": "external",
|
||||||
"source": "xhprof",
|
"source": "xhprof",
|
||||||
"ext-depends": [
|
"ext-depends": [
|
||||||
@@ -575,6 +843,10 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"xlswriter": {
|
"xlswriter": {
|
||||||
|
"support": {
|
||||||
|
"Windows": "wip",
|
||||||
|
"BSD": "wip"
|
||||||
|
},
|
||||||
"type": "external",
|
"type": "external",
|
||||||
"source": "xlswriter",
|
"source": "xlswriter",
|
||||||
"arg-type": "custom",
|
"arg-type": "custom",
|
||||||
@@ -584,6 +856,10 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"xml": {
|
"xml": {
|
||||||
|
"support": {
|
||||||
|
"BSD": "wip"
|
||||||
|
},
|
||||||
|
"notes": true,
|
||||||
"type": "builtin",
|
"type": "builtin",
|
||||||
"arg-type": "custom",
|
"arg-type": "custom",
|
||||||
"arg-type-windows": "with",
|
"arg-type-windows": "with",
|
||||||
@@ -595,6 +871,9 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"xmlreader": {
|
"xmlreader": {
|
||||||
|
"support": {
|
||||||
|
"BSD": "wip"
|
||||||
|
},
|
||||||
"type": "builtin",
|
"type": "builtin",
|
||||||
"arg-type": "custom",
|
"arg-type": "custom",
|
||||||
"lib-depends": [
|
"lib-depends": [
|
||||||
@@ -606,6 +885,9 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"xmlwriter": {
|
"xmlwriter": {
|
||||||
|
"support": {
|
||||||
|
"BSD": "wip"
|
||||||
|
},
|
||||||
"type": "builtin",
|
"type": "builtin",
|
||||||
"arg-type": "custom",
|
"arg-type": "custom",
|
||||||
"lib-depends": [
|
"lib-depends": [
|
||||||
@@ -616,6 +898,10 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"xsl": {
|
"xsl": {
|
||||||
|
"support": {
|
||||||
|
"Windows": "wip",
|
||||||
|
"BSD": "wip"
|
||||||
|
},
|
||||||
"type": "builtin",
|
"type": "builtin",
|
||||||
"arg-type": "with-prefix",
|
"arg-type": "with-prefix",
|
||||||
"lib-depends": [
|
"lib-depends": [
|
||||||
@@ -627,6 +913,9 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"yac": {
|
"yac": {
|
||||||
|
"support": {
|
||||||
|
"BSD": "wip"
|
||||||
|
},
|
||||||
"type": "external",
|
"type": "external",
|
||||||
"source": "yac",
|
"source": "yac",
|
||||||
"arg-type-unix": "custom",
|
"arg-type-unix": "custom",
|
||||||
@@ -635,6 +924,10 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"yaml": {
|
"yaml": {
|
||||||
|
"support": {
|
||||||
|
"Windows": "wip",
|
||||||
|
"BSD": "wip"
|
||||||
|
},
|
||||||
"type": "external",
|
"type": "external",
|
||||||
"source": "yaml",
|
"source": "yaml",
|
||||||
"arg-type": "with-prefix",
|
"arg-type": "with-prefix",
|
||||||
@@ -643,6 +936,10 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"zip": {
|
"zip": {
|
||||||
|
"support": {
|
||||||
|
"Windows": "wip",
|
||||||
|
"BSD": "wip"
|
||||||
|
},
|
||||||
"type": "builtin",
|
"type": "builtin",
|
||||||
"arg-type": "with-prefix",
|
"arg-type": "with-prefix",
|
||||||
"arg-type-windows": "enable",
|
"arg-type-windows": "enable",
|
||||||
@@ -659,6 +956,10 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"zstd": {
|
"zstd": {
|
||||||
|
"support": {
|
||||||
|
"Windows": "wip",
|
||||||
|
"BSD": "wip"
|
||||||
|
},
|
||||||
"type": "external",
|
"type": "external",
|
||||||
"source": "ext-zstd",
|
"source": "ext-zstd",
|
||||||
"arg-type": "custom",
|
"arg-type": "custom",
|
||||||
|
|||||||
@@ -528,6 +528,12 @@
|
|||||||
"zstd"
|
"zstd"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
"pthreads4w": {
|
||||||
|
"source": "pthreads4w",
|
||||||
|
"static-libs-windows": [
|
||||||
|
"libpthreadVC3.lib"
|
||||||
|
]
|
||||||
|
},
|
||||||
"qdbm": {
|
"qdbm": {
|
||||||
"source": "qdbm",
|
"source": "qdbm",
|
||||||
"static-libs-unix": [
|
"static-libs-unix": [
|
||||||
|
|||||||
@@ -259,9 +259,14 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"libcares": {
|
"libcares": {
|
||||||
"type": "filelist",
|
"type": "ghrel",
|
||||||
"url": "https://c-ares.org/download/",
|
"repo": "c-ares/c-ares",
|
||||||
"regex": "/href=\"\\/download\\/(?<file>c-ares-(?<version>[^\"]+)\\.tar\\.gz)\"/",
|
"match": "c-ares-.+\\.tar\\.gz",
|
||||||
|
"alt": {
|
||||||
|
"type": "filelist",
|
||||||
|
"url": "https://c-ares.org/download/",
|
||||||
|
"regex": "/href=\"\\/download\\/(?<file>c-ares-(?<version>[^\"]+)\\.tar\\.gz)\"/"
|
||||||
|
},
|
||||||
"license": {
|
"license": {
|
||||||
"type": "file",
|
"type": "file",
|
||||||
"path": "LICENSE.md"
|
"path": "LICENSE.md"
|
||||||
@@ -463,7 +468,7 @@
|
|||||||
"type": "git",
|
"type": "git",
|
||||||
"path": "php-src/sapi/micro",
|
"path": "php-src/sapi/micro",
|
||||||
"rev": "master",
|
"rev": "master",
|
||||||
"url": "https://github.com/static-php/phpmicro",
|
"url": "https://github.com/easysoft/phpmicro",
|
||||||
"license": {
|
"license": {
|
||||||
"type": "file",
|
"type": "file",
|
||||||
"path": "LICENSE"
|
"path": "LICENSE"
|
||||||
@@ -515,6 +520,16 @@
|
|||||||
"path": "LICENSE.txt"
|
"path": "LICENSE.txt"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"parallel": {
|
||||||
|
"type": "url",
|
||||||
|
"url": "https://pecl.php.net/get/parallel",
|
||||||
|
"path": "php-src/ext/parallel",
|
||||||
|
"filename": "parallel.tgz",
|
||||||
|
"license": {
|
||||||
|
"type": "file",
|
||||||
|
"path": "LICENSE"
|
||||||
|
}
|
||||||
|
},
|
||||||
"pdo_sqlsrv": {
|
"pdo_sqlsrv": {
|
||||||
"type": "url",
|
"type": "url",
|
||||||
"url": "https://pecl.php.net/get/pdo_sqlsrv",
|
"url": "https://pecl.php.net/get/pdo_sqlsrv",
|
||||||
@@ -551,6 +566,15 @@
|
|||||||
"path": "LICENSE"
|
"path": "LICENSE"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"pthreads4w": {
|
||||||
|
"type": "git",
|
||||||
|
"rev": "master",
|
||||||
|
"url": "https://git.code.sf.net/p/pthreads4w/code",
|
||||||
|
"license": {
|
||||||
|
"type": "file",
|
||||||
|
"path": "LICENSE"
|
||||||
|
}
|
||||||
|
},
|
||||||
"qdbm": {
|
"qdbm": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/static-php/qdbm.git",
|
"url": "https://github.com/static-php/qdbm.git",
|
||||||
|
|||||||
@@ -13,6 +13,6 @@ parameters:
|
|||||||
- PHP_OS_FAMILY
|
- PHP_OS_FAMILY
|
||||||
excludePaths:
|
excludePaths:
|
||||||
analyseAndScan:
|
analyseAndScan:
|
||||||
- ./src/globals/tests/swoole.php
|
- ./src/globals/ext-tests/swoole.php
|
||||||
- ./src/globals/tests/swoole.phpt
|
- ./src/globals/ext-tests/swoole.phpt
|
||||||
- ./src/globals/test-extensions.php
|
- ./src/globals/test-extensions.php
|
||||||
@@ -8,6 +8,7 @@ use SPC\command\BuildCliCommand;
|
|||||||
use SPC\command\BuildLibsCommand;
|
use SPC\command\BuildLibsCommand;
|
||||||
use SPC\command\DeleteDownloadCommand;
|
use SPC\command\DeleteDownloadCommand;
|
||||||
use SPC\command\dev\AllExtCommand;
|
use SPC\command\dev\AllExtCommand;
|
||||||
|
use SPC\command\dev\GenerateExtDocCommand;
|
||||||
use SPC\command\dev\PhpVerCommand;
|
use SPC\command\dev\PhpVerCommand;
|
||||||
use SPC\command\dev\SortConfigCommand;
|
use SPC\command\dev\SortConfigCommand;
|
||||||
use SPC\command\DoctorCommand;
|
use SPC\command\DoctorCommand;
|
||||||
@@ -16,16 +17,15 @@ use SPC\command\DumpLicenseCommand;
|
|||||||
use SPC\command\ExtractCommand;
|
use SPC\command\ExtractCommand;
|
||||||
use SPC\command\InstallPkgCommand;
|
use SPC\command\InstallPkgCommand;
|
||||||
use SPC\command\MicroCombineCommand;
|
use SPC\command\MicroCombineCommand;
|
||||||
|
use SPC\command\SwitchPhpVersionCommand;
|
||||||
use Symfony\Component\Console\Application;
|
use Symfony\Component\Console\Application;
|
||||||
use Symfony\Component\Console\Command\HelpCommand;
|
|
||||||
use Symfony\Component\Console\Command\ListCommand;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* static-php-cli console app entry
|
* static-php-cli console app entry
|
||||||
*/
|
*/
|
||||||
final class ConsoleApplication extends Application
|
final class ConsoleApplication extends Application
|
||||||
{
|
{
|
||||||
public const VERSION = '2.2.0';
|
public const VERSION = '2.2.2';
|
||||||
|
|
||||||
public function __construct()
|
public function __construct()
|
||||||
{
|
{
|
||||||
@@ -43,17 +43,14 @@ final class ConsoleApplication extends Application
|
|||||||
new DumpLicenseCommand(),
|
new DumpLicenseCommand(),
|
||||||
new ExtractCommand(),
|
new ExtractCommand(),
|
||||||
new MicroCombineCommand(),
|
new MicroCombineCommand(),
|
||||||
|
new SwitchPhpVersionCommand(),
|
||||||
|
|
||||||
// Dev commands
|
// Dev commands
|
||||||
new AllExtCommand(),
|
new AllExtCommand(),
|
||||||
new PhpVerCommand(),
|
new PhpVerCommand(),
|
||||||
new SortConfigCommand(),
|
new SortConfigCommand(),
|
||||||
|
new GenerateExtDocCommand(),
|
||||||
]
|
]
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function getDefaultCommands(): array
|
|
||||||
{
|
|
||||||
return [new HelpCommand(), new ListCommand()];
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ use SPC\exception\FileSystemException;
|
|||||||
use SPC\exception\RuntimeException;
|
use SPC\exception\RuntimeException;
|
||||||
use SPC\exception\WrongUsageException;
|
use SPC\exception\WrongUsageException;
|
||||||
use SPC\store\Config;
|
use SPC\store\Config;
|
||||||
|
use SPC\store\FileSystem;
|
||||||
use SPC\store\SourceManager;
|
use SPC\store\SourceManager;
|
||||||
use SPC\util\CustomExt;
|
use SPC\util\CustomExt;
|
||||||
|
|
||||||
@@ -33,7 +34,7 @@ abstract class BuilderBase
|
|||||||
protected string $patch_point = '';
|
protected string $patch_point = '';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Build libraries
|
* Convert libraries to class
|
||||||
*
|
*
|
||||||
* @param array<string> $sorted_libraries Libraries to build (if not empty, must sort first)
|
* @param array<string> $sorted_libraries Libraries to build (if not empty, must sort first)
|
||||||
* @throws FileSystemException
|
* @throws FileSystemException
|
||||||
@@ -41,7 +42,27 @@ abstract class BuilderBase
|
|||||||
* @throws WrongUsageException
|
* @throws WrongUsageException
|
||||||
* @internal
|
* @internal
|
||||||
*/
|
*/
|
||||||
abstract public function buildLibs(array $sorted_libraries);
|
abstract public function proveLibs(array $sorted_libraries);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Build libraries
|
||||||
|
*
|
||||||
|
* @throws FileSystemException
|
||||||
|
* @throws RuntimeException
|
||||||
|
* @throws WrongUsageException
|
||||||
|
*/
|
||||||
|
public function buildLibs(): void
|
||||||
|
{
|
||||||
|
// build all libs
|
||||||
|
foreach ($this->libs as $lib) {
|
||||||
|
match ($lib->tryBuild($this->getOption('rebuild', false))) {
|
||||||
|
BUILD_STATUS_OK => logger()->info('lib [' . $lib::NAME . '] build success'),
|
||||||
|
BUILD_STATUS_ALREADY => logger()->notice('lib [' . $lib::NAME . '] already built'),
|
||||||
|
BUILD_STATUS_FAILED => logger()->error('lib [' . $lib::NAME . '] build failed'),
|
||||||
|
default => logger()->warning('lib [' . $lib::NAME . '] build status unknown'),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Add library to build.
|
* Add library to build.
|
||||||
@@ -255,6 +276,24 @@ abstract class BuilderBase
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function getMicroVersion(): false|string
|
||||||
|
{
|
||||||
|
$file = FileSystem::convertPath(SOURCE_PATH . '/php-src/sapi/micro/php_micro.h');
|
||||||
|
if (!file_exists($file)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
$content = file_get_contents($file);
|
||||||
|
$ver = '';
|
||||||
|
preg_match('/#define PHP_MICRO_VER_MAJ (\d)/m', $content, $match);
|
||||||
|
$ver .= $match[1] . '.';
|
||||||
|
preg_match('/#define PHP_MICRO_VER_MIN (\d)/m', $content, $match);
|
||||||
|
$ver .= $match[1] . '.';
|
||||||
|
preg_match('/#define PHP_MICRO_VER_PAT (\d)/m', $content, $match);
|
||||||
|
$ver .= $match[1];
|
||||||
|
return $ver;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get build type name string to display.
|
* Get build type name string to display.
|
||||||
*
|
*
|
||||||
@@ -335,6 +374,19 @@ abstract class BuilderBase
|
|||||||
return $this->patch_point;
|
return $this->patch_point;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Validate libs and exts can be compiled successfully in current environment
|
||||||
|
*/
|
||||||
|
public function validateLibsAndExts(): void
|
||||||
|
{
|
||||||
|
foreach ($this->libs as $lib) {
|
||||||
|
$lib->validate();
|
||||||
|
}
|
||||||
|
foreach ($this->exts as $ext) {
|
||||||
|
$ext->validate();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public function emitPatchPoint(string $point_name): void
|
public function emitPatchPoint(string $point_name): void
|
||||||
{
|
{
|
||||||
$this->patch_point = $point_name;
|
$this->patch_point = $point_name;
|
||||||
@@ -401,4 +453,26 @@ abstract class BuilderBase
|
|||||||
$php .= "echo '[micro-test-end]';\n";
|
$php .= "echo '[micro-test-end]';\n";
|
||||||
return $php;
|
return $php;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected function getMicroTestTasks(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'micro_ext_test' => [
|
||||||
|
'content' => ($this->getOption('without-micro-ext-test') ? '<?php echo "[micro-test-start][micro-test-end]";' : $this->generateMicroExtTests()),
|
||||||
|
'conditions' => [
|
||||||
|
function ($ret) { return $ret === 0; },
|
||||||
|
function ($ret, $out) {
|
||||||
|
$raw_out = trim(implode('', $out));
|
||||||
|
return str_starts_with($raw_out, '[micro-test-start]') && str_ends_with($raw_out, '[micro-test-end]');
|
||||||
|
},
|
||||||
|
],
|
||||||
|
],
|
||||||
|
'micro_zend_bug_test' => [
|
||||||
|
'content' => ($this->getOption('without-micro-ext-test') ? '<?php echo "hello";' : file_get_contents(ROOT_DIR . '/src/globals/common-tests/micro_zend_mm_heap_corrupted.txt')),
|
||||||
|
'conditions' => [
|
||||||
|
function ($ret) { return $ret === 0; },
|
||||||
|
],
|
||||||
|
],
|
||||||
|
];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -27,6 +27,8 @@ class BuilderProvider
|
|||||||
*/
|
*/
|
||||||
public static function makeBuilderByInput(InputInterface $input): BuilderBase
|
public static function makeBuilderByInput(InputInterface $input): BuilderBase
|
||||||
{
|
{
|
||||||
|
ini_set('memory_limit', '2G');
|
||||||
|
|
||||||
self::$builder = match (PHP_OS_FAMILY) {
|
self::$builder = match (PHP_OS_FAMILY) {
|
||||||
'Windows' => new WindowsBuilder($input->getOptions()),
|
'Windows' => new WindowsBuilder($input->getOptions()),
|
||||||
'Darwin' => new MacOSBuilder($input->getOptions()),
|
'Darwin' => new MacOSBuilder($input->getOptions()),
|
||||||
|
|||||||
@@ -170,19 +170,19 @@ class Extension
|
|||||||
public function runCliCheckUnix(): void
|
public function runCliCheckUnix(): void
|
||||||
{
|
{
|
||||||
// Run compile check if build target is cli
|
// Run compile check if build target is cli
|
||||||
// If you need to run some check, overwrite this or add your assert in src/globals/tests/{extension_name}.php
|
// If you need to run some check, overwrite this or add your assert in src/globals/ext-tests/{extension_name}.php
|
||||||
// If check failed, throw RuntimeException
|
// If check failed, throw RuntimeException
|
||||||
[$ret] = shell()->execWithResult(BUILD_ROOT_PATH . '/bin/php --ri "' . $this->getDistName() . '"', false);
|
[$ret] = shell()->execWithResult(BUILD_ROOT_PATH . '/bin/php --ri "' . $this->getDistName() . '"', false);
|
||||||
if ($ret !== 0) {
|
if ($ret !== 0) {
|
||||||
throw new RuntimeException('extension ' . $this->getName() . ' failed compile check: php-cli returned ' . $ret);
|
throw new RuntimeException('extension ' . $this->getName() . ' failed compile check: php-cli returned ' . $ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (file_exists(ROOT_DIR . '/src/globals/tests/' . $this->getName() . '.php')) {
|
if (file_exists(ROOT_DIR . '/src/globals/ext-tests/' . $this->getName() . '.php')) {
|
||||||
// Trim additional content & escape special characters to allow inline usage
|
// Trim additional content & escape special characters to allow inline usage
|
||||||
$test = str_replace(
|
$test = str_replace(
|
||||||
['<?php', 'declare(strict_types=1);', "\n", '"', '$'],
|
['<?php', 'declare(strict_types=1);', "\n", '"', '$'],
|
||||||
['', '', '', '\"', '\$'],
|
['', '', '', '\"', '\$'],
|
||||||
file_get_contents(ROOT_DIR . '/src/globals/tests/' . $this->getName() . '.php')
|
file_get_contents(ROOT_DIR . '/src/globals/ext-tests/' . $this->getName() . '.php')
|
||||||
);
|
);
|
||||||
|
|
||||||
[$ret, $out] = shell()->execWithResult(BUILD_ROOT_PATH . '/bin/php -r "' . trim($test) . '"');
|
[$ret, $out] = shell()->execWithResult(BUILD_ROOT_PATH . '/bin/php -r "' . trim($test) . '"');
|
||||||
@@ -201,19 +201,19 @@ class Extension
|
|||||||
public function runCliCheckWindows(): void
|
public function runCliCheckWindows(): void
|
||||||
{
|
{
|
||||||
// Run compile check if build target is cli
|
// Run compile check if build target is cli
|
||||||
// If you need to run some check, overwrite this or add your assert in src/globals/tests/{extension_name}.php
|
// If you need to run some check, overwrite this or add your assert in src/globals/ext-tests/{extension_name}.php
|
||||||
// If check failed, throw RuntimeException
|
// If check failed, throw RuntimeException
|
||||||
[$ret] = cmd()->execWithResult(BUILD_ROOT_PATH . '/bin/php.exe --ri "' . $this->getDistName() . '"', false);
|
[$ret] = cmd()->execWithResult(BUILD_ROOT_PATH . '/bin/php.exe --ri "' . $this->getDistName() . '"', false);
|
||||||
if ($ret !== 0) {
|
if ($ret !== 0) {
|
||||||
throw new RuntimeException('extension ' . $this->getName() . ' failed compile check: php-cli returned ' . $ret);
|
throw new RuntimeException('extension ' . $this->getName() . ' failed compile check: php-cli returned ' . $ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (file_exists(FileSystem::convertPath(ROOT_DIR . '/src/globals/tests/' . $this->getName() . '.php'))) {
|
if (file_exists(FileSystem::convertPath(ROOT_DIR . '/src/globals/ext-tests/' . $this->getName() . '.php'))) {
|
||||||
// Trim additional content & escape special characters to allow inline usage
|
// Trim additional content & escape special characters to allow inline usage
|
||||||
$test = str_replace(
|
$test = str_replace(
|
||||||
['<?php', 'declare(strict_types=1);', "\n", '"', '$'],
|
['<?php', 'declare(strict_types=1);', "\n", '"', '$'],
|
||||||
['', '', '', '\"', '$'],
|
['', '', '', '\"', '$'],
|
||||||
file_get_contents(FileSystem::convertPath(ROOT_DIR . '/src/globals/tests/' . $this->getName() . '.php'))
|
file_get_contents(FileSystem::convertPath(ROOT_DIR . '/src/globals/ext-tests/' . $this->getName() . '.php'))
|
||||||
);
|
);
|
||||||
|
|
||||||
[$ret] = cmd()->execWithResult(BUILD_ROOT_PATH . '/bin/php.exe -r "' . trim($test) . '"');
|
[$ret] = cmd()->execWithResult(BUILD_ROOT_PATH . '/bin/php.exe -r "' . trim($test) . '"');
|
||||||
@@ -223,6 +223,11 @@ class Extension
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function validate(): void
|
||||||
|
{
|
||||||
|
// do nothing, just throw wrong usage exception if not valid
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @throws RuntimeException
|
* @throws RuntimeException
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -177,6 +177,11 @@ abstract class LibraryBase
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function validate(): void
|
||||||
|
{
|
||||||
|
// do nothing, just throw wrong usage exception if not valid
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get current builder object.
|
* Get current builder object.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -14,11 +14,15 @@ class imap extends Extension
|
|||||||
/**
|
/**
|
||||||
* @throws WrongUsageException
|
* @throws WrongUsageException
|
||||||
*/
|
*/
|
||||||
public function getUnixConfigureArg(): string
|
public function validate(): void
|
||||||
{
|
{
|
||||||
if ($this->builder->getOption('enable-zts')) {
|
if ($this->builder->getOption('enable-zts')) {
|
||||||
throw new WrongUsageException('ext-imap is not thread safe, do not build it with ZTS builds');
|
throw new WrongUsageException('ext-imap is not thread safe, do not build it with ZTS builds');
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getUnixConfigureArg(): string
|
||||||
|
{
|
||||||
$arg = '--with-imap=' . BUILD_ROOT_PATH;
|
$arg = '--with-imap=' . BUILD_ROOT_PATH;
|
||||||
if ($this->builder->getLib('openssl') !== null) {
|
if ($this->builder->getLib('openssl') !== null) {
|
||||||
$arg .= ' --with-imap-ssl=' . BUILD_ROOT_PATH;
|
$arg .= ' --with-imap-ssl=' . BUILD_ROOT_PATH;
|
||||||
|
|||||||
@@ -16,11 +16,15 @@ class opcache extends Extension
|
|||||||
* @throws WrongUsageException
|
* @throws WrongUsageException
|
||||||
* @throws RuntimeException
|
* @throws RuntimeException
|
||||||
*/
|
*/
|
||||||
public function getUnixConfigureArg(): string
|
public function validate(): void
|
||||||
{
|
{
|
||||||
if ($this->builder->getPHPVersionID() < 80000) {
|
if ($this->builder->getPHPVersionID() < 80000 && getenv('SPC_SKIP_PHP_VERSION_CHECK') !== 'yes') {
|
||||||
throw new WrongUsageException('Statically compiled PHP with Zend Opcache only available for PHP >= 8.0 !');
|
throw new WrongUsageException('Statically compiled PHP with Zend Opcache only available for PHP >= 8.0 !');
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getUnixConfigureArg(): string
|
||||||
|
{
|
||||||
return '--enable-opcache';
|
return '--enable-opcache';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
20
src/SPC/builder/extension/parallel.php
Normal file
20
src/SPC/builder/extension/parallel.php
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace SPC\builder\extension;
|
||||||
|
|
||||||
|
use SPC\builder\Extension;
|
||||||
|
use SPC\exception\WrongUsageException;
|
||||||
|
use SPC\util\CustomExt;
|
||||||
|
|
||||||
|
#[CustomExt('parallel')]
|
||||||
|
class parallel extends Extension
|
||||||
|
{
|
||||||
|
public function validate(): void
|
||||||
|
{
|
||||||
|
if (!$this->builder->getOption('enable-zts')) {
|
||||||
|
throw new WrongUsageException('ext-parallel must be built with ZTS builds. Use "--enable-zts" option!');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
19
src/SPC/builder/extension/protobuf.php
Normal file
19
src/SPC/builder/extension/protobuf.php
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace SPC\builder\extension;
|
||||||
|
|
||||||
|
use SPC\builder\Extension;
|
||||||
|
use SPC\util\CustomExt;
|
||||||
|
|
||||||
|
#[CustomExt('protobuf')]
|
||||||
|
class protobuf extends Extension
|
||||||
|
{
|
||||||
|
public function validate(): void
|
||||||
|
{
|
||||||
|
if ($this->builder->getPHPVersionID() < 80000 && getenv('SPC_SKIP_PHP_VERSION_CHECK') !== 'yes') {
|
||||||
|
throw new \RuntimeException('The latest protobuf extension requires PHP 8.0 or later');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -17,12 +17,16 @@ class swoole_hook_pgsql extends Extension
|
|||||||
return 'swoole';
|
return 'swoole';
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getUnixConfigureArg(): string
|
public function validate(): void
|
||||||
{
|
{
|
||||||
// pdo_pgsql need to be disabled
|
// pdo_pgsql need to be disabled
|
||||||
if ($this->builder->getExt('pdo_pgsql') !== null) {
|
if ($this->builder->getExt('pdo_pgsql') !== null) {
|
||||||
throw new WrongUsageException('swoole-hook-pgsql provides pdo_pgsql, if you enable pgsql hook for swoole, you must remove pdo_pgsql extension.');
|
throw new WrongUsageException('swoole-hook-pgsql provides pdo_pgsql, if you enable pgsql hook for swoole, you must remove pdo_pgsql extension.');
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getUnixConfigureArg(): string
|
||||||
|
{
|
||||||
// enable swoole pgsql hook
|
// enable swoole pgsql hook
|
||||||
return '--enable-swoole-pgsql';
|
return '--enable-swoole-pgsql';
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,12 +17,16 @@ class swoole_hook_sqlite extends Extension
|
|||||||
return 'swoole';
|
return 'swoole';
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getUnixConfigureArg(): string
|
public function validate(): void
|
||||||
{
|
{
|
||||||
// pdo_pgsql need to be disabled
|
// pdo_pgsql need to be disabled
|
||||||
if ($this->builder->getExt('pdo_sqlite') !== null) {
|
if ($this->builder->getExt('pdo_sqlite') !== null) {
|
||||||
throw new WrongUsageException('swoole-hook-sqlite provides pdo_sqlite, if you enable sqlite hook for swoole, you must remove pdo_sqlite extension.');
|
throw new WrongUsageException('swoole-hook-sqlite provides pdo_sqlite, if you enable sqlite hook for swoole, you must remove pdo_sqlite extension.');
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getUnixConfigureArg(): string
|
||||||
|
{
|
||||||
// enable swoole pgsql hook
|
// enable swoole pgsql hook
|
||||||
return '--enable-swoole-sqlite';
|
return '--enable-swoole-sqlite';
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,6 +11,13 @@ use SPC\util\CustomExt;
|
|||||||
#[CustomExt('swow')]
|
#[CustomExt('swow')]
|
||||||
class swow extends Extension
|
class swow extends Extension
|
||||||
{
|
{
|
||||||
|
public function validate(): void
|
||||||
|
{
|
||||||
|
if ($this->builder->getPHPVersionID() < 80000 && getenv('SPC_SKIP_PHP_VERSION_CHECK') !== 'yes') {
|
||||||
|
throw new RuntimeException('The latest swow extension requires PHP 8.0 or later');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public function getUnixConfigureArg(): string
|
public function getUnixConfigureArg(): string
|
||||||
{
|
{
|
||||||
$arg = '--enable-swow';
|
$arg = '--enable-swow';
|
||||||
|
|||||||
19
src/SPC/builder/extension/uv.php
Normal file
19
src/SPC/builder/extension/uv.php
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace SPC\builder\extension;
|
||||||
|
|
||||||
|
use SPC\builder\Extension;
|
||||||
|
use SPC\util\CustomExt;
|
||||||
|
|
||||||
|
#[CustomExt('uv')]
|
||||||
|
class uv extends Extension
|
||||||
|
{
|
||||||
|
public function validate(): void
|
||||||
|
{
|
||||||
|
if ($this->builder->getPHPVersionID() < 80000 && getenv('SPC_SKIP_PHP_VERSION_CHECK') !== 'yes') {
|
||||||
|
throw new \RuntimeException('The latest uv extension requires PHP 8.0 or later');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -28,7 +28,7 @@ class BSDBuilder extends UnixBuilderBase
|
|||||||
// ---------- set necessary options ----------
|
// ---------- set necessary options ----------
|
||||||
// set C Compiler (default: clang)
|
// set C Compiler (default: clang)
|
||||||
f_putenv('CC=' . $this->getOption('cc', 'clang'));
|
f_putenv('CC=' . $this->getOption('cc', 'clang'));
|
||||||
// set C++ Composer (default: clang++)
|
// set C++ Compiler (default: clang++)
|
||||||
f_putenv('CXX=' . $this->getOption('cxx', 'clang++'));
|
f_putenv('CXX=' . $this->getOption('cxx', 'clang++'));
|
||||||
// set PATH
|
// set PATH
|
||||||
f_putenv('PATH=' . BUILD_ROOT_PATH . '/bin:' . getenv('PATH'));
|
f_putenv('PATH=' . BUILD_ROOT_PATH . '/bin:' . getenv('PATH'));
|
||||||
@@ -86,7 +86,8 @@ class BSDBuilder extends UnixBuilderBase
|
|||||||
SourcePatcher::patchBeforeConfigure($this);
|
SourcePatcher::patchBeforeConfigure($this);
|
||||||
|
|
||||||
$json_74 = $this->getPHPVersionID() < 80000 ? '--enable-json ' : '';
|
$json_74 = $this->getPHPVersionID() < 80000 ? '--enable-json ' : '';
|
||||||
$zts = $this->getOption('enable-zts', false) ? '--enable-zts --disable-zend-signals ' : '';
|
$zts_enable = $this->getPHPVersionID() < 80000 ? '--enable-maintainer-zts --disable-zend-signals' : '--enable-zts --disable-zend-signals';
|
||||||
|
$zts = $this->getOption('enable-zts', false) ? $zts_enable : '';
|
||||||
|
|
||||||
$enableCli = ($build_target & BUILD_TARGET_CLI) === BUILD_TARGET_CLI;
|
$enableCli = ($build_target & BUILD_TARGET_CLI) === BUILD_TARGET_CLI;
|
||||||
$enableFpm = ($build_target & BUILD_TARGET_FPM) === BUILD_TARGET_FPM;
|
$enableFpm = ($build_target & BUILD_TARGET_FPM) === BUILD_TARGET_FPM;
|
||||||
@@ -180,7 +181,7 @@ class BSDBuilder extends UnixBuilderBase
|
|||||||
}
|
}
|
||||||
if ($this->getExt('phar')) {
|
if ($this->getExt('phar')) {
|
||||||
$this->phar_patched = true;
|
$this->phar_patched = true;
|
||||||
SourcePatcher::patchMicro(['phar']);
|
SourcePatcher::patchMicroPhar($this->getPHPVersionID());
|
||||||
}
|
}
|
||||||
|
|
||||||
$enable_fake_cli = $this->getOption('with-micro-fake-cli', false) ? ' -DPHP_MICRO_FAKE_CLI' : '';
|
$enable_fake_cli = $this->getOption('with-micro-fake-cli', false) ? ' -DPHP_MICRO_FAKE_CLI' : '';
|
||||||
@@ -201,7 +202,7 @@ class BSDBuilder extends UnixBuilderBase
|
|||||||
$this->deployBinary(BUILD_TARGET_MICRO);
|
$this->deployBinary(BUILD_TARGET_MICRO);
|
||||||
|
|
||||||
if ($this->phar_patched) {
|
if ($this->phar_patched) {
|
||||||
SourcePatcher::patchMicro(['phar'], true);
|
SourcePatcher::unpatchMicroPhar();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -92,6 +92,9 @@ class LinuxBuilder extends UnixBuilderBase
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
* Build PHP from source.
|
||||||
|
*
|
||||||
|
* @param int $build_target Build target, use `BUILD_TARGET_*` constants
|
||||||
* @throws RuntimeException
|
* @throws RuntimeException
|
||||||
* @throws FileSystemException
|
* @throws FileSystemException
|
||||||
* @throws WrongUsageException
|
* @throws WrongUsageException
|
||||||
@@ -131,10 +134,10 @@ class LinuxBuilder extends UnixBuilderBase
|
|||||||
}
|
}
|
||||||
$disable_jit = $this->getOption('disable-opcache-jit', false) ? '--disable-opcache-jit ' : '';
|
$disable_jit = $this->getOption('disable-opcache-jit', false) ? '--disable-opcache-jit ' : '';
|
||||||
|
|
||||||
$enableCli = ($build_target & BUILD_TARGET_CLI) === BUILD_TARGET_CLI;
|
$enable_cli = ($build_target & BUILD_TARGET_CLI) === BUILD_TARGET_CLI;
|
||||||
$enableFpm = ($build_target & BUILD_TARGET_FPM) === BUILD_TARGET_FPM;
|
$enable_fpm = ($build_target & BUILD_TARGET_FPM) === BUILD_TARGET_FPM;
|
||||||
$enableMicro = ($build_target & BUILD_TARGET_MICRO) === BUILD_TARGET_MICRO;
|
$enable_micro = ($build_target & BUILD_TARGET_MICRO) === BUILD_TARGET_MICRO;
|
||||||
$enableEmbed = ($build_target & BUILD_TARGET_EMBED) === BUILD_TARGET_EMBED;
|
$enable_embed = ($build_target & BUILD_TARGET_EMBED) === BUILD_TARGET_EMBED;
|
||||||
|
|
||||||
// prepare build php envs
|
// prepare build php envs
|
||||||
$envs_build_php = SystemUtil::makeEnvVarString([
|
$envs_build_php = SystemUtil::makeEnvVarString([
|
||||||
@@ -144,49 +147,22 @@ class LinuxBuilder extends UnixBuilderBase
|
|||||||
'LIBS' => getenv('SPC_CMD_VAR_PHP_CONFIGURE_LIBS'),
|
'LIBS' => getenv('SPC_CMD_VAR_PHP_CONFIGURE_LIBS'),
|
||||||
]);
|
]);
|
||||||
|
|
||||||
// upx pack and strip for micro
|
// process micro upx patch if micro sapi enabled
|
||||||
// but always restore Makefile.frag.bak first
|
if ($enable_micro) {
|
||||||
if (file_exists(SOURCE_PATH . '/php-src/sapi/micro/Makefile.frag.bak')) {
|
if (version_compare($this->getMicroVersion(), '0.2.0') < 0) {
|
||||||
copy(SOURCE_PATH . '/php-src/sapi/micro/Makefile.frag.bak', SOURCE_PATH . '/php-src/sapi/micro/Makefile.frag');
|
// for phpmicro 0.1.x
|
||||||
}
|
$this->processMicroUPXLegacy();
|
||||||
if ($this->getOption('with-upx-pack', false)) {
|
|
||||||
// judge $(MAKE) micro_2s_objs SFX_FILESIZE=`$(STAT_SIZE) $(SAPI_MICRO_PATH)` count
|
|
||||||
// if 2, replace src/globals/extra/micro-triple-Makefile.frag file content
|
|
||||||
if (substr_count(FileSystem::readFile(SOURCE_PATH . '/php-src/sapi/micro/Makefile.frag'), '$(MAKE) micro_2s_objs SFX_FILESIZE=`$(STAT_SIZE) $(SAPI_MICRO_PATH)`') === 2) {
|
|
||||||
// bak first
|
|
||||||
copy(SOURCE_PATH . '/php-src/sapi/micro/Makefile.frag', SOURCE_PATH . '/php-src/sapi/micro/Makefile.frag.bak');
|
|
||||||
// replace Makefile.frag content
|
|
||||||
FileSystem::writeFile(SOURCE_PATH . '/php-src/sapi/micro/Makefile.frag', FileSystem::readFile(ROOT_DIR . '/src/globals/extra/micro-triple-Makefile.frag'));
|
|
||||||
}
|
}
|
||||||
// with upx pack always need strip
|
// micro latest needs do strip and upx pack later (strip, upx, cut binary manually supported)
|
||||||
FileSystem::replaceFileRegex(
|
|
||||||
SOURCE_PATH . '/php-src/sapi/micro/Makefile.frag',
|
|
||||||
'/POST_MICRO_BUILD_COMMANDS=.*/',
|
|
||||||
'POST_MICRO_BUILD_COMMANDS=\$(STRIP) \$(MICRO_STRIP_FLAGS) \$(SAPI_MICRO_PATH) && ' . getenv('UPX_EXEC') . ' --best \$(SAPI_MICRO_PATH)',
|
|
||||||
);
|
|
||||||
} elseif (!$this->getOption('no-strip', false)) {
|
|
||||||
// not-no-strip means strip (default behavior)
|
|
||||||
FileSystem::replaceFileRegex(
|
|
||||||
SOURCE_PATH . '/php-src/sapi/micro/Makefile.frag',
|
|
||||||
'/POST_MICRO_BUILD_COMMANDS=.*/',
|
|
||||||
'POST_MICRO_BUILD_COMMANDS=\$(STRIP) \$(MICRO_STRIP_FLAGS) \$(SAPI_MICRO_PATH)',
|
|
||||||
);
|
|
||||||
} else {
|
|
||||||
// just no strip
|
|
||||||
FileSystem::replaceFileRegex(
|
|
||||||
SOURCE_PATH . '/php-src/sapi/micro/Makefile.frag',
|
|
||||||
'/POST_MICRO_BUILD_COMMANDS=.*/',
|
|
||||||
'POST_MICRO_BUILD_COMMANDS=true',
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
shell()->cd(SOURCE_PATH . '/php-src')
|
shell()->cd(SOURCE_PATH . '/php-src')
|
||||||
->exec(
|
->exec(
|
||||||
getenv('SPC_CMD_PREFIX_PHP_CONFIGURE') . ' ' .
|
getenv('SPC_CMD_PREFIX_PHP_CONFIGURE') . ' ' .
|
||||||
($enableCli ? '--enable-cli ' : '--disable-cli ') .
|
($enable_cli ? '--enable-cli ' : '--disable-cli ') .
|
||||||
($enableFpm ? '--enable-fpm ' : '--disable-fpm ') .
|
($enable_fpm ? '--enable-fpm ' : '--disable-fpm ') .
|
||||||
($enableEmbed ? '--enable-embed=static ' : '--disable-embed ') .
|
($enable_embed ? '--enable-embed=static ' : '--disable-embed ') .
|
||||||
($enableMicro ? '--enable-micro=all-static ' : '--disable-micro ') .
|
($enable_micro ? '--enable-micro=all-static ' : '--disable-micro ') .
|
||||||
$disable_jit .
|
$disable_jit .
|
||||||
$json_74 .
|
$json_74 .
|
||||||
$zts .
|
$zts .
|
||||||
@@ -200,21 +176,21 @@ class LinuxBuilder extends UnixBuilderBase
|
|||||||
|
|
||||||
$this->cleanMake();
|
$this->cleanMake();
|
||||||
|
|
||||||
if ($enableCli) {
|
if ($enable_cli) {
|
||||||
logger()->info('building cli');
|
logger()->info('building cli');
|
||||||
$this->buildCli();
|
$this->buildCli();
|
||||||
}
|
}
|
||||||
if ($enableFpm) {
|
if ($enable_fpm) {
|
||||||
logger()->info('building fpm');
|
logger()->info('building fpm');
|
||||||
$this->buildFpm();
|
$this->buildFpm();
|
||||||
}
|
}
|
||||||
if ($enableMicro) {
|
if ($enable_micro) {
|
||||||
logger()->info('building micro');
|
logger()->info('building micro');
|
||||||
$this->buildMicro();
|
$this->buildMicro();
|
||||||
}
|
}
|
||||||
if ($enableEmbed) {
|
if ($enable_embed) {
|
||||||
logger()->info('building embed');
|
logger()->info('building embed');
|
||||||
if ($enableMicro) {
|
if ($enable_micro) {
|
||||||
FileSystem::replaceFileStr(SOURCE_PATH . '/php-src/Makefile', 'OVERALL_TARGET =', 'OVERALL_TARGET = libphp.la');
|
FileSystem::replaceFileStr(SOURCE_PATH . '/php-src/Makefile', 'OVERALL_TARGET =', 'OVERALL_TARGET = libphp.la');
|
||||||
}
|
}
|
||||||
$this->buildEmbed();
|
$this->buildEmbed();
|
||||||
@@ -264,7 +240,7 @@ class LinuxBuilder extends UnixBuilderBase
|
|||||||
}
|
}
|
||||||
if ($this->getExt('phar')) {
|
if ($this->getExt('phar')) {
|
||||||
$this->phar_patched = true;
|
$this->phar_patched = true;
|
||||||
SourcePatcher::patchMicro(['phar']);
|
SourcePatcher::patchMicroPhar($this->getPHPVersionID());
|
||||||
}
|
}
|
||||||
|
|
||||||
$enable_fake_cli = $this->getOption('with-micro-fake-cli', false) ? ' -DPHP_MICRO_FAKE_CLI' : '';
|
$enable_fake_cli = $this->getOption('with-micro-fake-cli', false) ? ' -DPHP_MICRO_FAKE_CLI' : '';
|
||||||
@@ -278,10 +254,12 @@ class LinuxBuilder extends UnixBuilderBase
|
|||||||
->exec('sed -i "s|//lib|/lib|g" Makefile')
|
->exec('sed -i "s|//lib|/lib|g" Makefile')
|
||||||
->exec("\$SPC_CMD_PREFIX_PHP_MAKE {$vars} micro");
|
->exec("\$SPC_CMD_PREFIX_PHP_MAKE {$vars} micro");
|
||||||
|
|
||||||
|
$this->processMicroUPX();
|
||||||
|
|
||||||
$this->deployBinary(BUILD_TARGET_MICRO);
|
$this->deployBinary(BUILD_TARGET_MICRO);
|
||||||
|
|
||||||
if ($this->phar_patched) {
|
if ($this->phar_patched) {
|
||||||
SourcePatcher::patchMicro(['phar'], true);
|
SourcePatcher::unpatchMicroPhar();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -330,4 +308,70 @@ class LinuxBuilder extends UnixBuilderBase
|
|||||||
'EXTRA_LDFLAGS_PROGRAM' => getenv('SPC_CMD_VAR_PHP_MAKE_EXTRA_LDFLAGS_PROGRAM'),
|
'EXTRA_LDFLAGS_PROGRAM' => getenv('SPC_CMD_VAR_PHP_MAKE_EXTRA_LDFLAGS_PROGRAM'),
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Apply option --no-strip and --with-upx-pack for micro sapi (only for phpmicro 0.1.x)
|
||||||
|
*
|
||||||
|
* @throws FileSystemException
|
||||||
|
*/
|
||||||
|
private function processMicroUPXLegacy(): void
|
||||||
|
{
|
||||||
|
// upx pack and strip for micro
|
||||||
|
// but always restore Makefile.frag.bak first
|
||||||
|
if (file_exists(SOURCE_PATH . '/php-src/sapi/micro/Makefile.frag.bak')) {
|
||||||
|
copy(SOURCE_PATH . '/php-src/sapi/micro/Makefile.frag.bak', SOURCE_PATH . '/php-src/sapi/micro/Makefile.frag');
|
||||||
|
}
|
||||||
|
if ($this->getOption('with-upx-pack', false)) {
|
||||||
|
// judge $(MAKE) micro_2s_objs SFX_FILESIZE=`$(STAT_SIZE) $(SAPI_MICRO_PATH)` count
|
||||||
|
// if 2, replace src/globals/extra/micro-triple-Makefile.frag file content
|
||||||
|
if (substr_count(FileSystem::readFile(SOURCE_PATH . '/php-src/sapi/micro/Makefile.frag'), '$(MAKE) micro_2s_objs SFX_FILESIZE=`$(STAT_SIZE) $(SAPI_MICRO_PATH)`') === 2) {
|
||||||
|
// bak first
|
||||||
|
copy(SOURCE_PATH . '/php-src/sapi/micro/Makefile.frag', SOURCE_PATH . '/php-src/sapi/micro/Makefile.frag.bak');
|
||||||
|
// replace Makefile.frag content
|
||||||
|
FileSystem::writeFile(SOURCE_PATH . '/php-src/sapi/micro/Makefile.frag', FileSystem::readFile(ROOT_DIR . '/src/globals/extra/micro-triple-Makefile.frag'));
|
||||||
|
}
|
||||||
|
// with upx pack always need strip
|
||||||
|
FileSystem::replaceFileRegex(
|
||||||
|
SOURCE_PATH . '/php-src/sapi/micro/Makefile.frag',
|
||||||
|
'/POST_MICRO_BUILD_COMMANDS=.*/',
|
||||||
|
'POST_MICRO_BUILD_COMMANDS=\$(STRIP) \$(MICRO_STRIP_FLAGS) \$(SAPI_MICRO_PATH) && ' . getenv('UPX_EXEC') . ' --best \$(SAPI_MICRO_PATH)',
|
||||||
|
);
|
||||||
|
} elseif (!$this->getOption('no-strip', false)) {
|
||||||
|
// not-no-strip means strip (default behavior)
|
||||||
|
FileSystem::replaceFileRegex(
|
||||||
|
SOURCE_PATH . '/php-src/sapi/micro/Makefile.frag',
|
||||||
|
'/POST_MICRO_BUILD_COMMANDS=.*/',
|
||||||
|
'POST_MICRO_BUILD_COMMANDS=\$(STRIP) \$(MICRO_STRIP_FLAGS) \$(SAPI_MICRO_PATH)',
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
// just no strip
|
||||||
|
FileSystem::replaceFileRegex(
|
||||||
|
SOURCE_PATH . '/php-src/sapi/micro/Makefile.frag',
|
||||||
|
'/POST_MICRO_BUILD_COMMANDS=.*/',
|
||||||
|
'POST_MICRO_BUILD_COMMANDS=true',
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private function processMicroUPX(): void
|
||||||
|
{
|
||||||
|
if (version_compare($this->getMicroVersion(), '0.2.0') >= 0 && !$this->getOption('no-strip', false)) {
|
||||||
|
shell()->exec('strip --strip-all ' . SOURCE_PATH . '/php-src/sapi/micro/micro.sfx');
|
||||||
|
|
||||||
|
if ($this->getOption('with-upx-pack')) {
|
||||||
|
// strip first
|
||||||
|
shell()->exec(getenv('UPX_EXEC') . ' --best ' . SOURCE_PATH . '/php-src/sapi/micro/micro.sfx');
|
||||||
|
// cut binary with readelf
|
||||||
|
[$ret, $out] = shell()->execWithResult('readelf -l ' . SOURCE_PATH . '/php-src/sapi/micro/micro.sfx | awk \'/LOAD|GNU_STACK/ {getline; print $1, $2, $3, $4, $6, $7}\'');
|
||||||
|
$out[1] = explode(' ', $out[1]);
|
||||||
|
$offset = $out[1][0];
|
||||||
|
if ($ret !== 0 || !str_starts_with($offset, '0x')) {
|
||||||
|
throw new RuntimeException('Cannot find offset in readelf output');
|
||||||
|
}
|
||||||
|
$offset = hexdec($offset);
|
||||||
|
// remove upx extra wastes
|
||||||
|
file_put_contents(SOURCE_PATH . '/php-src/sapi/micro/micro.sfx', substr(file_get_contents(SOURCE_PATH . '/php-src/sapi/micro/micro.sfx'), 0, $offset));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -233,7 +233,7 @@ class MacOSBuilder extends UnixBuilderBase
|
|||||||
}
|
}
|
||||||
if ($this->getExt('phar')) {
|
if ($this->getExt('phar')) {
|
||||||
$this->phar_patched = true;
|
$this->phar_patched = true;
|
||||||
SourcePatcher::patchMicro(['phar']);
|
SourcePatcher::patchMicroPhar($this->getPHPVersionID());
|
||||||
}
|
}
|
||||||
|
|
||||||
$enable_fake_cli = $this->getOption('with-micro-fake-cli', false) ? ' -DPHP_MICRO_FAKE_CLI' : '';
|
$enable_fake_cli = $this->getOption('with-micro-fake-cli', false) ? ' -DPHP_MICRO_FAKE_CLI' : '';
|
||||||
@@ -241,7 +241,7 @@ class MacOSBuilder extends UnixBuilderBase
|
|||||||
|
|
||||||
// patch fake cli for micro
|
// patch fake cli for micro
|
||||||
$vars['EXTRA_CFLAGS'] .= $enable_fake_cli;
|
$vars['EXTRA_CFLAGS'] .= $enable_fake_cli;
|
||||||
if (!$this->getOption('no-strip', false)) {
|
if ($this->getOption('no-strip', false)) {
|
||||||
$vars['STRIP'] = 'dsymutil -f ';
|
$vars['STRIP'] = 'dsymutil -f ';
|
||||||
}
|
}
|
||||||
$vars = SystemUtil::makeEnvVarString($vars);
|
$vars = SystemUtil::makeEnvVarString($vars);
|
||||||
@@ -251,7 +251,7 @@ class MacOSBuilder extends UnixBuilderBase
|
|||||||
$this->deployBinary(BUILD_TARGET_MICRO);
|
$this->deployBinary(BUILD_TARGET_MICRO);
|
||||||
|
|
||||||
if ($this->phar_patched) {
|
if ($this->phar_patched) {
|
||||||
SourcePatcher::patchMicro(['phar'], true);
|
SourcePatcher::unpatchMicroPhar();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -90,7 +90,7 @@ abstract class UnixBuilderBase extends BuilderBase
|
|||||||
return $extra;
|
return $extra;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function buildLibs(array $sorted_libraries): void
|
public function proveLibs(array $sorted_libraries): void
|
||||||
{
|
{
|
||||||
// search all supported libs
|
// search all supported libs
|
||||||
$support_lib_list = [];
|
$support_lib_list = [];
|
||||||
@@ -137,16 +137,6 @@ abstract class UnixBuilderBase extends BuilderBase
|
|||||||
SourceManager::initSource(libs: $sorted_libraries);
|
SourceManager::initSource(libs: $sorted_libraries);
|
||||||
|
|
||||||
$this->emitPatchPoint('after-libs-extract');
|
$this->emitPatchPoint('after-libs-extract');
|
||||||
|
|
||||||
// build all libs
|
|
||||||
foreach ($this->libs as $lib) {
|
|
||||||
match ($lib->tryBuild($this->getOption('rebuild', false))) {
|
|
||||||
BUILD_STATUS_OK => logger()->info('lib [' . $lib::NAME . '] build success'),
|
|
||||||
BUILD_STATUS_ALREADY => logger()->notice('lib [' . $lib::NAME . '] already built'),
|
|
||||||
BUILD_STATUS_FAILED => logger()->error('lib [' . $lib::NAME . '] build failed'),
|
|
||||||
default => logger()->warning('lib [' . $lib::NAME . '] build status unknown'),
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -172,22 +162,20 @@ abstract class UnixBuilderBase extends BuilderBase
|
|||||||
|
|
||||||
// sanity check for phpmicro
|
// sanity check for phpmicro
|
||||||
if (($build_target & BUILD_TARGET_MICRO) === BUILD_TARGET_MICRO) {
|
if (($build_target & BUILD_TARGET_MICRO) === BUILD_TARGET_MICRO) {
|
||||||
if (file_exists(SOURCE_PATH . '/hello.exe')) {
|
$test_task = $this->getMicroTestTasks();
|
||||||
@unlink(SOURCE_PATH . '/hello.exe');
|
foreach ($test_task as $task_name => $task) {
|
||||||
}
|
$test_file = SOURCE_PATH . '/' . $task_name . '.exe';
|
||||||
file_put_contents(
|
if (file_exists($test_file)) {
|
||||||
SOURCE_PATH . '/hello.exe',
|
@unlink($test_file);
|
||||||
file_get_contents(SOURCE_PATH . '/php-src/sapi/micro/micro.sfx') .
|
}
|
||||||
($this->getOption('without-micro-ext-test') ? '<?php echo "[micro-test-start][micro-test-end]";' : $this->generateMicroExtTests())
|
file_put_contents($test_file, file_get_contents(SOURCE_PATH . '/php-src/sapi/micro/micro.sfx') . $task['content']);
|
||||||
);
|
chmod($test_file, 0755);
|
||||||
chmod(SOURCE_PATH . '/hello.exe', 0755);
|
[$ret, $out] = shell()->execWithResult($test_file);
|
||||||
[$ret, $output2] = shell()->execWithResult(SOURCE_PATH . '/hello.exe');
|
foreach ($task['conditions'] as $condition => $closure) {
|
||||||
$raw_out = trim(implode('', $output2));
|
if (!$closure($ret, $out)) {
|
||||||
$condition[0] = $ret === 0;
|
$raw_out = trim(implode('', $out));
|
||||||
$condition[1] = str_starts_with($raw_out, '[micro-test-start]') && str_ends_with($raw_out, '[micro-test-end]');
|
throw new RuntimeException("micro failed sanity check: {$task_name}, condition [{$condition}], ret[{$ret}], out[{$raw_out}]");
|
||||||
foreach ($condition as $k => $v) {
|
}
|
||||||
if (!$v) {
|
|
||||||
throw new RuntimeException("micro failed sanity check with condition[{$k}], ret[{$ret}], out[{$raw_out}]");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,9 +5,20 @@ declare(strict_types=1);
|
|||||||
namespace SPC\builder\unix\library;
|
namespace SPC\builder\unix\library;
|
||||||
|
|
||||||
use SPC\exception\RuntimeException;
|
use SPC\exception\RuntimeException;
|
||||||
|
use SPC\store\FileSystem;
|
||||||
|
|
||||||
trait libcares
|
trait libcares
|
||||||
{
|
{
|
||||||
|
public function patchBeforeBuild(): bool
|
||||||
|
{
|
||||||
|
if (!file_exists($this->source_dir . '/src/lib/thirdparty/apple/dnsinfo.h')) {
|
||||||
|
FileSystem::createDir($this->source_dir . '/src/lib/thirdparty/apple');
|
||||||
|
copy(ROOT_DIR . '/src/globals/extra/libcares_dnsinfo.h', $this->source_dir . '/src/lib/thirdparty/apple/dnsinfo.h');
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @throws RuntimeException
|
* @throws RuntimeException
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -80,16 +80,18 @@ class WindowsBuilder extends BuilderBase
|
|||||||
$zts = $this->zts ? '--enable-zts=yes ' : '--enable-zts=no ';
|
$zts = $this->zts ? '--enable-zts=yes ' : '--enable-zts=no ';
|
||||||
|
|
||||||
// with-upx-pack for phpmicro
|
// with-upx-pack for phpmicro
|
||||||
$makefile = FileSystem::convertPath(SOURCE_PATH . '/php-src/sapi/micro/Makefile.frag.w32');
|
if ($enableMicro && version_compare($this->getMicroVersion(), '0.2.0') < 0) {
|
||||||
if ($this->getOption('with-upx-pack', false)) {
|
$makefile = FileSystem::convertPath(SOURCE_PATH . '/php-src/sapi/micro/Makefile.frag.w32');
|
||||||
if (!file_exists($makefile . '.originfile')) {
|
if ($this->getOption('with-upx-pack', false)) {
|
||||||
copy($makefile, $makefile . '.originfile');
|
if (!file_exists($makefile . '.originfile')) {
|
||||||
FileSystem::replaceFileStr($makefile, '$(MICRO_SFX):', '_MICRO_UPX = ' . getenv('UPX_EXEC') . " --best $(MICRO_SFX)\n$(MICRO_SFX):");
|
copy($makefile, $makefile . '.originfile');
|
||||||
FileSystem::replaceFileStr($makefile, '@$(_MICRO_MT)', "@$(_MICRO_MT)\n\t@$(_MICRO_UPX)");
|
FileSystem::replaceFileStr($makefile, '$(MICRO_SFX):', '_MICRO_UPX = ' . getenv('UPX_EXEC') . " --best $(MICRO_SFX)\n$(MICRO_SFX):");
|
||||||
|
FileSystem::replaceFileStr($makefile, '@$(_MICRO_MT)', "@$(_MICRO_MT)\n\t@$(_MICRO_UPX)");
|
||||||
|
}
|
||||||
|
} elseif (file_exists($makefile . '.originfile')) {
|
||||||
|
copy($makefile . '.originfile', $makefile);
|
||||||
|
unlink($makefile . '.originfile');
|
||||||
}
|
}
|
||||||
} elseif (file_exists($makefile . '.originfile')) {
|
|
||||||
copy($makefile . '.originfile', $makefile);
|
|
||||||
unlink($makefile . '.originfile');
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (($logo = $this->getOption('with-micro-logo')) !== null) {
|
if (($logo = $this->getOption('with-micro-logo')) !== null) {
|
||||||
@@ -191,21 +193,21 @@ class WindowsBuilder extends BuilderBase
|
|||||||
// phar patch for micro
|
// phar patch for micro
|
||||||
if ($this->getExt('phar')) {
|
if ($this->getExt('phar')) {
|
||||||
$this->phar_patched = true;
|
$this->phar_patched = true;
|
||||||
SourcePatcher::patchMicro(['phar']);
|
SourcePatcher::patchMicroPhar($this->getPHPVersionID());
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
cmd()->cd(SOURCE_PATH . '\php-src')->exec("{$this->sdk_prefix} nmake_micro_wrapper.bat --task-args micro");
|
cmd()->cd(SOURCE_PATH . '\php-src')->exec("{$this->sdk_prefix} nmake_micro_wrapper.bat --task-args micro");
|
||||||
} finally {
|
} finally {
|
||||||
if ($this->phar_patched) {
|
if ($this->phar_patched) {
|
||||||
SourcePatcher::patchMicro(['phar'], true);
|
SourcePatcher::unpatchMicroPhar();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->deployBinary(BUILD_TARGET_MICRO);
|
$this->deployBinary(BUILD_TARGET_MICRO);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function buildLibs(array $sorted_libraries): void
|
public function proveLibs(array $sorted_libraries): void
|
||||||
{
|
{
|
||||||
// search all supported libs
|
// search all supported libs
|
||||||
$support_lib_list = [];
|
$support_lib_list = [];
|
||||||
@@ -242,16 +244,6 @@ class WindowsBuilder extends BuilderBase
|
|||||||
|
|
||||||
// extract sources
|
// extract sources
|
||||||
SourceManager::initSource(libs: $sorted_libraries);
|
SourceManager::initSource(libs: $sorted_libraries);
|
||||||
|
|
||||||
// build all libs
|
|
||||||
foreach ($this->libs as $lib) {
|
|
||||||
match ($lib->tryBuild($this->getOption('rebuild', false))) {
|
|
||||||
BUILD_STATUS_OK => logger()->info('lib [' . $lib::NAME . '] build success'),
|
|
||||||
BUILD_STATUS_ALREADY => logger()->notice('lib [' . $lib::NAME . '] already built'),
|
|
||||||
BUILD_STATUS_FAILED => logger()->error('lib [' . $lib::NAME . '] build failed'),
|
|
||||||
default => logger()->warning('lib [' . $lib::NAME . '] build status unknown'),
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -271,6 +263,12 @@ class WindowsBuilder extends BuilderBase
|
|||||||
*/
|
*/
|
||||||
public function sanityCheck(mixed $build_target): void
|
public function sanityCheck(mixed $build_target): void
|
||||||
{
|
{
|
||||||
|
// remove all .dll from `buildroot/bin/`
|
||||||
|
logger()->debug('Removing all .dll files from buildroot/bin/');
|
||||||
|
$dlls = glob(BUILD_BIN_PATH . '\*.dll');
|
||||||
|
foreach ($dlls as $dll) {
|
||||||
|
@unlink($dll);
|
||||||
|
}
|
||||||
// sanity check for php-cli
|
// sanity check for php-cli
|
||||||
if (($build_target & BUILD_TARGET_CLI) === BUILD_TARGET_CLI) {
|
if (($build_target & BUILD_TARGET_CLI) === BUILD_TARGET_CLI) {
|
||||||
logger()->info('running cli sanity check');
|
logger()->info('running cli sanity check');
|
||||||
@@ -287,22 +285,20 @@ class WindowsBuilder extends BuilderBase
|
|||||||
|
|
||||||
// sanity check for phpmicro
|
// sanity check for phpmicro
|
||||||
if (($build_target & BUILD_TARGET_MICRO) === BUILD_TARGET_MICRO) {
|
if (($build_target & BUILD_TARGET_MICRO) === BUILD_TARGET_MICRO) {
|
||||||
if (file_exists(SOURCE_PATH . '\hello.exe')) {
|
$test_task = $this->getMicroTestTasks();
|
||||||
@unlink(SOURCE_PATH . '\hello.exe');
|
foreach ($test_task as $task_name => $task) {
|
||||||
}
|
$test_file = SOURCE_PATH . '/' . $task_name . '.exe';
|
||||||
file_put_contents(
|
if (file_exists($test_file)) {
|
||||||
SOURCE_PATH . '\hello.exe',
|
@unlink($test_file);
|
||||||
file_get_contents(BUILD_ROOT_PATH . '\bin\micro.sfx') .
|
}
|
||||||
($this->getOption('without-micro-ext-test') ? '<?php echo "[micro-test-start][micro-test-end]";' : $this->generateMicroExtTests())
|
file_put_contents($test_file, file_get_contents(BUILD_ROOT_PATH . '\bin\micro.sfx') . $task['content']);
|
||||||
);
|
chmod($test_file, 0755);
|
||||||
chmod(SOURCE_PATH . '\hello.exe', 0755);
|
[$ret, $out] = cmd()->execWithResult($test_file);
|
||||||
[$ret, $output2] = cmd()->execWithResult(SOURCE_PATH . '\hello.exe');
|
foreach ($task['conditions'] as $condition => $closure) {
|
||||||
$raw_out = trim(implode('', $output2));
|
if (!$closure($ret, $out)) {
|
||||||
$condition[0] = $ret === 0;
|
$raw_out = trim(implode('', $out));
|
||||||
$condition[1] = str_starts_with($raw_out, '[micro-test-start]') && str_ends_with($raw_out, '[micro-test-end]');
|
throw new RuntimeException("micro failed sanity check: {$task_name}, condition [{$condition}], ret[{$ret}], out[{$raw_out}]");
|
||||||
foreach ($condition as $k => $v) {
|
}
|
||||||
if (!$v) {
|
|
||||||
throw new RuntimeException("micro failed sanity check with condition[{$k}], ret[{$ret}], out[{$raw_out}]");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -324,9 +320,11 @@ class WindowsBuilder extends BuilderBase
|
|||||||
default => throw new RuntimeException('Deployment does not accept type ' . $type),
|
default => throw new RuntimeException('Deployment does not accept type ' . $type),
|
||||||
};
|
};
|
||||||
|
|
||||||
// with-upx-pack for cli
|
// with-upx-pack for cli and micro
|
||||||
if ($this->getOption('with-upx-pack', false) && $type === BUILD_TARGET_CLI) {
|
if ($this->getOption('with-upx-pack', false)) {
|
||||||
cmd()->exec(getenv('UPX_EXEC') . ' --best ' . escapeshellarg($src));
|
if ($type === BUILD_TARGET_CLI || ($type === BUILD_TARGET_MICRO && version_compare($this->getMicroVersion(), '0.2.0') >= 0)) {
|
||||||
|
cmd()->exec(getenv('UPX_EXEC') . ' --best ' . escapeshellarg($src));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
logger()->info('Deploying ' . $this->getBuildTypeName($type) . ' file');
|
logger()->info('Deploying ' . $this->getBuildTypeName($type) . ' file');
|
||||||
|
|||||||
29
src/SPC/builder/windows/library/pthreads4w.php
Normal file
29
src/SPC/builder/windows/library/pthreads4w.php
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace SPC\builder\windows\library;
|
||||||
|
|
||||||
|
class pthreads4w extends WindowsLibraryBase
|
||||||
|
{
|
||||||
|
public const NAME = 'pthreads4w';
|
||||||
|
|
||||||
|
protected function build(): void
|
||||||
|
{
|
||||||
|
cmd()->cd($this->source_dir)
|
||||||
|
->execWithWrapper(
|
||||||
|
$this->builder->makeSimpleWrapper(
|
||||||
|
'nmake /E /nologo /f Makefile ' .
|
||||||
|
'DESTROOT=' . BUILD_ROOT_PATH . ' ' .
|
||||||
|
'XCFLAGS="/MT" ' . // no dll
|
||||||
|
'EHFLAGS="/I. /DHAVE_CONFIG_H /Os /Ob2 /D__PTW32_STATIC_LIB /D__PTW32_BUILD_INLINED"'
|
||||||
|
),
|
||||||
|
'pthreadVC3.inlined_static_stamp'
|
||||||
|
);
|
||||||
|
copy($this->source_dir . '\libpthreadVC3.lib', BUILD_LIB_PATH . '\libpthreadVC3.lib');
|
||||||
|
copy($this->source_dir . '\_ptw32.h', BUILD_INCLUDE_PATH . '\_ptw32.h');
|
||||||
|
copy($this->source_dir . '\pthread.h', BUILD_INCLUDE_PATH . '\pthread.h');
|
||||||
|
copy($this->source_dir . '\sched.h', BUILD_INCLUDE_PATH . '\sched.h');
|
||||||
|
copy($this->source_dir . '\semaphore.h', BUILD_INCLUDE_PATH . '\semaphore.h');
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -96,6 +96,8 @@ abstract class BaseCommand extends Command
|
|||||||
});
|
});
|
||||||
if ($this->shouldExecute()) {
|
if ($this->shouldExecute()) {
|
||||||
try {
|
try {
|
||||||
|
// show raw argv list for logger()->debug
|
||||||
|
logger()->debug('argv: ' . implode(' ', $_SERVER['argv']));
|
||||||
return $this->handle();
|
return $this->handle();
|
||||||
} catch (WrongUsageException $e) {
|
} catch (WrongUsageException $e) {
|
||||||
$msg = explode("\n", $e->getMessage());
|
$msg = explode("\n", $e->getMessage());
|
||||||
@@ -132,4 +134,14 @@ abstract class BaseCommand extends Command
|
|||||||
{
|
{
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected function logWithResult(bool $result, string $success_msg, string $fail_msg): int
|
||||||
|
{
|
||||||
|
if ($result) {
|
||||||
|
logger()->info($success_msg);
|
||||||
|
return static::SUCCESS;
|
||||||
|
}
|
||||||
|
logger()->error($fail_msg);
|
||||||
|
return static::FAILURE;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ use Symfony\Component\Console\Input\InputArgument;
|
|||||||
use Symfony\Component\Console\Input\InputOption;
|
use Symfony\Component\Console\Input\InputOption;
|
||||||
use ZM\Logger\ConsoleColor;
|
use ZM\Logger\ConsoleColor;
|
||||||
|
|
||||||
#[AsCommand('build', 'build PHP')]
|
#[AsCommand('build', 'build PHP', ['build:php'])]
|
||||||
class BuildCliCommand extends BuildCommand
|
class BuildCliCommand extends BuildCommand
|
||||||
{
|
{
|
||||||
public function configure(): void
|
public function configure(): void
|
||||||
@@ -93,6 +93,9 @@ class BuildCliCommand extends BuildCommand
|
|||||||
if ($this->getOption('no-strip')) {
|
if ($this->getOption('no-strip')) {
|
||||||
logger()->warning('--with-upx-pack conflicts with --no-strip, --no-strip won\'t work!');
|
logger()->warning('--with-upx-pack conflicts with --no-strip, --no-strip won\'t work!');
|
||||||
}
|
}
|
||||||
|
if (($rule & BUILD_TARGET_MICRO) === BUILD_TARGET_MICRO) {
|
||||||
|
logger()->warning('Some cases micro.sfx cannot be packed via UPX due to dynamic size bug, be aware!');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
// create builder
|
// create builder
|
||||||
@@ -133,17 +136,23 @@ class BuildCliCommand extends BuildCommand
|
|||||||
}
|
}
|
||||||
$this->printFormatInfo($this->getDefinedEnvs(), true);
|
$this->printFormatInfo($this->getDefinedEnvs(), true);
|
||||||
$this->printFormatInfo($indent_texts);
|
$this->printFormatInfo($indent_texts);
|
||||||
|
|
||||||
logger()->notice('Build will start after 2s ...');
|
logger()->notice('Build will start after 2s ...');
|
||||||
sleep(2);
|
sleep(2);
|
||||||
|
|
||||||
|
// compile libraries
|
||||||
|
$builder->proveLibs($libraries);
|
||||||
|
// check extensions
|
||||||
|
$builder->proveExts($extensions);
|
||||||
|
// validate libs and exts
|
||||||
|
$builder->validateLibsAndExts();
|
||||||
|
// build libraries
|
||||||
|
$builder->buildLibs();
|
||||||
|
|
||||||
if ($this->input->getOption('with-clean')) {
|
if ($this->input->getOption('with-clean')) {
|
||||||
logger()->info('Cleaning source dir...');
|
logger()->info('Cleaning source dir...');
|
||||||
FileSystem::removeDir(SOURCE_PATH);
|
FileSystem::removeDir(SOURCE_PATH);
|
||||||
}
|
}
|
||||||
// compile libraries
|
|
||||||
$builder->buildLibs($libraries);
|
|
||||||
// check extensions
|
|
||||||
$builder->proveExts($extensions);
|
|
||||||
|
|
||||||
// Process -I option
|
// Process -I option
|
||||||
$custom_ini = [];
|
$custom_ini = [];
|
||||||
|
|||||||
@@ -61,7 +61,11 @@ class BuildLibsCommand extends BuildCommand
|
|||||||
$builder->setLibsOnly();
|
$builder->setLibsOnly();
|
||||||
// 编译和检查库完整
|
// 编译和检查库完整
|
||||||
$libraries = DependencyUtil::getLibs($libraries);
|
$libraries = DependencyUtil::getLibs($libraries);
|
||||||
$builder->buildLibs($libraries);
|
logger()->info('Building libraries: ' . implode(',', $libraries));
|
||||||
|
sleep(2);
|
||||||
|
$builder->proveLibs($libraries);
|
||||||
|
$builder->validateLibsAndExts();
|
||||||
|
$builder->buildLibs();
|
||||||
|
|
||||||
$time = round(microtime(true) - START_TIME, 3);
|
$time = round(microtime(true) - START_TIME, 3);
|
||||||
logger()->info('Build libs complete, used ' . $time . ' s !');
|
logger()->info('Build libs complete, used ' . $time . ' s !');
|
||||||
|
|||||||
@@ -57,8 +57,11 @@ class DumpLicenseCommand extends BaseCommand
|
|||||||
$libraries = DependencyUtil::getLibs($libraries);
|
$libraries = DependencyUtil::getLibs($libraries);
|
||||||
$dumper->addLibs($libraries);
|
$dumper->addLibs($libraries);
|
||||||
$dumper->dump($this->getOption('dump-dir'));
|
$dumper->dump($this->getOption('dump-dir'));
|
||||||
$this->output->writeln('Dump target dir: ' . $this->getOption('dump-dir'));
|
return $this->logWithResult(
|
||||||
return static::SUCCESS;
|
$dumper->dump($this->getOption('dump-dir')),
|
||||||
|
'Dump target dir: ' . $this->getOption('dump-dir'),
|
||||||
|
'Dump failed!'
|
||||||
|
);
|
||||||
}
|
}
|
||||||
if ($this->getOption('for-sources') !== null) {
|
if ($this->getOption('for-sources') !== null) {
|
||||||
$sources = array_map('trim', array_filter(explode(',', $this->getOption('for-sources'))));
|
$sources = array_map('trim', array_filter(explode(',', $this->getOption('for-sources'))));
|
||||||
|
|||||||
67
src/SPC/command/SwitchPhpVersionCommand.php
Normal file
67
src/SPC/command/SwitchPhpVersionCommand.php
Normal file
@@ -0,0 +1,67 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace SPC\command;
|
||||||
|
|
||||||
|
use SPC\store\Config;
|
||||||
|
use SPC\store\Downloader;
|
||||||
|
use SPC\store\FileSystem;
|
||||||
|
use Symfony\Component\Console\Attribute\AsCommand;
|
||||||
|
use Symfony\Component\Console\Input\InputArgument;
|
||||||
|
use Symfony\Component\Console\Input\InputOption;
|
||||||
|
|
||||||
|
#[AsCommand('switch-php-version', description: 'Switch downloaded PHP version')]
|
||||||
|
class SwitchPhpVersionCommand extends BaseCommand
|
||||||
|
{
|
||||||
|
public function configure()
|
||||||
|
{
|
||||||
|
$this->addArgument(
|
||||||
|
'php-major-version',
|
||||||
|
InputArgument::REQUIRED,
|
||||||
|
'PHP major version (supported: 7.4, 8.0, 8.1, 8.2, 8.3)',
|
||||||
|
null,
|
||||||
|
fn () => ['7.4', '8.0', '8.1', '8.2', '8.3']
|
||||||
|
);
|
||||||
|
$this->no_motd = true;
|
||||||
|
|
||||||
|
$this->addOption('retry', 'R', InputOption::VALUE_REQUIRED, 'Set retry time when downloading failed (default: 0)', '0');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function handle(): int
|
||||||
|
{
|
||||||
|
$php_ver = $this->input->getArgument('php-major-version');
|
||||||
|
if (!in_array($php_ver, ['7.4', '8.0', '8.1', '8.2', '8.3'])) {
|
||||||
|
$this->output->writeln('<error>Invalid PHP major version ' . $php_ver . ' !</error>');
|
||||||
|
return static::FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// detect if downloads/.lock.json exists
|
||||||
|
$lock_file = DOWNLOAD_PATH . '/.lock.json';
|
||||||
|
// parse php-src part of lock file
|
||||||
|
$lock_data = json_decode(file_get_contents($lock_file), true);
|
||||||
|
// get php-src downloaded file name
|
||||||
|
$php_src = $lock_data['php-src'];
|
||||||
|
$file = DOWNLOAD_PATH . '/' . ($php_src['filename'] ?? '.donot.delete.me');
|
||||||
|
if (file_exists($file)) {
|
||||||
|
$this->output->writeln('<info>Removing old PHP source...</info>');
|
||||||
|
unlink($file);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Download new PHP source
|
||||||
|
$this->output->writeln('<info>Downloading PHP source...</info>');
|
||||||
|
define('SPC_BUILD_PHP_VERSION', $php_ver);
|
||||||
|
|
||||||
|
// retry
|
||||||
|
$retry = intval($this->getOption('retry'));
|
||||||
|
f_putenv('SPC_RETRY_TIME=' . $retry);
|
||||||
|
|
||||||
|
Downloader::downloadSource('php-src', Config::getSource('php-src'));
|
||||||
|
|
||||||
|
// Remove source/php-src dir
|
||||||
|
FileSystem::removeDir(SOURCE_PATH . '/php-src');
|
||||||
|
|
||||||
|
$this->output->writeln('<info>Switched to PHP ' . $php_ver . ' successfully!</info>');
|
||||||
|
return static::SUCCESS;
|
||||||
|
}
|
||||||
|
}
|
||||||
80
src/SPC/command/dev/GenerateExtDocCommand.php
Normal file
80
src/SPC/command/dev/GenerateExtDocCommand.php
Normal file
@@ -0,0 +1,80 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace SPC\command\dev;
|
||||||
|
|
||||||
|
use SPC\command\BaseCommand;
|
||||||
|
use SPC\store\FileSystem;
|
||||||
|
use SPC\util\ConfigValidator;
|
||||||
|
use Symfony\Component\Console\Attribute\AsCommand;
|
||||||
|
|
||||||
|
#[AsCommand('dev:gen-ext-docs', 'Generate extension list markdown', [], true)]
|
||||||
|
class GenerateExtDocCommand extends BaseCommand
|
||||||
|
{
|
||||||
|
protected bool $no_motd = true;
|
||||||
|
|
||||||
|
public function handle(): int
|
||||||
|
{
|
||||||
|
// Get ext.json
|
||||||
|
$exts = json_decode(FileSystem::readFile(ROOT_DIR . '/config/ext.json'), true);
|
||||||
|
ConfigValidator::validateExts($exts);
|
||||||
|
// Markdown table needs format, we need to calculate the max length of each column
|
||||||
|
$max_name = 0;
|
||||||
|
$max_linux = 5;
|
||||||
|
$max_macos = 5;
|
||||||
|
$max_freebsd = 7;
|
||||||
|
$max_windows = 7;
|
||||||
|
$md_lines = [];
|
||||||
|
foreach ($exts as $ext_name => $ext) {
|
||||||
|
// notes is optional
|
||||||
|
$name = ($ext['notes'] ?? false) === true ? "[{$ext_name}](./extension-notes#{$ext_name})" : $ext_name;
|
||||||
|
// calculate max length
|
||||||
|
$max_name = max($max_name, strlen($name));
|
||||||
|
|
||||||
|
// linux
|
||||||
|
$linux = match ($ext['support']['Linux'] ?? 'yes') {
|
||||||
|
'wip' => '',
|
||||||
|
default => $ext['support']['Linux'] ?? 'yes',
|
||||||
|
};
|
||||||
|
$max_linux = max($max_linux, strlen($linux));
|
||||||
|
|
||||||
|
// macos
|
||||||
|
$macos = match ($ext['support']['Darwin'] ?? 'yes') {
|
||||||
|
'wip' => '',
|
||||||
|
default => $ext['support']['Darwin'] ?? 'yes',
|
||||||
|
};
|
||||||
|
$max_macos = max($max_macos, strlen($macos));
|
||||||
|
|
||||||
|
// freebsd
|
||||||
|
$freebsd = match ($ext['support']['BSD'] ?? 'yes') {
|
||||||
|
'wip' => '',
|
||||||
|
default => $ext['support']['BSD'] ?? 'yes',
|
||||||
|
};
|
||||||
|
$max_freebsd = max($max_freebsd, strlen($freebsd));
|
||||||
|
|
||||||
|
// windows
|
||||||
|
$windows = match ($ext['support']['Windows'] ?? 'yes') {
|
||||||
|
'wip' => '',
|
||||||
|
default => $ext['support']['Windows'] ?? 'yes',
|
||||||
|
};
|
||||||
|
$max_windows = max($max_windows, strlen($windows));
|
||||||
|
$md_lines[] = [
|
||||||
|
$name,
|
||||||
|
$linux,
|
||||||
|
$macos,
|
||||||
|
$freebsd,
|
||||||
|
$windows,
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
// generate markdown
|
||||||
|
$md = '| ' . str_pad('Extension Name', $max_name) . ' | ' . str_pad('Linux', $max_linux) . ' | ' . str_pad('macOS', $max_macos) . ' | ' . str_pad('FreeBSD', $max_freebsd) . ' | ' . str_pad('Windows', $max_windows) . ' |' . PHP_EOL;
|
||||||
|
$md .= '| ' . str_repeat('-', $max_name) . ' | ' . str_repeat('-', $max_linux) . ' | ' . str_repeat('-', $max_macos) . ' | ' . str_repeat('-', $max_freebsd) . ' | ' . str_repeat('-', $max_windows) . ' |' . PHP_EOL;
|
||||||
|
foreach ($md_lines as $line) {
|
||||||
|
$md .= '| ' . str_pad($line[0], $max_name) . ' | ' . str_pad($line[1], $max_linux) . ' | ' . str_pad($line[2], $max_macos) . ' | ' . str_pad($line[3], $max_freebsd) . ' | ' . str_pad($line[4], $max_windows) . ' |' . PHP_EOL;
|
||||||
|
}
|
||||||
|
$this->output->writeln($md);
|
||||||
|
return static::SUCCESS;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -436,6 +436,21 @@ class FileSystem
|
|||||||
return str_replace(array_keys($replacement), array_values($replacement), $path);
|
return str_replace(array_keys($replacement), array_values($replacement), $path);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static function backupFile(string $path): string
|
||||||
|
{
|
||||||
|
copy($path, $path . '.bak');
|
||||||
|
return $path . '.bak';
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function restoreBackupFile(string $path): void
|
||||||
|
{
|
||||||
|
if (!file_exists($path . '.bak')) {
|
||||||
|
throw new RuntimeException('Cannot find bak file for ' . $path);
|
||||||
|
}
|
||||||
|
copy($path . '.bak', $path);
|
||||||
|
unlink($path . '.bak');
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @throws RuntimeException
|
* @throws RuntimeException
|
||||||
* @throws FileSystemException
|
* @throws FileSystemException
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ class SourcePatcher
|
|||||||
FileSystem::addSourceExtractHook('micro', [SourcePatcher::class, 'patchMicro']);
|
FileSystem::addSourceExtractHook('micro', [SourcePatcher::class, 'patchMicro']);
|
||||||
FileSystem::addSourceExtractHook('openssl', [SourcePatcher::class, 'patchOpenssl11Darwin']);
|
FileSystem::addSourceExtractHook('openssl', [SourcePatcher::class, 'patchOpenssl11Darwin']);
|
||||||
FileSystem::addSourceExtractHook('swoole', [SourcePatcher::class, 'patchSwoole']);
|
FileSystem::addSourceExtractHook('swoole', [SourcePatcher::class, 'patchSwoole']);
|
||||||
|
FileSystem::addSourceExtractHook('php-src', [SourcePatcher::class, 'patchPhpLibxml212']);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -200,6 +201,11 @@ class SourcePatcher
|
|||||||
FileSystem::replaceFileStr(SOURCE_PATH . '/php-src/Makefile', 'install-micro', '');
|
FileSystem::replaceFileStr(SOURCE_PATH . '/php-src/Makefile', 'install-micro', '');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// no asan
|
||||||
|
// if (strpos(file_get_contents(SOURCE_PATH . '/php-src/Makefile'), 'CFLAGS_CLEAN = -g') === false) {
|
||||||
|
// FileSystem::replaceFileStr(SOURCE_PATH . '/php-src/Makefile', 'CFLAGS_CLEAN = ', 'CFLAGS_CLEAN = -g -fsanitize=address ');
|
||||||
|
// }
|
||||||
|
|
||||||
// call extension patch before make
|
// call extension patch before make
|
||||||
foreach ($builder->getExts() as $ext) {
|
foreach ($builder->getExts() as $ext) {
|
||||||
if ($ext->patchBeforeMake() === true) {
|
if ($ext->patchBeforeMake() === true) {
|
||||||
@@ -268,6 +274,36 @@ class SourcePatcher
|
|||||||
return $result;
|
return $result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static function patchMicroPhar(int $version_id): void
|
||||||
|
{
|
||||||
|
FileSystem::backupFile(SOURCE_PATH . '/php-src/ext/phar/phar.c');
|
||||||
|
FileSystem::replaceFileStr(
|
||||||
|
SOURCE_PATH . '/php-src/ext/phar/phar.c',
|
||||||
|
'static zend_op_array *phar_compile_file',
|
||||||
|
"char *micro_get_filename(void);\n\nstatic zend_op_array *phar_compile_file"
|
||||||
|
);
|
||||||
|
if ($version_id < 80100) {
|
||||||
|
// PHP 8.0.x
|
||||||
|
FileSystem::replaceFileStr(
|
||||||
|
SOURCE_PATH . '/php-src/ext/phar/phar.c',
|
||||||
|
'if (strstr(file_handle->filename, ".phar") && !strstr(file_handle->filename, "://")) {',
|
||||||
|
'if ((strstr(file_handle->filename, micro_get_filename()) || strstr(file_handle->filename, ".phar")) && !strstr(file_handle->filename, "://")) {'
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
// PHP >= 8.1
|
||||||
|
FileSystem::replaceFileStr(
|
||||||
|
SOURCE_PATH . '/php-src/ext/phar/phar.c',
|
||||||
|
'if (strstr(ZSTR_VAL(file_handle->filename), ".phar") && !strstr(ZSTR_VAL(file_handle->filename), "://")) {',
|
||||||
|
'if ((strstr(ZSTR_VAL(file_handle->filename), micro_get_filename()) || strstr(ZSTR_VAL(file_handle->filename), ".phar")) && !strstr(ZSTR_VAL(file_handle->filename), "://")) {'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function unpatchMicroPhar(): void
|
||||||
|
{
|
||||||
|
FileSystem::restoreBackupFile(SOURCE_PATH . '/php-src/ext/phar/phar.c');
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Patch cli SAPI Makefile for Windows.
|
* Patch cli SAPI Makefile for Windows.
|
||||||
*
|
*
|
||||||
@@ -296,6 +332,27 @@ class SourcePatcher
|
|||||||
FileSystem::writeFile(SOURCE_PATH . '/php-src/Makefile', implode("\r\n", $lines));
|
FileSystem::writeFile(SOURCE_PATH . '/php-src/Makefile', implode("\r\n", $lines));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static function patchPhpLibxml212(): bool
|
||||||
|
{
|
||||||
|
$file = file_get_contents(SOURCE_PATH . '/php-src/main/php_version.h');
|
||||||
|
if (preg_match('/PHP_VERSION_ID (\d+)/', $file, $match) !== 0) {
|
||||||
|
$ver_id = intval($match[1]);
|
||||||
|
if ($ver_id < 80000) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if ($ver_id < 80100) {
|
||||||
|
self::patchFile('spc_fix_libxml2_12_php80.patch', SOURCE_PATH . '/php-src');
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if ($ver_id < 80200) {
|
||||||
|
self::patchFile('spc_fix_libxml2_12_php81.patch', SOURCE_PATH . '/php-src');
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Add additional `static-php-cli.version` ini value for PHP source.
|
* Add additional `static-php-cli.version` ini value for PHP source.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -51,7 +51,7 @@ class GlobalEnvManager
|
|||||||
|
|
||||||
// Init system-specific env
|
// Init system-specific env
|
||||||
match (PHP_OS_FAMILY) {
|
match (PHP_OS_FAMILY) {
|
||||||
'Windows' => self::initWindowsEnv($builder),
|
'Windows' => self::initWindowsEnv(),
|
||||||
'Darwin' => self::initDarwinEnv($builder),
|
'Darwin' => self::initDarwinEnv($builder),
|
||||||
'Linux' => self::initLinuxEnv($builder),
|
'Linux' => self::initLinuxEnv($builder),
|
||||||
'BSD' => 'TODO',
|
'BSD' => 'TODO',
|
||||||
@@ -59,7 +59,7 @@ class GlobalEnvManager
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
private static function initWindowsEnv(BuilderBase $builder): void
|
private static function initWindowsEnv(): void
|
||||||
{
|
{
|
||||||
// Windows need php-sdk binary tools
|
// Windows need php-sdk binary tools
|
||||||
self::initIfNotExists('PHP_SDK_PATH', WORKING_DIR . DIRECTORY_SEPARATOR . 'php-sdk-binary-tools');
|
self::initIfNotExists('PHP_SDK_PATH', WORKING_DIR . DIRECTORY_SEPARATOR . 'php-sdk-binary-tools');
|
||||||
@@ -69,7 +69,7 @@ class GlobalEnvManager
|
|||||||
private static function initLinuxEnv(BuilderBase $builder): void
|
private static function initLinuxEnv(BuilderBase $builder): void
|
||||||
{
|
{
|
||||||
// Init C Compiler and C++ Compiler (alpine)
|
// Init C Compiler and C++ Compiler (alpine)
|
||||||
if (\SPC\builder\linux\SystemUtil::isMuslDist()) {
|
if (LinuxSystemUtil::isMuslDist()) {
|
||||||
self::initIfNotExists('CC', 'gcc');
|
self::initIfNotExists('CC', 'gcc');
|
||||||
self::initIfNotExists('CXX', 'g++');
|
self::initIfNotExists('CXX', 'g++');
|
||||||
self::initIfNotExists('AR', 'ar');
|
self::initIfNotExists('AR', 'ar');
|
||||||
|
|||||||
@@ -10,6 +10,9 @@ use SPC\exception\WrongUsageException;
|
|||||||
use SPC\store\Config;
|
use SPC\store\Config;
|
||||||
use SPC\store\FileSystem;
|
use SPC\store\FileSystem;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* License dumper, dump source license files to target directory
|
||||||
|
*/
|
||||||
class LicenseDumper
|
class LicenseDumper
|
||||||
{
|
{
|
||||||
private array $exts = [];
|
private array $exts = [];
|
||||||
@@ -37,6 +40,10 @@ class LicenseDumper
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
* Dump source licenses to target directory
|
||||||
|
*
|
||||||
|
* @param string $target_dir Target directory
|
||||||
|
* @return bool Success or not
|
||||||
* @throws WrongUsageException
|
* @throws WrongUsageException
|
||||||
* @throws FileSystemException
|
* @throws FileSystemException
|
||||||
* @throws RuntimeException
|
* @throws RuntimeException
|
||||||
@@ -55,20 +62,29 @@ class LicenseDumper
|
|||||||
|
|
||||||
$source_name = Config::getExt($ext, 'source');
|
$source_name = Config::getExt($ext, 'source');
|
||||||
foreach ($this->getSourceLicenses($source_name) as $index => $license) {
|
foreach ($this->getSourceLicenses($source_name) as $index => $license) {
|
||||||
file_put_contents("{$target_dir}/ext_{$ext}_{$index}.txt", $license);
|
$result = file_put_contents("{$target_dir}/ext_{$ext}_{$index}.txt", $license);
|
||||||
|
if ($result === false) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach ($this->libs as $lib) {
|
foreach ($this->libs as $lib) {
|
||||||
$source_name = Config::getLib($lib, 'source');
|
$source_name = Config::getLib($lib, 'source');
|
||||||
foreach ($this->getSourceLicenses($source_name) as $index => $license) {
|
foreach ($this->getSourceLicenses($source_name) as $index => $license) {
|
||||||
file_put_contents("{$target_dir}/lib_{$lib}_{$index}.txt", $license);
|
$result = file_put_contents("{$target_dir}/lib_{$lib}_{$index}.txt", $license);
|
||||||
|
if ($result === false) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach ($this->sources as $source) {
|
foreach ($this->sources as $source) {
|
||||||
foreach ($this->getSourceLicenses($source) as $index => $license) {
|
foreach ($this->getSourceLicenses($source) as $index => $license) {
|
||||||
file_put_contents("{$target_dir}/src_{$source}_{$index}.txt", $license);
|
$result = file_put_contents("{$target_dir}/src_{$source}_{$index}.txt", $license);
|
||||||
|
if ($result === false) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
@@ -1,38 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
declare(strict_types=1);
|
|
||||||
|
|
||||||
namespace SPC\util;
|
|
||||||
|
|
||||||
use SPC\exception\FileSystemException;
|
|
||||||
use SPC\exception\RuntimeException;
|
|
||||||
use SPC\store\FileSystem;
|
|
||||||
|
|
||||||
class Patcher
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* @throws FileSystemException
|
|
||||||
* @throws RuntimeException
|
|
||||||
*/
|
|
||||||
public static function patchLinuxConfigHeader(string $libc): void
|
|
||||||
{
|
|
||||||
switch ($libc) {
|
|
||||||
case 'musl_wrapper':
|
|
||||||
// bad checks
|
|
||||||
FileSystem::replaceFileRegex(SOURCE_PATH . '/php-src/main/php_config.h', '/^#define HAVE_STRLCPY 1$/m', '');
|
|
||||||
FileSystem::replaceFileRegex(SOURCE_PATH . '/php-src/main/php_config.h', '/^#define HAVE_STRLCAT 1$/m', '');
|
|
||||||
// no break
|
|
||||||
case 'musl':
|
|
||||||
FileSystem::replaceFileRegex(SOURCE_PATH . '/php-src/main/php_config.h', '/^#define HAVE_FUNC_ATTRIBUTE_IFUNC 1$/m', '');
|
|
||||||
break;
|
|
||||||
case 'glibc':
|
|
||||||
// avoid lcrypt dependency
|
|
||||||
FileSystem::replaceFileRegex(SOURCE_PATH . '/php-src/main/php_config.h', '/^#define HAVE_CRYPT 1$/m', '');
|
|
||||||
FileSystem::replaceFileRegex(SOURCE_PATH . '/php-src/main/php_config.h', '/^#define HAVE_CRYPT_R 1$/m', '');
|
|
||||||
FileSystem::replaceFileRegex(SOURCE_PATH . '/php-src/main/php_config.h', '/^#define HAVE_CRYPT_H 1$/m', '');
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
throw new RuntimeException('not implemented');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -15,6 +15,9 @@ class UnixShell
|
|||||||
|
|
||||||
private array $env = [];
|
private array $env = [];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @throws RuntimeException
|
||||||
|
*/
|
||||||
public function __construct(?bool $debug = null)
|
public function __construct(?bool $debug = null)
|
||||||
{
|
{
|
||||||
if (PHP_OS_FAMILY === 'Windows') {
|
if (PHP_OS_FAMILY === 'Windows') {
|
||||||
|
|||||||
@@ -15,6 +15,9 @@ class WindowsCmd
|
|||||||
|
|
||||||
private array $env = [];
|
private array $env = [];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @throws RuntimeException
|
||||||
|
*/
|
||||||
public function __construct(?bool $debug = null)
|
public function __construct(?bool $debug = null)
|
||||||
{
|
{
|
||||||
if (PHP_OS_FAMILY !== 'Windows') {
|
if (PHP_OS_FAMILY !== 'Windows') {
|
||||||
|
|||||||
361
src/globals/common-tests/micro_zend_mm_heap_corrupted.txt
Normal file
361
src/globals/common-tests/micro_zend_mm_heap_corrupted.txt
Normal file
@@ -0,0 +1,361 @@
|
|||||||
|
<?php
|
||||||
|
define('K_SP', ' ');
|
||||||
|
define('K_exclam', '!');
|
||||||
|
define('K_quotedbl', '"');
|
||||||
|
define('K_numbersign', '#');
|
||||||
|
define('K_dollar', '$');
|
||||||
|
define('K_percent', '%');
|
||||||
|
define('K_ampersand', '&');
|
||||||
|
define('K_apostrophe', "'");
|
||||||
|
define('K_parentleft', '(');
|
||||||
|
define('K_parentright', ')');
|
||||||
|
define('K_asterisk', '*');
|
||||||
|
define('K_plus', '+');
|
||||||
|
define('K_comma', ',');
|
||||||
|
define('K_minus', '-');
|
||||||
|
define('K_period', '.');
|
||||||
|
define('K_slash', '/');
|
||||||
|
define('K_0', '0');
|
||||||
|
define('K_1', '1');
|
||||||
|
define('K_2', '2');
|
||||||
|
define('K_3', '3');
|
||||||
|
define('K_4', '4');
|
||||||
|
define('K_5', '5');
|
||||||
|
define('K_6', '6');
|
||||||
|
define('K_7', '7');
|
||||||
|
define('K_8', '8');
|
||||||
|
define('K_9', '9');
|
||||||
|
define('K_colon', ':');
|
||||||
|
define('K_semicolon', ';');
|
||||||
|
define('K_less', '<');
|
||||||
|
define('K_equal', '=');
|
||||||
|
define('K_greater', '>');
|
||||||
|
define('K_question', '?');
|
||||||
|
define('K_at', '@');
|
||||||
|
define('K_A', 'A');
|
||||||
|
define('K_B', 'B');
|
||||||
|
define('K_C', 'C');
|
||||||
|
define('K_D', 'D');
|
||||||
|
define('K_E', 'E');
|
||||||
|
define('K_F', 'F');
|
||||||
|
define('K_G', 'G');
|
||||||
|
define('K_H', 'H');
|
||||||
|
define('K_I', 'I');
|
||||||
|
define('K_J', 'J');
|
||||||
|
define('K_K', 'K');
|
||||||
|
define('K_L', 'L');
|
||||||
|
define('K_M', 'M');
|
||||||
|
define('K_N', 'N');
|
||||||
|
define('K_O', 'O');
|
||||||
|
define('K_P', 'P');
|
||||||
|
define('K_Q', 'Q');
|
||||||
|
define('K_R', 'R');
|
||||||
|
define('K_S', 'S');
|
||||||
|
define('K_T', 'T');
|
||||||
|
define('K_U', 'U');
|
||||||
|
define('K_V', 'V');
|
||||||
|
define('K_W', 'W');
|
||||||
|
define('K_X', 'X');
|
||||||
|
define('K_Y', 'Y');
|
||||||
|
define('K_Z', 'Z');
|
||||||
|
define('K_bracketleft', '[');
|
||||||
|
define('K_bracketright', ']');
|
||||||
|
define('K_circum', '^');
|
||||||
|
define('K_underscore', '_');
|
||||||
|
define('K_grave', '`');
|
||||||
|
define('K_a', 'a');
|
||||||
|
define('K_b', 'b');
|
||||||
|
define('K_c', 'c');
|
||||||
|
define('K_d', 'd');
|
||||||
|
define('K_e', 'e');
|
||||||
|
define('K_f', 'f');
|
||||||
|
define('K_g', 'g');
|
||||||
|
define('K_h', 'h');
|
||||||
|
define('K_i', 'i');
|
||||||
|
define('K_j', 'j');
|
||||||
|
define('K_k', 'k');
|
||||||
|
define('K_l', 'l');
|
||||||
|
define('K_m', 'm');
|
||||||
|
define('K_n', 'n');
|
||||||
|
define('K_o', 'o');
|
||||||
|
define('K_p', 'p');
|
||||||
|
define('K_q', 'q');
|
||||||
|
define('K_r', 'r');
|
||||||
|
define('K_s', 's');
|
||||||
|
define('K_t', 't');
|
||||||
|
define('K_u', 'u');
|
||||||
|
define('K_v', 'v');
|
||||||
|
define('K_w', 'w');
|
||||||
|
define('K_x', 'x');
|
||||||
|
define('K_y', 'y');
|
||||||
|
define('K_z', 'z');
|
||||||
|
define('K_braceleft', '{');
|
||||||
|
define('K_bar', '|');
|
||||||
|
define('K_braceright', '}');
|
||||||
|
define('K_tilde', '~');
|
||||||
|
define('K_BS', '\\b');
|
||||||
|
define('K_TAB', "\t");
|
||||||
|
define('K_LF', "\n");
|
||||||
|
define('K_CR', "\r");
|
||||||
|
define('K_quoteleft', '`');
|
||||||
|
define('K_quoteright', "'");
|
||||||
|
define('K_PAUSE', 65299);
|
||||||
|
define('K_ESC', 65307);
|
||||||
|
define('K_HOME', 65360);
|
||||||
|
define('K_LEFT', 65361);
|
||||||
|
define('K_UP', 65362);
|
||||||
|
define('K_RIGHT', 65363);
|
||||||
|
define('K_DOWN', 65364);
|
||||||
|
define('K_PGUP', 65365);
|
||||||
|
define('K_PGDN', 65366);
|
||||||
|
define('K_END', 65367);
|
||||||
|
define('K_MIDDLE', 65291);
|
||||||
|
define('K_Print', 65377);
|
||||||
|
define('K_INS', 65379);
|
||||||
|
define('K_Menu', 65383);
|
||||||
|
define('K_DEL', 65535);
|
||||||
|
define('K_F1', 65470);
|
||||||
|
define('K_F2', 65471);
|
||||||
|
define('K_F3', 65472);
|
||||||
|
define('K_F4', 65473);
|
||||||
|
define('K_F5', 65474);
|
||||||
|
define('K_F6', 65475);
|
||||||
|
define('K_F7', 65476);
|
||||||
|
define('K_F8', 65477);
|
||||||
|
define('K_F9', 65478);
|
||||||
|
define('K_F10', 65479);
|
||||||
|
define('K_F11', 65480);
|
||||||
|
define('K_F12', 65481);
|
||||||
|
define('K_F13', 65482);
|
||||||
|
define('K_F14', 65483);
|
||||||
|
define('K_F15', 65484);
|
||||||
|
define('K_F16', 65485);
|
||||||
|
define('K_F17', 65486);
|
||||||
|
define('K_F18', 65487);
|
||||||
|
define('K_F19', 65488);
|
||||||
|
define('K_F20', 65489);
|
||||||
|
define('K_LSHIFT', 65505);
|
||||||
|
define('K_RSHIFT', 65506);
|
||||||
|
define('K_LCTRL', 65507);
|
||||||
|
define('K_RCTRL', 65508);
|
||||||
|
define('K_LALT', 65513);
|
||||||
|
define('K_RALT', 65514);
|
||||||
|
define('K_NUM', 65407);
|
||||||
|
define('K_SCROLL', 65300);
|
||||||
|
define('K_CAPS', 65509);
|
||||||
|
define('K_CLEAR', 65490);
|
||||||
|
define('K_HELP', 65491);
|
||||||
|
define('K_ccedilla', 231);
|
||||||
|
define('K_Ccedilla', 199);
|
||||||
|
define('K_acute', 180);
|
||||||
|
define('K_diaeresis', 168);
|
||||||
|
define('IUP_RUN', 'RUN');
|
||||||
|
define('IUP_ENGLISH', 'ENGLISH');
|
||||||
|
define('IUP_PORTUGUESE', 'PORTUGUESE');
|
||||||
|
define('IUP_SBH', 'SBH');
|
||||||
|
define('IUP_SBV', 'SBV');
|
||||||
|
define('IUP_IDLE_ACTION', 'IDLE_ACTION');
|
||||||
|
define('IUP_ACTION', 'ACTION');
|
||||||
|
define('IUP_GETFOCUS_CB', 'GETFOCUS_CB');
|
||||||
|
define('IUP_KILLFOCUS_CB', 'KILLFOCUS_CB');
|
||||||
|
define('IUP_K_ANY', 'K_ANY');
|
||||||
|
define('IUP_KEYPRESS_CB', 'KEYPRESS_CB');
|
||||||
|
define('IUP_HELP_CB', 'HELP_CB');
|
||||||
|
define('IUP_SCROLL_CB', 'SCROLL_CB');
|
||||||
|
define('IUP_RESIZE_CB', 'RESIZE_CB');
|
||||||
|
define('IUP_MOTION_CB', 'MOTION_CB');
|
||||||
|
define('IUP_BUTTON_CB', 'BUTTON_CB');
|
||||||
|
define('IUP_ENTERWINDOW_CB', 'ENTERWINDOW_CB');
|
||||||
|
define('IUP_LEAVEWINDOW_CB', 'LEAVEWINDOW_CB');
|
||||||
|
define('IUP_WHEEL_CB', 'WHEEL_CB');
|
||||||
|
define('IUP_MASK_CB', 'MASK_CB');
|
||||||
|
define('IUP_OPEN_CB', 'OPEN_CB');
|
||||||
|
define('IUP_HIGHLIGHT_CB', 'HIGHLIGHT_CB');
|
||||||
|
define('IUP_MENUCLOSE_CB', 'MENUCLOSE_CB');
|
||||||
|
define('IUP_MAP_CB', 'MAP_CB');
|
||||||
|
define('IUP_CLOSE_CB', 'CLOSE_CB');
|
||||||
|
define('IUP_SHOW_CB', 'SHOW_CB');
|
||||||
|
define('IUP_DROPFILES_CB', 'DROPFILES_CB');
|
||||||
|
define('IUP_WOM_CB', 'WOM_CB');
|
||||||
|
define('IUP_DIRECTION', 'DIRECTION');
|
||||||
|
define('IUP_ACTIVE', 'ACTIVE');
|
||||||
|
define('IUP_BGCOLOR', 'BGCOLOR');
|
||||||
|
define('IUP_FRAMECOLOR', 'FRAMECOLOR');
|
||||||
|
define('IUP_FGCOLOR', 'FGCOLOR');
|
||||||
|
define('IUP_COLOR', 'COLOR');
|
||||||
|
define('IUP_WID', 'WID');
|
||||||
|
define('IUP_SIZE', 'SIZE');
|
||||||
|
define('IUP_RASTERSIZE', 'RASTERSIZE');
|
||||||
|
define('IUP_TITLE', 'TITLE');
|
||||||
|
define('IUP_VALUE', 'VALUE');
|
||||||
|
define('IUP_VISIBLE', 'VISIBLE');
|
||||||
|
define('IUP_FONT', 'FONT');
|
||||||
|
define('IUP_TIP', 'TIP');
|
||||||
|
define('IUP_EXPAND', 'EXPAND');
|
||||||
|
define('IUP_SEPARATOR', 'SEPARATOR');
|
||||||
|
define('IUP_HOTSPOT', 'HOTSPOT');
|
||||||
|
define('IUP_HEIGHT', 'HEIGHT');
|
||||||
|
define('IUP_WIDTH', 'WIDTH');
|
||||||
|
define('IUP_KEY', 'KEY');
|
||||||
|
define('IUP_MULTIPLE', 'MULTIPLE');
|
||||||
|
define('IUP_DROPDOWN', 'DROPDOWN');
|
||||||
|
define('IUP_VISIBLE_ITEMS', 'VISIBLE_ITEMS');
|
||||||
|
define('IUP_MARGIN', 'MARGIN');
|
||||||
|
define('IUP_GAP', 'GAP');
|
||||||
|
define('IUP_ALIGNMENT', 'ALIGNMENT');
|
||||||
|
define('IUP_IMAGE', 'IMAGE');
|
||||||
|
define('IUP_IMINACTIVE', 'IMINACTIVE');
|
||||||
|
define('IUP_IMPRESS', 'IMPRESS');
|
||||||
|
define('IUP_WIN_SAVEBITS', 'WIN_SAVEBITS');
|
||||||
|
define('IUP_NC', 'NC');
|
||||||
|
define('IUP_MASK', 'MASK');
|
||||||
|
define('IUP_APPEND', 'APPEND');
|
||||||
|
define('IUP_BORDER', 'BORDER');
|
||||||
|
define('IUP_CARET', 'CARET');
|
||||||
|
define('IUP_SELECTION', 'SELECTION');
|
||||||
|
define('IUP_SELECTEDTEXT', 'SELECTEDTEXT');
|
||||||
|
define('IUP_INSERT', 'INSERT');
|
||||||
|
define('IUP_CONID', 'CONID');
|
||||||
|
define('IUP_CURSOR', 'CURSOR');
|
||||||
|
define('IUP_ICON', 'ICON');
|
||||||
|
define('IUP_MENUBOX', 'MENUBOX');
|
||||||
|
define('IUP_MINBOX', 'MINBOX');
|
||||||
|
define('IUP_MAXBOX', 'MAXBOX');
|
||||||
|
define('IUP_RESIZE', 'RESIZE');
|
||||||
|
define('IUP_MENU', 'MENU');
|
||||||
|
define('IUP_STARTFOCUS', 'STARTFOCUS');
|
||||||
|
define('IUP_PARENTDIALOG', 'PARENTDIALOG');
|
||||||
|
define('IUP_SHRINK', 'SHRINK');
|
||||||
|
define('IUP_DEFAULTENTER', 'DEFAULTENTER');
|
||||||
|
define('IUP_DEFAULTESC', 'DEFAULTESC');
|
||||||
|
define('IUP_X', 'X');
|
||||||
|
define('IUP_Y', 'Y');
|
||||||
|
define('IUP_TOOLBOX', 'TOOLBOX');
|
||||||
|
define('IUP_CONTROL', 'CONTROL');
|
||||||
|
define('IUP_READONLY', 'READONLY');
|
||||||
|
define('IUP_SCROLLBAR', 'SCROLLBAR');
|
||||||
|
define('IUP_POSY', 'POSY');
|
||||||
|
define('IUP_POSX', 'POSX');
|
||||||
|
define('IUP_DX', 'DX');
|
||||||
|
define('IUP_DY', 'DY');
|
||||||
|
define('IUP_XMAX', 'XMAX');
|
||||||
|
define('IUP_XMIN', 'XMIN');
|
||||||
|
define('IUP_YMAX', 'YMAX');
|
||||||
|
define('IUP_YMIN', 'YMIN');
|
||||||
|
define('IUP_RED', '255 0 0');
|
||||||
|
define('IUP_GREEN', '0 255 0');
|
||||||
|
define('IUP_BLUE', '0 0 255');
|
||||||
|
define('IUP_MIN', 'MIN');
|
||||||
|
define('IUP_MAX', 'MAX');
|
||||||
|
define('IUP_TIME', 'TIME');
|
||||||
|
define('IUP_DRAG', 'DRAG');
|
||||||
|
define('IUP_DROP', 'DROP');
|
||||||
|
define('IUP_REPAINT', 'REPAINT');
|
||||||
|
define('IUP_TOPMOST', 'TOPMOST');
|
||||||
|
define('IUP_CLIPCHILDREN', 'CLIPCHILDREN');
|
||||||
|
define('IUP_DIALOGTYPE', 'DIALOGTYPE');
|
||||||
|
define('IUP_FILE', 'FILE');
|
||||||
|
define('IUP_MULTIPLEFILES', 'MULTIPLEFILES');
|
||||||
|
define('IUP_FILTER', 'FILTER');
|
||||||
|
define('IUP_FILTERUSED', 'FILTERUSED');
|
||||||
|
define('IUP_FILTERINFO', 'FILTERINFO');
|
||||||
|
define('IUP_EXTFILTER', 'EXTFILTER');
|
||||||
|
define('IUP_DIRECTORY', 'DIRECTORY');
|
||||||
|
define('IUP_ALLOWNEW', 'ALLOWNEW');
|
||||||
|
define('IUP_NOOVERWRITEPROMPT', 'NOOVERWRITEPROMPT');
|
||||||
|
define('IUP_NOCHANGEDIR', 'NOCHANGEDIR');
|
||||||
|
define('IUP_FILEEXIST', 'FILEEXIST');
|
||||||
|
define('IUP_STATUS', 'STATUS');
|
||||||
|
define('IUP_LOCKLOOP', 'LOCKLOOP');
|
||||||
|
define('IUP_SYSTEM', 'SYSTEM');
|
||||||
|
define('IUP_DRIVER', 'DRIVER');
|
||||||
|
define('IUP_SCREENSIZE', 'SCREENSIZE');
|
||||||
|
define('IUP_SYSTEMLANGUAGE', 'SYSTEMLANGUAGE');
|
||||||
|
define('IUP_COMPUTERNAME', 'COMPUTERNAME');
|
||||||
|
define('IUP_USERNAME', 'USERNAME');
|
||||||
|
define('IUP_OPEN', 'OPEN');
|
||||||
|
define('IUP_SAVE', 'SAVE');
|
||||||
|
define('IUP_DIR', 'DIR');
|
||||||
|
define('IUP_HORIZONTAL', 'HORIZONTAL');
|
||||||
|
define('IUP_VERTICAL', 'VERTICAL');
|
||||||
|
define('IUP_YES', 'YES');
|
||||||
|
define('IUP_NO', 'NO');
|
||||||
|
define('IUP_ON', 'ON');
|
||||||
|
define('IUP_OFF', 'OFF');
|
||||||
|
define('IUP_ACENTER', 'ACENTER');
|
||||||
|
define('IUP_ALEFT', 'ALEFT');
|
||||||
|
define('IUP_ARIGHT', 'ARIGHT');
|
||||||
|
define('IUP_ATOP', 'ATOP');
|
||||||
|
define('IUP_ABOTTOM', 'ABOTTOM');
|
||||||
|
define('IUP_NORTH', 'NORTH');
|
||||||
|
define('IUP_SOUTH', 'SOUTH');
|
||||||
|
define('IUP_WEST', 'WEST');
|
||||||
|
define('IUP_EAST', 'EAST');
|
||||||
|
define('IUP_NE', 'NE');
|
||||||
|
define('IUP_SE', 'SE');
|
||||||
|
define('IUP_NW', 'NW');
|
||||||
|
define('IUP_SW', 'SW');
|
||||||
|
define('IUP_FULLSCREEN', 'FULLSCREEN');
|
||||||
|
define('IUP_FULL', 'FULL');
|
||||||
|
define('IUP_HALF', 'HALF');
|
||||||
|
define('IUP_THIRD', 'THIRD');
|
||||||
|
define('IUP_QUARTER', 'QUARTER');
|
||||||
|
define('IUP_EIGHTH', 'EIGHTH');
|
||||||
|
define('IUP_ARROW', 'ARROW');
|
||||||
|
define('IUP_BUSY', 'BUSY');
|
||||||
|
define('IUP_RESIZE_N', 'RESIZE_N');
|
||||||
|
define('IUP_RESIZE_S', 'RESIZE_S');
|
||||||
|
define('IUP_RESIZE_E', 'RESIZE_E');
|
||||||
|
define('IUP_RESIZE_W', 'RESIZE_W');
|
||||||
|
define('IUP_RESIZE_NE', 'RESIZE_NE');
|
||||||
|
define('IUP_RESIZE_NW', 'RESIZE_NW');
|
||||||
|
define('IUP_RESIZE_SE', 'RESIZE_SE');
|
||||||
|
define('IUP_RESIZE_SW', 'RESIZE_SW');
|
||||||
|
define('IUP_MOVE', 'MOVE');
|
||||||
|
define('IUP_HAND', 'HAND');
|
||||||
|
define('IUP_NONE', 'NONE');
|
||||||
|
define('IUP_IUP', 'IUP');
|
||||||
|
define('IUP_CROSS', 'CROSS');
|
||||||
|
define('IUP_PEN', 'PEN');
|
||||||
|
define('IUP_TEXT', 'TEXT');
|
||||||
|
define('IUP_RESIZE_C', 'RESIZE_C');
|
||||||
|
define('IUP_OPENHAND', 'OPENHAND');
|
||||||
|
define('IUP_K_exclam', 'K_exclam');
|
||||||
|
define('IUP_K_quotedbl', 'K_quotedbl');
|
||||||
|
define('IUP_K_numbersign', 'K_numbersign');
|
||||||
|
define('IUP_K_dollar', 'K_dollar');
|
||||||
|
define('IUP_K_percent', 'K_percent');
|
||||||
|
define('IUP_K_ampersand', 'K_ampersand');
|
||||||
|
define('IUP_K_quoteright', 'K_quoteright');
|
||||||
|
define('IUP_K_parentleft', 'K_parentleft');
|
||||||
|
define('IUP_K_parentright', 'K_parentright');
|
||||||
|
define('IUP_K_asterisk', 'K_asterisk');
|
||||||
|
define('IUP_K_plus', 'K_plus');
|
||||||
|
define('IUP_K_comma', 'K_comma');
|
||||||
|
define('IUP_K_minus', 'K_minus');
|
||||||
|
define('IUP_K_period', 'K_period');
|
||||||
|
define('IUP_K_slash', 'K_slash');
|
||||||
|
define('IUP_K_0', 'K_0');
|
||||||
|
define('IUP_K_1', 'K_1');
|
||||||
|
define('IUP_K_2', 'K_2');
|
||||||
|
define('IUP_K_3', 'K_3');
|
||||||
|
define('IUP_K_4', 'K_4');
|
||||||
|
define('IUP_K_5', 'K_5');
|
||||||
|
define('IUP_K_6', 'K_6');
|
||||||
|
define('IUP_K_7', 'K_7');
|
||||||
|
define('IUP_K_8', 'K_8');
|
||||||
|
define('IUP_K_9', 'K_9');
|
||||||
|
define('IUP_K_colon', 'K_colon');
|
||||||
|
define('IUP_K_semicolon', 'K_semicolon ');
|
||||||
|
define('IUP_K_less', 'K_less');
|
||||||
|
define('IUP_K_equal', 'K_equal');
|
||||||
|
define('IUP_K_greater', 'K_greater');
|
||||||
|
define('IUP_K_question', 'K_question');
|
||||||
|
define('IUP_K_at', 'K_at');
|
||||||
|
define('IUP_K_A', 'K_A');
|
||||||
|
define('IUP_K_B', 'K_B');
|
||||||
|
define('IUP_K_C', 'K_C');
|
||||||
|
define('IUP_K_D', 'K_D');
|
||||||
|
define('IUP_K_E', 'K_E');
|
||||||
|
define('IUP_K_F', 'K_F');
|
||||||
|
define('IUP_K_G', 'K_G');
|
||||||
5
src/globals/ext-tests/parallel.php
Normal file
5
src/globals/ext-tests/parallel.php
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
assert(class_exists('\parallel\Runtime'));
|
||||||
128
src/globals/extra/libcares_dnsinfo.h
Normal file
128
src/globals/extra/libcares_dnsinfo.h
Normal file
@@ -0,0 +1,128 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2004-2006, 2008, 2009, 2011-2013, 2015-2018 Apple Inc. All rights reserved.
|
||||||
|
*
|
||||||
|
* @APPLE_LICENSE_HEADER_START@
|
||||||
|
*
|
||||||
|
* This file contains Original Code and/or Modifications of Original Code
|
||||||
|
* as defined in and that are subject to the Apple Public Source License
|
||||||
|
* Version 2.0 (the 'License'). You may not use this file except in
|
||||||
|
* compliance with the License. Please obtain a copy of the License at
|
||||||
|
* http://www.opensource.apple.com/apsl/ and read it before using this
|
||||||
|
* file.
|
||||||
|
*
|
||||||
|
* The Original Code and all software distributed under the License are
|
||||||
|
* distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
|
||||||
|
* EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
|
||||||
|
* INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
|
||||||
|
* Please see the License for the specific language governing rights and
|
||||||
|
* limitations under the License.
|
||||||
|
*
|
||||||
|
* @APPLE_LICENSE_HEADER_END@
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __DNSINFO_H__
|
||||||
|
#define __DNSINFO_H__
|
||||||
|
|
||||||
|
/*
|
||||||
|
* These routines provide access to the systems DNS configuration
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <os/availability.h>
|
||||||
|
#include <sys/cdefs.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/socket.h>
|
||||||
|
#include <netinet/in.h>
|
||||||
|
|
||||||
|
#define DNSINFO_VERSION 20170629
|
||||||
|
|
||||||
|
#define DEFAULT_SEARCH_ORDER 200000 /* search order for the "default" resolver domain name */
|
||||||
|
|
||||||
|
#define DNS_PTR(type, name) \
|
||||||
|
union { \
|
||||||
|
type name; \
|
||||||
|
uint64_t _ ## name ## _p; \
|
||||||
|
}
|
||||||
|
|
||||||
|
#define DNS_VAR(type, name) \
|
||||||
|
type name
|
||||||
|
|
||||||
|
|
||||||
|
#pragma pack(4)
|
||||||
|
typedef struct {
|
||||||
|
struct in_addr address;
|
||||||
|
struct in_addr mask;
|
||||||
|
} dns_sortaddr_t;
|
||||||
|
#pragma pack()
|
||||||
|
|
||||||
|
|
||||||
|
#pragma pack(4)
|
||||||
|
typedef struct {
|
||||||
|
DNS_PTR(char *, domain); /* domain */
|
||||||
|
DNS_VAR(int32_t, n_nameserver); /* # nameserver */
|
||||||
|
DNS_PTR(struct sockaddr **, nameserver);
|
||||||
|
DNS_VAR(uint16_t, port); /* port (in host byte order) */
|
||||||
|
DNS_VAR(int32_t, n_search); /* # search */
|
||||||
|
DNS_PTR(char **, search);
|
||||||
|
DNS_VAR(int32_t, n_sortaddr); /* # sortaddr */
|
||||||
|
DNS_PTR(dns_sortaddr_t **, sortaddr);
|
||||||
|
DNS_PTR(char *, options); /* options */
|
||||||
|
DNS_VAR(uint32_t, timeout); /* timeout */
|
||||||
|
DNS_VAR(uint32_t, search_order); /* search_order */
|
||||||
|
DNS_VAR(uint32_t, if_index);
|
||||||
|
DNS_VAR(uint32_t, flags);
|
||||||
|
DNS_VAR(uint32_t, reach_flags); /* SCNetworkReachabilityFlags */
|
||||||
|
DNS_VAR(uint32_t, service_identifier);
|
||||||
|
DNS_PTR(char *, cid); /* configuration identifer */
|
||||||
|
DNS_PTR(char *, if_name); /* if_index interface name */
|
||||||
|
} dns_resolver_t;
|
||||||
|
#pragma pack()
|
||||||
|
|
||||||
|
|
||||||
|
#define DNS_RESOLVER_FLAGS_REQUEST_A_RECORDS 0x0002 /* always requesting for A dns records in queries */
|
||||||
|
#define DNS_RESOLVER_FLAGS_REQUEST_AAAA_RECORDS 0x0004 /* always requesting for AAAA dns records in queries */
|
||||||
|
|
||||||
|
#define DNS_RESOLVER_FLAGS_REQUEST_ALL_RECORDS \
|
||||||
|
(DNS_RESOLVER_FLAGS_REQUEST_A_RECORDS | DNS_RESOLVER_FLAGS_REQUEST_AAAA_RECORDS)
|
||||||
|
|
||||||
|
#define DNS_RESOLVER_FLAGS_SCOPED 0x1000 /* configuration is for scoped questions */
|
||||||
|
#define DNS_RESOLVER_FLAGS_SERVICE_SPECIFIC 0x2000 /* configuration is service-specific */
|
||||||
|
#define DNS_RESOLVER_FLAGS_SUPPLEMENTAL 0x4000 /* supplemental match configuration */
|
||||||
|
|
||||||
|
|
||||||
|
#pragma pack(4)
|
||||||
|
typedef struct {
|
||||||
|
DNS_VAR(int32_t, n_resolver); /* resolver configurations */
|
||||||
|
DNS_PTR(dns_resolver_t **, resolver);
|
||||||
|
DNS_VAR(int32_t, n_scoped_resolver); /* "scoped" resolver configurations */
|
||||||
|
DNS_PTR(dns_resolver_t **, scoped_resolver);
|
||||||
|
DNS_VAR(uint64_t, generation);
|
||||||
|
DNS_VAR(int32_t, n_service_specific_resolver);
|
||||||
|
DNS_PTR(dns_resolver_t **, service_specific_resolver);
|
||||||
|
DNS_VAR(uint32_t, version);
|
||||||
|
} dns_config_t;
|
||||||
|
#pragma pack()
|
||||||
|
|
||||||
|
|
||||||
|
__BEGIN_DECLS
|
||||||
|
|
||||||
|
/*
|
||||||
|
* DNS configuration access APIs
|
||||||
|
*/
|
||||||
|
const char *
|
||||||
|
dns_configuration_notify_key (void) API_AVAILABLE(macos(10.4), ios(2.0));
|
||||||
|
|
||||||
|
dns_config_t *
|
||||||
|
dns_configuration_copy (void) API_AVAILABLE(macos(10.4), ios(2.0));
|
||||||
|
|
||||||
|
void
|
||||||
|
dns_configuration_free (dns_config_t *config) API_AVAILABLE(macos(10.4), ios(2.0));
|
||||||
|
|
||||||
|
void
|
||||||
|
_dns_configuration_ack (dns_config_t *config,
|
||||||
|
const char *bundle_id) API_AVAILABLE(macos(10.8), ios(6.0));
|
||||||
|
|
||||||
|
__END_DECLS
|
||||||
|
|
||||||
|
#endif /* __DNSINFO_H__ */
|
||||||
@@ -47,6 +47,13 @@ function arch2gnu(string $arch): string
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Match pattern function
|
||||||
|
* Example: match_pattern('*.txt', 'test.txt') will return true.
|
||||||
|
*
|
||||||
|
* @param string $pattern Pattern string
|
||||||
|
* @param string $subject Subject string
|
||||||
|
*/
|
||||||
function match_pattern(string $pattern, string $subject): bool
|
function match_pattern(string $pattern, string $subject): bool
|
||||||
{
|
{
|
||||||
$pattern = str_replace(['\*', '\\\\.*'], ['.*', '\*'], preg_quote($pattern, '/'));
|
$pattern = str_replace(['\*', '\\\\.*'], ['.*', '\*'], preg_quote($pattern, '/'));
|
||||||
@@ -54,6 +61,12 @@ function match_pattern(string $pattern, string $subject): bool
|
|||||||
return preg_match($pattern, $subject) === 1;
|
return preg_match($pattern, $subject) === 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Quote a string with a quote character
|
||||||
|
*
|
||||||
|
* @param string $str String to quote
|
||||||
|
* @param string $quote Quote character, default: `"`
|
||||||
|
*/
|
||||||
function quote(string $str, string $quote = '"'): string
|
function quote(string $str, string $quote = '"'): string
|
||||||
{
|
{
|
||||||
return $quote . $str . $quote;
|
return $quote . $str . $quote;
|
||||||
@@ -61,7 +74,6 @@ function quote(string $str, string $quote = '"'): string
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Get Family name of current OS
|
* Get Family name of current OS
|
||||||
*
|
|
||||||
* @throws WrongUsageException
|
* @throws WrongUsageException
|
||||||
*/
|
*/
|
||||||
function osfamily2dir(): string
|
function osfamily2dir(): string
|
||||||
@@ -76,6 +88,41 @@ function osfamily2dir(): string
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function shell(?bool $debug = null): UnixShell
|
||||||
|
{
|
||||||
|
/* @noinspection PhpUnhandledExceptionInspection */
|
||||||
|
return new UnixShell($debug);
|
||||||
|
}
|
||||||
|
|
||||||
|
function cmd(?bool $debug = null): WindowsCmd
|
||||||
|
{
|
||||||
|
/* @noinspection PhpUnhandledExceptionInspection */
|
||||||
|
return new WindowsCmd($debug);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get current builder.
|
||||||
|
*
|
||||||
|
* @throws WrongUsageException
|
||||||
|
*/
|
||||||
|
function builder(): BuilderBase
|
||||||
|
{
|
||||||
|
return BuilderProvider::getBuilder();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get current patch point.
|
||||||
|
*
|
||||||
|
* @throws WrongUsageException
|
||||||
|
*/
|
||||||
|
function patch_point(): string
|
||||||
|
{
|
||||||
|
return BuilderProvider::getBuilder()->getPatchPoint();
|
||||||
|
}
|
||||||
|
|
||||||
|
// ------- function f_* part -------
|
||||||
|
// f_ means standard function wrapper
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Execute the shell command, and the output will be directly printed in the terminal. If there is an error, an exception will be thrown
|
* Execute the shell command, and the output will be directly printed in the terminal. If there is an error, an exception will be thrown
|
||||||
*
|
*
|
||||||
@@ -126,33 +173,3 @@ function f_putenv(string $env): bool
|
|||||||
logger()->debug('Setting env: ' . $env);
|
logger()->debug('Setting env: ' . $env);
|
||||||
return putenv($env);
|
return putenv($env);
|
||||||
}
|
}
|
||||||
|
|
||||||
function shell(?bool $debug = null): UnixShell
|
|
||||||
{
|
|
||||||
return new UnixShell($debug);
|
|
||||||
}
|
|
||||||
|
|
||||||
function cmd(?bool $debug = null): WindowsCmd
|
|
||||||
{
|
|
||||||
return new WindowsCmd($debug);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get current builder.
|
|
||||||
*
|
|
||||||
* @throws WrongUsageException
|
|
||||||
*/
|
|
||||||
function builder(): BuilderBase
|
|
||||||
{
|
|
||||||
return BuilderProvider::getBuilder();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get current patch point.
|
|
||||||
*
|
|
||||||
* @throws WrongUsageException
|
|
||||||
*/
|
|
||||||
function patch_point(): string
|
|
||||||
{
|
|
||||||
return BuilderProvider::getBuilder()->getPatchPoint();
|
|
||||||
}
|
|
||||||
|
|||||||
89
src/globals/patch/spc_fix_libxml2_12_php80.patch
Normal file
89
src/globals/patch/spc_fix_libxml2_12_php80.patch
Normal file
@@ -0,0 +1,89 @@
|
|||||||
|
diff --git a/ext/dom/document.c b/ext/dom/document.c
|
||||||
|
index 02522b50..6d1b0740 100644
|
||||||
|
--- a/ext/dom/document.c
|
||||||
|
+++ b/ext/dom/document.c
|
||||||
|
@@ -23,6 +23,7 @@
|
||||||
|
#if defined(HAVE_LIBXML) && defined(HAVE_DOM)
|
||||||
|
#include "php_dom.h"
|
||||||
|
#include <libxml/SAX.h>
|
||||||
|
+#include <libxml/xmlsave.h>
|
||||||
|
#ifdef LIBXML_SCHEMAS_ENABLED
|
||||||
|
#include <libxml/relaxng.h>
|
||||||
|
#include <libxml/xmlschemas.h>
|
||||||
|
diff --git a/ext/libxml/libxml.c b/ext/libxml/libxml.c
|
||||||
|
index 73486ae2..59bd3d20 100644
|
||||||
|
--- a/ext/libxml/libxml.c
|
||||||
|
+++ b/ext/libxml/libxml.c
|
||||||
|
@@ -382,7 +382,7 @@ php_libxml_input_buffer_create_filename(const char *URI, xmlCharEncoding enc)
|
||||||
|
|
||||||
|
if (encoding) {
|
||||||
|
char *end;
|
||||||
|
-
|
||||||
|
+
|
||||||
|
encoding += sizeof("charset=")-1;
|
||||||
|
if (*encoding == '"') {
|
||||||
|
encoding++;
|
||||||
|
@@ -481,7 +481,11 @@ static void _php_libxml_free_error(void *ptr)
|
||||||
|
xmlResetError((xmlErrorPtr) ptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
-static void _php_list_set_error_structure(xmlErrorPtr error, const char *msg)
|
||||||
|
+#if LIBXML_VERSION >= 21200
|
||||||
|
+static void _php_list_set_error_structure(const xmlError *error, const char *msg)
|
||||||
|
+#else
|
||||||
|
+static void _php_list_set_error_structure(xmlError *error, const char *msg)
|
||||||
|
+#endif
|
||||||
|
{
|
||||||
|
xmlError error_copy;
|
||||||
|
int ret;
|
||||||
|
@@ -732,7 +736,11 @@ PHP_LIBXML_API void php_libxml_ctx_warning(void *ctx, const char *msg, ...)
|
||||||
|
va_end(args);
|
||||||
|
}
|
||||||
|
|
||||||
|
+#if LIBXML_VERSION >= 21200
|
||||||
|
+PHP_LIBXML_API void php_libxml_structured_error_handler(void *userData, const xmlError *error)
|
||||||
|
+#else
|
||||||
|
PHP_LIBXML_API void php_libxml_structured_error_handler(void *userData, xmlErrorPtr error)
|
||||||
|
+#endif
|
||||||
|
{
|
||||||
|
_php_list_set_error_structure(error, NULL);
|
||||||
|
|
||||||
|
@@ -1035,11 +1043,9 @@ PHP_FUNCTION(libxml_use_internal_errors)
|
||||||
|
/* {{{ Retrieve last error from libxml */
|
||||||
|
PHP_FUNCTION(libxml_get_last_error)
|
||||||
|
{
|
||||||
|
- xmlErrorPtr error;
|
||||||
|
-
|
||||||
|
ZEND_PARSE_PARAMETERS_NONE();
|
||||||
|
|
||||||
|
- error = xmlGetLastError();
|
||||||
|
+ const xmlError *error = xmlGetLastError();
|
||||||
|
|
||||||
|
if (error) {
|
||||||
|
object_init_ex(return_value, libxmlerror_class_entry);
|
||||||
|
diff --git a/ext/libxml/php_libxml.h b/ext/libxml/php_libxml.h
|
||||||
|
index d0ce7cec..02717417 100644
|
||||||
|
--- a/ext/libxml/php_libxml.h
|
||||||
|
+++ b/ext/libxml/php_libxml.h
|
||||||
|
@@ -35,6 +35,7 @@ extern zend_module_entry libxml_module_entry;
|
||||||
|
|
||||||
|
#include "zend_smart_str.h"
|
||||||
|
#include <libxml/tree.h>
|
||||||
|
+#include <libxml/parser.h>
|
||||||
|
|
||||||
|
#define LIBXML_SAVE_NOEMPTYTAG 1<<2
|
||||||
|
|
||||||
|
diff --git a/ext/soap/php_sdl.c b/ext/soap/php_sdl.c
|
||||||
|
index e5e7f2f9..00b58b87 100644
|
||||||
|
--- a/ext/soap/php_sdl.c
|
||||||
|
+++ b/ext/soap/php_sdl.c
|
||||||
|
@@ -331,8 +331,7 @@ static void load_wsdl_ex(zval *this_ptr, char *struri, sdlCtx *ctx, int include)
|
||||||
|
sdl_restore_uri_credentials(ctx);
|
||||||
|
|
||||||
|
if (!wsdl) {
|
||||||
|
- xmlErrorPtr xmlErrorPtr = xmlGetLastError();
|
||||||
|
-
|
||||||
|
+ const xmlError *xmlErrorPtr = xmlGetLastError();
|
||||||
|
if (xmlErrorPtr) {
|
||||||
|
soap_error2(E_ERROR, "Parsing WSDL: Couldn't load from '%s' : %s", struri, xmlErrorPtr->message);
|
||||||
|
} else {
|
||||||
55
src/globals/patch/spc_fix_libxml2_12_php81.patch
Normal file
55
src/globals/patch/spc_fix_libxml2_12_php81.patch
Normal file
@@ -0,0 +1,55 @@
|
|||||||
|
diff --git a/ext/libxml/libxml.c b/ext/libxml/libxml.c
|
||||||
|
index 3959b362..6cdfbd39 100644
|
||||||
|
--- a/ext/libxml/libxml.c
|
||||||
|
+++ b/ext/libxml/libxml.c
|
||||||
|
@@ -483,7 +483,11 @@ static void _php_libxml_free_error(void *ptr)
|
||||||
|
xmlResetError((xmlErrorPtr) ptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
-static void _php_list_set_error_structure(xmlErrorPtr error, const char *msg)
|
||||||
|
+#if LIBXML_VERSION >= 21200
|
||||||
|
+static void _php_list_set_error_structure(const xmlError *error, const char *msg)
|
||||||
|
+#else
|
||||||
|
+static void _php_list_set_error_structure(xmlError *error, const char *msg)
|
||||||
|
+#endif
|
||||||
|
{
|
||||||
|
xmlError error_copy;
|
||||||
|
int ret;
|
||||||
|
@@ -736,7 +740,11 @@ PHP_LIBXML_API void php_libxml_ctx_warning(void *ctx, const char *msg, ...)
|
||||||
|
va_end(args);
|
||||||
|
}
|
||||||
|
|
||||||
|
+#if LIBXML_VERSION >= 21200
|
||||||
|
+PHP_LIBXML_API void php_libxml_structured_error_handler(void *userData, const xmlError *error)
|
||||||
|
+#else
|
||||||
|
PHP_LIBXML_API void php_libxml_structured_error_handler(void *userData, xmlErrorPtr error)
|
||||||
|
+#endif
|
||||||
|
{
|
||||||
|
_php_list_set_error_structure(error, NULL);
|
||||||
|
|
||||||
|
@@ -1009,11 +1017,9 @@ PHP_FUNCTION(libxml_use_internal_errors)
|
||||||
|
/* {{{ Retrieve last error from libxml */
|
||||||
|
PHP_FUNCTION(libxml_get_last_error)
|
||||||
|
{
|
||||||
|
- xmlErrorPtr error;
|
||||||
|
-
|
||||||
|
ZEND_PARSE_PARAMETERS_NONE();
|
||||||
|
|
||||||
|
- error = xmlGetLastError();
|
||||||
|
+ const xmlError *error = xmlGetLastError();
|
||||||
|
|
||||||
|
if (error) {
|
||||||
|
object_init_ex(return_value, libxmlerror_class_entry);
|
||||||
|
diff --git a/ext/soap/php_sdl.c b/ext/soap/php_sdl.c
|
||||||
|
index 651eab23..7a7ce304 100644
|
||||||
|
--- a/ext/soap/php_sdl.c
|
||||||
|
+++ b/ext/soap/php_sdl.c
|
||||||
|
@@ -332,7 +332,7 @@ static void load_wsdl_ex(zval *this_ptr, char *struri, sdlCtx *ctx, int include)
|
||||||
|
sdl_restore_uri_credentials(ctx);
|
||||||
|
|
||||||
|
if (!wsdl) {
|
||||||
|
- xmlErrorPtr xmlErrorPtr = xmlGetLastError();
|
||||||
|
+ const xmlError *xmlErrorPtr = xmlGetLastError();
|
||||||
|
|
||||||
|
if (xmlErrorPtr) {
|
||||||
|
soap_error2(E_ERROR, "Parsing WSDL: Couldn't load from '%s' : %s", struri, xmlErrorPtr->message);
|
||||||
@@ -11,10 +11,16 @@ declare(strict_types=1);
|
|||||||
|
|
||||||
// --------------------------------- edit area ---------------------------------
|
// --------------------------------- edit area ---------------------------------
|
||||||
|
|
||||||
|
$zts = false;
|
||||||
|
|
||||||
|
$no_strip = false;
|
||||||
|
|
||||||
|
$upx = true;
|
||||||
|
|
||||||
// If you want to test your added extensions and libs, add below (comma separated, example `bcmath,openssl`).
|
// If you want to test your added extensions and libs, add below (comma separated, example `bcmath,openssl`).
|
||||||
$extensions = match (PHP_OS_FAMILY) {
|
$extensions = match (PHP_OS_FAMILY) {
|
||||||
'Linux', 'Darwin' => 'readline,pgsql,xml,dom,mbstring,mbregex,pdo_pgsql',
|
'Linux', 'Darwin' => 'libxml,swoole',
|
||||||
'Windows' => 'mbstring,pdo_sqlite,mbregex',
|
'Windows' => 'mbstring,pdo_sqlite,mbregex,libxml',
|
||||||
};
|
};
|
||||||
|
|
||||||
// If you want to test lib-suggests feature with extension, add them below (comma separated, example `libwebp,libavif`).
|
// If you want to test lib-suggests feature with extension, add them below (comma separated, example `libwebp,libavif`).
|
||||||
@@ -27,7 +33,7 @@ $with_libs = match (PHP_OS_FAMILY) {
|
|||||||
// You can use `common`, `bulk`, `minimal` or `none`.
|
// You can use `common`, `bulk`, `minimal` or `none`.
|
||||||
// note: combination is only available for *nix platform. Windows must use `none` combination
|
// note: combination is only available for *nix platform. Windows must use `none` combination
|
||||||
$base_combination = match (PHP_OS_FAMILY) {
|
$base_combination = match (PHP_OS_FAMILY) {
|
||||||
'Linux', 'Darwin' => 'none',
|
'Linux', 'Darwin' => 'minimal',
|
||||||
'Windows' => 'none',
|
'Windows' => 'none',
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -71,5 +77,8 @@ echo match ($argv[1]) {
|
|||||||
'libs' => $final_libs,
|
'libs' => $final_libs,
|
||||||
'libs_cmd' => ($final_libs === '' ? '' : (' --with-libs=' . $final_libs)),
|
'libs_cmd' => ($final_libs === '' ? '' : (' --with-libs=' . $final_libs)),
|
||||||
'cmd' => $final_extensions_cmd . ($final_libs === '' ? '' : (' --with-libs=' . $final_libs)),
|
'cmd' => $final_extensions_cmd . ($final_libs === '' ? '' : (' --with-libs=' . $final_libs)),
|
||||||
|
'zts' => $zts ? '--enable-zts' : '',
|
||||||
|
'no_strip' => $no_strip ? '--no-strip' : '',
|
||||||
|
'upx' => $upx ? '--with-upx-pack' : '',
|
||||||
default => '',
|
default => '',
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user