mirror of
https://github.com/crazywhalecc/static-php-cli.git
synced 2026-07-03 23:05:41 +08:00
Compare commits
164 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2a03c32bc0 | ||
|
|
0b8a0504a2 | ||
|
|
e9aff8f1d8 | ||
|
|
93cb7e9fbb | ||
|
|
2d2607cd7f | ||
|
|
d80406b8e0 | ||
|
|
db9645641f | ||
|
|
b3018af61c | ||
|
|
7e6c2b4432 | ||
|
|
1ae1c81f9c | ||
|
|
eff698cbe8 | ||
|
|
036e4f52b7 | ||
|
|
d258417afb | ||
|
|
3057d02e37 | ||
|
|
af8204fbf0 | ||
|
|
968b3acbce | ||
|
|
5d2bd93bd7 | ||
|
|
4ba92b08ca | ||
|
|
11076b1355 | ||
|
|
71770a0a5f | ||
|
|
98d3766fe8 | ||
|
|
1fdb6b439e | ||
|
|
3136d6edc1 | ||
|
|
3e84becf77 | ||
|
|
1632c25223 | ||
|
|
e6c308c242 | ||
|
|
3fcb7ebf03 | ||
|
|
7416b8079b | ||
|
|
bde18054e5 | ||
|
|
954f8f4ddc | ||
|
|
0fee628842 | ||
|
|
69e6d82e83 | ||
|
|
e1e6270d86 | ||
|
|
30af182aff | ||
|
|
3ecc603770 | ||
|
|
15c2935d48 | ||
|
|
7a8e0a7e67 | ||
|
|
d98d6aeffb | ||
|
|
aaa4510f25 | ||
|
|
b14894fab7 | ||
|
|
1a87ce4194 | ||
|
|
6b96feb538 | ||
|
|
21dbb8af46 | ||
|
|
4d227ca7ef | ||
|
|
3a2683bb0c | ||
|
|
bd8f91d466 | ||
|
|
254844b5ec | ||
|
|
4cb1764439 | ||
|
|
847535721c | ||
|
|
e3c542d9df | ||
|
|
b4ed4ea956 | ||
|
|
99aadd3e73 | ||
|
|
c77dc1af6c | ||
|
|
9fd56987ef | ||
|
|
1e494a2213 | ||
|
|
da6d9ffb4b | ||
|
|
d3a001d808 | ||
|
|
d445668d9f | ||
|
|
32f14e16c8 | ||
|
|
46984b6df1 | ||
|
|
96c3e6b935 | ||
|
|
8092f1e481 | ||
|
|
632f904f30 | ||
|
|
8358a985b3 | ||
|
|
e21b5676e7 | ||
|
|
94b3afe6bc | ||
|
|
e4d8e5e4d2 | ||
|
|
88796bc017 | ||
|
|
e23daaa355 | ||
|
|
71017361b5 | ||
|
|
d202de3f50 | ||
|
|
03510073c6 | ||
|
|
8e58592a6e | ||
|
|
96dd5ba87b | ||
|
|
d4c0290195 | ||
|
|
f5d1df5407 | ||
|
|
9664709f21 | ||
|
|
b46655ecfe | ||
|
|
842e0add29 | ||
|
|
254764761d | ||
|
|
5f6c1a0f40 | ||
|
|
d5dcd193cf | ||
|
|
5012da96be | ||
|
|
df0e37cd0f | ||
|
|
4ab7b6bfdc | ||
|
|
f498250001 | ||
|
|
3945ac037b | ||
|
|
b0d8b00fcc | ||
|
|
62b0bf8af0 | ||
|
|
905e080770 | ||
|
|
097ecd3fb0 | ||
|
|
b9359759dd | ||
|
|
50fe366c42 | ||
|
|
9dd89e6b02 | ||
|
|
c03220d1ee | ||
|
|
9db843ab66 | ||
|
|
304973d9bc | ||
|
|
ab386f820c | ||
|
|
4adf1f5e2e | ||
|
|
b4ae87585c | ||
|
|
ae3298472d | ||
|
|
d241cb993e | ||
|
|
8376122634 | ||
|
|
a30e054d7d | ||
|
|
78f4317660 | ||
|
|
3ac3dab6c8 | ||
|
|
1a7e436ee1 | ||
|
|
f11b36ab3c | ||
|
|
e2ef195a84 | ||
|
|
645e2a9fc2 | ||
|
|
d59b8457c6 | ||
|
|
a2d1262cbf | ||
|
|
2f9a1e8601 | ||
|
|
b239f60fe4 | ||
|
|
983521e225 | ||
|
|
aeed04a5ec | ||
|
|
faed569e8a | ||
|
|
49ddb3ec13 | ||
|
|
71c0387ab0 | ||
|
|
e5d2d5e689 | ||
|
|
be2394b39b | ||
|
|
158298b96c | ||
|
|
ffa84f8b91 | ||
|
|
0954ddcc96 | ||
|
|
d9bd96af71 | ||
|
|
2649dcd05c | ||
|
|
939db75268 | ||
|
|
227bf73870 | ||
|
|
05e3898e7a | ||
|
|
9777c9aa93 | ||
|
|
b8d8461e61 | ||
|
|
b977543c72 | ||
|
|
4d87cd11cc | ||
|
|
957daf0547 | ||
|
|
3dae904122 | ||
|
|
e835196972 | ||
|
|
52ed0e2cee | ||
|
|
1e898d271d | ||
|
|
39754cde59 | ||
|
|
a6f7b938e1 | ||
|
|
0ad501af9a | ||
|
|
73035067e3 | ||
|
|
421b3830b6 | ||
|
|
59dcb905fe | ||
|
|
d222190fc7 | ||
|
|
06e9864d19 | ||
|
|
0b1a321615 | ||
|
|
9ee7d7769a | ||
|
|
2440a65d8e | ||
|
|
839931d65f | ||
|
|
2591b48abe | ||
|
|
2549597871 | ||
|
|
2064172bed | ||
|
|
dc19d0c61d | ||
|
|
05c6dc6dab | ||
|
|
4b653bc293 | ||
|
|
1c3476b8e9 | ||
|
|
61ca501c2a | ||
|
|
d916feec62 | ||
|
|
0dcecf6ca4 | ||
|
|
a04deb458f | ||
|
|
34f810571e | ||
|
|
5ab4d140d5 | ||
|
|
104778d17a |
2
.github/FUNDING.yml
vendored
2
.github/FUNDING.yml
vendored
@@ -10,4 +10,6 @@ liberapay: # Replace with a single Liberapay username
|
|||||||
issuehunt: # Replace with a single IssueHunt username
|
issuehunt: # Replace with a single IssueHunt username
|
||||||
otechie: # Replace with a single Otechie username
|
otechie: # Replace with a single Otechie username
|
||||||
lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry
|
lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry
|
||||||
|
# noinspection YAMLSchemaValidation
|
||||||
|
buy_me_a_coffee: crazywhalecc
|
||||||
custom: 'https://github.com/crazywhalecc/crazywhalecc/blob/master/FUNDING.md' # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
|
custom: 'https://github.com/crazywhalecc/crazywhalecc/blob/master/FUNDING.md' # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
|
||||||
|
|||||||
32
.github/workflows/build-linux-arm.yml
vendored
32
.github/workflows/build-linux-arm.yml
vendored
@@ -45,14 +45,30 @@ jobs:
|
|||||||
name: build ${{ inputs.version }} on ${{ inputs.operating-system }}
|
name: build ${{ inputs.version }} on ${{ inputs.operating-system }}
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
|
# Cache composer dependencies
|
||||||
|
- id: cache-composer-deps
|
||||||
|
uses: actions/cache@v4
|
||||||
|
with:
|
||||||
|
path: vendor
|
||||||
|
key: composer-dependencies
|
||||||
|
|
||||||
|
# If there's no Composer cache, install dependencies
|
||||||
|
- if: steps.cache-composer-deps.outputs.cache-hit != 'true'
|
||||||
|
run: composer update --no-dev --classmap-authoritative
|
||||||
|
|
||||||
|
- name: Generate hashed key for download cache
|
||||||
|
run: |
|
||||||
|
INPUT_HASH=$(echo "${{ runner.os }}-${{ inputs.version }}-${{ inputs.extensions }}" | sha256sum | awk '{print $1}')
|
||||||
|
echo "INPUT_HASH=${INPUT_HASH}" >> $GITHUB_ENV
|
||||||
|
|
||||||
# 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-${{ inputs.version }}-dependencies-${{ inputs.extensions }}
|
key: php-${{ env.INPUT_HASH }}
|
||||||
|
|
||||||
# With or without debug
|
# With or without debug
|
||||||
- if: inputs.debug == true
|
- if: inputs.debug == true
|
||||||
@@ -75,31 +91,31 @@ jobs:
|
|||||||
|
|
||||||
# Upload cli executable
|
# Upload cli executable
|
||||||
- if: ${{ inputs.build-cli == true }}
|
- if: ${{ inputs.build-cli == true }}
|
||||||
uses: actions/upload-artifact@v3
|
uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: php-${{ inputs.version }}-linux-${{ inputs.operating-system }}
|
name: php-${{ inputs.version }}-linux-${{ inputs.operating-system }}
|
||||||
path: buildroot/bin/php
|
path: buildroot/bin/php
|
||||||
|
|
||||||
# Upload micro self-extracted executable
|
# Upload micro self-extracted executable
|
||||||
- if: ${{ inputs.build-micro == true }}
|
- if: ${{ inputs.build-micro == true }}
|
||||||
uses: actions/upload-artifact@v3
|
uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: micro-${{ inputs.version }}-linux-${{ inputs.operating-system }}
|
name: micro-${{ inputs.version }}-linux-${{ inputs.operating-system }}
|
||||||
path: buildroot/bin/micro.sfx
|
path: buildroot/bin/micro.sfx
|
||||||
|
|
||||||
# Upload fpm executable
|
# Upload fpm executable
|
||||||
- if: ${{ inputs.build-fpm == true }}
|
- if: ${{ inputs.build-fpm == true }}
|
||||||
uses: actions/upload-artifact@v3
|
uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: php-fpm-${{ inputs.version }}-linux-${{ inputs.operating-system }}
|
name: php-fpm-${{ inputs.version }}-linux-${{ inputs.operating-system }}
|
||||||
path: buildroot/bin/php-fpm
|
path: buildroot/bin/php-fpm
|
||||||
|
|
||||||
# Upload extensions metadata
|
# Upload extensions metadata
|
||||||
- uses: actions/upload-artifact@v3
|
- uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: license-files
|
name: license-files
|
||||||
path: buildroot/license/
|
path: buildroot/license/
|
||||||
- uses: actions/upload-artifact@v3
|
- uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: build-meta
|
name: build-meta
|
||||||
path: |
|
path: |
|
||||||
|
|||||||
23
.github/workflows/build-linux-x86_64.yml
vendored
23
.github/workflows/build-linux-x86_64.yml
vendored
@@ -39,11 +39,11 @@ jobs:
|
|||||||
name: build ${{ inputs.version }} on Linux x86_64
|
name: build ${{ inputs.version }} on Linux x86_64
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
# Cache composer dependencies
|
# Cache composer dependencies
|
||||||
- id: cache-composer-deps
|
- id: cache-composer-deps
|
||||||
uses: actions/cache@v3
|
uses: actions/cache@v4
|
||||||
with:
|
with:
|
||||||
path: vendor
|
path: vendor
|
||||||
key: composer-dependencies
|
key: composer-dependencies
|
||||||
@@ -52,12 +52,17 @@ jobs:
|
|||||||
- if: steps.cache-composer-deps.outputs.cache-hit != 'true'
|
- if: steps.cache-composer-deps.outputs.cache-hit != 'true'
|
||||||
run: composer update --no-dev --classmap-authoritative
|
run: composer update --no-dev --classmap-authoritative
|
||||||
|
|
||||||
|
- name: Generate hashed key for download cache
|
||||||
|
run: |
|
||||||
|
INPUT_HASH=$(echo "${{ runner.os }}-${{ inputs.version }}-${{ inputs.extensions }}" | sha256sum | awk '{print $1}')
|
||||||
|
echo "INPUT_HASH=${INPUT_HASH}" >> $GITHUB_ENV
|
||||||
|
|
||||||
# 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-${{ inputs.version }}-dependencies-${{ inputs.extensions }}
|
key: php-${{ env.INPUT_HASH }}
|
||||||
|
|
||||||
# With or without debug
|
# With or without debug
|
||||||
- if: inputs.debug == true
|
- if: inputs.debug == true
|
||||||
@@ -80,31 +85,31 @@ jobs:
|
|||||||
|
|
||||||
# Upload cli executable
|
# Upload cli executable
|
||||||
- if: ${{ inputs.build-cli == true }}
|
- if: ${{ inputs.build-cli == true }}
|
||||||
uses: actions/upload-artifact@v3
|
uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: php-${{ inputs.version }}-${{ env.SPC_BUILD_OS }}
|
name: php-${{ inputs.version }}-${{ env.SPC_BUILD_OS }}
|
||||||
path: buildroot/bin/php
|
path: buildroot/bin/php
|
||||||
|
|
||||||
# Upload micro self-extracted executable
|
# Upload micro self-extracted executable
|
||||||
- if: ${{ inputs.build-micro == true }}
|
- if: ${{ inputs.build-micro == true }}
|
||||||
uses: actions/upload-artifact@v3
|
uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: micro-${{ inputs.version }}-${{ env.SPC_BUILD_OS }}
|
name: micro-${{ inputs.version }}-${{ env.SPC_BUILD_OS }}
|
||||||
path: buildroot/bin/micro.sfx
|
path: buildroot/bin/micro.sfx
|
||||||
|
|
||||||
# Upload fpm executable
|
# Upload fpm executable
|
||||||
- if: ${{ inputs.build-fpm == true }}
|
- if: ${{ inputs.build-fpm == true }}
|
||||||
uses: actions/upload-artifact@v3
|
uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: php-fpm-${{ inputs.version }}-${{ env.SPC_BUILD_OS }}
|
name: php-fpm-${{ inputs.version }}-${{ env.SPC_BUILD_OS }}
|
||||||
path: buildroot/bin/php-fpm
|
path: buildroot/bin/php-fpm
|
||||||
|
|
||||||
# Upload extensions metadata
|
# Upload extensions metadata
|
||||||
- uses: actions/upload-artifact@v3
|
- uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: license-files
|
name: license-files
|
||||||
path: buildroot/license/
|
path: buildroot/license/
|
||||||
- uses: actions/upload-artifact@v3
|
- uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: build-meta
|
name: build-meta
|
||||||
path: |
|
path: |
|
||||||
|
|||||||
132
.github/workflows/build-macos-aarch64.yml
vendored
Normal file
132
.github/workflows/build-macos-aarch64.yml
vendored
Normal file
@@ -0,0 +1,132 @@
|
|||||||
|
name: CI on arm64 macOS
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_dispatch:
|
||||||
|
inputs:
|
||||||
|
version:
|
||||||
|
required: true
|
||||||
|
description: php version to compile
|
||||||
|
default: '8.2'
|
||||||
|
type: choice
|
||||||
|
options:
|
||||||
|
- '8.3'
|
||||||
|
- '8.2'
|
||||||
|
- '8.1'
|
||||||
|
- '8.0'
|
||||||
|
- '7.4'
|
||||||
|
build-cli:
|
||||||
|
description: build cli binary
|
||||||
|
default: true
|
||||||
|
type: boolean
|
||||||
|
build-micro:
|
||||||
|
description: build phpmicro binary
|
||||||
|
type: boolean
|
||||||
|
build-fpm:
|
||||||
|
description: build fpm binary
|
||||||
|
type: boolean
|
||||||
|
extensions:
|
||||||
|
description: extensions to compile (comma separated)
|
||||||
|
required: true
|
||||||
|
type: string
|
||||||
|
debug:
|
||||||
|
type: boolean
|
||||||
|
|
||||||
|
env:
|
||||||
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
name: build ${{ inputs.version }} on macOS arm64
|
||||||
|
runs-on: macos-14
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
|
# Install macOS missing packages and mark os suffix
|
||||||
|
- run: |
|
||||||
|
brew install automake gzip
|
||||||
|
echo "SPC_BUILD_OS=macos" >> $GITHUB_ENV
|
||||||
|
|
||||||
|
|
||||||
|
- name: "Setup PHP"
|
||||||
|
uses: shivammathur/setup-php@v2
|
||||||
|
with:
|
||||||
|
php-version: 8.1
|
||||||
|
tools: pecl, composer
|
||||||
|
extensions: curl, openssl, mbstring, tokenizer
|
||||||
|
ini-values: memory_limit=-1
|
||||||
|
|
||||||
|
|
||||||
|
# Cache composer dependencies
|
||||||
|
- id: cache-composer-deps
|
||||||
|
uses: actions/cache@v4
|
||||||
|
with:
|
||||||
|
path: vendor
|
||||||
|
key: composer-dependencies
|
||||||
|
|
||||||
|
# If there's no Composer cache, install dependencies
|
||||||
|
- if: steps.cache-composer-deps.outputs.cache-hit != 'true'
|
||||||
|
run: composer update --no-dev --classmap-authoritative
|
||||||
|
|
||||||
|
- name: Generate hashed key for download cache
|
||||||
|
run: |
|
||||||
|
INPUT_HASH=$(echo "${{ runner.os }}-${{ inputs.version }}-${{ inputs.extensions }}" | sha256sum | awk '{print $1}')
|
||||||
|
echo "INPUT_HASH=${INPUT_HASH}" >> $GITHUB_ENV
|
||||||
|
|
||||||
|
# Cache downloaded source
|
||||||
|
- id: cache-download
|
||||||
|
uses: actions/cache@v4
|
||||||
|
with:
|
||||||
|
path: downloads
|
||||||
|
key: php-${{ env.INPUT_HASH }}
|
||||||
|
|
||||||
|
# With or without debug
|
||||||
|
- if: inputs.debug == true
|
||||||
|
run: echo "SPC_BUILD_DEBUG=--debug" >> $GITHUB_ENV
|
||||||
|
|
||||||
|
# With target select: cli, micro or both
|
||||||
|
- if: ${{ inputs.build-cli == true }}
|
||||||
|
run: echo "SPC_BUILD_CLI=--build-cli" >> $GITHUB_ENV
|
||||||
|
- if: ${{ inputs.build-micro == true }}
|
||||||
|
run: echo "SPC_BUILD_MICRO=--build-micro" >> $GITHUB_ENV
|
||||||
|
- if: ${{ inputs.build-fpm == true }}
|
||||||
|
run: echo "SPC_BUILD_FPM=--build-fpm" >> $GITHUB_ENV
|
||||||
|
|
||||||
|
# If there's no dependencies cache, fetch sources, with or without debug
|
||||||
|
- if: steps.cache-download.outputs.cache-hit != 'true'
|
||||||
|
run: ./bin/spc download --with-php=${{ inputs.version }} --for-extensions=${{ inputs.extensions }} ${{ env.SPC_BUILD_DEBUG }}
|
||||||
|
|
||||||
|
# Run build command
|
||||||
|
- run: ./bin/spc build ${{ inputs.extensions }} ${{ env.SPC_BUILD_DEBUG }} ${{ env.SPC_BUILD_CLI }} ${{ env.SPC_BUILD_MICRO }} ${{ env.SPC_BUILD_FPM }}
|
||||||
|
|
||||||
|
# Upload cli executable
|
||||||
|
- if: ${{ inputs.build-cli == true }}
|
||||||
|
uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: php-${{ inputs.version }}-${{ env.SPC_BUILD_OS }}
|
||||||
|
path: buildroot/bin/php
|
||||||
|
|
||||||
|
# Upload micro self-extracted executable
|
||||||
|
- if: ${{ inputs.build-micro == true }}
|
||||||
|
uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: micro-${{ inputs.version }}-${{ env.SPC_BUILD_OS }}
|
||||||
|
path: buildroot/bin/micro.sfx
|
||||||
|
|
||||||
|
# Upload fpm executable
|
||||||
|
- if: ${{ inputs.build-fpm == true }}
|
||||||
|
uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: php-fpm-${{ inputs.version }}-${{ env.SPC_BUILD_OS }}
|
||||||
|
path: buildroot/bin/php-fpm
|
||||||
|
|
||||||
|
# Upload extensions metadata
|
||||||
|
- uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: license-files
|
||||||
|
path: buildroot/license/
|
||||||
|
- uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: build-meta
|
||||||
|
path: |
|
||||||
|
buildroot/build-extensions.json
|
||||||
|
buildroot/build-libraries.json
|
||||||
33
.github/workflows/build-macos-x86_64.yml
vendored
33
.github/workflows/build-macos-x86_64.yml
vendored
@@ -37,18 +37,26 @@ env:
|
|||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
name: build ${{ inputs.version }} on macOS x86_64
|
name: build ${{ inputs.version }} on macOS x86_64
|
||||||
runs-on: macos-latest
|
runs-on: macos-13
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
# Install macOS missing packages and mark os suffix
|
# Install macOS missing packages and mark os suffix
|
||||||
- run: |
|
- run: |
|
||||||
brew install automake gzip
|
brew install automake gzip
|
||||||
echo "SPC_BUILD_OS=macos" >> $GITHUB_ENV
|
echo "SPC_BUILD_OS=macos" >> $GITHUB_ENV
|
||||||
|
|
||||||
|
- name: "Setup PHP"
|
||||||
|
uses: shivammathur/setup-php@v2
|
||||||
|
with:
|
||||||
|
php-version: 8.1
|
||||||
|
tools: pecl, composer
|
||||||
|
extensions: curl, openssl, mbstring, tokenizer
|
||||||
|
ini-values: memory_limit=-1
|
||||||
|
|
||||||
# Cache composer dependencies
|
# Cache composer dependencies
|
||||||
- id: cache-composer-deps
|
- id: cache-composer-deps
|
||||||
uses: actions/cache@v3
|
uses: actions/cache@v4
|
||||||
with:
|
with:
|
||||||
path: vendor
|
path: vendor
|
||||||
key: composer-dependencies
|
key: composer-dependencies
|
||||||
@@ -57,12 +65,17 @@ jobs:
|
|||||||
- if: steps.cache-composer-deps.outputs.cache-hit != 'true'
|
- if: steps.cache-composer-deps.outputs.cache-hit != 'true'
|
||||||
run: composer update --no-dev --classmap-authoritative
|
run: composer update --no-dev --classmap-authoritative
|
||||||
|
|
||||||
|
- name: Generate hashed key for download cache
|
||||||
|
run: |
|
||||||
|
INPUT_HASH=$(echo "${{ runner.os }}-${{ inputs.version }}-${{ inputs.extensions }}" | sha256sum | awk '{print $1}')
|
||||||
|
echo "INPUT_HASH=${INPUT_HASH}" >> $GITHUB_ENV
|
||||||
|
|
||||||
# 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-${{ inputs.version }}-dependencies-${{ inputs.extensions }}
|
key: php-${{ env.INPUT_HASH }}
|
||||||
|
|
||||||
# With or without debug
|
# With or without debug
|
||||||
- if: inputs.debug == true
|
- if: inputs.debug == true
|
||||||
@@ -85,31 +98,31 @@ jobs:
|
|||||||
|
|
||||||
# Upload cli executable
|
# Upload cli executable
|
||||||
- if: ${{ inputs.build-cli == true }}
|
- if: ${{ inputs.build-cli == true }}
|
||||||
uses: actions/upload-artifact@v3
|
uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: php-${{ inputs.version }}-${{ env.SPC_BUILD_OS }}
|
name: php-${{ inputs.version }}-${{ env.SPC_BUILD_OS }}
|
||||||
path: buildroot/bin/php
|
path: buildroot/bin/php
|
||||||
|
|
||||||
# Upload micro self-extracted executable
|
# Upload micro self-extracted executable
|
||||||
- if: ${{ inputs.build-micro == true }}
|
- if: ${{ inputs.build-micro == true }}
|
||||||
uses: actions/upload-artifact@v3
|
uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: micro-${{ inputs.version }}-${{ env.SPC_BUILD_OS }}
|
name: micro-${{ inputs.version }}-${{ env.SPC_BUILD_OS }}
|
||||||
path: buildroot/bin/micro.sfx
|
path: buildroot/bin/micro.sfx
|
||||||
|
|
||||||
# Upload fpm executable
|
# Upload fpm executable
|
||||||
- if: ${{ inputs.build-fpm == true }}
|
- if: ${{ inputs.build-fpm == true }}
|
||||||
uses: actions/upload-artifact@v3
|
uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: php-fpm-${{ inputs.version }}-${{ env.SPC_BUILD_OS }}
|
name: php-fpm-${{ inputs.version }}-${{ env.SPC_BUILD_OS }}
|
||||||
path: buildroot/bin/php-fpm
|
path: buildroot/bin/php-fpm
|
||||||
|
|
||||||
# Upload extensions metadata
|
# Upload extensions metadata
|
||||||
- uses: actions/upload-artifact@v3
|
- uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: license-files
|
name: license-files
|
||||||
path: buildroot/license/
|
path: buildroot/license/
|
||||||
- uses: actions/upload-artifact@v3
|
- uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: build-meta
|
name: build-meta
|
||||||
path: |
|
path: |
|
||||||
|
|||||||
108
.github/workflows/build-windows-x86_64.yml
vendored
Normal file
108
.github/workflows/build-windows-x86_64.yml
vendored
Normal file
@@ -0,0 +1,108 @@
|
|||||||
|
name: CI on x86_64 Windows
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_dispatch:
|
||||||
|
inputs:
|
||||||
|
version:
|
||||||
|
required: true
|
||||||
|
description: php version to compile
|
||||||
|
default: '8.2'
|
||||||
|
type: choice
|
||||||
|
options:
|
||||||
|
- '8.3'
|
||||||
|
- '8.2'
|
||||||
|
- '8.1'
|
||||||
|
- '8.0'
|
||||||
|
- '7.4'
|
||||||
|
build-cli:
|
||||||
|
description: build cli binary
|
||||||
|
default: true
|
||||||
|
type: boolean
|
||||||
|
build-micro:
|
||||||
|
description: build phpmicro binary
|
||||||
|
type: boolean
|
||||||
|
extensions:
|
||||||
|
description: extensions to compile (comma separated)
|
||||||
|
required: true
|
||||||
|
type: string
|
||||||
|
debug:
|
||||||
|
type: boolean
|
||||||
|
|
||||||
|
env:
|
||||||
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
name: build ${{ inputs.version }} on Windows x86_64
|
||||||
|
runs-on: windows-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
|
# Cache composer dependencies
|
||||||
|
- id: cache-composer-deps
|
||||||
|
uses: actions/cache@v4
|
||||||
|
with:
|
||||||
|
path: vendor
|
||||||
|
key: composer-dependencies
|
||||||
|
|
||||||
|
# If there's no Composer cache, install dependencies
|
||||||
|
- if: steps.cache-composer-deps.outputs.cache-hit != 'true'
|
||||||
|
run: composer update --no-dev --classmap-authoritative
|
||||||
|
|
||||||
|
- name: Generate hashed key for download cache
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
INPUT_HASH=$(echo "${{ runner.os }}-${{ inputs.version }}-${{ inputs.extensions }}" | sha256sum | awk '{print $1}')
|
||||||
|
echo "INPUT_HASH=${INPUT_HASH}" >> "$GITHUB_ENV"
|
||||||
|
|
||||||
|
# Cache downloaded source
|
||||||
|
- id: cache-download
|
||||||
|
uses: actions/cache@v4
|
||||||
|
with:
|
||||||
|
path: downloads
|
||||||
|
key: php-${{ env.INPUT_HASH }}
|
||||||
|
|
||||||
|
# With or without debug
|
||||||
|
- if: inputs.debug == true
|
||||||
|
run: echo "SPC_BUILD_DEBUG=--debug" >> $env:GITHUB_ENV
|
||||||
|
|
||||||
|
# With target select: cli, micro or both
|
||||||
|
- if: ${{ inputs.build-cli == true }}
|
||||||
|
run: echo "SPC_BUILD_CLI=--build-cli" >> $env:GITHUB_ENV
|
||||||
|
- if: ${{ inputs.build-micro == true }}
|
||||||
|
run: echo "SPC_BUILD_MICRO=--build-micro" >> $env:GITHUB_ENV
|
||||||
|
|
||||||
|
- run: ./bin/spc doctor
|
||||||
|
|
||||||
|
# If there's no dependencies cache, fetch sources, with or without debug
|
||||||
|
- if: steps.cache-download.outputs.cache-hit != 'true'
|
||||||
|
run: ./bin/spc download --with-php="${{ inputs.version }}" --for-extensions="${{ inputs.extensions }}" ${{ env.SPC_BUILD_DEBUG }}
|
||||||
|
|
||||||
|
# Run build command
|
||||||
|
- run: ./bin/spc build "${{ inputs.extensions }}" ${{ env.SPC_BUILD_DEBUG }} ${{ env.SPC_BUILD_CLI }} ${{ env.SPC_BUILD_MICRO }} ${{ env.SPC_BUILD_FPM }}
|
||||||
|
|
||||||
|
# Upload cli executable
|
||||||
|
- if: ${{ inputs.build-cli == true }}
|
||||||
|
uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: php-${{ inputs.version }}
|
||||||
|
path: buildroot/bin/php.exe
|
||||||
|
|
||||||
|
# Upload micro self-extracted executable
|
||||||
|
- if: ${{ inputs.build-micro == true }}
|
||||||
|
uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: micro-${{ inputs.version }}
|
||||||
|
path: buildroot/bin/micro.sfx
|
||||||
|
|
||||||
|
# Upload extensions metadata
|
||||||
|
- uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: license-files
|
||||||
|
path: buildroot/license/
|
||||||
|
- uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: build-meta
|
||||||
|
path: |
|
||||||
|
buildroot/build-extensions.json
|
||||||
|
buildroot/build-libraries.json
|
||||||
60
.github/workflows/release-build.yml
vendored
60
.github/workflows/release-build.yml
vendored
@@ -11,18 +11,19 @@ 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:
|
||||||
- "8.1"
|
- "8.2"
|
||||||
micro-version:
|
micro-version:
|
||||||
- "8.1.26"
|
- "8.2.18"
|
||||||
operating-system:
|
operating-system:
|
||||||
- "linux-x86_64"
|
- "linux-x86_64"
|
||||||
- "macos-x86_64"
|
- "macos-x86_64"
|
||||||
- "linux-aarch64"
|
- "linux-aarch64"
|
||||||
- "macos-aarch64"
|
- "macos-aarch64"
|
||||||
|
- "windows-x64"
|
||||||
steps:
|
steps:
|
||||||
- name: "Checkout"
|
- name: "Checkout"
|
||||||
uses: "actions/checkout@v4"
|
uses: "actions/checkout@v4"
|
||||||
@@ -44,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') }}"
|
||||||
@@ -59,31 +60,54 @@ jobs:
|
|||||||
|
|
||||||
- name: "Download minimal combination"
|
- name: "Download minimal combination"
|
||||||
run: |
|
run: |
|
||||||
curl https://dl.static-php.dev/static-php-cli/minimal/php-${{ matrix.micro-version }}-micro-${{ matrix.operating-system }}.tar.gz -o tmp.tgz
|
if [ "${{ matrix.operating-system }}" = "windows-x64" ]; then
|
||||||
tar -zxvf tmp.tgz
|
curl https://dl.static-php.dev/static-php-cli/windows/spc-min/php-${{ matrix.micro-version }}-micro-win.zip -o tmp.zip
|
||||||
|
unzip tmp.zip
|
||||||
|
else
|
||||||
|
curl https://dl.static-php.dev/static-php-cli/minimal/php-${{ matrix.micro-version }}-micro-${{ matrix.operating-system }}.tar.gz -o tmp.tgz
|
||||||
|
tar -zxvf tmp.tgz
|
||||||
|
fi
|
||||||
|
|
||||||
- name: "Generate Executable"
|
- name: "Generate Executable"
|
||||||
run: |
|
run: |
|
||||||
cat micro.sfx spc.phar > spc
|
bin/spc micro:combine spc.phar -M micro.sfx -O spc -I "memory_limit=2G"
|
||||||
chmod +x spc
|
if [ "${{ matrix.operating-system }}" = "windows-x64" ]; then
|
||||||
|
mv spc spc.exe
|
||||||
|
else
|
||||||
|
chmod +x spc
|
||||||
|
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: |
|
||||||
tar -czf spc-${{ matrix.operating-system }}.tar.gz spc
|
if [ "${{ matrix.operating-system }}" != "windows-x64" ]; then
|
||||||
echo "filename=spc-${{ matrix.operating-system }}.tar.gz" >> $GITHUB_ENV
|
tar -czf spc-${{ matrix.operating-system }}.tar.gz spc
|
||||||
echo "OS=${{ matrix.operating-system }}" >> $GITHUB_ENV
|
echo "filename=spc-${{ matrix.operating-system }}.tar.gz" >> $GITHUB_ENV
|
||||||
if [ "${{ matrix.operating-system }}" == "linux-x86_64" ]; then
|
echo "OS=${{ matrix.operating-system }}" >> $GITHUB_ENV
|
||||||
./spc dev:extensions
|
if [ "${{ matrix.operating-system }}" == "macos-aarch64" ]; then
|
||||||
|
./spc dev:extensions
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
echo "filename=spc-${{ matrix.operating-system }}.exe" >> $GITHUB_ENV
|
||||||
|
echo "OS=${{ matrix.operating-system }}" >> $GITHUB_ENV
|
||||||
fi
|
fi
|
||||||
|
|
||||||
- name: "Copy file"
|
- name: "Copy file"
|
||||||
run: "mkdir dist/ && cp ${{ env.filename }} dist/ && cp spc dist/spc-$OS"
|
run: |
|
||||||
|
if [ "${{ matrix.operating-system }}" != "windows-x64" ]; then
|
||||||
|
mkdir dist/ && cp ${{ env.filename }} dist/ && cp spc dist/spc-$OS
|
||||||
|
else
|
||||||
|
mkdir dist/ && cp spc.exe dist/${{ env.filename }}
|
||||||
|
echo "SUFFIX=.exe" >> $GITHUB_ENV
|
||||||
|
fi
|
||||||
|
|
||||||
- name: upload binaries to release
|
- name: upload binaries to release
|
||||||
uses: softprops/action-gh-release@v1
|
uses: softprops/action-gh-release@v1
|
||||||
if: ${{startsWith(github.ref, 'refs/tags/') }}
|
if: ${{startsWith(github.ref, 'refs/tags/') }}
|
||||||
with:
|
with:
|
||||||
files: ${{ env.filename }}
|
files: dist/${{ env.filename }}
|
||||||
|
|
||||||
- name: "Deploy to Self-Hosted Server"
|
- name: "Deploy to Self-Hosted Server"
|
||||||
if: github.repository == 'crazywhalecc/static-php-cli'
|
if: github.repository == 'crazywhalecc/static-php-cli'
|
||||||
@@ -98,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
|
path: spc${{ env.SUFFIX }}
|
||||||
name: spc-${{ matrix.operating-system }}
|
name: spc-${{ matrix.operating-system }}${{ env.SUFFIX }}
|
||||||
|
|||||||
43
.github/workflows/tests.yml
vendored
43
.github/workflows/tests.yml
vendored
@@ -12,6 +12,9 @@ on:
|
|||||||
permissions:
|
permissions:
|
||||||
contents: read
|
contents: read
|
||||||
|
|
||||||
|
env:
|
||||||
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
php-cs-fixer:
|
php-cs-fixer:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
@@ -48,7 +51,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 +89,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 +116,9 @@ jobs:
|
|||||||
- "8.3"
|
- "8.3"
|
||||||
os:
|
os:
|
||||||
- ubuntu-latest
|
- ubuntu-latest
|
||||||
- macos-latest
|
- macos-13
|
||||||
|
- windows-latest
|
||||||
|
- macos-14
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
steps:
|
steps:
|
||||||
- name: "Checkout"
|
- name: "Checkout"
|
||||||
@@ -127,9 +132,9 @@ jobs:
|
|||||||
extensions: curl, openssl, mbstring
|
extensions: curl, openssl, mbstring
|
||||||
ini-values: memory_limit=-1
|
ini-values: memory_limit=-1
|
||||||
|
|
||||||
- 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') }}
|
||||||
@@ -138,7 +143,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
|
||||||
@@ -149,8 +154,26 @@ jobs:
|
|||||||
- name: "Run Build Tests (doctor)"
|
- name: "Run Build Tests (doctor)"
|
||||||
run: bin/spc doctor --auto-fix
|
run: bin/spc doctor --auto-fix
|
||||||
|
|
||||||
- name: "Run Build Tests (download)"
|
- name: "Prepare UPX for Windows"
|
||||||
run: bin/spc download --for-extensions="$(php src/globals/test-extensions.php extensions)" --with-php=${{ matrix.php }} --debug
|
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: "Run Build Tests (build)"
|
- name: "Prepare UPX for Linux"
|
||||||
run: bin/spc build $(php src/globals/test-extensions.php cmd) --build-cli --build-micro --build-fpm --debug
|
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)"
|
||||||
|
run: |
|
||||||
|
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=5
|
||||||
|
|
||||||
|
- name: "Run Build Tests (build, *nix)"
|
||||||
|
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 --debug --enable-micro-win32
|
||||||
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: |
|
||||||
|
|||||||
3
.gitignore
vendored
3
.gitignore
vendored
@@ -16,6 +16,9 @@ docker/source/
|
|||||||
# default source build root directory
|
# default source build root directory
|
||||||
/buildroot/
|
/buildroot/
|
||||||
|
|
||||||
|
# default package root directory
|
||||||
|
/pkgroot/
|
||||||
|
|
||||||
# tools cache files
|
# tools cache files
|
||||||
.php-cs-fixer.cache
|
.php-cs-fixer.cache
|
||||||
.phpunit.result.cache
|
.phpunit.result.cache
|
||||||
|
|||||||
89
README-zh.md
89
README-zh.md
@@ -1,10 +1,11 @@
|
|||||||
# static-php-cli
|
# static-php-cli
|
||||||
|
|
||||||
[]()
|
[](README.md)
|
||||||
[](https://github.com/crazywhalecc/static-php-cli/actions/workflows/tests.yml)
|
[](README-zh.md)
|
||||||
[]()
|
[](https://github.com/crazywhalecc/static-php-cli/releases)
|
||||||
[]([https://static-php.dev/](https://static-php.dev/en/guide/extensions.html))
|
[](https://github.com/crazywhalecc/static-php-cli/actions/workflows/tests.yml)
|
||||||
[](https://discord.gg/RNpegEYW)
|
[](https://github.com/crazywhalecc/static-php-cli/blob/main/LICENSE)
|
||||||
|
[](https://static-php.dev/zh/guide/extensions.html)
|
||||||
|
|
||||||
**static-php-cli**是一个用于静态编译、构建 PHP 解释器的工具,支持众多流行扩展。
|
**static-php-cli**是一个用于静态编译、构建 PHP 解释器的工具,支持众多流行扩展。
|
||||||
|
|
||||||
@@ -12,9 +13,6 @@
|
|||||||
|
|
||||||
**static-php-cli**也支持将 PHP 代码和 PHP 运行时打包为一个文件并运行。
|
**static-php-cli**也支持将 PHP 代码和 PHP 运行时打包为一个文件并运行。
|
||||||
|
|
||||||
- [README - English](./README.md)
|
|
||||||
- [README - 中文](./README-zh.md)
|
|
||||||
|
|
||||||
## 特性
|
## 特性
|
||||||
|
|
||||||
static-php-cli(简称 `spc`)有许多特性:
|
static-php-cli(简称 `spc`)有许多特性:
|
||||||
@@ -22,11 +20,12 @@ static-php-cli(简称 `spc`)有许多特性:
|
|||||||
- :handbag: 构建独立的单文件 PHP 解释器,无需任何依赖
|
- :handbag: 构建独立的单文件 PHP 解释器,无需任何依赖
|
||||||
- :hamburger: 构建 **[phpmicro](https://github.com/dixyes/phpmicro)** 自执行二进制(将 PHP 代码和 PHP 解释器打包为一个文件)
|
- :hamburger: 构建 **[phpmicro](https://github.com/dixyes/phpmicro)** 自执行二进制(将 PHP 代码和 PHP 解释器打包为一个文件)
|
||||||
- :pill: 提供一键检查和修复编译环境的 Doctor 模块
|
- :pill: 提供一键检查和修复编译环境的 Doctor 模块
|
||||||
- :zap: 支持多个系统:`Linux`、`macOS`、`FreeBSD`、[`Windows (WIP)`](https://github.com/crazywhalecc/static-php-cli/pull/301)
|
- :zap: 支持多个系统:`Linux`、`macOS`、`FreeBSD`、`Windows`
|
||||||
- :wrench: 高度自定义的代码 patch 功能
|
- :wrench: 高度自定义的代码 patch 功能
|
||||||
- :books: 自带编译依赖管理
|
- :books: 自带编译依赖管理
|
||||||
- 📦 提供由自身编译的独立 `spc` 二进制(使用 spc 和 [box](https://github.com/box-project/box) 构建)
|
- 📦 提供由自身编译的独立 `spc` 二进制(使用 spc 和 [box](https://github.com/box-project/box) 构建)
|
||||||
- :fire: 支持大量 [扩展](https://static-php.dev/zh/guide/extensions.html)
|
- :fire: 支持大量 [扩展](https://static-php.dev/zh/guide/extensions.html)
|
||||||
|
- :floppy_disk: 整合 UPX 工具(减小二进制文件体积)
|
||||||
|
|
||||||
**静态 php-cli:**
|
**静态 php-cli:**
|
||||||
|
|
||||||
@@ -44,31 +43,52 @@ 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/)。
|
||||||
|
|
||||||
## 使用 static-php-cli 构建 PHP
|
## 使用 static-php-cli 构建 PHP
|
||||||
|
|
||||||
### 编译环境需求
|
### 编译环境需求
|
||||||
|
|
||||||
- PHP >= 8.1(spc 自身是用 PHP 写的)
|
- PHP >= 8.1(这是 spc 自身需要的版本,不是支持的构建版本)
|
||||||
- 扩展:`mbstring,pcntl,posix,tokenizer,phar`
|
- 扩展:`mbstring,tokenizer,phar`
|
||||||
- 系统安装了 `curl` 和 `git`
|
- 系统安装了 `curl` 和 `git`
|
||||||
|
|
||||||
是的,本项目采用 PHP 编写,编译前需要一个 PHP 环境,比较滑稽。
|
是的,本项目采用 PHP 编写,编译前需要一个 PHP 环境,比较滑稽。
|
||||||
但本项目默认可通过自身构建的 micro 和 static-php 二进制运行,其他只需要包含 mbstring、pcntl 扩展和 PHP 版本大于等于 8.1 即可。
|
但本项目默认可通过自身构建的 micro 和 static-php 二进制运行,其他只需要包含上面提到的扩展和 PHP 版本大于等于 8.1 即可。
|
||||||
|
|
||||||
下面是架构支持情况,:octocat: 代表支持 GitHub Action 构建,:computer: 代表支持本地构建,空 代表暂不支持。
|
下面是架构支持情况,:octocat: 代表支持 GitHub Action 构建,:computer: 代表支持本地构建,空 代表暂不支持。
|
||||||
|
|
||||||
| | x86_64 | aarch64 |
|
| | x86_64 | aarch64 |
|
||||||
|---------|----------------------|----------------------|
|
|---------|----------------------|----------------------|
|
||||||
| macOS | :octocat: :computer: | :computer: |
|
| macOS | :octocat: :computer: | :octocat: :computer: |
|
||||||
| Linux | :octocat: :computer: | :octocat: :computer: |
|
| Linux | :octocat: :computer: | :octocat: :computer: |
|
||||||
| Windows | | |
|
| Windows | :octocat: :computer: | |
|
||||||
| FreeBSD | :computer: | :computer: |
|
| FreeBSD | :computer: | :computer: |
|
||||||
|
|
||||||
目前支持编译的 PHP 版本为:`7.3`,`7.4`,`8.0`,`8.1`,`8.2`,`8.3`。
|
当前支持编译的 PHP 版本:
|
||||||
|
|
||||||
|
> :warning: 支持,但 static-php-cli 作者可能不再提供补丁修复
|
||||||
|
>
|
||||||
|
> :heavy_check_mark: 支持
|
||||||
|
>
|
||||||
|
> :x: 不支持
|
||||||
|
|
||||||
|
| PHP Version | Status | Comment |
|
||||||
|
|-------------|--------------------|------------------------------|
|
||||||
|
| 7.2 | :x: | |
|
||||||
|
| 7.3 | :warning: | phpmicro 和许多扩展不支持 7.3、7.4 版本 |
|
||||||
|
| 7.4 | :warning: | phpmicro 和许多扩展不支持 7.3、7.4 版本 |
|
||||||
|
| 8.0 | :heavy_check_mark: | PHP 官方已停止 8.0 的维护 |
|
||||||
|
| 8.1 | :heavy_check_mark: | PHP 官方仅对 8.1 提供安全更新 |
|
||||||
|
| 8.2 | :heavy_check_mark: | |
|
||||||
|
| 8.3 | :heavy_check_mark: | |
|
||||||
|
|
||||||
### 支持的扩展
|
### 支持的扩展
|
||||||
|
|
||||||
@@ -108,10 +128,16 @@ curl -o spc https://dl.static-php.dev/static-php-cli/spc-bin/nightly/spc-linux-a
|
|||||||
curl -o spc https://dl.static-php.dev/static-php-cli/spc-bin/nightly/spc-macos-x86_64
|
curl -o spc https://dl.static-php.dev/static-php-cli/spc-bin/nightly/spc-macos-x86_64
|
||||||
# macOS aarch64 (Apple)
|
# macOS aarch64 (Apple)
|
||||||
curl -o spc https://dl.static-php.dev/static-php-cli/spc-bin/nightly/spc-macos-aarch64
|
curl -o spc https://dl.static-php.dev/static-php-cli/spc-bin/nightly/spc-macos-aarch64
|
||||||
|
# Windows (x86_64, win10 build 17063 or later)
|
||||||
|
curl.exe -o spc.exe https://dl.static-php.dev/static-php-cli/spc-bin/nightly/spc-windows-x64.exe
|
||||||
|
|
||||||
# add x perm
|
# Add execute perm (Linux and macOS only)
|
||||||
chmod +x ./spc
|
chmod +x ./spc
|
||||||
|
|
||||||
|
# Run (Linux and macOS)
|
||||||
./spc --version
|
./spc --version
|
||||||
|
# Run (Windows powershell)
|
||||||
|
.\spc.exe --version
|
||||||
```
|
```
|
||||||
|
|
||||||
自托管 `spc` 由 GitHub Actions 构建,你也可以从 Actions 直接下载:[此处](https://github.com/crazywhalecc/static-php-cli/actions/workflows/release-build.yml)。
|
自托管 `spc` 由 GitHub Actions 构建,你也可以从 Actions 直接下载:[此处](https://github.com/crazywhalecc/static-php-cli/actions/workflows/release-build.yml)。
|
||||||
@@ -150,14 +176,16 @@ bin/spc --version
|
|||||||
# 拉取所有依赖库
|
# 拉取所有依赖库
|
||||||
./bin/spc download --all
|
./bin/spc download --all
|
||||||
# 只拉取编译指定扩展需要的所有依赖(推荐)
|
# 只拉取编译指定扩展需要的所有依赖(推荐)
|
||||||
./bin/spc download --for-extensions=openssl,pcntl,mbstring,pdo_sqlite
|
./bin/spc download --for-extensions="openssl,pcntl,mbstring,pdo_sqlite"
|
||||||
# 下载编译不同版本的 PHP (--with-php=x.y,推荐 7.3 ~ 8.3)
|
# 下载编译不同版本的 PHP (--with-php=x.y,推荐 7.3 ~ 8.3)
|
||||||
./bin/spc download --for-extensions=openssl,curl,mbstring --with-php=8.1
|
./bin/spc download --for-extensions="openssl,curl,mbstring" --with-php=8.1
|
||||||
|
|
||||||
# 构建包含 bcmath,openssl,tokenizer,sqlite3,pdo_sqlite,ftp,curl 扩展的 php-cli 和 micro.sfx
|
# 构建包含 bcmath,openssl,tokenizer,sqlite3,pdo_sqlite,ftp,curl 扩展的 php-cli 和 micro.sfx
|
||||||
./bin/spc build "bcmath,openssl,tokenizer,sqlite3,pdo_sqlite,ftp,curl" --build-cli --build-micro
|
./bin/spc build "bcmath,openssl,tokenizer,sqlite3,pdo_sqlite,ftp,curl" --build-cli --build-micro
|
||||||
# 编译线程安全版本 (--enable-zts)
|
# 编译线程安全版本 (--enable-zts)
|
||||||
./bin/spc build curl,phar --enable-zts --build-cli
|
./bin/spc build "curl,phar" --enable-zts --build-cli
|
||||||
|
# 编译后使用 UPX 减小可执行文件体积 (--with-upx-pack) (至少压缩至原来的 30~50%)
|
||||||
|
./bin/spc build "curl,phar" --enable-zts --build-cli --with-upx-pack
|
||||||
```
|
```
|
||||||
|
|
||||||
其中,目前支持构建 cli,micro,fpm 和 embed,使用以下参数的一个或多个来指定编译的 SAPI:
|
其中,目前支持构建 cli,micro,fpm 和 embed,使用以下参数的一个或多个来指定编译的 SAPI:
|
||||||
@@ -171,7 +199,7 @@ bin/spc --version
|
|||||||
如果出现了任何错误,可以使用 `--debug` 参数来展示完整的输出日志,以供排查错误:
|
如果出现了任何错误,可以使用 `--debug` 参数来展示完整的输出日志,以供排查错误:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
./bin/spc build openssl,pcntl,mbstring --debug --build-all
|
./bin/spc build "openssl,pcntl,mbstring" --debug --build-all
|
||||||
./bin/spc download --all --debug
|
./bin/spc download --all --debug
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -250,18 +278,17 @@ bin/spc micro:combine my-app.phar -I "memory_limit=4G" -I "disable_functions=sys
|
|||||||
|
|
||||||
## 赞助本项目
|
## 赞助本项目
|
||||||
|
|
||||||
你可以在 [我的个人赞助页](https://github.com/crazywhalecc/crazywhalecc/blob/master/FUNDING.md) 支持我和我的项目。
|
你可以在 [我的个人赞助页](https://github.com/crazywhalecc/crazywhalecc/blob/master/FUNDING.md) 支持我和我的项目。你捐赠的一部分将会被用于维护 **static-php.dev** 服务器。
|
||||||
|
|
||||||
## 开源协议
|
## 开源协议
|
||||||
|
|
||||||
本项目依据旧版本惯例采用 MIT License 开源,部分扩展的集成编译命令参考或修改自以下项目:
|
本项目采用 MIT License 许可开源,下面是类似的项目:
|
||||||
|
|
||||||
- [dixyes/lwmbs](https://github.com/dixyes/lwmbs)(木兰宽松许可证)
|
- [dixyes/lwmbs](https://github.com/dixyes/lwmbs)
|
||||||
- [swoole/swoole-cli](https://github.com/swoole/swoole-cli)(Apache 2.0 LICENSE、SWOOLE-CLI LICENSE)
|
- [swoole/swoole-cli](https://github.com/swoole/swoole-cli)
|
||||||
|
|
||||||
|
该项目使用了 [dixyes/lwmbs](https://github.com/dixyes/lwmbs) 中的一些代码,例如 Windows 静态构建目标和 libiconv 库支持。
|
||||||
|
lwmbs 使用 [Mulan PSL 2](http://license.coscl.org.cn/MulanPSL2) 许可进行分发。对应文件有关于作者和许可的特殊说明,除此之外,均使用 MIT 授权许可。
|
||||||
|
|
||||||
因本项目的特殊性,使用项目编译过程中会使用很多其他开源项目,例如 curl、protobuf 等,它们都有各自的开源协议。
|
因本项目的特殊性,使用项目编译过程中会使用很多其他开源项目,例如 curl、protobuf 等,它们都有各自的开源协议。
|
||||||
请在编译完成后,使用命令 `bin/spc dump-license` 导出项目使用项目的开源协议,并遵守对应项目的 LICENSE。
|
请在编译完成后,使用命令 `bin/spc dump-license` 导出项目使用项目的开源协议,并遵守对应项目的 LICENSE。
|
||||||
|
|
||||||
## 进阶
|
|
||||||
|
|
||||||
本项目重构分支为模块化编写。如果你对本项目感兴趣,想加入开发,可以参照文档的 [贡献指南](https://static-php.dev) 贡献代码或文档。
|
|
||||||
|
|||||||
88
README.md
88
README.md
@@ -1,10 +1,11 @@
|
|||||||
# static-php-cli
|
# static-php-cli
|
||||||
|
|
||||||
[]()
|
[](README-zh.md)
|
||||||
[](https://github.com/crazywhalecc/static-php-cli/actions/workflows/tests.yml)
|
[](README.md)
|
||||||
[]()
|
[](https://github.com/crazywhalecc/static-php-cli/releases)
|
||||||
[]([https://static-php.dev/](https://static-php.dev/en/guide/extensions.html))
|
[](https://github.com/crazywhalecc/static-php-cli/actions/workflows/tests.yml)
|
||||||
[](https://discord.gg/RNpegEYW)
|
[](https://github.com/crazywhalecc/static-php-cli/blob/main/LICENSE)
|
||||||
|
[](https://static-php.dev/en/guide/extensions.html)
|
||||||
|
|
||||||
**static-php-cli** is a powerful tool designed for building static, standalone PHP runtime
|
**static-php-cli** is a powerful tool designed for building static, standalone PHP runtime
|
||||||
with popular extensions.
|
with popular extensions.
|
||||||
@@ -14,9 +15,6 @@ Static PHP built by **static-php-cli** supports `cli`, `fpm`, `embed` and `micro
|
|||||||
**static-php-cli** also has the ability to package PHP projects
|
**static-php-cli** also has the ability to package PHP projects
|
||||||
along with the PHP interpreter into one single executable file.
|
along with the PHP interpreter into one single executable file.
|
||||||
|
|
||||||
- [README - English](./README.md)
|
|
||||||
- [README - 中文](./README-zh.md)
|
|
||||||
|
|
||||||
## Features
|
## Features
|
||||||
|
|
||||||
static-php-cli (you can call it `spc`) has a lot of features:
|
static-php-cli (you can call it `spc`) has a lot of features:
|
||||||
@@ -24,11 +22,12 @@ static-php-cli (you can call it `spc`) has a lot of features:
|
|||||||
- :handbag: Build single-file php executable, without any dependencies
|
- :handbag: Build single-file php executable, without any dependencies
|
||||||
- :hamburger: Build **[phpmicro](https://github.com/dixyes/phpmicro)** self-extracted executable (glue php binary and php source code into one file)
|
- :hamburger: Build **[phpmicro](https://github.com/dixyes/phpmicro)** self-extracted executable (glue php binary and php source code into one file)
|
||||||
- :pill: Automatic build environment checker (Doctor module)
|
- :pill: Automatic build environment checker (Doctor module)
|
||||||
- :zap: `Linux`, `macOS`, `FreeBSD`, [`Windows (WIP)`](https://github.com/crazywhalecc/static-php-cli/pull/301) support
|
- :zap: `Linux`, `macOS`, `FreeBSD`, `Windows` support
|
||||||
- :wrench: Configurable source code patches
|
- :wrench: Configurable source code patches
|
||||||
- :books: Build dependency management
|
- :books: Build dependency management
|
||||||
- 📦 Provide `spc` own standalone executable (built by spc and [box](https://github.com/box-project/box))
|
- 📦 Provide `spc` own standalone executable (built by spc and [box](https://github.com/box-project/box))
|
||||||
- :fire: Support many popular [extensions](https://static-php.dev/en/guide/extensions.html)
|
- :fire: Support many popular [extensions](https://static-php.dev/en/guide/extensions.html)
|
||||||
|
- :floppy_disk: UPX integration (significantly reduces binary size)
|
||||||
|
|
||||||
**Single-file standalone php-cli:**
|
**Single-file standalone php-cli:**
|
||||||
|
|
||||||
@@ -50,32 +49,54 @@ 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,
|
||||||
|
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/).
|
||||||
|
|
||||||
## Build
|
## Build
|
||||||
|
|
||||||
### Compilation Requirements
|
### Compilation Requirements
|
||||||
|
|
||||||
- PHP >= 8.1 (static-php-cli is written in PHP)
|
|
||||||
- Extension: `mbstring,pcntl,posix,tokenizer,phar`
|
|
||||||
- Supported OS with `curl` and `git` installed
|
|
||||||
|
|
||||||
You can say I made a PHP builder written in PHP, pretty funny.
|
You can say I made a PHP builder written in PHP, pretty funny.
|
||||||
But static-php-cli runtime only requires an environment above PHP 8.1 and `mbstring`, `pcntl` extension.
|
But static-php-cli runtime only requires an environment above PHP 8.1 and extensions mentioned below.
|
||||||
|
|
||||||
|
- PHP >= 8.1 (This is the version required by spc itself, not the build version)
|
||||||
|
- Extension: `mbstring,tokenizer,phar`
|
||||||
|
- Supported OS with `curl` and `git` installed
|
||||||
|
|
||||||
Here is the supported OS and arch, where :octocat: represents support for GitHub Action builds,
|
Here is the supported OS and arch, where :octocat: represents support for GitHub Action builds,
|
||||||
:computer: represents support for local manual builds, and blank represents not currently supported.
|
:computer: represents support for local manual builds, and blank represents not currently supported.
|
||||||
|
|
||||||
| | x86_64 | aarch64 |
|
| | x86_64 | aarch64 |
|
||||||
|---------|----------------------|----------------------|
|
|---------|----------------------|----------------------|
|
||||||
| macOS | :octocat: :computer: | :computer: |
|
| macOS | :octocat: :computer: | :octocat: :computer: |
|
||||||
| Linux | :octocat: :computer: | :octocat: :computer: |
|
| Linux | :octocat: :computer: | :octocat: :computer: |
|
||||||
| Windows | | |
|
| Windows | :octocat: :computer: | |
|
||||||
| FreeBSD | :computer: | :computer: |
|
| FreeBSD | :computer: | :computer: |
|
||||||
|
|
||||||
Currently supported PHP versions for compilation are: `7.3`, `7.4`, `8.0`, `8.1`, `8.2`, `8.3`.
|
Currently supported PHP versions for compilation:
|
||||||
|
|
||||||
|
> :warning: supported but not maintained by static-php-cli authors
|
||||||
|
>
|
||||||
|
> :heavy_check_mark: supported
|
||||||
|
>
|
||||||
|
> :x: not supported
|
||||||
|
|
||||||
|
| PHP Version | Status | Comment |
|
||||||
|
|-------------|--------------------|---------------------------------------------------|
|
||||||
|
| 7.2 | :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 |
|
||||||
|
| 8.0 | :heavy_check_mark: | PHP official has stopped maintenance of 8.0 |
|
||||||
|
| 8.1 | :heavy_check_mark: | PHP official has security fixes only |
|
||||||
|
| 8.2 | :heavy_check_mark: | |
|
||||||
|
| 8.3 | :heavy_check_mark: | |
|
||||||
|
|
||||||
### Supported Extensions
|
### Supported Extensions
|
||||||
|
|
||||||
@@ -118,10 +139,16 @@ curl -o spc https://dl.static-php.dev/static-php-cli/spc-bin/nightly/spc-linux-a
|
|||||||
curl -o spc https://dl.static-php.dev/static-php-cli/spc-bin/nightly/spc-macos-x86_64
|
curl -o spc https://dl.static-php.dev/static-php-cli/spc-bin/nightly/spc-macos-x86_64
|
||||||
# macOS aarch64 (Apple)
|
# macOS aarch64 (Apple)
|
||||||
curl -o spc https://dl.static-php.dev/static-php-cli/spc-bin/nightly/spc-macos-aarch64
|
curl -o spc https://dl.static-php.dev/static-php-cli/spc-bin/nightly/spc-macos-aarch64
|
||||||
|
# Windows (x86_64, win10 build 17063 or later)
|
||||||
|
curl.exe -o spc.exe https://dl.static-php.dev/static-php-cli/spc-bin/nightly/spc-windows-x64.exe
|
||||||
|
|
||||||
# add x perm
|
# Add execute perm (Linux and macOS only)
|
||||||
chmod +x ./spc
|
chmod +x ./spc
|
||||||
|
|
||||||
|
# Run (Linux and macOS)
|
||||||
./spc --version
|
./spc --version
|
||||||
|
# Run (Windows powershell)
|
||||||
|
.\spc.exe --version
|
||||||
```
|
```
|
||||||
|
|
||||||
Self-hosted `spc` is built by GitHub Actions, you can also download from Actions artifacts [here](https://github.com/crazywhalecc/static-php-cli/actions/workflows/release-build.yml).
|
Self-hosted `spc` is built by GitHub Actions, you can also download from Actions artifacts [here](https://github.com/crazywhalecc/static-php-cli/actions/workflows/release-build.yml).
|
||||||
@@ -151,7 +178,7 @@ bin/spc --version
|
|||||||
|
|
||||||
Basic usage for building php with some extensions:
|
Basic usage for building php with some extensions:
|
||||||
|
|
||||||
> If you are using the packaged `spc` binary, you need to replace `bin/spc` with `./spc` in the following commands.
|
> If you are using the packaged standalone `spc` binary, you need to replace `bin/spc` with `./spc` or `.\spc.exe` in the following commands.
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Check system tool dependencies, auto-fix them if possible
|
# Check system tool dependencies, auto-fix them if possible
|
||||||
@@ -160,14 +187,16 @@ Basic usage for building php with some extensions:
|
|||||||
# fetch all libraries
|
# fetch all libraries
|
||||||
./bin/spc download --all
|
./bin/spc download --all
|
||||||
# only fetch necessary sources by needed extensions (recommended)
|
# only fetch necessary sources by needed extensions (recommended)
|
||||||
./bin/spc download --for-extensions=openssl,pcntl,mbstring,pdo_sqlite
|
./bin/spc download --for-extensions="openssl,pcntl,mbstring,pdo_sqlite"
|
||||||
# download different PHP version (--with-php=x.y, recommend 7.3 ~ 8.3)
|
# download different PHP version (--with-php=x.y, recommend 7.3 ~ 8.3)
|
||||||
./bin/spc download --for-extensions=openssl,curl,mbstring --with-php=8.1
|
./bin/spc download --for-extensions="openssl,curl,mbstring" --with-php=8.1
|
||||||
|
|
||||||
# with bcmath,openssl,tokenizer,sqlite3,pdo_sqlite,ftp,curl extension, build both CLI and phpmicro SAPI
|
# with bcmath,openssl,tokenizer,sqlite3,pdo_sqlite,ftp,curl extension, build both CLI and phpmicro SAPI
|
||||||
./bin/spc build bcmath,openssl,tokenizer,sqlite3,pdo_sqlite,ftp,curl --build-cli --build-micro
|
./bin/spc build "bcmath,openssl,tokenizer,sqlite3,pdo_sqlite,ftp,curl" --build-cli --build-micro
|
||||||
# build thread-safe (ZTS) version (--enable-zts)
|
# build thread-safe (ZTS) version (--enable-zts)
|
||||||
./bin/spc build curl,phar --enable-zts --build-cli
|
./bin/spc build "curl,phar" --enable-zts --build-cli
|
||||||
|
# build, pack executable with UPX (--with-upx-pack) (reduce binary size for 30~50%)
|
||||||
|
./bin/spc build "curl,phar" --enable-zts --build-cli --with-upx-pack
|
||||||
```
|
```
|
||||||
|
|
||||||
Now we support `cli`, `micro`, `fpm` and `embed` SAPI. You can use one or more of the following parameters to specify the compiled SAPI:
|
Now we support `cli`, `micro`, `fpm` and `embed` SAPI. You can use one or more of the following parameters to specify the compiled SAPI:
|
||||||
@@ -181,7 +210,7 @@ Now we support `cli`, `micro`, `fpm` and `embed` SAPI. You can use one or more o
|
|||||||
If anything goes wrong, use `--debug` option to display full terminal output:
|
If anything goes wrong, use `--debug` option to display full terminal output:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
./bin/spc build openssl,pcntl,mbstring --debug --build-all
|
./bin/spc build "openssl,pcntl,mbstring" --debug --build-all
|
||||||
./bin/spc download --all --debug
|
./bin/spc download --all --debug
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -274,7 +303,7 @@ Now there is a [static-php](https://github.com/static-php) organization, which i
|
|||||||
|
|
||||||
## Sponsor this project
|
## Sponsor this project
|
||||||
|
|
||||||
You can sponsor my project on [this page](https://github.com/crazywhalecc/crazywhalecc/blob/master/FUNDING.md).
|
You can sponsor my project on [this page](https://github.com/crazywhalecc/crazywhalecc/blob/master/FUNDING.md). A portion of your donation will be used to maintain the **static-php.dev** server.
|
||||||
|
|
||||||
## Open-Source License
|
## Open-Source License
|
||||||
|
|
||||||
@@ -287,6 +316,9 @@ These are similar projects:
|
|||||||
- [dixyes/lwmbs](https://github.com/dixyes/lwmbs)
|
- [dixyes/lwmbs](https://github.com/dixyes/lwmbs)
|
||||||
- [swoole/swoole-cli](https://github.com/swoole/swoole-cli)
|
- [swoole/swoole-cli](https://github.com/swoole/swoole-cli)
|
||||||
|
|
||||||
|
The project uses some code from [dixyes/lwmbs](https://github.com/dixyes/lwmbs), such as windows static build target and libiconv support.
|
||||||
|
lwmbs is licensed under the [Mulan PSL 2](http://license.coscl.org.cn/MulanPSL2).
|
||||||
|
|
||||||
Due to the special nature of this project,
|
Due to the special nature of this project,
|
||||||
many other open source projects such as curl and protobuf will be used during the project compilation process,
|
many other open source projects such as curl and protobuf will be used during the project compilation process,
|
||||||
and they all have their own open source licenses.
|
and they all have their own open source licenses.
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ function RemoveFromPath {
|
|||||||
$currentPath = [System.Environment]::GetEnvironmentVariable('Path', 'User')
|
$currentPath = [System.Environment]::GetEnvironmentVariable('Path', 'User')
|
||||||
|
|
||||||
if ($currentPath -like "*$pathToRemove*") {
|
if ($currentPath -like "*$pathToRemove*") {
|
||||||
$newPath = $currentPath -replace [regex]::Escape($pathToRemove), ''
|
$newPath = $currentPath -replace [regex]::Escape(';' + $pathToRemove), ''
|
||||||
[System.Environment]::SetEnvironmentVariable('Path', $newPath, 'User')
|
[System.Environment]::SetEnvironmentVariable('Path', $newPath, 'User')
|
||||||
Write-Host "Removed Path '$pathToRemove'"
|
Write-Host "Removed Path '$pathToRemove'"
|
||||||
} else {
|
} else {
|
||||||
@@ -92,7 +92,7 @@ if (-not(Test-Path "runtime\composer.phar"))
|
|||||||
# create runtime\composer.ps1
|
# create runtime\composer.ps1
|
||||||
$ComposerContent = '
|
$ComposerContent = '
|
||||||
$WorkingDir = (Split-Path -Parent $MyInvocation.MyCommand.Definition)
|
$WorkingDir = (Split-Path -Parent $MyInvocation.MyCommand.Definition)
|
||||||
Start-Process ($WorkingDir + "\php.exe") ($WorkingDir + "\composer.phar " + $args) -NoNewWindow -Wait
|
& ($WorkingDir + "\php.exe") (Join-Path $WorkingDir "\composer.phar") @args
|
||||||
'
|
'
|
||||||
$ComposerContent | Set-Content -Path 'runtime\composer.ps1' -Encoding UTF8
|
$ComposerContent | Set-Content -Path 'runtime\composer.ps1' -Encoding UTF8
|
||||||
|
|
||||||
|
|||||||
1
bin/spc
1
bin/spc
@@ -21,4 +21,5 @@ try {
|
|||||||
(new ConsoleApplication())->run();
|
(new ConsoleApplication())->run();
|
||||||
} catch (Exception $e) {
|
} catch (Exception $e) {
|
||||||
ExceptionHandler::getInstance()->handle($e);
|
ExceptionHandler::getInstance()->handle($e);
|
||||||
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
$PHP_Exec = "runtime\php.exe"
|
$PHP_Exec = ".\runtime\php.exe"
|
||||||
|
|
||||||
if (-not(Test-Path $PHP_Exec)) {
|
if (-not(Test-Path $PHP_Exec)) {
|
||||||
$PHP_Exec = Get-Command php.exe -ErrorAction SilentlyContinue | Select-Object -ExpandProperty Definition
|
$PHP_Exec = Get-Command php.exe -ErrorAction SilentlyContinue | Select-Object -ExpandProperty Definition
|
||||||
@@ -8,5 +8,5 @@ if (-not(Test-Path $PHP_Exec)) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$phpArgs = "bin\spc " + $args
|
& "$PHP_Exec" ("bin/spc") @args
|
||||||
Start-Process $PHP_Exec -ArgumentList $phpArgs -NoNewWindow -Wait
|
exit $LASTEXITCODE
|
||||||
|
|||||||
2
box.json
2
box.json
@@ -4,6 +4,7 @@
|
|||||||
"blacklist": [
|
"blacklist": [
|
||||||
".github"
|
".github"
|
||||||
],
|
],
|
||||||
|
"compression": "GZ",
|
||||||
"directories": [
|
"directories": [
|
||||||
"config",
|
"config",
|
||||||
"src",
|
"src",
|
||||||
@@ -14,6 +15,5 @@
|
|||||||
"vendor/zhamao"
|
"vendor/zhamao"
|
||||||
],
|
],
|
||||||
"git-commit-short": "git_commit_short",
|
"git-commit-short": "git_commit_short",
|
||||||
"metadata": "ConsoleApplication::VERSION",
|
|
||||||
"output": "spc.phar"
|
"output": "spc.phar"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,13 +16,13 @@
|
|||||||
"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.3",
|
"humbug/box": "^4.5",
|
||||||
"nunomaduro/collision": "^7.8",
|
"nunomaduro/collision": "^7.8",
|
||||||
"phpstan/phpstan": "^1.10",
|
"phpstan/phpstan": "^1.10",
|
||||||
"phpunit/phpunit": "^10.3"
|
"phpunit/phpunit": "^10.3 || ^9"
|
||||||
},
|
},
|
||||||
"autoload": {
|
"autoload": {
|
||||||
"psr-4": {
|
"psr-4": {
|
||||||
@@ -50,9 +50,17 @@
|
|||||||
"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
|
||||||
}
|
},
|
||||||
|
"funding": [
|
||||||
|
{
|
||||||
|
"type": "other",
|
||||||
|
"url": "https://github.com/crazywhalecc/crazywhalecc/blob/master/FUNDING.md"
|
||||||
|
}
|
||||||
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
2436
composer.lock
generated
2436
composer.lock
generated
File diff suppressed because it is too large
Load Diff
417
config/ext.json
417
config/ext.json
@@ -1,4 +1,18 @@
|
|||||||
{
|
{
|
||||||
|
"amqp": {
|
||||||
|
"support": {
|
||||||
|
"BSD": "wip"
|
||||||
|
},
|
||||||
|
"type": "external",
|
||||||
|
"arg-type": "custom",
|
||||||
|
"source": "amqp",
|
||||||
|
"lib-depends": [
|
||||||
|
"librabbitmq"
|
||||||
|
],
|
||||||
|
"ext-depends-windows": [
|
||||||
|
"openssl"
|
||||||
|
]
|
||||||
|
},
|
||||||
"apcu": {
|
"apcu": {
|
||||||
"type": "external",
|
"type": "external",
|
||||||
"source": "apcu"
|
"source": "apcu"
|
||||||
@@ -7,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": [
|
||||||
@@ -20,26 +37,58 @@
|
|||||||
"type": "builtin"
|
"type": "builtin"
|
||||||
},
|
},
|
||||||
"curl": {
|
"curl": {
|
||||||
|
"notes": true,
|
||||||
"type": "builtin",
|
"type": "builtin",
|
||||||
"arg-type": "with",
|
"arg-type": "with",
|
||||||
"lib-depends": [
|
"lib-depends": [
|
||||||
"curl"
|
"curl"
|
||||||
|
],
|
||||||
|
"ext-depends-windows": [
|
||||||
|
"zlib",
|
||||||
|
"openssl"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"dba": {
|
"dba": {
|
||||||
"type": "builtin",
|
"type": "builtin",
|
||||||
"arg-type-windows": "with"
|
"arg-type": "custom",
|
||||||
|
"lib-suggests": [
|
||||||
|
"qdbm"
|
||||||
|
]
|
||||||
},
|
},
|
||||||
"dom": {
|
"dom": {
|
||||||
|
"support": {
|
||||||
|
"BSD": "wip"
|
||||||
|
},
|
||||||
"type": "builtin",
|
"type": "builtin",
|
||||||
"arg-type": "custom",
|
"arg-type": "custom",
|
||||||
"arg-type-windows": "with",
|
"arg-type-windows": "with",
|
||||||
"lib-depends": [
|
"lib-depends": [
|
||||||
"libxml2",
|
"libxml2",
|
||||||
"zlib"
|
"zlib"
|
||||||
|
],
|
||||||
|
"ext-depends-windows": [
|
||||||
|
"xml"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
"ds": {
|
||||||
|
"type": "external",
|
||||||
|
"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",
|
||||||
@@ -57,10 +106,18 @@
|
|||||||
"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": [
|
"lib-depends-unix": [
|
||||||
"libffi"
|
"libffi"
|
||||||
|
],
|
||||||
|
"lib-depends-windows": [
|
||||||
|
"libffi-win"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"fileinfo": {
|
"fileinfo": {
|
||||||
@@ -76,6 +133,10 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"gd": {
|
"gd": {
|
||||||
|
"support": {
|
||||||
|
"BSD": "wip"
|
||||||
|
},
|
||||||
|
"notes": true,
|
||||||
"type": "builtin",
|
"type": "builtin",
|
||||||
"arg-type": "custom",
|
"arg-type": "custom",
|
||||||
"arg-type-windows": "with",
|
"arg-type-windows": "with",
|
||||||
@@ -94,21 +155,36 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"gettext": {
|
"gettext": {
|
||||||
|
"support": {
|
||||||
|
"Windows": "wip",
|
||||||
|
"BSD": "wip"
|
||||||
|
},
|
||||||
"type": "builtin",
|
"type": "builtin",
|
||||||
"arg-type": "with",
|
"arg-type": "with-prefix",
|
||||||
"lib-depends": [
|
"lib-depends": [
|
||||||
"gettext"
|
"gettext"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"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",
|
||||||
"lib-depends": [
|
"lib-depends": [
|
||||||
"glfw"
|
"glfw"
|
||||||
]
|
],
|
||||||
|
"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": [
|
||||||
@@ -116,17 +192,32 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"iconv": {
|
"iconv": {
|
||||||
|
"support": {
|
||||||
|
"BSD": "wip"
|
||||||
|
},
|
||||||
"type": "builtin",
|
"type": "builtin",
|
||||||
"arg-type": "with-prefix",
|
"arg-type": "with-prefix",
|
||||||
"lib-depends": [
|
"arg-type-windows": "with",
|
||||||
|
"lib-depends-unix": [
|
||||||
"libiconv"
|
"libiconv"
|
||||||
|
],
|
||||||
|
"lib-depends-windows": [
|
||||||
|
"libiconv-win"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"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",
|
||||||
@@ -135,26 +226,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": [
|
||||||
@@ -168,6 +277,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",
|
||||||
@@ -182,7 +301,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",
|
||||||
@@ -194,6 +327,11 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"memcached": {
|
"memcached": {
|
||||||
|
"support": {
|
||||||
|
"Windows": "wip",
|
||||||
|
"BSD": "wip",
|
||||||
|
"Linux": "no"
|
||||||
|
},
|
||||||
"type": "external",
|
"type": "external",
|
||||||
"source": "memcached",
|
"source": "memcached",
|
||||||
"arg-type": "custom",
|
"arg-type": "custom",
|
||||||
@@ -207,6 +345,10 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"mongodb": {
|
"mongodb": {
|
||||||
|
"support": {
|
||||||
|
"BSD": "wip",
|
||||||
|
"Windows": "wip"
|
||||||
|
},
|
||||||
"type": "external",
|
"type": "external",
|
||||||
"source": "mongodb",
|
"source": "mongodb",
|
||||||
"arg-type": "custom",
|
"arg-type": "custom",
|
||||||
@@ -231,13 +373,25 @@
|
|||||||
"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",
|
||||||
"lib-depends": [
|
"lib-depends": [
|
||||||
"openssl",
|
"openssl",
|
||||||
"zlib"
|
"zlib"
|
||||||
@@ -246,7 +400,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": [
|
||||||
@@ -254,6 +425,9 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"pcntl": {
|
"pcntl": {
|
||||||
|
"support": {
|
||||||
|
"Windows": "no"
|
||||||
|
},
|
||||||
"type": "builtin",
|
"type": "builtin",
|
||||||
"unix-only": true
|
"unix-only": true
|
||||||
},
|
},
|
||||||
@@ -269,6 +443,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": [
|
||||||
@@ -280,6 +458,9 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"pdo_sqlite": {
|
"pdo_sqlite": {
|
||||||
|
"support": {
|
||||||
|
"BSD": "wip"
|
||||||
|
},
|
||||||
"type": "builtin",
|
"type": "builtin",
|
||||||
"arg-type": "with",
|
"arg-type": "with",
|
||||||
"ext-depends": [
|
"ext-depends": [
|
||||||
@@ -290,7 +471,25 @@
|
|||||||
"sqlite"
|
"sqlite"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
"pdo_sqlsrv": {
|
||||||
|
"support": {
|
||||||
|
"Windows": "wip",
|
||||||
|
"BSD": "wip"
|
||||||
|
},
|
||||||
|
"type": "external",
|
||||||
|
"source": "pdo_sqlsrv",
|
||||||
|
"arg-type": "with",
|
||||||
|
"ext-depends": [
|
||||||
|
"pdo",
|
||||||
|
"sqlsrv"
|
||||||
|
]
|
||||||
|
},
|
||||||
"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": [
|
||||||
@@ -304,26 +503,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"
|
||||||
},
|
},
|
||||||
"pspell": {
|
|
||||||
"type": "builtin",
|
|
||||||
"arg-type": "with",
|
|
||||||
"lib-depends": [
|
|
||||||
"aspell"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"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": [
|
||||||
@@ -331,6 +540,10 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"redis": {
|
"redis": {
|
||||||
|
"support": {
|
||||||
|
"Windows": "wip",
|
||||||
|
"BSD": "wip"
|
||||||
|
},
|
||||||
"type": "external",
|
"type": "external",
|
||||||
"source": "redis",
|
"source": "redis",
|
||||||
"arg-type": "custom",
|
"arg-type": "custom",
|
||||||
@@ -349,15 +562,29 @@
|
|||||||
"shmop": {
|
"shmop": {
|
||||||
"type": "builtin"
|
"type": "builtin"
|
||||||
},
|
},
|
||||||
|
"simdjson": {
|
||||||
|
"type": "external",
|
||||||
|
"source": "ext-simdjson",
|
||||||
|
"cpp-extension": true
|
||||||
|
},
|
||||||
"simplexml": {
|
"simplexml": {
|
||||||
|
"support": {
|
||||||
|
"BSD": "wip"
|
||||||
|
},
|
||||||
"type": "builtin",
|
"type": "builtin",
|
||||||
"arg-type": "custom",
|
"arg-type": "custom",
|
||||||
"arg-type-windows": "with",
|
|
||||||
"lib-depends": [
|
"lib-depends": [
|
||||||
"libxml2"
|
"libxml2"
|
||||||
|
],
|
||||||
|
"ext-depends-windows": [
|
||||||
|
"xml"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"snappy": {
|
"snappy": {
|
||||||
|
"support": {
|
||||||
|
"Windows": "wip",
|
||||||
|
"BSD": "wip"
|
||||||
|
},
|
||||||
"type": "external",
|
"type": "external",
|
||||||
"source": "ext-snappy",
|
"source": "ext-snappy",
|
||||||
"cpp-extension": true,
|
"cpp-extension": true,
|
||||||
@@ -369,24 +596,27 @@
|
|||||||
"apcu"
|
"apcu"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"snmp": {
|
|
||||||
"type": "builtin",
|
|
||||||
"arg-type": "with",
|
|
||||||
"lib-depends": [
|
|
||||||
"net-snmp"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"soap": {
|
"soap": {
|
||||||
|
"support": {
|
||||||
|
"BSD": "wip"
|
||||||
|
},
|
||||||
"type": "builtin",
|
"type": "builtin",
|
||||||
"arg-type": "custom",
|
"arg-type": "custom",
|
||||||
"lib-depends": [
|
"lib-depends": [
|
||||||
"libxml2"
|
"libxml2"
|
||||||
|
],
|
||||||
|
"ext-depends-windows": [
|
||||||
|
"xml"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"sockets": {
|
"sockets": {
|
||||||
"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": [
|
||||||
@@ -394,13 +624,21 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"sqlite3": {
|
"sqlite3": {
|
||||||
|
"support": {
|
||||||
|
"BSD": "wip"
|
||||||
|
},
|
||||||
"type": "builtin",
|
"type": "builtin",
|
||||||
"arg-type": "with-prefix",
|
"arg-type": "with-prefix",
|
||||||
|
"arg-type-windows": "with",
|
||||||
"lib-depends": [
|
"lib-depends": [
|
||||||
"sqlite"
|
"sqlite"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"sqlsrv": {
|
"sqlsrv": {
|
||||||
|
"support": {
|
||||||
|
"Windows": "wip",
|
||||||
|
"BSD": "wip"
|
||||||
|
},
|
||||||
"type": "external",
|
"type": "external",
|
||||||
"source": "sqlsrv",
|
"source": "sqlsrv",
|
||||||
"lib-depends": [
|
"lib-depends": [
|
||||||
@@ -412,14 +650,27 @@
|
|||||||
"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",
|
||||||
|
"arg-type-windows": "with",
|
||||||
"lib-depends": [
|
"lib-depends": [
|
||||||
"libssh2"
|
"libssh2"
|
||||||
|
],
|
||||||
|
"ext-depends-windows": [
|
||||||
|
"openssl",
|
||||||
|
"zlib"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"swoole": {
|
"swoole": {
|
||||||
|
"support": {
|
||||||
|
"Windows": "no",
|
||||||
|
"BSD": "wip"
|
||||||
|
},
|
||||||
|
"notes": true,
|
||||||
"type": "external",
|
"type": "external",
|
||||||
"source": "swoole",
|
"source": "swoole",
|
||||||
"arg-type": "custom",
|
"arg-type": "custom",
|
||||||
@@ -442,6 +693,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": [
|
||||||
@@ -454,6 +710,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": [
|
||||||
@@ -462,6 +724,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": [
|
||||||
@@ -470,6 +737,11 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"swow": {
|
"swow": {
|
||||||
|
"support": {
|
||||||
|
"Windows": "wip",
|
||||||
|
"BSD": "wip"
|
||||||
|
},
|
||||||
|
"notes": true,
|
||||||
"type": "external",
|
"type": "external",
|
||||||
"source": "swow",
|
"source": "swow",
|
||||||
"arg-type": "custom",
|
"arg-type": "custom",
|
||||||
@@ -483,18 +755,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": {
|
||||||
"type": "builtin",
|
"support": {
|
||||||
"unix-only": true
|
"BSD": "wip"
|
||||||
|
},
|
||||||
|
"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": [
|
||||||
@@ -504,7 +790,23 @@
|
|||||||
"tokenizer": {
|
"tokenizer": {
|
||||||
"type": "builtin"
|
"type": "builtin"
|
||||||
},
|
},
|
||||||
|
"uuid": {
|
||||||
|
"support": {
|
||||||
|
"Windows": "wip",
|
||||||
|
"BSD": "wip"
|
||||||
|
},
|
||||||
|
"type": "external",
|
||||||
|
"source": "ext-uuid",
|
||||||
|
"arg-type": "with-prefix",
|
||||||
|
"lib-depends": [
|
||||||
|
"libuuid"
|
||||||
|
]
|
||||||
|
},
|
||||||
"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",
|
||||||
@@ -515,7 +817,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": [
|
||||||
@@ -523,37 +840,68 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"xlswriter": {
|
"xlswriter": {
|
||||||
|
"support": {
|
||||||
|
"Windows": "wip",
|
||||||
|
"BSD": "wip"
|
||||||
|
},
|
||||||
"type": "external",
|
"type": "external",
|
||||||
"source": "xlswriter",
|
"source": "xlswriter",
|
||||||
"arg-type": "custom",
|
"arg-type": "custom",
|
||||||
"ext-depends": [
|
"ext-depends": [
|
||||||
"zlib",
|
"zlib",
|
||||||
"zip"
|
"zip"
|
||||||
|
],
|
||||||
|
"lib-suggests": [
|
||||||
|
"openssl"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"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",
|
||||||
"lib-depends": [
|
"lib-depends": [
|
||||||
"libxml2"
|
"libxml2"
|
||||||
|
],
|
||||||
|
"ext-depends-windows": [
|
||||||
|
"iconv"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"xmlreader": {
|
"xmlreader": {
|
||||||
|
"support": {
|
||||||
|
"BSD": "wip"
|
||||||
|
},
|
||||||
"type": "builtin",
|
"type": "builtin",
|
||||||
"arg-type": "custom",
|
"arg-type": "custom",
|
||||||
"lib-depends": [
|
"lib-depends": [
|
||||||
"libxml2"
|
"libxml2"
|
||||||
|
],
|
||||||
|
"ext-depends-windows": [
|
||||||
|
"xml",
|
||||||
|
"dom"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"xmlwriter": {
|
"xmlwriter": {
|
||||||
|
"support": {
|
||||||
|
"BSD": "wip"
|
||||||
|
},
|
||||||
"type": "builtin",
|
"type": "builtin",
|
||||||
"arg-type": "custom",
|
"arg-type": "custom",
|
||||||
"lib-depends": [
|
"lib-depends": [
|
||||||
"libxml2"
|
"libxml2"
|
||||||
|
],
|
||||||
|
"ext-depends-windows": [
|
||||||
|
"xml"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"xsl": {
|
"xsl": {
|
||||||
|
"support": {
|
||||||
|
"Windows": "wip",
|
||||||
|
"BSD": "wip"
|
||||||
|
},
|
||||||
"type": "builtin",
|
"type": "builtin",
|
||||||
"arg-type": "with-prefix",
|
"arg-type": "with-prefix",
|
||||||
"lib-depends": [
|
"lib-depends": [
|
||||||
@@ -564,7 +912,22 @@
|
|||||||
"dom"
|
"dom"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
"yac": {
|
||||||
|
"support": {
|
||||||
|
"BSD": "wip"
|
||||||
|
},
|
||||||
|
"type": "external",
|
||||||
|
"source": "yac",
|
||||||
|
"arg-type-unix": "custom",
|
||||||
|
"ext-depends-unix": [
|
||||||
|
"igbinary"
|
||||||
|
]
|
||||||
|
},
|
||||||
"yaml": {
|
"yaml": {
|
||||||
|
"support": {
|
||||||
|
"Windows": "wip",
|
||||||
|
"BSD": "wip"
|
||||||
|
},
|
||||||
"type": "external",
|
"type": "external",
|
||||||
"source": "yaml",
|
"source": "yaml",
|
||||||
"arg-type": "with-prefix",
|
"arg-type": "with-prefix",
|
||||||
@@ -573,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",
|
||||||
@@ -589,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",
|
||||||
|
|||||||
148
config/lib.json
148
config/lib.json
@@ -36,7 +36,7 @@
|
|||||||
"libcurl.a"
|
"libcurl.a"
|
||||||
],
|
],
|
||||||
"static-libs-windows": [
|
"static-libs-windows": [
|
||||||
"libcurl.lib"
|
"libcurl_a.lib"
|
||||||
],
|
],
|
||||||
"headers": [
|
"headers": [
|
||||||
"curl"
|
"curl"
|
||||||
@@ -45,21 +45,21 @@
|
|||||||
"openssl",
|
"openssl",
|
||||||
"zlib"
|
"zlib"
|
||||||
],
|
],
|
||||||
"lib-suggests": [
|
"lib-depends-windows": [
|
||||||
|
"openssl",
|
||||||
|
"zlib",
|
||||||
|
"libssh2",
|
||||||
|
"nghttp2"
|
||||||
|
],
|
||||||
|
"lib-suggests-unix": [
|
||||||
"libssh2",
|
"libssh2",
|
||||||
"brotli",
|
"brotli",
|
||||||
"nghttp2",
|
"nghttp2",
|
||||||
"zstd"
|
"zstd"
|
||||||
],
|
],
|
||||||
"lib-suggests-windows": [
|
"lib-suggests-windows": [
|
||||||
"zlib",
|
|
||||||
"libssh2",
|
|
||||||
"brotli",
|
"brotli",
|
||||||
"nghttp2",
|
"zstd"
|
||||||
"zstd",
|
|
||||||
"openssl",
|
|
||||||
"idn2",
|
|
||||||
"psl"
|
|
||||||
],
|
],
|
||||||
"frameworks": [
|
"frameworks": [
|
||||||
"CoreFoundation",
|
"CoreFoundation",
|
||||||
@@ -72,6 +72,9 @@
|
|||||||
"static-libs-unix": [
|
"static-libs-unix": [
|
||||||
"libfreetype.a"
|
"libfreetype.a"
|
||||||
],
|
],
|
||||||
|
"static-libs-windows": [
|
||||||
|
"libfreetype_a.lib"
|
||||||
|
],
|
||||||
"headers-unix": [
|
"headers-unix": [
|
||||||
"freetype2/freetype/freetype.h",
|
"freetype2/freetype/freetype.h",
|
||||||
"freetype2/ft2build.h"
|
"freetype2/ft2build.h"
|
||||||
@@ -85,6 +88,22 @@
|
|||||||
"brotli"
|
"brotli"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
"gettext": {
|
||||||
|
"source": "gettext",
|
||||||
|
"static-libs-unix": [
|
||||||
|
"libintl.a"
|
||||||
|
],
|
||||||
|
"lib-depends": [
|
||||||
|
"libiconv"
|
||||||
|
],
|
||||||
|
"lib-suggests": [
|
||||||
|
"ncurses",
|
||||||
|
"libxml2"
|
||||||
|
],
|
||||||
|
"frameworks": [
|
||||||
|
"CoreFoundation"
|
||||||
|
]
|
||||||
|
},
|
||||||
"glfw": {
|
"glfw": {
|
||||||
"source": "ext-glfw",
|
"source": "ext-glfw",
|
||||||
"static-libs-unix": [
|
"static-libs-unix": [
|
||||||
@@ -131,7 +150,8 @@
|
|||||||
"libpng",
|
"libpng",
|
||||||
"libjpeg",
|
"libjpeg",
|
||||||
"libwebp",
|
"libwebp",
|
||||||
"freetype"
|
"freetype",
|
||||||
|
"libtiff"
|
||||||
],
|
],
|
||||||
"lib-suggests": [
|
"lib-suggests": [
|
||||||
"zstd",
|
"zstd",
|
||||||
@@ -173,6 +193,9 @@
|
|||||||
"source": "libavif",
|
"source": "libavif",
|
||||||
"static-libs-unix": [
|
"static-libs-unix": [
|
||||||
"libavif.a"
|
"libavif.a"
|
||||||
|
],
|
||||||
|
"static-libs-windows": [
|
||||||
|
"avif.lib"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"libcares": {
|
"libcares": {
|
||||||
@@ -217,6 +240,17 @@
|
|||||||
"ffitarget.h"
|
"ffitarget.h"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
"libffi-win": {
|
||||||
|
"source": "libffi-win",
|
||||||
|
"static-libs-windows": [
|
||||||
|
"libffi.lib"
|
||||||
|
],
|
||||||
|
"headers-windows": [
|
||||||
|
"ffi.h",
|
||||||
|
"ffitarget.h",
|
||||||
|
"fficonfig.h"
|
||||||
|
]
|
||||||
|
},
|
||||||
"libiconv": {
|
"libiconv": {
|
||||||
"source": "libiconv",
|
"source": "libiconv",
|
||||||
"static-libs-unix": [
|
"static-libs-unix": [
|
||||||
@@ -229,11 +263,24 @@
|
|||||||
"localcharset.h"
|
"localcharset.h"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
"libiconv-win": {
|
||||||
|
"source": "libiconv-win",
|
||||||
|
"static-libs-windows": [
|
||||||
|
"libiconv.lib",
|
||||||
|
"libiconv_a.lib"
|
||||||
|
]
|
||||||
|
},
|
||||||
"libjpeg": {
|
"libjpeg": {
|
||||||
"source": "libjpeg",
|
"source": "libjpeg",
|
||||||
"static-libs-unix": [
|
"static-libs-unix": [
|
||||||
"libjpeg.a",
|
"libjpeg.a",
|
||||||
"libturbojpeg.a"
|
"libturbojpeg.a"
|
||||||
|
],
|
||||||
|
"static-libs-windows": [
|
||||||
|
"libjpeg_a.lib"
|
||||||
|
],
|
||||||
|
"lib-suggests-windows": [
|
||||||
|
"zlib"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"liblz4": {
|
"liblz4": {
|
||||||
@@ -255,7 +302,8 @@
|
|||||||
"libpng16.a"
|
"libpng16.a"
|
||||||
],
|
],
|
||||||
"static-libs-windows": [
|
"static-libs-windows": [
|
||||||
"libpng16_static.lib"
|
"libpng16_static.lib",
|
||||||
|
"libpng_a.lib"
|
||||||
],
|
],
|
||||||
"headers-unix": [
|
"headers-unix": [
|
||||||
"png.h",
|
"png.h",
|
||||||
@@ -270,6 +318,18 @@
|
|||||||
"zlib"
|
"zlib"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
"librabbitmq": {
|
||||||
|
"source": "librabbitmq",
|
||||||
|
"static-libs-unix": [
|
||||||
|
"librabbitmq.a"
|
||||||
|
],
|
||||||
|
"static-libs-windows": [
|
||||||
|
"rabbitmq.4.lib"
|
||||||
|
],
|
||||||
|
"lib-depends": [
|
||||||
|
"openssl"
|
||||||
|
]
|
||||||
|
},
|
||||||
"libsodium": {
|
"libsodium": {
|
||||||
"source": "libsodium",
|
"source": "libsodium",
|
||||||
"static-libs-unix": [
|
"static-libs-unix": [
|
||||||
@@ -296,6 +356,21 @@
|
|||||||
"zlib"
|
"zlib"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
"libtiff": {
|
||||||
|
"source": "libtiff",
|
||||||
|
"static-libs-unix": [
|
||||||
|
"libtiff.a"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"libuuid": {
|
||||||
|
"source": "libuuid",
|
||||||
|
"static-libs-unix": [
|
||||||
|
"libuuid.a"
|
||||||
|
],
|
||||||
|
"headers": [
|
||||||
|
"uuid/uuid.h"
|
||||||
|
]
|
||||||
|
},
|
||||||
"libuv": {
|
"libuv": {
|
||||||
"source": "libuv",
|
"source": "libuv",
|
||||||
"static-libs-unix": [
|
"static-libs-unix": [
|
||||||
@@ -310,6 +385,12 @@
|
|||||||
"libwebpdemux.a",
|
"libwebpdemux.a",
|
||||||
"libwebpmux.a",
|
"libwebpmux.a",
|
||||||
"libsharpyuv.a"
|
"libsharpyuv.a"
|
||||||
|
],
|
||||||
|
"static-libs-windows": [
|
||||||
|
"libwebp.lib",
|
||||||
|
"libwebpdecoder.lib",
|
||||||
|
"libwebpdemux.lib",
|
||||||
|
"libsharpyuv.lib"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"libxml2": {
|
"libxml2": {
|
||||||
@@ -318,21 +399,25 @@
|
|||||||
"libxml2.a"
|
"libxml2.a"
|
||||||
],
|
],
|
||||||
"static-libs-windows": [
|
"static-libs-windows": [
|
||||||
[
|
"libxml2s.lib",
|
||||||
"libxml2s.lib",
|
"libxml2_a.lib"
|
||||||
"libxml2_a.lib"
|
|
||||||
]
|
|
||||||
],
|
],
|
||||||
"headers": [
|
"headers": [
|
||||||
"libxml2"
|
"libxml2"
|
||||||
],
|
],
|
||||||
"lib-depends": [
|
"lib-depends-unix": [
|
||||||
"libiconv"
|
"libiconv"
|
||||||
],
|
],
|
||||||
"lib-suggests": [
|
"lib-suggests-unix": [
|
||||||
"xz",
|
"xz",
|
||||||
"icu",
|
"icu",
|
||||||
"zlib"
|
"zlib"
|
||||||
|
],
|
||||||
|
"lib-depends-windows": [
|
||||||
|
"libiconv-win"
|
||||||
|
],
|
||||||
|
"lib-suggests-windows": [
|
||||||
|
"zlib"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"libxslt": {
|
"libxslt": {
|
||||||
@@ -413,10 +498,8 @@
|
|||||||
"libonig.a"
|
"libonig.a"
|
||||||
],
|
],
|
||||||
"static-libs-windows": [
|
"static-libs-windows": [
|
||||||
[
|
"onig.lib",
|
||||||
"onig.lib",
|
"onig_a.lib"
|
||||||
"onig_a.lib"
|
|
||||||
]
|
|
||||||
],
|
],
|
||||||
"headers": [
|
"headers": [
|
||||||
"oniggnu.h",
|
"oniggnu.h",
|
||||||
@@ -464,6 +547,24 @@
|
|||||||
"zstd"
|
"zstd"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
"pthreads4w": {
|
||||||
|
"source": "pthreads4w",
|
||||||
|
"static-libs-windows": [
|
||||||
|
"libpthreadVC3.lib"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"qdbm": {
|
||||||
|
"source": "qdbm",
|
||||||
|
"static-libs-unix": [
|
||||||
|
"libqdbm.a"
|
||||||
|
],
|
||||||
|
"static-libs-windows": [
|
||||||
|
"qdbm_a.lib"
|
||||||
|
],
|
||||||
|
"headers-windows": [
|
||||||
|
"depot.h"
|
||||||
|
]
|
||||||
|
},
|
||||||
"readline": {
|
"readline": {
|
||||||
"source": "readline",
|
"source": "readline",
|
||||||
"static-libs-unix": [
|
"static-libs-unix": [
|
||||||
@@ -493,7 +594,10 @@
|
|||||||
"static-libs-unix": [
|
"static-libs-unix": [
|
||||||
"libsqlite3.a"
|
"libsqlite3.a"
|
||||||
],
|
],
|
||||||
"headers-unix": [
|
"static-libs-windows": [
|
||||||
|
"libsqlite3_a.lib"
|
||||||
|
],
|
||||||
|
"headers": [
|
||||||
"sqlite3.h",
|
"sqlite3.h",
|
||||||
"sqlite3ext.h"
|
"sqlite3ext.h"
|
||||||
]
|
]
|
||||||
|
|||||||
46
config/pkg.json
Normal file
46
config/pkg.json
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
{
|
||||||
|
"musl-toolchain-aarch64-linux": {
|
||||||
|
"type": "url",
|
||||||
|
"url": "https://dl.static-php.dev/static-php-cli/deps/musl-toolchain/aarch64-musl-toolchain.tgz"
|
||||||
|
},
|
||||||
|
"musl-toolchain-x86_64-linux": {
|
||||||
|
"type": "url",
|
||||||
|
"url": "https://dl.static-php.dev/static-php-cli/deps/musl-toolchain/x86_64-musl-toolchain.tgz"
|
||||||
|
},
|
||||||
|
"nasm-x86_64-win": {
|
||||||
|
"type": "url",
|
||||||
|
"url": "https://www.nasm.us/pub/nasm/releasebuilds/2.16.01/win64/nasm-2.16.01-win64.zip",
|
||||||
|
"extract-files": {
|
||||||
|
"nasm-2.16.01/nasm.exe": "{php_sdk_path}/bin/nasm.exe",
|
||||||
|
"nasm-2.16.01/ndisasm.exe": "{php_sdk_path}/bin/ndisasm.exe"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"strawberry-perl-x86_64-win": {
|
||||||
|
"type": "url",
|
||||||
|
"url": "https://github.com/StrawberryPerl/Perl-Dist-Strawberry/releases/download/SP_5380_5361/strawberry-perl-5.38.0.1-64bit-portable.zip"
|
||||||
|
},
|
||||||
|
"upx-aarch64-linux": {
|
||||||
|
"type": "ghrel",
|
||||||
|
"repo": "upx/upx",
|
||||||
|
"match": "upx.+-arm64_linux\\.tar\\.xz",
|
||||||
|
"extract-files": {
|
||||||
|
"upx": "{pkg_root_path}/bin/upx"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"upx-x86_64-linux": {
|
||||||
|
"type": "ghrel",
|
||||||
|
"repo": "upx/upx",
|
||||||
|
"match": "upx.+-amd64_linux\\.tar\\.xz",
|
||||||
|
"extract-files": {
|
||||||
|
"upx": "{pkg_root_path}/bin/upx"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"upx-x86_64-win": {
|
||||||
|
"type": "ghrel",
|
||||||
|
"repo": "upx/upx",
|
||||||
|
"match": "upx.+-win64\\.zip",
|
||||||
|
"extract-files": {
|
||||||
|
"upx-*-win64/upx.exe": "{pkg_root_path}/bin/upx.exe"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -6,6 +6,16 @@
|
|||||||
"path": "LICENSE"
|
"path": "LICENSE"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"amqp": {
|
||||||
|
"type": "url",
|
||||||
|
"url": "https://pecl.php.net/get/amqp",
|
||||||
|
"path": "php-src/ext/amqp",
|
||||||
|
"filename": "amqp.tgz",
|
||||||
|
"license": {
|
||||||
|
"type": "file",
|
||||||
|
"path": "LICENSE"
|
||||||
|
}
|
||||||
|
},
|
||||||
"apcu": {
|
"apcu": {
|
||||||
"type": "url",
|
"type": "url",
|
||||||
"url": "https://pecl.php.net/get/APCu",
|
"url": "https://pecl.php.net/get/APCu",
|
||||||
@@ -42,6 +52,16 @@
|
|||||||
"path": "COPYING"
|
"path": "COPYING"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"ext-ds": {
|
||||||
|
"type": "url",
|
||||||
|
"url": "https://pecl.php.net/get/ds",
|
||||||
|
"path": "php-src/ext/ds",
|
||||||
|
"filename": "ds.tgz",
|
||||||
|
"license": {
|
||||||
|
"type": "file",
|
||||||
|
"path": "LICENSE"
|
||||||
|
}
|
||||||
|
},
|
||||||
"ext-event": {
|
"ext-event": {
|
||||||
"type": "url",
|
"type": "url",
|
||||||
"url": "https://bitbucket.org/osmanov/pecl-event/get/3.0.8.tar.gz",
|
"url": "https://bitbucket.org/osmanov/pecl-event/get/3.0.8.tar.gz",
|
||||||
@@ -80,6 +100,16 @@
|
|||||||
"path": "LICENSE"
|
"path": "LICENSE"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"ext-simdjson": {
|
||||||
|
"type": "url",
|
||||||
|
"url": "https://pecl.php.net/get/simdjson",
|
||||||
|
"path": "php-src/ext/simdjson",
|
||||||
|
"filename": "simdjson.tgz",
|
||||||
|
"license": {
|
||||||
|
"type": "file",
|
||||||
|
"path": "LICENSE"
|
||||||
|
}
|
||||||
|
},
|
||||||
"ext-snappy": {
|
"ext-snappy": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"path": "php-src/ext/snappy",
|
"path": "php-src/ext/snappy",
|
||||||
@@ -100,6 +130,16 @@
|
|||||||
"path": "LICENSE"
|
"path": "LICENSE"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"ext-uuid": {
|
||||||
|
"type": "url",
|
||||||
|
"url": "https://pecl.php.net/get/uuid",
|
||||||
|
"path": "php-src/ext/uuid",
|
||||||
|
"filename": "uuid.tgz",
|
||||||
|
"license": {
|
||||||
|
"type": "file",
|
||||||
|
"path": "LICENSE"
|
||||||
|
}
|
||||||
|
},
|
||||||
"ext-uv": {
|
"ext-uv": {
|
||||||
"type": "url",
|
"type": "url",
|
||||||
"url": "https://pecl.php.net/get/uv",
|
"url": "https://pecl.php.net/get/uv",
|
||||||
@@ -129,9 +169,22 @@
|
|||||||
"path": "LICENSE.TXT"
|
"path": "LICENSE.TXT"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"gettext": {
|
||||||
|
"type": "filelist",
|
||||||
|
"url": "https://ftp.gnu.org/pub/gnu/gettext/",
|
||||||
|
"regex": "/href=\"(?<file>gettext-(?<version>[^\"]+)\\.tar\\.xz)\"/",
|
||||||
|
"license": {
|
||||||
|
"type": "file",
|
||||||
|
"path": "COPYING"
|
||||||
|
}
|
||||||
|
},
|
||||||
"gmp": {
|
"gmp": {
|
||||||
"type": "ghtagtar",
|
"type": "url",
|
||||||
"repo": "alisw/GMP",
|
"url": "https://dl.static-php.dev/static-php-cli/deps/gmp/gmp-6.3.0.tar.xz",
|
||||||
|
"alt": {
|
||||||
|
"type": "ghtagtar",
|
||||||
|
"repo": "alisw/GMP"
|
||||||
|
},
|
||||||
"license": {
|
"license": {
|
||||||
"type": "text",
|
"type": "text",
|
||||||
"text": "Since version 6, GMP is distributed under the dual licenses, GNU LGPL v3 and GNU GPL v2. These licenses make the library free to use, share, and improve, and allow you to pass on the result. The GNU licenses give freedoms, but also set firm restrictions on the use with non-free programs."
|
"text": "Since version 6, GMP is distributed under the dual licenses, GNU LGPL v3 and GNU GPL v2. These licenses make the library free to use, share, and improve, and allow you to pass on the result. The GNU licenses give freedoms, but also set firm restrictions on the use with non-free programs."
|
||||||
@@ -195,7 +248,7 @@
|
|||||||
"libargon2": {
|
"libargon2": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"rev": "master",
|
"rev": "master",
|
||||||
"url": "https://github.com/mpociot/phc-winner-argon2",
|
"url": "https://github.com/static-php/phc-winner-argon2",
|
||||||
"license": {
|
"license": {
|
||||||
"type": "file",
|
"type": "file",
|
||||||
"path": "LICENSE"
|
"path": "LICENSE"
|
||||||
@@ -210,9 +263,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"
|
||||||
@@ -236,6 +294,15 @@
|
|||||||
"path": "LICENSE"
|
"path": "LICENSE"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"libffi-win": {
|
||||||
|
"type": "git",
|
||||||
|
"rev": "master",
|
||||||
|
"url": "https://github.com/static-php/libffi-win.git",
|
||||||
|
"license": {
|
||||||
|
"type": "file",
|
||||||
|
"path": "LICENSE"
|
||||||
|
}
|
||||||
|
},
|
||||||
"libiconv": {
|
"libiconv": {
|
||||||
"type": "filelist",
|
"type": "filelist",
|
||||||
"url": "https://ftp.gnu.org/gnu/libiconv/",
|
"url": "https://ftp.gnu.org/gnu/libiconv/",
|
||||||
@@ -245,6 +312,15 @@
|
|||||||
"path": "COPYING"
|
"path": "COPYING"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"libiconv-win": {
|
||||||
|
"type": "git",
|
||||||
|
"rev": "master",
|
||||||
|
"url": "https://github.com/static-php/libiconv-win.git",
|
||||||
|
"license": {
|
||||||
|
"type": "file",
|
||||||
|
"path": "source/COPYING"
|
||||||
|
}
|
||||||
|
},
|
||||||
"libjpeg": {
|
"libjpeg": {
|
||||||
"type": "ghtar",
|
"type": "ghtar",
|
||||||
"repo": "libjpeg-turbo/libjpeg-turbo",
|
"repo": "libjpeg-turbo/libjpeg-turbo",
|
||||||
@@ -280,6 +356,15 @@
|
|||||||
"path": "LICENSE"
|
"path": "LICENSE"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"librabbitmq": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/alanxz/rabbitmq-c.git",
|
||||||
|
"rev": "master",
|
||||||
|
"license": {
|
||||||
|
"type": "file",
|
||||||
|
"path": "LICENSE"
|
||||||
|
}
|
||||||
|
},
|
||||||
"libsodium": {
|
"libsodium": {
|
||||||
"type": "ghrel",
|
"type": "ghrel",
|
||||||
"repo": "jedisct1/libsodium",
|
"repo": "jedisct1/libsodium",
|
||||||
@@ -298,6 +383,24 @@
|
|||||||
"path": "COPYING"
|
"path": "COPYING"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"libtiff": {
|
||||||
|
"type": "filelist",
|
||||||
|
"url": "https://download.osgeo.org/libtiff/",
|
||||||
|
"regex": "/href=\"(?<file>tiff-(?<version>[^\"]+)\\.tar\\.xz)\"/",
|
||||||
|
"license": {
|
||||||
|
"type": "file",
|
||||||
|
"path": "LICENSE.md"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"libuuid": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/static-php/libuuid.git",
|
||||||
|
"rev": "master",
|
||||||
|
"license": {
|
||||||
|
"type": "file",
|
||||||
|
"path": "COPYING"
|
||||||
|
}
|
||||||
|
},
|
||||||
"libuv": {
|
"libuv": {
|
||||||
"type": "ghtar",
|
"type": "ghtar",
|
||||||
"repo": "libuv/libuv",
|
"repo": "libuv/libuv",
|
||||||
@@ -322,7 +425,7 @@
|
|||||||
},
|
},
|
||||||
"libxml2": {
|
"libxml2": {
|
||||||
"type": "url",
|
"type": "url",
|
||||||
"url": "https://github.com/GNOME/libxml2/archive/refs/tags/v2.9.14.tar.gz",
|
"url": "https://github.com/GNOME/libxml2/archive/refs/tags/v2.12.5.tar.gz",
|
||||||
"license": {
|
"license": {
|
||||||
"type": "file",
|
"type": "file",
|
||||||
"path": "Copyright"
|
"path": "Copyright"
|
||||||
@@ -369,7 +472,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"
|
||||||
@@ -421,6 +524,26 @@
|
|||||||
"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": {
|
||||||
|
"type": "url",
|
||||||
|
"url": "https://pecl.php.net/get/pdo_sqlsrv",
|
||||||
|
"path": "php-src/ext/pdo_sqlsrv",
|
||||||
|
"filename": "pdo_sqlsrv.tgz",
|
||||||
|
"license": {
|
||||||
|
"type": "file",
|
||||||
|
"path": "LICENSE"
|
||||||
|
}
|
||||||
|
},
|
||||||
"pkg-config": {
|
"pkg-config": {
|
||||||
"type": "url",
|
"type": "url",
|
||||||
"url": "https://dl.static-php.dev/static-php-cli/deps/pkg-config/pkg-config-0.29.2.tar.gz",
|
"url": "https://dl.static-php.dev/static-php-cli/deps/pkg-config/pkg-config-0.29.2.tar.gz",
|
||||||
@@ -431,7 +554,7 @@
|
|||||||
},
|
},
|
||||||
"postgresql": {
|
"postgresql": {
|
||||||
"type": "url",
|
"type": "url",
|
||||||
"url": "https://ftp.postgresql.org/pub/source/v16.1/postgresql-16.1.tar.gz",
|
"url": "https://ftp.postgresql.org/pub/source/v16.2/postgresql-16.2.tar.bz2",
|
||||||
"license": {
|
"license": {
|
||||||
"type": "file",
|
"type": "file",
|
||||||
"path": "COPYRIGHT"
|
"path": "COPYRIGHT"
|
||||||
@@ -447,6 +570,24 @@
|
|||||||
"path": "LICENSE"
|
"path": "LICENSE"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"pthreads4w": {
|
||||||
|
"type": "git",
|
||||||
|
"rev": "master",
|
||||||
|
"url": "https://git.code.sf.net/p/pthreads4w/code",
|
||||||
|
"license": {
|
||||||
|
"type": "file",
|
||||||
|
"path": "LICENSE"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"qdbm": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/static-php/qdbm.git",
|
||||||
|
"rev": "main",
|
||||||
|
"license": {
|
||||||
|
"type": "file",
|
||||||
|
"path": "COPYING"
|
||||||
|
}
|
||||||
|
},
|
||||||
"rar": {
|
"rar": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/static-php/php-rar.git",
|
"url": "https://github.com/static-php/php-rar.git",
|
||||||
@@ -562,14 +703,23 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"xz": {
|
"xz": {
|
||||||
"type": "ghrel",
|
"type": "url",
|
||||||
"repo": "tukaani-project/xz",
|
"url": "https://fossies.org/linux/misc/xz-5.4.6.tar.xz",
|
||||||
"match": "xz-.+\\.tar\\.gz",
|
|
||||||
"license": {
|
"license": {
|
||||||
"type": "file",
|
"type": "file",
|
||||||
"path": "COPYING"
|
"path": "COPYING"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"yac": {
|
||||||
|
"type": "url",
|
||||||
|
"url": "https://pecl.php.net/get/yac",
|
||||||
|
"path": "php-src/ext/yac",
|
||||||
|
"filename": "yac.tgz",
|
||||||
|
"license": {
|
||||||
|
"type": "file",
|
||||||
|
"path": "LICENSE"
|
||||||
|
}
|
||||||
|
},
|
||||||
"yaml": {
|
"yaml": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"path": "php-src/ext/yaml",
|
"path": "php-src/ext/yaml",
|
||||||
|
|||||||
@@ -13,5 +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
|
||||||
@@ -6,24 +6,26 @@ namespace SPC;
|
|||||||
|
|
||||||
use SPC\command\BuildCliCommand;
|
use SPC\command\BuildCliCommand;
|
||||||
use SPC\command\BuildLibsCommand;
|
use SPC\command\BuildLibsCommand;
|
||||||
|
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;
|
||||||
use SPC\command\DownloadCommand;
|
use SPC\command\DownloadCommand;
|
||||||
use SPC\command\DumpLicenseCommand;
|
use SPC\command\DumpLicenseCommand;
|
||||||
use SPC\command\ExtractCommand;
|
use SPC\command\ExtractCommand;
|
||||||
|
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.0.1';
|
public const VERSION = '2.2.4';
|
||||||
|
|
||||||
public function __construct()
|
public function __construct()
|
||||||
{
|
{
|
||||||
@@ -31,24 +33,24 @@ final class ConsoleApplication extends Application
|
|||||||
|
|
||||||
$this->addCommands(
|
$this->addCommands(
|
||||||
[
|
[
|
||||||
|
// Common commands
|
||||||
new BuildCliCommand(),
|
new BuildCliCommand(),
|
||||||
new BuildLibsCommand(),
|
new BuildLibsCommand(),
|
||||||
new DoctorCommand(),
|
new DoctorCommand(),
|
||||||
new DownloadCommand(),
|
new DownloadCommand(),
|
||||||
|
new InstallPkgCommand(),
|
||||||
|
new DeleteDownloadCommand(),
|
||||||
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()];
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,9 +10,8 @@ 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\FileSystem;
|
||||||
use SPC\store\SourceExtractor;
|
use SPC\store\SourceManager;
|
||||||
use SPC\util\CustomExt;
|
use SPC\util\CustomExt;
|
||||||
use SPC\util\DependencyUtil;
|
|
||||||
|
|
||||||
abstract class BuilderBase
|
abstract class BuilderBase
|
||||||
{
|
{
|
||||||
@@ -35,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
|
||||||
@@ -43,54 +42,17 @@ abstract class BuilderBase
|
|||||||
* @throws WrongUsageException
|
* @throws WrongUsageException
|
||||||
* @internal
|
* @internal
|
||||||
*/
|
*/
|
||||||
public function buildLibs(array $sorted_libraries): void
|
abstract public function proveLibs(array $sorted_libraries);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Build libraries
|
||||||
|
*
|
||||||
|
* @throws FileSystemException
|
||||||
|
* @throws RuntimeException
|
||||||
|
* @throws WrongUsageException
|
||||||
|
*/
|
||||||
|
public function buildLibs(): void
|
||||||
{
|
{
|
||||||
// search all supported libs
|
|
||||||
$support_lib_list = [];
|
|
||||||
$classes = FileSystem::getClassesPsr4(
|
|
||||||
ROOT_DIR . '/src/SPC/builder/' . osfamily2dir() . '/library',
|
|
||||||
'SPC\\builder\\' . osfamily2dir() . '\\library'
|
|
||||||
);
|
|
||||||
foreach ($classes as $class) {
|
|
||||||
if (defined($class . '::NAME') && $class::NAME !== 'unknown' && Config::getLib($class::NAME) !== null) {
|
|
||||||
$support_lib_list[$class::NAME] = $class;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// if no libs specified, compile all supported libs
|
|
||||||
if ($sorted_libraries === [] && $this->isLibsOnly()) {
|
|
||||||
$libraries = array_keys($support_lib_list);
|
|
||||||
$sorted_libraries = DependencyUtil::getLibsByDeps($libraries);
|
|
||||||
}
|
|
||||||
|
|
||||||
// pkg-config must be compiled first, whether it is specified or not
|
|
||||||
if (!in_array('pkg-config', $sorted_libraries)) {
|
|
||||||
array_unshift($sorted_libraries, 'pkg-config');
|
|
||||||
}
|
|
||||||
|
|
||||||
// add lib object for builder
|
|
||||||
foreach ($sorted_libraries as $library) {
|
|
||||||
// if some libs are not supported (but in config "lib.json", throw exception)
|
|
||||||
if (!isset($support_lib_list[$library])) {
|
|
||||||
throw new WrongUsageException('library [' . $library . '] is in the lib.json list but not supported to compile, but in the future I will support it!');
|
|
||||||
}
|
|
||||||
$lib = new ($support_lib_list[$library])($this);
|
|
||||||
$this->addLib($lib);
|
|
||||||
}
|
|
||||||
|
|
||||||
// calculate and check dependencies
|
|
||||||
foreach ($this->libs as $lib) {
|
|
||||||
$lib->calcDependency();
|
|
||||||
}
|
|
||||||
|
|
||||||
// patch point
|
|
||||||
$this->emitPatchPoint('before-libs-extract');
|
|
||||||
|
|
||||||
// extract sources
|
|
||||||
SourceExtractor::initSource(libs: $sorted_libraries);
|
|
||||||
|
|
||||||
$this->emitPatchPoint('after-libs-extract');
|
|
||||||
|
|
||||||
// build all libs
|
// build all libs
|
||||||
foreach ($this->libs as $lib) {
|
foreach ($this->libs as $lib) {
|
||||||
match ($lib->tryBuild($this->getOption('rebuild', false))) {
|
match ($lib->tryBuild($this->getOption('rebuild', false))) {
|
||||||
@@ -203,15 +165,15 @@ abstract class BuilderBase
|
|||||||
{
|
{
|
||||||
CustomExt::loadCustomExt();
|
CustomExt::loadCustomExt();
|
||||||
$this->emitPatchPoint('before-php-extract');
|
$this->emitPatchPoint('before-php-extract');
|
||||||
SourceExtractor::initSource(sources: ['php-src']);
|
SourceManager::initSource(sources: ['php-src']);
|
||||||
$this->emitPatchPoint('after-php-extract');
|
$this->emitPatchPoint('after-php-extract');
|
||||||
if ($this->getPHPVersionID() >= 80000) {
|
if ($this->getPHPVersionID() >= 80000) {
|
||||||
$this->emitPatchPoint('before-micro-extract');
|
$this->emitPatchPoint('before-micro-extract');
|
||||||
SourceExtractor::initSource(sources: ['micro']);
|
SourceManager::initSource(sources: ['micro']);
|
||||||
$this->emitPatchPoint('after-micro-extract');
|
$this->emitPatchPoint('after-micro-extract');
|
||||||
}
|
}
|
||||||
$this->emitPatchPoint('before-exts-extract');
|
$this->emitPatchPoint('before-exts-extract');
|
||||||
SourceExtractor::initSource(exts: $extensions);
|
SourceManager::initSource(exts: $extensions);
|
||||||
$this->emitPatchPoint('after-exts-extract');
|
$this->emitPatchPoint('after-exts-extract');
|
||||||
foreach ($extensions as $extension) {
|
foreach ($extensions as $extension) {
|
||||||
$class = CustomExt::getExtClass($extension);
|
$class = CustomExt::getExtClass($extension);
|
||||||
@@ -242,6 +204,7 @@ abstract class BuilderBase
|
|||||||
{
|
{
|
||||||
$ret = [];
|
$ret = [];
|
||||||
foreach ($this->exts as $ext) {
|
foreach ($this->exts as $ext) {
|
||||||
|
logger()->info($ext->getName() . ' is using ' . $ext->getConfigureArg());
|
||||||
$ret[] = trim($ext->getConfigureArg());
|
$ret[] = trim($ext->getConfigureArg());
|
||||||
}
|
}
|
||||||
logger()->debug('Using configure: ' . implode(' ', $ret));
|
logger()->debug('Using configure: ' . implode(' ', $ret));
|
||||||
@@ -289,6 +252,48 @@ abstract class BuilderBase
|
|||||||
throw new RuntimeException('PHP version file format is malformed, please remove it and download again');
|
throw new RuntimeException('PHP version file format is malformed, please remove it and download again');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get PHP version from archive file name.
|
||||||
|
*
|
||||||
|
* @param null|string $file php-*.*.*.tar.gz filename, read from lockfile if empty
|
||||||
|
*/
|
||||||
|
public function getPHPVersionFromArchive(?string $file = null): false|string
|
||||||
|
{
|
||||||
|
if ($file === null) {
|
||||||
|
$lock = file_exists(DOWNLOAD_PATH . '/.lock.json') ? file_get_contents(DOWNLOAD_PATH . '/.lock.json') : false;
|
||||||
|
if ($lock === false) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
$lock = json_decode($lock, true);
|
||||||
|
$file = $lock['php-src']['filename'] ?? null;
|
||||||
|
if ($file === null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (preg_match('/php-(\d+\.\d+\.\d+)/', $file, $match)) {
|
||||||
|
return $match[1];
|
||||||
|
}
|
||||||
|
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.
|
||||||
*
|
*
|
||||||
@@ -369,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;
|
||||||
@@ -417,4 +435,47 @@ abstract class BuilderBase
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Generate micro extension test php code.
|
||||||
|
*/
|
||||||
|
protected function generateMicroExtTests(): string
|
||||||
|
{
|
||||||
|
$php = "<?php\n\necho '[micro-test-start]' . PHP_EOL;\n";
|
||||||
|
|
||||||
|
foreach ($this->getExts() as $ext) {
|
||||||
|
$ext_name = $ext->getDistName();
|
||||||
|
if (!empty($ext_name)) {
|
||||||
|
$php .= "echo 'Running micro with {$ext_name} test' . PHP_EOL;\n";
|
||||||
|
$php .= "assert(extension_loaded('{$ext_name}'));\n\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$php .= "echo '[micro-test-end]';\n";
|
||||||
|
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' => [
|
||||||
|
// program success
|
||||||
|
function ($ret) { return $ret === 0; },
|
||||||
|
// program returns expected output
|
||||||
|
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' => [
|
||||||
|
// program success
|
||||||
|
function ($ret) { return $ret === 0; },
|
||||||
|
],
|
||||||
|
],
|
||||||
|
];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ namespace SPC\builder;
|
|||||||
use SPC\builder\freebsd\BSDBuilder;
|
use SPC\builder\freebsd\BSDBuilder;
|
||||||
use SPC\builder\linux\LinuxBuilder;
|
use SPC\builder\linux\LinuxBuilder;
|
||||||
use SPC\builder\macos\MacOSBuilder;
|
use SPC\builder\macos\MacOSBuilder;
|
||||||
|
use SPC\builder\windows\WindowsBuilder;
|
||||||
use SPC\exception\FileSystemException;
|
use SPC\exception\FileSystemException;
|
||||||
use SPC\exception\RuntimeException;
|
use SPC\exception\RuntimeException;
|
||||||
use SPC\exception\WrongUsageException;
|
use SPC\exception\WrongUsageException;
|
||||||
@@ -26,12 +27,10 @@ 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(
|
'Windows' => new WindowsBuilder($input->getOptions()),
|
||||||
// binary_sdk_dir: $input->getOption('with-sdk-binary-dir'),
|
|
||||||
// vs_ver: $input->getOption('vs-ver'),
|
|
||||||
// arch: $input->getOption('arch'),
|
|
||||||
// ),
|
|
||||||
'Darwin' => new MacOSBuilder($input->getOptions()),
|
'Darwin' => new MacOSBuilder($input->getOptions()),
|
||||||
'Linux' => new LinuxBuilder($input->getOptions()),
|
'Linux' => new LinuxBuilder($input->getOptions()),
|
||||||
'BSD' => new BSDBuilder($input->getOptions()),
|
'BSD' => new BSDBuilder($input->getOptions()),
|
||||||
|
|||||||
@@ -8,6 +8,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;
|
||||||
|
|
||||||
class Extension
|
class Extension
|
||||||
{
|
{
|
||||||
@@ -42,7 +43,7 @@ class Extension
|
|||||||
$arg = $this->getEnableArg();
|
$arg = $this->getEnableArg();
|
||||||
switch (PHP_OS_FAMILY) {
|
switch (PHP_OS_FAMILY) {
|
||||||
case 'Windows':
|
case 'Windows':
|
||||||
$arg = $this->getWindowsConfigureArg();
|
$arg .= $this->getWindowsConfigureArg();
|
||||||
break;
|
break;
|
||||||
case 'Darwin':
|
case 'Darwin':
|
||||||
case 'Linux':
|
case 'Linux':
|
||||||
@@ -164,34 +165,69 @@ class Extension
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 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 check failed, throw RuntimeException
|
|
||||||
*
|
|
||||||
* @throws RuntimeException
|
* @throws RuntimeException
|
||||||
*/
|
*/
|
||||||
public function runCliCheck(): void
|
public function runCliCheckUnix(): void
|
||||||
{
|
{
|
||||||
|
// Run compile check if build target is cli
|
||||||
|
// 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
|
||||||
[$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] = shell()->execWithResult(BUILD_ROOT_PATH . '/bin/php -r "' . trim($test) . '"');
|
[$ret, $out] = shell()->execWithResult(BUILD_ROOT_PATH . '/bin/php -r "' . trim($test) . '"');
|
||||||
|
if ($ret !== 0) {
|
||||||
|
if ($this->builder->getOption('debug')) {
|
||||||
|
var_dump($out);
|
||||||
|
}
|
||||||
|
throw new RuntimeException('extension ' . $this->getName() . ' failed sanity check');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @throws RuntimeException
|
||||||
|
*/
|
||||||
|
public function runCliCheckWindows(): void
|
||||||
|
{
|
||||||
|
// Run compile check if build target is cli
|
||||||
|
// 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
|
||||||
|
[$ret] = cmd()->execWithResult(BUILD_ROOT_PATH . '/bin/php.exe --ri "' . $this->getDistName() . '"', false);
|
||||||
|
if ($ret !== 0) {
|
||||||
|
throw new RuntimeException('extension ' . $this->getName() . ' failed compile check: php-cli returned ' . $ret);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (file_exists(FileSystem::convertPath(ROOT_DIR . '/src/globals/ext-tests/' . $this->getName() . '.php'))) {
|
||||||
|
// Trim additional content & escape special characters to allow inline usage
|
||||||
|
$test = str_replace(
|
||||||
|
['<?php', 'declare(strict_types=1);', "\n", '"', '$'],
|
||||||
|
['', '', '', '\"', '$'],
|
||||||
|
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) . '"');
|
||||||
if ($ret !== 0) {
|
if ($ret !== 0) {
|
||||||
throw new RuntimeException('extension ' . $this->getName() . ' failed sanity check');
|
throw new RuntimeException('extension ' . $this->getName() . ' failed sanity check');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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.
|
||||||
*/
|
*/
|
||||||
@@ -206,4 +211,9 @@ abstract class LibraryBase
|
|||||||
}
|
}
|
||||||
logger()->debug('enabling ' . static::NAME . " without {$name}");
|
logger()->debug('enabling ' . static::NAME . " without {$name}");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected function getSnakeCaseName(): string
|
||||||
|
{
|
||||||
|
return str_replace('-', '_', static::NAME);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
35
src/SPC/builder/extension/amqp.php
Normal file
35
src/SPC/builder/extension/amqp.php
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace SPC\builder\extension;
|
||||||
|
|
||||||
|
use SPC\builder\Extension;
|
||||||
|
use SPC\store\FileSystem;
|
||||||
|
use SPC\util\CustomExt;
|
||||||
|
|
||||||
|
#[CustomExt('amqp')]
|
||||||
|
class amqp extends Extension
|
||||||
|
{
|
||||||
|
public function patchBeforeMake(): bool
|
||||||
|
{
|
||||||
|
if (PHP_OS_FAMILY === 'Windows') {
|
||||||
|
FileSystem::replaceFileRegex(BUILD_INCLUDE_PATH . '\amqp.h', '/^#warning.*/m', '');
|
||||||
|
FileSystem::replaceFileRegex(BUILD_INCLUDE_PATH . '\amqp_framing.h', '/^#warning.*/m', '');
|
||||||
|
FileSystem::replaceFileRegex(BUILD_INCLUDE_PATH . '\amqp_ssl_socket.h', '/^#warning.*/m', '');
|
||||||
|
FileSystem::replaceFileRegex(BUILD_INCLUDE_PATH . '\amqp_tcp_socket.h', '/^#warning.*/m', '');
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getUnixConfigureArg(): string
|
||||||
|
{
|
||||||
|
return '--with-amqp --with-librabbitmq-dir=' . BUILD_ROOT_PATH;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getWindowsConfigureArg(): string
|
||||||
|
{
|
||||||
|
return '--with-amqp';
|
||||||
|
}
|
||||||
|
}
|
||||||
24
src/SPC/builder/extension/dba.php
Normal file
24
src/SPC/builder/extension/dba.php
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace SPC\builder\extension;
|
||||||
|
|
||||||
|
use SPC\builder\Extension;
|
||||||
|
use SPC\util\CustomExt;
|
||||||
|
|
||||||
|
#[CustomExt('dba')]
|
||||||
|
class dba extends Extension
|
||||||
|
{
|
||||||
|
public function getUnixConfigureArg(): string
|
||||||
|
{
|
||||||
|
$qdbm = $this->builder->getLib('qdbm') ? (' --with-qdbm=' . BUILD_ROOT_PATH) : '';
|
||||||
|
return '--enable-dba' . $qdbm;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getWindowsConfigureArg(): string
|
||||||
|
{
|
||||||
|
$qdbm = $this->builder->getLib('qdbm') ? ' --with-qdbm' : '';
|
||||||
|
return '--with-dba' . $qdbm;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -5,6 +5,7 @@ declare(strict_types=1);
|
|||||||
namespace SPC\builder\extension;
|
namespace SPC\builder\extension;
|
||||||
|
|
||||||
use SPC\builder\Extension;
|
use SPC\builder\Extension;
|
||||||
|
use SPC\builder\macos\MacOSBuilder;
|
||||||
use SPC\exception\FileSystemException;
|
use SPC\exception\FileSystemException;
|
||||||
use SPC\store\FileSystem;
|
use SPC\store\FileSystem;
|
||||||
use SPC\util\CustomExt;
|
use SPC\util\CustomExt;
|
||||||
@@ -34,4 +35,16 @@ class event extends Extension
|
|||||||
FileSystem::replaceFileRegex(SOURCE_PATH . '/php-src/configure', '/-levent_openssl/', $this->getLibFilesString());
|
FileSystem::replaceFileRegex(SOURCE_PATH . '/php-src/configure', '/-levent_openssl/', $this->getLibFilesString());
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @throws FileSystemException
|
||||||
|
*/
|
||||||
|
public function patchBeforeMake(): bool
|
||||||
|
{
|
||||||
|
// Prevent event extension compile error on macOS
|
||||||
|
if ($this->builder instanceof MacOSBuilder) {
|
||||||
|
FileSystem::replaceFileRegex(SOURCE_PATH . '/php-src/main/php_config.h', '/^#define HAVE_OPENPTY 1$/m', '');
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,4 +14,9 @@ class ffi extends Extension
|
|||||||
{
|
{
|
||||||
return '--with-ffi --enable-zend-signals';
|
return '--with-ffi --enable-zend-signals';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function getWindowsConfigureArg(): string
|
||||||
|
{
|
||||||
|
return '--with-ffi';
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
40
src/SPC/builder/extension/gettext.php
Normal file
40
src/SPC/builder/extension/gettext.php
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace SPC\builder\extension;
|
||||||
|
|
||||||
|
use SPC\builder\Extension;
|
||||||
|
use SPC\builder\macos\MacOSBuilder;
|
||||||
|
use SPC\exception\FileSystemException;
|
||||||
|
use SPC\exception\WrongUsageException;
|
||||||
|
use SPC\store\FileSystem;
|
||||||
|
use SPC\util\CustomExt;
|
||||||
|
|
||||||
|
#[CustomExt('gettext')]
|
||||||
|
class gettext extends Extension
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @throws FileSystemException
|
||||||
|
*/
|
||||||
|
public function patchBeforeBuildconf(): bool
|
||||||
|
{
|
||||||
|
if ($this->builder instanceof MacOSBuilder) {
|
||||||
|
FileSystem::replaceFileStr(SOURCE_PATH . '/php-src/ext/gettext/config.m4', 'AC_CHECK_LIB($GETTEXT_CHECK_IN_LIB', 'AC_CHECK_LIB(intl');
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @throws WrongUsageException
|
||||||
|
* @throws FileSystemException
|
||||||
|
*/
|
||||||
|
public function patchBeforeConfigure(): bool
|
||||||
|
{
|
||||||
|
if ($this->builder instanceof MacOSBuilder) {
|
||||||
|
$frameworks = ' ' . $this->builder->getFrameworks(true) . ' ';
|
||||||
|
FileSystem::replaceFileStr(SOURCE_PATH . '/php-src/configure', '-lintl', $this->getLibFilesString() . $frameworks);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -34,4 +34,9 @@ class glfw extends Extension
|
|||||||
{
|
{
|
||||||
return '--enable-glfw --with-glfw-dir=' . BUILD_ROOT_PATH;
|
return '--enable-glfw --with-glfw-dir=' . BUILD_ROOT_PATH;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function getWindowsConfigureArg(): string
|
||||||
|
{
|
||||||
|
return '--enable-glfw=static';
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,11 +14,11 @@ class imagick extends Extension
|
|||||||
public function patchBeforeMake(): bool
|
public function patchBeforeMake(): bool
|
||||||
{
|
{
|
||||||
// imagick may call omp_pause_all which requires -lgomp
|
// imagick may call omp_pause_all which requires -lgomp
|
||||||
$extra_libs = $this->builder->getOption('extra-libs', '');
|
$extra_libs = getenv('SPC_EXTRA_LIBS') ?: '';
|
||||||
if ($this->builder instanceof LinuxBuilder) {
|
if ($this->builder instanceof LinuxBuilder) {
|
||||||
$extra_libs .= ' -lgomp ';
|
$extra_libs .= (empty($extra_libs) ? '' : ' ') . '-lgomp ';
|
||||||
}
|
}
|
||||||
$this->builder->setOption('extra-libs', $extra_libs);
|
f_putenv('SPC_EXTRA_LIBS=' . $extra_libs);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
26
src/SPC/builder/extension/intl.php
Normal file
26
src/SPC/builder/extension/intl.php
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace SPC\builder\extension;
|
||||||
|
|
||||||
|
use SPC\builder\Extension;
|
||||||
|
use SPC\store\FileSystem;
|
||||||
|
use SPC\util\CustomExt;
|
||||||
|
|
||||||
|
#[CustomExt('intl')]
|
||||||
|
class intl extends Extension
|
||||||
|
{
|
||||||
|
public function patchBeforeBuildconf(): bool
|
||||||
|
{
|
||||||
|
// TODO: remove the following line when https://github.com/php/php-src/pull/14002 will be released
|
||||||
|
FileSystem::replaceFileStr(SOURCE_PATH . '/php-src/ext/intl/config.m4', 'PHP_CXX_COMPILE_STDCXX(11', 'PHP_CXX_COMPILE_STDCXX(17');
|
||||||
|
// Also need to use clang++ -std=c++17 to force override the default C++ standard
|
||||||
|
if (is_string($env = getenv('CXX')) && !str_contains($env, 'std=c++17')) {
|
||||||
|
f_putenv('CXX=' . $env . ' -std=c++17');
|
||||||
|
} else {
|
||||||
|
f_putenv('CXX=clang++ -std=c++17');
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -11,6 +11,11 @@ use SPC\util\CustomExt;
|
|||||||
#[CustomExt('mbregex')]
|
#[CustomExt('mbregex')]
|
||||||
class mbregex extends Extension
|
class mbregex extends Extension
|
||||||
{
|
{
|
||||||
|
public function getDistName(): string
|
||||||
|
{
|
||||||
|
return 'mbstring';
|
||||||
|
}
|
||||||
|
|
||||||
public function getConfigureArg(): string
|
public function getConfigureArg(): string
|
||||||
{
|
{
|
||||||
return '';
|
return '';
|
||||||
@@ -19,11 +24,23 @@ class mbregex extends Extension
|
|||||||
/**
|
/**
|
||||||
* mbregex is not an extension, we need to overwrite the default check.
|
* mbregex is not an extension, we need to overwrite the default check.
|
||||||
*/
|
*/
|
||||||
public function runCliCheck(): void
|
public function runCliCheckUnix(): void
|
||||||
{
|
{
|
||||||
[$ret] = shell()->execWithResult(BUILD_ROOT_PATH . '/bin/php --ri "mbstring" | grep regex', false);
|
[$ret] = shell()->execWithResult(BUILD_ROOT_PATH . '/bin/php --ri "mbstring" | grep regex', false);
|
||||||
if ($ret !== 0) {
|
if ($ret !== 0) {
|
||||||
throw new RuntimeException('extension ' . $this->getName() . ' failed compile check: compiled php-cli mbstring extension does not contain regex !');
|
throw new RuntimeException('extension ' . $this->getName() . ' failed compile check: compiled php-cli mbstring extension does not contain regex !');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function runCliCheckWindows(): void
|
||||||
|
{
|
||||||
|
[$ret, $out] = cmd()->execWithResult(BUILD_ROOT_PATH . '/bin/php --ri "mbstring"', false);
|
||||||
|
if ($ret !== 0) {
|
||||||
|
throw new RuntimeException('extension ' . $this->getName() . ' failed compile check: compiled php-cli does not contain mbstring !');
|
||||||
|
}
|
||||||
|
$out = implode("\n", $out);
|
||||||
|
if (!str_contains($out, 'regex')) {
|
||||||
|
throw new RuntimeException('extension ' . $this->getName() . ' failed compile check: compiled php-cli mbstring extension does not contain regex !');
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,11 +10,13 @@ use SPC\util\CustomExt;
|
|||||||
#[CustomExt('mbstring')]
|
#[CustomExt('mbstring')]
|
||||||
class mbstring extends Extension
|
class mbstring extends Extension
|
||||||
{
|
{
|
||||||
public function getUnixConfigureArg(): string
|
public function getConfigureArg(): string
|
||||||
{
|
{
|
||||||
$arg = '--enable-mbstring';
|
$arg = '--enable-mbstring';
|
||||||
if ($this->builder->getExt('mbregex') === null) {
|
if ($this->builder->getExt('mbregex') === null) {
|
||||||
$arg .= ' --disable-mbregex';
|
$arg .= ' --disable-mbregex';
|
||||||
|
} else {
|
||||||
|
$arg .= ' --enable-mbregex';
|
||||||
}
|
}
|
||||||
return $arg;
|
return $arg;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,20 +5,11 @@ declare(strict_types=1);
|
|||||||
namespace SPC\builder\extension;
|
namespace SPC\builder\extension;
|
||||||
|
|
||||||
use SPC\builder\Extension;
|
use SPC\builder\Extension;
|
||||||
use SPC\store\FileSystem;
|
|
||||||
use SPC\util\CustomExt;
|
use SPC\util\CustomExt;
|
||||||
|
|
||||||
#[CustomExt('mongodb')]
|
#[CustomExt('mongodb')]
|
||||||
class mongodb extends Extension
|
class mongodb extends Extension
|
||||||
{
|
{
|
||||||
public function patchBeforeBuildconf(): bool
|
|
||||||
{
|
|
||||||
FileSystem::replaceFileStr(SOURCE_PATH . '/php-src/ext/mongodb/config.m4', 'if test -z "$PHP_CONFIG"; then', 'if false; then');
|
|
||||||
FileSystem::replaceFileStr(SOURCE_PATH . '/php-src/ext/mongodb/config.m4', 'PHP_MONGODB_PHP_VERSION=`${PHP_CONFIG} --version`', 'PHP_MONGODB_PHP_VERSION=' . $this->builder->getPHPVersion());
|
|
||||||
FileSystem::replaceFileStr(SOURCE_PATH . '/php-src/ext/mongodb/config.m4', 'PHP_MONGODB_PHP_VERSION_ID=`${PHP_CONFIG} --vernum`', 'PHP_MONGODB_PHP_VERSION_ID=' . $this->builder->getPHPVersionID());
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getUnixConfigureArg(): string
|
public function getUnixConfigureArg(): string
|
||||||
{
|
{
|
||||||
$arg = ' --enable-mongodb ';
|
$arg = ' --enable-mongodb ';
|
||||||
|
|||||||
@@ -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!');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -11,7 +11,12 @@ use SPC\util\CustomExt;
|
|||||||
#[CustomExt('password-argon2')]
|
#[CustomExt('password-argon2')]
|
||||||
class password_argon2 extends Extension
|
class password_argon2 extends Extension
|
||||||
{
|
{
|
||||||
public function runCliCheck(): void
|
public function getDistName(): string
|
||||||
|
{
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
|
||||||
|
public function runCliCheckUnix(): void
|
||||||
{
|
{
|
||||||
[$ret] = shell()->execWithResult(BUILD_ROOT_PATH . '/bin/php -r "assert(defined(\'PASSWORD_ARGON2I\'));"');
|
[$ret] = shell()->execWithResult(BUILD_ROOT_PATH . '/bin/php -r "assert(defined(\'PASSWORD_ARGON2I\'));"');
|
||||||
if ($ret !== 0) {
|
if ($ret !== 0) {
|
||||||
|
|||||||
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');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
34
src/SPC/builder/extension/simdjson.php
Normal file
34
src/SPC/builder/extension/simdjson.php
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace SPC\builder\extension;
|
||||||
|
|
||||||
|
use SPC\builder\Extension;
|
||||||
|
use SPC\store\FileSystem;
|
||||||
|
use SPC\util\CustomExt;
|
||||||
|
|
||||||
|
#[CustomExt('simdjson')]
|
||||||
|
class simdjson extends Extension
|
||||||
|
{
|
||||||
|
public function patchBeforeBuildconf(): bool
|
||||||
|
{
|
||||||
|
$php_ver = $this->builder->getPHPVersionID();
|
||||||
|
FileSystem::replaceFileRegex(
|
||||||
|
SOURCE_PATH . '/php-src/ext/simdjson/config.m4',
|
||||||
|
'/php_version=(`.*`)$/m',
|
||||||
|
'php_version=' . strval($php_ver)
|
||||||
|
);
|
||||||
|
FileSystem::replaceFileStr(
|
||||||
|
SOURCE_PATH . '/php-src/ext/simdjson/config.m4',
|
||||||
|
'if test -z "$PHP_CONFIG"; then',
|
||||||
|
'if false; then'
|
||||||
|
);
|
||||||
|
FileSystem::replaceFileStr(
|
||||||
|
SOURCE_PATH . '/php-src/ext/simdjson/config.w32',
|
||||||
|
"'yes',",
|
||||||
|
'PHP_SIMDJSON_SHARED,'
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -15,8 +15,8 @@ class swoole extends Extension
|
|||||||
// enable swoole
|
// enable swoole
|
||||||
$arg = '--enable-swoole';
|
$arg = '--enable-swoole';
|
||||||
|
|
||||||
// commonly-used feature: coroutine-time, thread-context
|
// commonly-used feature: coroutine-time, disable-thread-context
|
||||||
$arg .= ' --enable-swoole-coro-time --enable-thread-context';
|
$arg .= ' --enable-swoole-coro-time --disable-thread-context';
|
||||||
|
|
||||||
// required feature: curl, openssl (but curl hook is buggy for php 8.0)
|
// required feature: curl, openssl (but curl hook is buggy for php 8.0)
|
||||||
$arg .= $this->builder->getPHPVersionID() >= 80100 ? ' --enable-swoole-curl' : ' --disable-swoole-curl';
|
$arg .= $this->builder->getPHPVersionID() >= 80100 ? ' --enable-swoole-curl' : ' --disable-swoole-curl';
|
||||||
|
|||||||
@@ -11,6 +11,11 @@ use SPC\util\CustomExt;
|
|||||||
#[CustomExt('swoole-hook-mysql')]
|
#[CustomExt('swoole-hook-mysql')]
|
||||||
class swoole_hook_mysql extends Extension
|
class swoole_hook_mysql extends Extension
|
||||||
{
|
{
|
||||||
|
public function getDistName(): string
|
||||||
|
{
|
||||||
|
return 'swoole';
|
||||||
|
}
|
||||||
|
|
||||||
public function getUnixConfigureArg(): string
|
public function getUnixConfigureArg(): string
|
||||||
{
|
{
|
||||||
// pdo_mysql doesn't need to be disabled
|
// pdo_mysql doesn't need to be disabled
|
||||||
@@ -18,7 +23,7 @@ class swoole_hook_mysql extends Extension
|
|||||||
return '';
|
return '';
|
||||||
}
|
}
|
||||||
|
|
||||||
public function runCliCheck(): void
|
public function runCliCheckUnix(): void
|
||||||
{
|
{
|
||||||
// skip if not enable swoole
|
// skip if not enable swoole
|
||||||
if ($this->builder->getExt('swoole') === null) {
|
if ($this->builder->getExt('swoole') === null) {
|
||||||
|
|||||||
@@ -12,17 +12,26 @@ use SPC\util\CustomExt;
|
|||||||
#[CustomExt('swoole-hook-pgsql')]
|
#[CustomExt('swoole-hook-pgsql')]
|
||||||
class swoole_hook_pgsql extends Extension
|
class swoole_hook_pgsql extends Extension
|
||||||
{
|
{
|
||||||
public function getUnixConfigureArg(): string
|
public function getDistName(): string
|
||||||
|
{
|
||||||
|
return 'swoole';
|
||||||
|
}
|
||||||
|
|
||||||
|
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';
|
||||||
}
|
}
|
||||||
|
|
||||||
public function runCliCheck(): void
|
public function runCliCheckUnix(): void
|
||||||
{
|
{
|
||||||
// skip if not enable swoole
|
// skip if not enable swoole
|
||||||
if ($this->builder->getExt('swoole') === null) {
|
if ($this->builder->getExt('swoole') === null) {
|
||||||
|
|||||||
@@ -12,17 +12,26 @@ use SPC\util\CustomExt;
|
|||||||
#[CustomExt('swoole-hook-sqlite')]
|
#[CustomExt('swoole-hook-sqlite')]
|
||||||
class swoole_hook_sqlite extends Extension
|
class swoole_hook_sqlite extends Extension
|
||||||
{
|
{
|
||||||
public function getUnixConfigureArg(): string
|
public function getDistName(): string
|
||||||
|
{
|
||||||
|
return 'swoole';
|
||||||
|
}
|
||||||
|
|
||||||
|
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';
|
||||||
}
|
}
|
||||||
|
|
||||||
public function runCliCheck(): void
|
public function runCliCheckUnix(): void
|
||||||
{
|
{
|
||||||
// skip if not enable swoole
|
// skip if not enable swoole
|
||||||
if ($this->builder->getExt('swoole') === null) {
|
if ($this->builder->getExt('swoole') === null) {
|
||||||
|
|||||||
@@ -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');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -12,6 +12,10 @@ class xlswriter extends Extension
|
|||||||
{
|
{
|
||||||
public function getUnixConfigureArg(): string
|
public function getUnixConfigureArg(): string
|
||||||
{
|
{
|
||||||
return '--with-xlswriter --enable-reader';
|
$arg = '--with-xlswriter --enable-reader';
|
||||||
|
if ($this->builder->getLib('openssl')) {
|
||||||
|
$arg .= ' --with-openssl=' . BUILD_ROOT_PATH;
|
||||||
|
}
|
||||||
|
return $arg;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ namespace SPC\builder\extension;
|
|||||||
|
|
||||||
use SPC\builder\Extension;
|
use SPC\builder\Extension;
|
||||||
use SPC\exception\RuntimeException;
|
use SPC\exception\RuntimeException;
|
||||||
|
use SPC\store\FileSystem;
|
||||||
use SPC\util\CustomExt;
|
use SPC\util\CustomExt;
|
||||||
|
|
||||||
#[CustomExt('xml')]
|
#[CustomExt('xml')]
|
||||||
@@ -33,4 +34,25 @@ class xml extends Extension
|
|||||||
$arg .= ' --with-libxml="' . BUILD_ROOT_PATH . '"';
|
$arg .= ' --with-libxml="' . BUILD_ROOT_PATH . '"';
|
||||||
return $arg;
|
return $arg;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function patchBeforeBuildconf(): bool
|
||||||
|
{
|
||||||
|
FileSystem::replaceFileStr(SOURCE_PATH . '/php-src/win32/build/config.w32', 'dllmain.c ', '');
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getWindowsConfigureArg(): string
|
||||||
|
{
|
||||||
|
$arg = match ($this->name) {
|
||||||
|
'xml' => '--with-xml',
|
||||||
|
'soap' => '--enable-soap',
|
||||||
|
'xmlreader' => '--enable-xmlreader',
|
||||||
|
'xmlwriter' => '--enable-xmlwriter',
|
||||||
|
'dom' => '--with-dom',
|
||||||
|
'simplexml' => '--with-simplexml',
|
||||||
|
default => throw new RuntimeException('Not accept non-xml extension'),
|
||||||
|
};
|
||||||
|
$arg .= ' --with-libxml';
|
||||||
|
return $arg;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
26
src/SPC/builder/extension/yac.php
Normal file
26
src/SPC/builder/extension/yac.php
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace SPC\builder\extension;
|
||||||
|
|
||||||
|
use SPC\builder\Extension;
|
||||||
|
use SPC\store\FileSystem;
|
||||||
|
use SPC\util\CustomExt;
|
||||||
|
|
||||||
|
#[CustomExt('yac')]
|
||||||
|
class yac extends Extension
|
||||||
|
{
|
||||||
|
public function patchBeforeBuildconf(): bool
|
||||||
|
{
|
||||||
|
FileSystem::replaceFileStr(SOURCE_PATH . '/php-src/ext/yac/storage/allocator/yac_allocator.h', 'defined(HAVE_SHM_MMAP_ANON)', 'defined(YAC_ALLOCATOR_H)');
|
||||||
|
FileSystem::replaceFileStr(SOURCE_PATH . '/php-src/ext/yac/serializer/igbinary.c', '#ifdef YAC_ENABLE_IGBINARY', '#if 1');
|
||||||
|
FileSystem::replaceFileStr(SOURCE_PATH . '/php-src/ext/yac/serializer/json.c', '#if YAC_ENABLE_JSON', '#if 1');
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getUnixConfigureArg(): string
|
||||||
|
{
|
||||||
|
return '--enable-yac --enable-igbinary --enable-json';
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -4,19 +4,15 @@ declare(strict_types=1);
|
|||||||
|
|
||||||
namespace SPC\builder\freebsd;
|
namespace SPC\builder\freebsd;
|
||||||
|
|
||||||
use SPC\builder\BuilderBase;
|
use SPC\builder\unix\UnixBuilderBase;
|
||||||
use SPC\builder\traits\UnixBuilderTrait;
|
|
||||||
use SPC\exception\FileSystemException;
|
use SPC\exception\FileSystemException;
|
||||||
use SPC\exception\RuntimeException;
|
use SPC\exception\RuntimeException;
|
||||||
use SPC\exception\WrongUsageException;
|
use SPC\exception\WrongUsageException;
|
||||||
use SPC\store\FileSystem;
|
use SPC\store\FileSystem;
|
||||||
use SPC\store\SourcePatcher;
|
use SPC\store\SourcePatcher;
|
||||||
|
|
||||||
class BSDBuilder extends BuilderBase
|
class BSDBuilder extends UnixBuilderBase
|
||||||
{
|
{
|
||||||
/** Unix compatible builder methods */
|
|
||||||
use UnixBuilderTrait;
|
|
||||||
|
|
||||||
/** @var bool Micro patch phar flag */
|
/** @var bool Micro patch phar flag */
|
||||||
private bool $phar_patched = false;
|
private bool $phar_patched = false;
|
||||||
|
|
||||||
@@ -32,7 +28,7 @@ class BSDBuilder extends BuilderBase
|
|||||||
// ---------- 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'));
|
||||||
@@ -90,7 +86,8 @@ class BSDBuilder extends BuilderBase
|
|||||||
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;
|
||||||
@@ -184,7 +181,7 @@ class BSDBuilder extends BuilderBase
|
|||||||
}
|
}
|
||||||
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' : '';
|
||||||
@@ -205,7 +202,7 @@ class BSDBuilder extends BuilderBase
|
|||||||
$this->deployBinary(BUILD_TARGET_MICRO);
|
$this->deployBinary(BUILD_TARGET_MICRO);
|
||||||
|
|
||||||
if ($this->phar_patched) {
|
if ($this->phar_patched) {
|
||||||
SourcePatcher::patchMicro(['phar'], true);
|
SourcePatcher::unpatchMicroPhar();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -4,79 +4,50 @@ declare(strict_types=1);
|
|||||||
|
|
||||||
namespace SPC\builder\linux;
|
namespace SPC\builder\linux;
|
||||||
|
|
||||||
use SPC\builder\BuilderBase;
|
|
||||||
use SPC\builder\linux\library\LinuxLibraryBase;
|
use SPC\builder\linux\library\LinuxLibraryBase;
|
||||||
use SPC\builder\traits\UnixBuilderTrait;
|
use SPC\builder\unix\UnixBuilderBase;
|
||||||
use SPC\exception\FileSystemException;
|
use SPC\exception\FileSystemException;
|
||||||
use SPC\exception\RuntimeException;
|
use SPC\exception\RuntimeException;
|
||||||
use SPC\exception\WrongUsageException;
|
use SPC\exception\WrongUsageException;
|
||||||
use SPC\store\FileSystem;
|
use SPC\store\FileSystem;
|
||||||
use SPC\store\SourcePatcher;
|
use SPC\store\SourcePatcher;
|
||||||
|
use SPC\util\GlobalEnvManager;
|
||||||
|
|
||||||
class LinuxBuilder extends BuilderBase
|
class LinuxBuilder extends UnixBuilderBase
|
||||||
{
|
{
|
||||||
/** Unix compatible builder methods */
|
|
||||||
use UnixBuilderTrait;
|
|
||||||
|
|
||||||
/** @var array Tune cflags */
|
|
||||||
public array $tune_c_flags;
|
|
||||||
|
|
||||||
/** @var bool Micro patch phar flag */
|
/** @var bool Micro patch phar flag */
|
||||||
private bool $phar_patched = false;
|
private bool $phar_patched = false;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @throws FileSystemException
|
* @throws FileSystemException
|
||||||
* @throws RuntimeException
|
|
||||||
* @throws WrongUsageException
|
* @throws WrongUsageException
|
||||||
*/
|
*/
|
||||||
public function __construct(array $options = [])
|
public function __construct(array $options = [])
|
||||||
{
|
{
|
||||||
$this->options = $options;
|
$this->options = $options;
|
||||||
|
|
||||||
// ---------- set necessary options ----------
|
// check musl-cross make installed if we use musl-cross-make
|
||||||
// set C/C++ compilers (default: alpine: gcc, others: musl-cross-make)
|
$arch = arch2gnu(php_uname('m'));
|
||||||
if (SystemUtil::isMuslDist()) {
|
|
||||||
f_putenv("CC={$this->getOption('cc', 'gcc')}");
|
|
||||||
f_putenv("CXX={$this->getOption('cxx', 'g++')}");
|
|
||||||
f_putenv("AR={$this->getOption('ar', 'ar')}");
|
|
||||||
f_putenv("LD={$this->getOption('ld', 'ld.gold')}");
|
|
||||||
} else {
|
|
||||||
$arch = arch2gnu(php_uname('m'));
|
|
||||||
f_putenv("CC={$this->getOption('cc', "{$arch}-linux-musl-gcc")}");
|
|
||||||
f_putenv("CXX={$this->getOption('cxx', "{$arch}-linux-musl-g++")}");
|
|
||||||
f_putenv("AR={$this->getOption('ar', "{$arch}-linux-musl-ar")}");
|
|
||||||
f_putenv("LD={$this->getOption('ld', 'ld.gold')}");
|
|
||||||
f_putenv("PATH=/usr/local/musl/bin:/usr/local/musl/{$arch}-linux-musl/bin:" . BUILD_ROOT_PATH . '/bin:' . getenv('PATH'));
|
|
||||||
|
|
||||||
// set library path, some libraries need it. (We cannot use `putenv` here, because cmake will be confused)
|
// set library path, some libraries need it. (We cannot use `putenv` here, because cmake will be confused)
|
||||||
$this->setOptionIfNotExist('library_path', "LIBRARY_PATH=/usr/local/musl/{$arch}-linux-musl/lib");
|
$this->setOptionIfNotExist('library_path', "LIBRARY_PATH=/usr/local/musl/{$arch}-linux-musl/lib");
|
||||||
$this->setOptionIfNotExist('ld_library_path', "LD_LIBRARY_PATH=/usr/local/musl/{$arch}-linux-musl/lib");
|
$this->setOptionIfNotExist('ld_library_path', "LD_LIBRARY_PATH=/usr/local/musl/{$arch}-linux-musl/lib");
|
||||||
|
|
||||||
// check musl-cross make installed if we use musl-cross-make
|
GlobalEnvManager::init($this);
|
||||||
if (str_ends_with(getenv('CC'), 'linux-musl-gcc') && !file_exists("/usr/local/musl/bin/{$arch}-linux-musl-gcc")) {
|
|
||||||
throw new WrongUsageException('musl-cross-make not installed, please install it first. (You can use `doctor` command to install it)');
|
if (str_ends_with(getenv('CC'), 'linux-musl-gcc') && !file_exists("/usr/local/musl/bin/{$arch}-linux-musl-gcc")) {
|
||||||
}
|
throw new WrongUsageException('musl-cross-make not installed, please install it first. (You can use `doctor` command to install it)');
|
||||||
}
|
}
|
||||||
|
|
||||||
// set PKG_CONFIG
|
|
||||||
f_putenv('PKG_CONFIG=' . BUILD_ROOT_PATH . '/bin/pkg-config');
|
|
||||||
// set PKG_CONFIG_PATH
|
|
||||||
f_putenv('PKG_CONFIG_PATH=' . BUILD_LIB_PATH . '/pkgconfig');
|
|
||||||
|
|
||||||
// set arch (default: current)
|
|
||||||
$this->setOptionIfNotExist('arch', php_uname('m'));
|
|
||||||
$this->setOptionIfNotExist('gnu-arch', arch2gnu($this->getOption('arch')));
|
|
||||||
|
|
||||||
// concurrency
|
// concurrency
|
||||||
$this->concurrency = SystemUtil::getCpuCount();
|
$this->concurrency = intval(getenv('SPC_CONCURRENCY'));
|
||||||
// cflags
|
// cflags
|
||||||
$this->arch_c_flags = SystemUtil::getArchCFlags(getenv('CC'), $this->getOption('arch'));
|
$this->arch_c_flags = getenv('SPC_DEFAULT_C_FLAGS');
|
||||||
$this->arch_cxx_flags = SystemUtil::getArchCFlags(getenv('CXX'), $this->getOption('arch'));
|
$this->arch_cxx_flags = getenv('SPC_DEFAULT_CXX_FLAGS');
|
||||||
$this->tune_c_flags = SystemUtil::checkCCFlags(SystemUtil::getTuneCFlags($this->getOption('arch')), getenv('CC'));
|
|
||||||
// cmake toolchain
|
// cmake toolchain
|
||||||
$this->cmake_toolchain_file = SystemUtil::makeCmakeToolchainFile(
|
$this->cmake_toolchain_file = SystemUtil::makeCmakeToolchainFile(
|
||||||
'Linux',
|
'Linux',
|
||||||
$this->getOption('arch'),
|
$arch,
|
||||||
$this->arch_c_flags,
|
$this->arch_c_flags,
|
||||||
getenv('CC'),
|
getenv('CC'),
|
||||||
getenv('CXX'),
|
getenv('CXX'),
|
||||||
@@ -121,6 +92,9 @@ class LinuxBuilder extends BuilderBase
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
* 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
|
||||||
@@ -128,8 +102,8 @@ class LinuxBuilder extends BuilderBase
|
|||||||
public function buildPHP(int $build_target = BUILD_TARGET_NONE): void
|
public function buildPHP(int $build_target = BUILD_TARGET_NONE): void
|
||||||
{
|
{
|
||||||
// ---------- Update extra-libs ----------
|
// ---------- Update extra-libs ----------
|
||||||
$extra_libs = $this->getOption('extra-libs', '');
|
$extra_libs = getenv('SPC_EXTRA_LIBS') ?: '';
|
||||||
// non-bloat linking
|
// bloat means force-load all static libraries, even if they are not used
|
||||||
if (!$this->getOption('bloat', false)) {
|
if (!$this->getOption('bloat', false)) {
|
||||||
$extra_libs .= (empty($extra_libs) ? '' : ' ') . implode(' ', $this->getAllStaticLibFiles());
|
$extra_libs .= (empty($extra_libs) ? '' : ' ') . implode(' ', $this->getAllStaticLibFiles());
|
||||||
} else {
|
} else {
|
||||||
@@ -137,21 +111,13 @@ class LinuxBuilder extends BuilderBase
|
|||||||
}
|
}
|
||||||
// add libstdc++, some extensions or libraries need it
|
// add libstdc++, some extensions or libraries need it
|
||||||
$extra_libs .= (empty($extra_libs) ? '' : ' ') . ($this->hasCpp() ? '-lstdc++ ' : '');
|
$extra_libs .= (empty($extra_libs) ? '' : ' ') . ($this->hasCpp() ? '-lstdc++ ' : '');
|
||||||
$this->setOption('extra-libs', $extra_libs);
|
f_putenv('SPC_EXTRA_LIBS=' . $extra_libs);
|
||||||
$cflags = $this->arch_c_flags;
|
$cflags = $this->arch_c_flags;
|
||||||
|
|
||||||
// prepare build php envs
|
|
||||||
$envs_build_php = SystemUtil::makeEnvVarString([
|
|
||||||
'CFLAGS' => $cflags,
|
|
||||||
'CPPFLAGS' => '-I' . BUILD_INCLUDE_PATH,
|
|
||||||
'LDFLAGS' => '-L' . BUILD_LIB_PATH,
|
|
||||||
'LIBS' => '-ldl -lpthread',
|
|
||||||
]);
|
|
||||||
|
|
||||||
$this->emitPatchPoint('before-php-buildconf');
|
$this->emitPatchPoint('before-php-buildconf');
|
||||||
SourcePatcher::patchBeforeBuildconf($this);
|
SourcePatcher::patchBeforeBuildconf($this);
|
||||||
|
|
||||||
shell()->cd(SOURCE_PATH . '/php-src')->exec('./buildconf --force');
|
shell()->cd(SOURCE_PATH . '/php-src')->exec(getenv('SPC_CMD_PREFIX_PHP_BUILDCONF'));
|
||||||
|
|
||||||
$this->emitPatchPoint('before-php-configure');
|
$this->emitPatchPoint('before-php-configure');
|
||||||
SourcePatcher::patchBeforeConfigure($this);
|
SourcePatcher::patchBeforeConfigure($this);
|
||||||
@@ -168,26 +134,35 @@ class LinuxBuilder extends BuilderBase
|
|||||||
}
|
}
|
||||||
$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
|
||||||
|
$envs_build_php = SystemUtil::makeEnvVarString([
|
||||||
|
'CFLAGS' => getenv('SPC_CMD_VAR_PHP_CONFIGURE_CFLAGS'),
|
||||||
|
'CPPFLAGS' => getenv('SPC_CMD_VAR_PHP_CONFIGURE_CPPFLAGS'),
|
||||||
|
'LDFLAGS' => getenv('SPC_CMD_VAR_PHP_CONFIGURE_LDFLAGS'),
|
||||||
|
'LIBS' => getenv('SPC_CMD_VAR_PHP_CONFIGURE_LIBS'),
|
||||||
|
]);
|
||||||
|
|
||||||
|
// process micro upx patch if micro sapi enabled
|
||||||
|
if ($enable_micro) {
|
||||||
|
if (version_compare($this->getMicroVersion(), '0.2.0') < 0) {
|
||||||
|
// for phpmicro 0.1.x
|
||||||
|
$this->processMicroUPXLegacy();
|
||||||
|
}
|
||||||
|
// micro latest needs do strip and upx pack later (strip, upx, cut binary manually supported)
|
||||||
|
}
|
||||||
|
|
||||||
shell()->cd(SOURCE_PATH . '/php-src')
|
shell()->cd(SOURCE_PATH . '/php-src')
|
||||||
->exec(
|
->exec(
|
||||||
"{$this->getOption('ld_library_path')} " .
|
getenv('SPC_CMD_PREFIX_PHP_CONFIGURE') . ' ' .
|
||||||
'./configure ' .
|
($enable_cli ? '--enable-cli ' : '--disable-cli ') .
|
||||||
'--prefix= ' .
|
($enable_fpm ? '--enable-fpm ' : '--disable-fpm ') .
|
||||||
'--with-valgrind=no ' .
|
($enable_embed ? '--enable-embed=static ' : '--disable-embed ') .
|
||||||
'--enable-shared=no ' .
|
($enable_micro ? '--enable-micro=all-static ' : '--disable-micro ') .
|
||||||
'--enable-static=yes ' .
|
|
||||||
'--disable-all ' .
|
|
||||||
'--disable-cgi ' .
|
|
||||||
'--disable-phpdbg ' .
|
|
||||||
($enableCli ? '--enable-cli ' : '--disable-cli ') .
|
|
||||||
($enableFpm ? '--enable-fpm ' : '--disable-fpm ') .
|
|
||||||
($enableEmbed ? '--enable-embed=static ' : '--disable-embed ') .
|
|
||||||
($enableMicro ? '--enable-micro=all-static ' : '--disable-micro ') .
|
|
||||||
$disable_jit .
|
$disable_jit .
|
||||||
$json_74 .
|
$json_74 .
|
||||||
$zts .
|
$zts .
|
||||||
@@ -201,21 +176,21 @@ class LinuxBuilder extends BuilderBase
|
|||||||
|
|
||||||
$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();
|
||||||
@@ -235,12 +210,16 @@ class LinuxBuilder extends BuilderBase
|
|||||||
*/
|
*/
|
||||||
protected function buildCli(): void
|
protected function buildCli(): void
|
||||||
{
|
{
|
||||||
$vars = SystemUtil::makeEnvVarString($this->getBuildVars());
|
$vars = SystemUtil::makeEnvVarString($this->getMakeExtraVars());
|
||||||
shell()->cd(SOURCE_PATH . '/php-src')
|
shell()->cd(SOURCE_PATH . '/php-src')
|
||||||
->exec('sed -i "s|//lib|/lib|g" Makefile')
|
->exec('sed -i "s|//lib|/lib|g" Makefile')
|
||||||
->exec("make -j{$this->concurrency} {$vars} cli");
|
->exec("\$SPC_CMD_PREFIX_PHP_MAKE {$vars} cli");
|
||||||
|
|
||||||
if (!$this->getOption('no-strip', false)) {
|
if ($this->getOption('with-upx-pack')) {
|
||||||
|
shell()->cd(SOURCE_PATH . '/php-src/sapi/cli')
|
||||||
|
->exec('strip --strip-all php')
|
||||||
|
->exec(getenv('UPX_EXEC') . ' --best php');
|
||||||
|
} elseif (!$this->getOption('no-strip', false)) {
|
||||||
shell()->cd(SOURCE_PATH . '/php-src/sapi/cli')->exec('strip --strip-all php');
|
shell()->cd(SOURCE_PATH . '/php-src/sapi/cli')->exec('strip --strip-all php');
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -261,24 +240,26 @@ class LinuxBuilder extends BuilderBase
|
|||||||
}
|
}
|
||||||
if ($this->getExt('phar')) {
|
if ($this->getExt('phar')) {
|
||||||
$this->phar_patched = true;
|
$this->phar_patched = true;
|
||||||
SourcePatcher::patchMicro(['phar']);
|
SourcePatcher::patchMicroPhar($this->getPHPVersionID());
|
||||||
}
|
}
|
||||||
|
|
||||||
$vars = SystemUtil::makeEnvVarString($this->getBuildVars([
|
$enable_fake_cli = $this->getOption('with-micro-fake-cli', false) ? ' -DPHP_MICRO_FAKE_CLI' : '';
|
||||||
'EXTRA_CFLAGS' => $this->getOption('with-micro-fake-cli', false) ? ' -DPHP_MICRO_FAKE_CLI' : '',
|
$vars = $this->getMakeExtraVars();
|
||||||
]));
|
|
||||||
|
// patch fake cli for micro
|
||||||
|
$vars['EXTRA_CFLAGS'] .= $enable_fake_cli;
|
||||||
|
$vars = SystemUtil::makeEnvVarString($vars);
|
||||||
|
|
||||||
shell()->cd(SOURCE_PATH . '/php-src')
|
shell()->cd(SOURCE_PATH . '/php-src')
|
||||||
->exec('sed -i "s|//lib|/lib|g" Makefile')
|
->exec('sed -i "s|//lib|/lib|g" Makefile')
|
||||||
->exec("make -j{$this->concurrency} {$vars} micro");
|
->exec("\$SPC_CMD_PREFIX_PHP_MAKE {$vars} micro");
|
||||||
|
|
||||||
if (!$this->getOption('no-strip', false)) {
|
$this->processMicroUPX();
|
||||||
shell()->cd(SOURCE_PATH . '/php-src/sapi/micro')->exec('strip --strip-all micro.sfx');
|
|
||||||
}
|
|
||||||
|
|
||||||
$this->deployBinary(BUILD_TARGET_MICRO);
|
$this->deployBinary(BUILD_TARGET_MICRO);
|
||||||
|
|
||||||
if ($this->phar_patched) {
|
if ($this->phar_patched) {
|
||||||
SourcePatcher::patchMicro(['phar'], true);
|
SourcePatcher::unpatchMicroPhar();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -290,15 +271,18 @@ class LinuxBuilder extends BuilderBase
|
|||||||
*/
|
*/
|
||||||
protected function buildFpm(): void
|
protected function buildFpm(): void
|
||||||
{
|
{
|
||||||
$vars = SystemUtil::makeEnvVarString($this->getBuildVars());
|
$vars = SystemUtil::makeEnvVarString($this->getMakeExtraVars());
|
||||||
shell()->cd(SOURCE_PATH . '/php-src')
|
shell()->cd(SOURCE_PATH . '/php-src')
|
||||||
->exec('sed -i "s|//lib|/lib|g" Makefile')
|
->exec('sed -i "s|//lib|/lib|g" Makefile')
|
||||||
->exec("make -j{$this->concurrency} {$vars} fpm");
|
->exec("\$SPC_CMD_PREFIX_PHP_MAKE {$vars} fpm");
|
||||||
|
|
||||||
if (!$this->getOption('no-strip', false)) {
|
if ($this->getOption('with-upx-pack')) {
|
||||||
|
shell()->cd(SOURCE_PATH . '/php-src/sapi/fpm')
|
||||||
|
->exec('strip --strip-all php-fpm')
|
||||||
|
->exec(getenv('UPX_EXEC') . ' --best php-fpm');
|
||||||
|
} elseif (!$this->getOption('no-strip', false)) {
|
||||||
shell()->cd(SOURCE_PATH . '/php-src/sapi/fpm')->exec('strip --strip-all php-fpm');
|
shell()->cd(SOURCE_PATH . '/php-src/sapi/fpm')->exec('strip --strip-all php-fpm');
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->deployBinary(BUILD_TARGET_FPM);
|
$this->deployBinary(BUILD_TARGET_FPM);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -309,29 +293,85 @@ class LinuxBuilder extends BuilderBase
|
|||||||
*/
|
*/
|
||||||
protected function buildEmbed(): void
|
protected function buildEmbed(): void
|
||||||
{
|
{
|
||||||
$vars = SystemUtil::makeEnvVarString($this->getBuildVars());
|
$vars = SystemUtil::makeEnvVarString($this->getMakeExtraVars());
|
||||||
|
|
||||||
shell()
|
shell()->cd(SOURCE_PATH . '/php-src')
|
||||||
->cd(SOURCE_PATH . '/php-src')
|
|
||||||
->exec('sed -i "s|//lib|/lib|g" Makefile')
|
->exec('sed -i "s|//lib|/lib|g" Makefile')
|
||||||
->exec('make INSTALL_ROOT=' . BUILD_ROOT_PATH . " -j{$this->concurrency} {$vars} install");
|
->exec(getenv('SPC_CMD_PREFIX_PHP_MAKE') . ' INSTALL_ROOT=' . BUILD_ROOT_PATH . " {$vars} install");
|
||||||
}
|
}
|
||||||
|
|
||||||
private function getBuildVars($input = []): array
|
private function getMakeExtraVars(): array
|
||||||
{
|
{
|
||||||
$use_lld = '';
|
|
||||||
if (str_ends_with(getenv('CC'), 'clang') && SystemUtil::findCommand('lld')) {
|
|
||||||
$use_lld = '-Xcompiler -fuse-ld=lld';
|
|
||||||
}
|
|
||||||
$optimization = $this->getOption('no-strip', false) ? '-g -O0' : '-g0 -Os';
|
|
||||||
$cflags = isset($input['EXTRA_CFLAGS']) && $input['EXTRA_CFLAGS'] ? " {$input['EXTRA_CFLAGS']}" : '';
|
|
||||||
$libs = isset($input['EXTRA_LIBS']) && $input['EXTRA_LIBS'] ? " {$input['EXTRA_LIBS']}" : '';
|
|
||||||
$ldflags = isset($input['EXTRA_LDFLAGS_PROGRAM']) && $input['EXTRA_LDFLAGS_PROGRAM'] ? " {$input['EXTRA_LDFLAGS_PROGRAM']}" : '';
|
|
||||||
$tune_c_flags = implode(' ', array_map(fn ($x) => "-Xcompiler {$x}", $this->tune_c_flags));
|
|
||||||
return [
|
return [
|
||||||
'EXTRA_CFLAGS' => "{$optimization} -fno-ident -fPIE {$tune_c_flags}{$cflags}",
|
'EXTRA_CFLAGS' => getenv('SPC_CMD_VAR_PHP_MAKE_EXTRA_CFLAGS'),
|
||||||
'EXTRA_LIBS' => "{$this->getOption('extra-libs', '')} {$libs}",
|
'EXTRA_LIBS' => getenv('SPC_EXTRA_LIBS') . ' ' . getenv('SPC_CMD_VAR_PHP_MAKE_EXTRA_LIBS'),
|
||||||
'EXTRA_LDFLAGS_PROGRAM' => "{$use_lld} -all-static{$ldflags}",
|
'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));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -110,11 +110,7 @@ class SystemUtil
|
|||||||
public static function getTuneCFlags(string $arch): array
|
public static function getTuneCFlags(string $arch): array
|
||||||
{
|
{
|
||||||
return match ($arch) {
|
return match ($arch) {
|
||||||
'x86_64' => [
|
'x86_64', 'arm64', 'aarch64' => [],
|
||||||
'-march=corei7',
|
|
||||||
'-mtune=core-avx2',
|
|
||||||
],
|
|
||||||
'arm64', 'aarch64' => [],
|
|
||||||
default => throw new RuntimeException('unsupported arch: ' . $arch),
|
default => throw new RuntimeException('unsupported arch: ' . $arch),
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
@@ -224,6 +220,8 @@ class SystemUtil
|
|||||||
'redhat',
|
'redhat',
|
||||||
// alpine
|
// alpine
|
||||||
'alpine',
|
'alpine',
|
||||||
|
// arch
|
||||||
|
'arch', 'manjaro',
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
12
src/SPC/builder/linux/library/gettext.php
Normal file
12
src/SPC/builder/linux/library/gettext.php
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace SPC\builder\linux\library;
|
||||||
|
|
||||||
|
class gettext extends LinuxLibraryBase
|
||||||
|
{
|
||||||
|
use \SPC\builder\unix\library\gettext;
|
||||||
|
|
||||||
|
public const NAME = 'gettext';
|
||||||
|
}
|
||||||
@@ -11,7 +11,7 @@ class icu extends LinuxLibraryBase
|
|||||||
protected function build(): void
|
protected function build(): void
|
||||||
{
|
{
|
||||||
$cppflags = 'CPPFLAGS="-DU_CHARSET_IS_UTF8=1 -DU_USING_ICU_NAMESPACE=1 -DU_STATIC_IMPLEMENTATION=1"';
|
$cppflags = 'CPPFLAGS="-DU_CHARSET_IS_UTF8=1 -DU_USING_ICU_NAMESPACE=1 -DU_STATIC_IMPLEMENTATION=1"';
|
||||||
$cxxflags = 'CXXFLAGS="-std=c++11"';
|
$cxxflags = 'CXXFLAGS="-std=c++17"';
|
||||||
$ldflags = 'LDFLAGS="-static"';
|
$ldflags = 'LDFLAGS="-static"';
|
||||||
shell()->cd($this->source_dir . '/source')
|
shell()->cd($this->source_dir . '/source')
|
||||||
->exec(
|
->exec(
|
||||||
|
|||||||
@@ -4,7 +4,6 @@ declare(strict_types=1);
|
|||||||
|
|
||||||
namespace SPC\builder\linux\library;
|
namespace SPC\builder\linux\library;
|
||||||
|
|
||||||
use SPC\exception\WrongUsageException;
|
|
||||||
use SPC\store\FileSystem;
|
use SPC\store\FileSystem;
|
||||||
|
|
||||||
class libargon2 extends LinuxLibraryBase
|
class libargon2 extends LinuxLibraryBase
|
||||||
@@ -15,10 +14,6 @@ class libargon2 extends LinuxLibraryBase
|
|||||||
|
|
||||||
public function patchBeforeBuild(): bool
|
public function patchBeforeBuild(): bool
|
||||||
{
|
{
|
||||||
// detect libsodium (The libargon2 conflicts with the libsodium library.)
|
|
||||||
if ($this->builder->getLib('libsodium') !== null) {
|
|
||||||
throw new WrongUsageException('libargon2 (required by password-argon2) conflicts with the libsodium library !');
|
|
||||||
}
|
|
||||||
FileSystem::replaceFileStr($this->source_dir . '/Makefile', 'LIBRARY_REL ?= lib/x86_64-linux-gnu', 'LIBRARY_REL ?= lib');
|
FileSystem::replaceFileStr($this->source_dir . '/Makefile', 'LIBRARY_REL ?= lib/x86_64-linux-gnu', 'LIBRARY_REL ?= lib');
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|||||||
12
src/SPC/builder/linux/library/librabbitmq.php
Normal file
12
src/SPC/builder/linux/library/librabbitmq.php
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace SPC\builder\linux\library;
|
||||||
|
|
||||||
|
class librabbitmq extends LinuxLibraryBase
|
||||||
|
{
|
||||||
|
use \SPC\builder\unix\library\librabbitmq;
|
||||||
|
|
||||||
|
public const NAME = 'librabbitmq';
|
||||||
|
}
|
||||||
12
src/SPC/builder/linux/library/libtiff.php
Normal file
12
src/SPC/builder/linux/library/libtiff.php
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace SPC\builder\linux\library;
|
||||||
|
|
||||||
|
class libtiff extends LinuxLibraryBase
|
||||||
|
{
|
||||||
|
use \SPC\builder\unix\library\libtiff;
|
||||||
|
|
||||||
|
public const NAME = 'libtiff';
|
||||||
|
}
|
||||||
12
src/SPC/builder/linux/library/libuuid.php
Normal file
12
src/SPC/builder/linux/library/libuuid.php
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace SPC\builder\linux\library;
|
||||||
|
|
||||||
|
class libuuid extends LinuxLibraryBase
|
||||||
|
{
|
||||||
|
use \SPC\builder\unix\library\libuuid;
|
||||||
|
|
||||||
|
public const NAME = 'libuuid';
|
||||||
|
}
|
||||||
@@ -18,7 +18,7 @@ class libxml2 extends LinuxLibraryBase
|
|||||||
*/
|
*/
|
||||||
public function build(): void
|
public function build(): void
|
||||||
{
|
{
|
||||||
$enable_zlib = $this->builder->getLib('zlib') ? 'ON' : 'OFF';
|
$enable_zlib = $this->builder->getLib('zlib') ? ('ON -DZLIB_LIBRARY=' . BUILD_LIB_PATH . '/libz.a -DZLIB_INCLUDE_DIR=' . BUILD_INCLUDE_PATH) : 'OFF';
|
||||||
$enable_icu = $this->builder->getLib('icu') ? 'ON' : 'OFF';
|
$enable_icu = $this->builder->getLib('icu') ? 'ON' : 'OFF';
|
||||||
$enable_xz = $this->builder->getLib('xz') ? 'ON' : 'OFF';
|
$enable_xz = $this->builder->getLib('xz') ? 'ON' : 'OFF';
|
||||||
|
|
||||||
@@ -28,6 +28,7 @@ class libxml2 extends LinuxLibraryBase
|
|||||||
'cmake ' .
|
'cmake ' .
|
||||||
'-DCMAKE_BUILD_TYPE=Release ' .
|
'-DCMAKE_BUILD_TYPE=Release ' .
|
||||||
'-DCMAKE_INSTALL_PREFIX=' . BUILD_ROOT_PATH . ' ' .
|
'-DCMAKE_INSTALL_PREFIX=' . BUILD_ROOT_PATH . ' ' .
|
||||||
|
'-DCMAKE_INSTALL_LIBDIR=' . BUILD_LIB_PATH . ' ' .
|
||||||
"-DCMAKE_TOOLCHAIN_FILE={$this->builder->cmake_toolchain_file} " .
|
"-DCMAKE_TOOLCHAIN_FILE={$this->builder->cmake_toolchain_file} " .
|
||||||
'-DBUILD_SHARED_LIBS=OFF ' .
|
'-DBUILD_SHARED_LIBS=OFF ' .
|
||||||
'-DIconv_IS_BUILT_IN=OFF ' .
|
'-DIconv_IS_BUILT_IN=OFF ' .
|
||||||
|
|||||||
@@ -24,6 +24,7 @@ use SPC\builder\linux\SystemUtil;
|
|||||||
use SPC\exception\FileSystemException;
|
use SPC\exception\FileSystemException;
|
||||||
use SPC\exception\RuntimeException;
|
use SPC\exception\RuntimeException;
|
||||||
use SPC\exception\WrongUsageException;
|
use SPC\exception\WrongUsageException;
|
||||||
|
use SPC\store\FileSystem;
|
||||||
|
|
||||||
class openssl extends LinuxLibraryBase
|
class openssl extends LinuxLibraryBase
|
||||||
{
|
{
|
||||||
@@ -41,8 +42,7 @@ class openssl extends LinuxLibraryBase
|
|||||||
$extra = '';
|
$extra = '';
|
||||||
$ex_lib = '-ldl -pthread';
|
$ex_lib = '-ldl -pthread';
|
||||||
|
|
||||||
$env = "CFLAGS='{$this->builder->arch_c_flags}'";
|
$env = "CC='" . getenv('CC') . ' -static -idirafter ' . BUILD_INCLUDE_PATH .
|
||||||
$env .= " CC='" . getenv('CC') . ' -static -idirafter ' . BUILD_INCLUDE_PATH .
|
|
||||||
' -idirafter /usr/include/ ' .
|
' -idirafter /usr/include/ ' .
|
||||||
' -idirafter /usr/include/' . $this->builder->getOption('arch') . '-linux-gnu/ ' .
|
' -idirafter /usr/include/' . $this->builder->getOption('arch') . '-linux-gnu/ ' .
|
||||||
"' ";
|
"' ";
|
||||||
@@ -63,7 +63,8 @@ class openssl extends LinuxLibraryBase
|
|||||||
$clang_postfix = SystemUtil::getCCType(getenv('CC')) === 'clang' ? '-clang' : '';
|
$clang_postfix = SystemUtil::getCCType(getenv('CC')) === 'clang' ? '-clang' : '';
|
||||||
|
|
||||||
shell()->cd($this->source_dir)
|
shell()->cd($this->source_dir)
|
||||||
->exec(
|
->setEnv(['CFLAGS' => $this->getLibExtraCFlags() ?: $this->builder->arch_c_flags, 'LDFLAGS' => $this->getLibExtraLdFlags(), 'LIBS' => $this->getLibExtraLibs()])
|
||||||
|
->execWithEnv(
|
||||||
"{$env} ./Configure no-shared {$extra} " .
|
"{$env} ./Configure no-shared {$extra} " .
|
||||||
'--prefix=/ ' .
|
'--prefix=/ ' .
|
||||||
'--libdir=lib ' .
|
'--libdir=lib ' .
|
||||||
@@ -73,8 +74,18 @@ class openssl extends LinuxLibraryBase
|
|||||||
"linux-{$this->builder->getOption('arch')}{$clang_postfix}"
|
"linux-{$this->builder->getOption('arch')}{$clang_postfix}"
|
||||||
)
|
)
|
||||||
->exec('make clean')
|
->exec('make clean')
|
||||||
->exec("make -j{$this->builder->concurrency} CNF_EX_LIBS=\"{$ex_lib}\"")
|
->execWithEnv("make -j{$this->builder->concurrency} CNF_EX_LIBS=\"{$ex_lib}\"")
|
||||||
->exec("make install_sw DESTDIR={$destdir}");
|
->exec("make install_sw DESTDIR={$destdir}");
|
||||||
$this->patchPkgconfPrefix(['libssl.pc', 'openssl.pc', 'libcrypto.pc']);
|
$this->patchPkgconfPrefix(['libssl.pc', 'openssl.pc', 'libcrypto.pc']);
|
||||||
|
// patch for openssl 3.3.0+
|
||||||
|
if (!str_contains($file = FileSystem::readFile(BUILD_LIB_PATH . '/pkgconfig/libssl.pc'), 'prefix=')) {
|
||||||
|
FileSystem::writeFile(BUILD_LIB_PATH . '/pkgconfig/libssl.pc', 'prefix=' . BUILD_ROOT_PATH . "\n" . $file);
|
||||||
|
}
|
||||||
|
if (!str_contains($file = FileSystem::readFile(BUILD_LIB_PATH . '/pkgconfig/openssl.pc'), 'prefix=')) {
|
||||||
|
FileSystem::writeFile(BUILD_LIB_PATH . '/pkgconfig/openssl.pc', 'prefix=' . BUILD_ROOT_PATH . "\n" . $file);
|
||||||
|
}
|
||||||
|
if (!str_contains($file = FileSystem::readFile(BUILD_LIB_PATH . '/pkgconfig/libcrypto.pc'), 'prefix=')) {
|
||||||
|
FileSystem::writeFile(BUILD_LIB_PATH . '/pkgconfig/libcrypto.pc', 'prefix=' . BUILD_ROOT_PATH . "\n" . $file);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
12
src/SPC/builder/linux/library/qdbm.php
Normal file
12
src/SPC/builder/linux/library/qdbm.php
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace SPC\builder\linux\library;
|
||||||
|
|
||||||
|
class qdbm extends LinuxLibraryBase
|
||||||
|
{
|
||||||
|
use \SPC\builder\unix\library\qdbm;
|
||||||
|
|
||||||
|
public const NAME = 'qdbm';
|
||||||
|
}
|
||||||
@@ -4,20 +4,17 @@ declare(strict_types=1);
|
|||||||
|
|
||||||
namespace SPC\builder\macos;
|
namespace SPC\builder\macos;
|
||||||
|
|
||||||
use SPC\builder\BuilderBase;
|
|
||||||
use SPC\builder\macos\library\MacOSLibraryBase;
|
use SPC\builder\macos\library\MacOSLibraryBase;
|
||||||
use SPC\builder\traits\UnixBuilderTrait;
|
use SPC\builder\unix\UnixBuilderBase;
|
||||||
use SPC\exception\FileSystemException;
|
use SPC\exception\FileSystemException;
|
||||||
use SPC\exception\RuntimeException;
|
use SPC\exception\RuntimeException;
|
||||||
use SPC\exception\WrongUsageException;
|
use SPC\exception\WrongUsageException;
|
||||||
use SPC\store\FileSystem;
|
use SPC\store\FileSystem;
|
||||||
use SPC\store\SourcePatcher;
|
use SPC\store\SourcePatcher;
|
||||||
|
use SPC\util\GlobalEnvManager;
|
||||||
|
|
||||||
class MacOSBuilder extends BuilderBase
|
class MacOSBuilder extends UnixBuilderBase
|
||||||
{
|
{
|
||||||
/** Unix compatible builder methods */
|
|
||||||
use UnixBuilderTrait;
|
|
||||||
|
|
||||||
/** @var bool Micro patch phar flag */
|
/** @var bool Micro patch phar flag */
|
||||||
private bool $phar_patched = false;
|
private bool $phar_patched = false;
|
||||||
|
|
||||||
@@ -30,28 +27,15 @@ class MacOSBuilder extends BuilderBase
|
|||||||
{
|
{
|
||||||
$this->options = $options;
|
$this->options = $options;
|
||||||
|
|
||||||
// ---------- set necessary options ----------
|
// apply global environment variables
|
||||||
// set C Compiler (default: clang)
|
GlobalEnvManager::init($this);
|
||||||
f_putenv('CC=' . $this->getOption('cc', 'clang'));
|
|
||||||
// set C++ Composer (default: clang++)
|
|
||||||
f_putenv('CXX=' . $this->getOption('cxx', 'clang++'));
|
|
||||||
// set PATH
|
|
||||||
f_putenv('PATH=' . BUILD_ROOT_PATH . '/bin:' . getenv('PATH'));
|
|
||||||
// set PKG_CONFIG
|
|
||||||
f_putenv('PKG_CONFIG=' . BUILD_ROOT_PATH . '/bin/pkg-config');
|
|
||||||
// set PKG_CONFIG_PATH
|
|
||||||
f_putenv('PKG_CONFIG_PATH=' . BUILD_LIB_PATH . '/pkgconfig/');
|
|
||||||
|
|
||||||
// set arch (default: current)
|
// ---------- set necessary compile vars ----------
|
||||||
$this->setOptionIfNotExist('arch', php_uname('m'));
|
|
||||||
$this->setOptionIfNotExist('gnu-arch', arch2gnu($this->getOption('arch')));
|
|
||||||
|
|
||||||
// ---------- set necessary compile environments ----------
|
|
||||||
// concurrency
|
// concurrency
|
||||||
$this->concurrency = SystemUtil::getCpuCount();
|
$this->concurrency = intval(getenv('SPC_CONCURRENCY'));
|
||||||
// cflags
|
// cflags
|
||||||
$this->arch_c_flags = SystemUtil::getArchCFlags($this->getOption('arch'));
|
$this->arch_c_flags = getenv('SPC_DEFAULT_C_FLAGS');
|
||||||
$this->arch_cxx_flags = SystemUtil::getArchCFlags($this->getOption('arch'));
|
$this->arch_cxx_flags = getenv('SPC_DEFAULT_CXX_FLAGS');
|
||||||
// cmake toolchain
|
// cmake toolchain
|
||||||
$this->cmake_toolchain_file = SystemUtil::makeCmakeToolchainFile('Darwin', $this->getOption('arch'), $this->arch_c_flags);
|
$this->cmake_toolchain_file = SystemUtil::makeCmakeToolchainFile('Darwin', $this->getOption('arch'), $this->arch_c_flags);
|
||||||
|
|
||||||
@@ -127,24 +111,25 @@ class MacOSBuilder extends BuilderBase
|
|||||||
*/
|
*/
|
||||||
public function buildPHP(int $build_target = BUILD_TARGET_NONE): void
|
public function buildPHP(int $build_target = BUILD_TARGET_NONE): void
|
||||||
{
|
{
|
||||||
|
$extra_libs = getenv('SPC_EXTRA_LIBS') ?: '';
|
||||||
// ---------- Update extra-libs ----------
|
// ---------- Update extra-libs ----------
|
||||||
$extra_libs = $this->getOption('extra-libs', '');
|
|
||||||
// add macOS frameworks
|
// add macOS frameworks
|
||||||
$extra_libs .= (empty($extra_libs) ? '' : ' ') . $this->getFrameworks(true);
|
$extra_libs .= (empty($extra_libs) ? '' : ' ') . $this->getFrameworks(true);
|
||||||
// add libc++, some extensions or libraries need it (C++ cannot be linked statically)
|
// add libc++, some extensions or libraries need it (C++ cannot be linked statically)
|
||||||
$extra_libs .= (empty($extra_libs) ? '' : ' ') . ($this->hasCpp() ? '-lc++ ' : '');
|
$extra_libs .= (empty($extra_libs) ? '' : ' ') . ($this->hasCpp() ? '-lc++ ' : '');
|
||||||
|
// bloat means force-load all static libraries, even if they are not used
|
||||||
if (!$this->getOption('bloat', false)) {
|
if (!$this->getOption('bloat', false)) {
|
||||||
$extra_libs .= (empty($extra_libs) ? '' : ' ') . implode(' ', $this->getAllStaticLibFiles());
|
$extra_libs .= (empty($extra_libs) ? '' : ' ') . implode(' ', $this->getAllStaticLibFiles());
|
||||||
} else {
|
} else {
|
||||||
logger()->info('bloat linking');
|
logger()->info('bloat linking');
|
||||||
$extra_libs .= (empty($extra_libs) ? '' : ' ') . implode(' ', array_map(fn ($x) => "-Wl,-force_load,{$x}", array_filter($this->getAllStaticLibFiles())));
|
$extra_libs .= (empty($extra_libs) ? '' : ' ') . implode(' ', array_map(fn ($x) => "-Wl,-force_load,{$x}", array_filter($this->getAllStaticLibFiles())));
|
||||||
}
|
}
|
||||||
$this->setOption('extra-libs', $extra_libs);
|
f_putenv('SPC_EXTRA_LIBS=' . $extra_libs);
|
||||||
|
|
||||||
$this->emitPatchPoint('before-php-buildconf');
|
$this->emitPatchPoint('before-php-buildconf');
|
||||||
SourcePatcher::patchBeforeBuildconf($this);
|
SourcePatcher::patchBeforeBuildconf($this);
|
||||||
|
|
||||||
shell()->cd(SOURCE_PATH . '/php-src')->exec('./buildconf --force');
|
shell()->cd(SOURCE_PATH . '/php-src')->exec(getenv('SPC_CMD_PREFIX_PHP_BUILDCONF'));
|
||||||
|
|
||||||
$this->emitPatchPoint('before-php-configure');
|
$this->emitPatchPoint('before-php-configure');
|
||||||
SourcePatcher::patchBeforeConfigure($this);
|
SourcePatcher::patchBeforeConfigure($this);
|
||||||
@@ -159,9 +144,9 @@ class MacOSBuilder extends BuilderBase
|
|||||||
|
|
||||||
// prepare build php envs
|
// prepare build php envs
|
||||||
$envs_build_php = SystemUtil::makeEnvVarString([
|
$envs_build_php = SystemUtil::makeEnvVarString([
|
||||||
'CFLAGS' => " {$this->arch_c_flags} -Werror=unknown-warning-option ",
|
'CFLAGS' => getenv('SPC_CMD_VAR_PHP_CONFIGURE_CFLAGS'),
|
||||||
'CPPFLAGS' => '-I' . BUILD_INCLUDE_PATH,
|
'CPPFLAGS' => getenv('SPC_CMD_VAR_PHP_CONFIGURE_CPPFLAGS'),
|
||||||
'LDFLAGS' => '-L' . BUILD_LIB_PATH,
|
'LDFLAGS' => getenv('SPC_CMD_VAR_PHP_CONFIGURE_LDFLAGS'),
|
||||||
]);
|
]);
|
||||||
|
|
||||||
if ($this->getLib('postgresql')) {
|
if ($this->getLib('postgresql')) {
|
||||||
@@ -174,14 +159,7 @@ class MacOSBuilder extends BuilderBase
|
|||||||
|
|
||||||
shell()->cd(SOURCE_PATH . '/php-src')
|
shell()->cd(SOURCE_PATH . '/php-src')
|
||||||
->exec(
|
->exec(
|
||||||
'./configure ' .
|
getenv('SPC_CMD_PREFIX_PHP_CONFIGURE') . ' ' .
|
||||||
'--prefix= ' .
|
|
||||||
'--with-valgrind=no ' . // Not detect memory leak
|
|
||||||
'--enable-shared=no ' .
|
|
||||||
'--enable-static=yes ' .
|
|
||||||
'--disable-all ' .
|
|
||||||
'--disable-cgi ' .
|
|
||||||
'--disable-phpdbg ' .
|
|
||||||
($enableCli ? '--enable-cli ' : '--disable-cli ') .
|
($enableCli ? '--enable-cli ' : '--disable-cli ') .
|
||||||
($enableFpm ? '--enable-fpm ' : '--disable-fpm ') .
|
($enableFpm ? '--enable-fpm ' : '--disable-fpm ') .
|
||||||
($enableEmbed ? '--enable-embed=static ' : '--disable-embed ') .
|
($enableEmbed ? '--enable-embed=static ' : '--disable-embed ') .
|
||||||
@@ -231,10 +209,10 @@ class MacOSBuilder extends BuilderBase
|
|||||||
*/
|
*/
|
||||||
protected function buildCli(): void
|
protected function buildCli(): void
|
||||||
{
|
{
|
||||||
$vars = SystemUtil::makeEnvVarString($this->getBuildVars());
|
$vars = SystemUtil::makeEnvVarString($this->getMakeExtraVars());
|
||||||
|
|
||||||
$shell = shell()->cd(SOURCE_PATH . '/php-src');
|
$shell = shell()->cd(SOURCE_PATH . '/php-src');
|
||||||
$shell->exec("make -j{$this->concurrency} {$vars} cli");
|
$shell->exec("\$SPC_CMD_PREFIX_PHP_MAKE {$vars} cli");
|
||||||
if (!$this->getOption('no-strip', false)) {
|
if (!$this->getOption('no-strip', false)) {
|
||||||
$shell->exec('dsymutil -f sapi/cli/php')->exec('strip sapi/cli/php');
|
$shell->exec('dsymutil -f sapi/cli/php')->exec('strip sapi/cli/php');
|
||||||
}
|
}
|
||||||
@@ -255,26 +233,25 @@ class MacOSBuilder extends BuilderBase
|
|||||||
}
|
}
|
||||||
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' : '';
|
||||||
$vars = [
|
$vars = $this->getMakeExtraVars();
|
||||||
// with debug information, optimize for size, remove identifiers, patch fake cli for micro
|
|
||||||
'EXTRA_CFLAGS' => '-g -Os -fno-ident' . $enable_fake_cli,
|
// patch fake cli for micro
|
||||||
];
|
$vars['EXTRA_CFLAGS'] .= $enable_fake_cli;
|
||||||
$vars = $this->getBuildVars($vars);
|
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);
|
||||||
|
|
||||||
shell()->cd(SOURCE_PATH . '/php-src')
|
shell()->cd(SOURCE_PATH . '/php-src')->exec(getenv('SPC_CMD_PREFIX_PHP_MAKE') . " {$vars} micro");
|
||||||
->exec("make -j{$this->concurrency} {$vars} micro");
|
|
||||||
$this->deployBinary(BUILD_TARGET_MICRO);
|
$this->deployBinary(BUILD_TARGET_MICRO);
|
||||||
|
|
||||||
if ($this->phar_patched) {
|
if ($this->phar_patched) {
|
||||||
SourcePatcher::patchMicro(['phar'], true);
|
SourcePatcher::unpatchMicroPhar();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -286,10 +263,10 @@ class MacOSBuilder extends BuilderBase
|
|||||||
*/
|
*/
|
||||||
protected function buildFpm(): void
|
protected function buildFpm(): void
|
||||||
{
|
{
|
||||||
$vars = SystemUtil::makeEnvVarString($this->getBuildVars());
|
$vars = SystemUtil::makeEnvVarString($this->getMakeExtraVars());
|
||||||
|
|
||||||
$shell = shell()->cd(SOURCE_PATH . '/php-src');
|
$shell = shell()->cd(SOURCE_PATH . '/php-src');
|
||||||
$shell->exec("make -j{$this->concurrency} {$vars} fpm");
|
$shell->exec(getenv('SPC_CMD_PREFIX_PHP_MAKE') . " {$vars} fpm");
|
||||||
if (!$this->getOption('no-strip', false)) {
|
if (!$this->getOption('no-strip', false)) {
|
||||||
$shell->exec('dsymutil -f sapi/fpm/php-fpm')->exec('strip sapi/fpm/php-fpm');
|
$shell->exec('dsymutil -f sapi/fpm/php-fpm')->exec('strip sapi/fpm/php-fpm');
|
||||||
}
|
}
|
||||||
@@ -303,11 +280,10 @@ class MacOSBuilder extends BuilderBase
|
|||||||
*/
|
*/
|
||||||
protected function buildEmbed(): void
|
protected function buildEmbed(): void
|
||||||
{
|
{
|
||||||
$vars = SystemUtil::makeEnvVarString($this->getBuildVars());
|
$vars = SystemUtil::makeEnvVarString($this->getMakeExtraVars());
|
||||||
|
|
||||||
shell()
|
shell()->cd(SOURCE_PATH . '/php-src')
|
||||||
->cd(SOURCE_PATH . '/php-src')
|
->exec(getenv('SPC_CMD_PREFIX_PHP_MAKE') . ' INSTALL_ROOT=' . BUILD_ROOT_PATH . " {$vars} install")
|
||||||
->exec('make INSTALL_ROOT=' . BUILD_ROOT_PATH . " -j{$this->concurrency} {$vars} install")
|
|
||||||
// Workaround for https://github.com/php/php-src/issues/12082
|
// Workaround for https://github.com/php/php-src/issues/12082
|
||||||
->exec('rm -Rf ' . BUILD_ROOT_PATH . '/lib/php-o')
|
->exec('rm -Rf ' . BUILD_ROOT_PATH . '/lib/php-o')
|
||||||
->exec('mkdir ' . BUILD_ROOT_PATH . '/lib/php-o')
|
->exec('mkdir ' . BUILD_ROOT_PATH . '/lib/php-o')
|
||||||
@@ -318,14 +294,11 @@ class MacOSBuilder extends BuilderBase
|
|||||||
->exec('rm -Rf ' . BUILD_ROOT_PATH . '/lib/php-o');
|
->exec('rm -Rf ' . BUILD_ROOT_PATH . '/lib/php-o');
|
||||||
}
|
}
|
||||||
|
|
||||||
private function getBuildVars($input = []): array
|
private function getMakeExtraVars(): array
|
||||||
{
|
{
|
||||||
$optimization = $this->getOption('no-strip', false) ? '-g -O0' : '-g0 -Os';
|
|
||||||
$cflags = isset($input['EXTRA_CFLAGS']) && $input['EXTRA_CFLAGS'] ? " {$input['EXTRA_CFLAGS']}" : '';
|
|
||||||
$libs = isset($input['EXTRA_LIBS']) && $input['EXTRA_LIBS'] ? " {$input['EXTRA_LIBS']}" : '';
|
|
||||||
return [
|
return [
|
||||||
'EXTRA_CFLAGS' => "{$optimization} {$cflags} " . $this->getOption('x-extra-cflags'),
|
'EXTRA_CFLAGS' => getenv('SPC_CMD_VAR_PHP_MAKE_EXTRA_CFLAGS'),
|
||||||
'EXTRA_LIBS' => "{$this->getOption('extra-libs')} -lresolv {$libs} " . $this->getOption('x-extra-libs'),
|
'EXTRA_LIBS' => getenv('SPC_EXTRA_LIBS') . ' ' . getenv('SPC_CMD_VAR_PHP_MAKE_EXTRA_LIBS'),
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
12
src/SPC/builder/macos/library/gettext.php
Normal file
12
src/SPC/builder/macos/library/gettext.php
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace SPC\builder\macos\library;
|
||||||
|
|
||||||
|
class gettext extends MacOSLibraryBase
|
||||||
|
{
|
||||||
|
use \SPC\builder\unix\library\gettext;
|
||||||
|
|
||||||
|
public const NAME = 'gettext';
|
||||||
|
}
|
||||||
@@ -35,7 +35,7 @@ class libpng extends MacOSLibraryBase
|
|||||||
*/
|
*/
|
||||||
protected function build(): void
|
protected function build(): void
|
||||||
{
|
{
|
||||||
$optimizations = match ($this->builder->getOption('arch')) {
|
$optimizations = match (php_uname('m')) {
|
||||||
'x86_64' => '--enable-intel-sse ',
|
'x86_64' => '--enable-intel-sse ',
|
||||||
'arm64' => '--enable-arm-neon ',
|
'arm64' => '--enable-arm-neon ',
|
||||||
default => '',
|
default => '',
|
||||||
@@ -45,7 +45,7 @@ class libpng extends MacOSLibraryBase
|
|||||||
->exec('chmod +x ./install-sh')
|
->exec('chmod +x ./install-sh')
|
||||||
->exec(
|
->exec(
|
||||||
'./configure ' .
|
'./configure ' .
|
||||||
"--host={$this->builder->getOption('gnu-arch')}-apple-darwin " .
|
'--host=' . arch2gnu(php_uname('m')) . '-apple-darwin ' .
|
||||||
'--disable-shared ' .
|
'--disable-shared ' .
|
||||||
'--enable-static ' .
|
'--enable-static ' .
|
||||||
'--enable-hardware-optimizations ' .
|
'--enable-hardware-optimizations ' .
|
||||||
|
|||||||
12
src/SPC/builder/macos/library/librabbitmq.php
Normal file
12
src/SPC/builder/macos/library/librabbitmq.php
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace SPC\builder\macos\library;
|
||||||
|
|
||||||
|
class librabbitmq extends MacOSLibraryBase
|
||||||
|
{
|
||||||
|
use \SPC\builder\unix\library\librabbitmq;
|
||||||
|
|
||||||
|
public const NAME = 'librabbitmq';
|
||||||
|
}
|
||||||
12
src/SPC/builder/macos/library/libtiff.php
Normal file
12
src/SPC/builder/macos/library/libtiff.php
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace SPC\builder\macos\library;
|
||||||
|
|
||||||
|
class libtiff extends MacOSLibraryBase
|
||||||
|
{
|
||||||
|
use \SPC\builder\unix\library\libtiff;
|
||||||
|
|
||||||
|
public const NAME = 'libtiff';
|
||||||
|
}
|
||||||
12
src/SPC/builder/macos/library/libuuid.php
Normal file
12
src/SPC/builder/macos/library/libuuid.php
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace SPC\builder\macos\library;
|
||||||
|
|
||||||
|
class libuuid extends MacOSLibraryBase
|
||||||
|
{
|
||||||
|
use \SPC\builder\unix\library\libuuid;
|
||||||
|
|
||||||
|
public const NAME = 'libuuid';
|
||||||
|
}
|
||||||
@@ -18,7 +18,7 @@ class libxml2 extends MacOSLibraryBase
|
|||||||
*/
|
*/
|
||||||
protected function build(): void
|
protected function build(): void
|
||||||
{
|
{
|
||||||
$enable_zlib = $this->builder->getLib('zlib') ? 'ON' : 'OFF';
|
$enable_zlib = $this->builder->getLib('zlib') ? ('ON -DZLIB_LIBRARY=' . BUILD_LIB_PATH . '/libz.a -DZLIB_INCLUDE_DIR=' . BUILD_INCLUDE_PATH) : 'OFF';
|
||||||
$enable_icu = $this->builder->getLib('icu') ? 'ON' : 'OFF';
|
$enable_icu = $this->builder->getLib('icu') ? 'ON' : 'OFF';
|
||||||
$enable_xz = $this->builder->getLib('xz') ? 'ON' : 'OFF';
|
$enable_xz = $this->builder->getLib('xz') ? 'ON' : 'OFF';
|
||||||
|
|
||||||
@@ -29,6 +29,7 @@ class libxml2 extends MacOSLibraryBase
|
|||||||
// '--debug-find ' .
|
// '--debug-find ' .
|
||||||
'-DCMAKE_BUILD_TYPE=Release ' .
|
'-DCMAKE_BUILD_TYPE=Release ' .
|
||||||
'-DCMAKE_INSTALL_PREFIX=' . BUILD_ROOT_PATH . ' ' .
|
'-DCMAKE_INSTALL_PREFIX=' . BUILD_ROOT_PATH . ' ' .
|
||||||
|
'-DCMAKE_INSTALL_LIBDIR=' . BUILD_LIB_PATH . ' ' .
|
||||||
"-DCMAKE_TOOLCHAIN_FILE={$this->builder->cmake_toolchain_file} " .
|
"-DCMAKE_TOOLCHAIN_FILE={$this->builder->cmake_toolchain_file} " .
|
||||||
'-DBUILD_SHARED_LIBS=OFF ' .
|
'-DBUILD_SHARED_LIBS=OFF ' .
|
||||||
'-DLIBXML2_WITH_ICONV=ON ' .
|
'-DLIBXML2_WITH_ICONV=ON ' .
|
||||||
|
|||||||
@@ -23,6 +23,7 @@ namespace SPC\builder\macos\library;
|
|||||||
use SPC\exception\FileSystemException;
|
use SPC\exception\FileSystemException;
|
||||||
use SPC\exception\RuntimeException;
|
use SPC\exception\RuntimeException;
|
||||||
use SPC\exception\WrongUsageException;
|
use SPC\exception\WrongUsageException;
|
||||||
|
use SPC\store\FileSystem;
|
||||||
|
|
||||||
class openssl extends MacOSLibraryBase
|
class openssl extends MacOSLibraryBase
|
||||||
{
|
{
|
||||||
@@ -47,6 +48,7 @@ class openssl extends MacOSLibraryBase
|
|||||||
}
|
}
|
||||||
|
|
||||||
shell()->cd($this->source_dir)
|
shell()->cd($this->source_dir)
|
||||||
|
->setEnv(['CFLAGS' => $this->getLibExtraCFlags(), 'LDFLAGS' => $this->getLibExtraLdFlags(), 'LIBS' => $this->getLibExtraLibs()])
|
||||||
->exec(
|
->exec(
|
||||||
"./Configure no-shared {$extra} " .
|
"./Configure no-shared {$extra} " .
|
||||||
'--prefix=/ ' . // use prefix=/
|
'--prefix=/ ' . // use prefix=/
|
||||||
@@ -55,8 +57,18 @@ class openssl extends MacOSLibraryBase
|
|||||||
"darwin64-{$this->builder->getOption('arch')}-cc"
|
"darwin64-{$this->builder->getOption('arch')}-cc"
|
||||||
)
|
)
|
||||||
->exec('make clean')
|
->exec('make clean')
|
||||||
->exec("make -j{$this->builder->concurrency} CNF_EX_LIBS=\"{$ex_lib}\"")
|
->execWithEnv("make -j{$this->builder->concurrency} CNF_EX_LIBS=\"{$ex_lib}\"")
|
||||||
->exec("make install_sw DESTDIR={$destdir}");
|
->exec("make install_sw DESTDIR={$destdir}");
|
||||||
$this->patchPkgconfPrefix(['libssl.pc', 'openssl.pc', 'libcrypto.pc']);
|
$this->patchPkgconfPrefix(['libssl.pc', 'openssl.pc', 'libcrypto.pc']);
|
||||||
|
// patch for openssl 3.3.0+
|
||||||
|
if (!str_contains($file = FileSystem::readFile(BUILD_LIB_PATH . '/pkgconfig/libssl.pc'), 'prefix=')) {
|
||||||
|
FileSystem::writeFile(BUILD_LIB_PATH . '/pkgconfig/libssl.pc', 'prefix=' . BUILD_ROOT_PATH . "\n" . $file);
|
||||||
|
}
|
||||||
|
if (!str_contains($file = FileSystem::readFile(BUILD_LIB_PATH . '/pkgconfig/openssl.pc'), 'prefix=')) {
|
||||||
|
FileSystem::writeFile(BUILD_LIB_PATH . '/pkgconfig/openssl.pc', 'prefix=' . BUILD_ROOT_PATH . "\n" . $file);
|
||||||
|
}
|
||||||
|
if (!str_contains($file = FileSystem::readFile(BUILD_LIB_PATH . '/pkgconfig/libcrypto.pc'), 'prefix=')) {
|
||||||
|
FileSystem::writeFile(BUILD_LIB_PATH . '/pkgconfig/libcrypto.pc', 'prefix=' . BUILD_ROOT_PATH . "\n" . $file);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
12
src/SPC/builder/macos/library/qdbm.php
Normal file
12
src/SPC/builder/macos/library/qdbm.php
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace SPC\builder\macos\library;
|
||||||
|
|
||||||
|
class qdbm extends MacOSLibraryBase
|
||||||
|
{
|
||||||
|
use \SPC\builder\unix\library\qdbm;
|
||||||
|
|
||||||
|
public const NAME = 'qdbm';
|
||||||
|
}
|
||||||
@@ -1,20 +1,4 @@
|
|||||||
<?php
|
<?php
|
||||||
/**
|
|
||||||
* Copyright (c) 2022 Yun Dou <dixyes@gmail.com>
|
|
||||||
*
|
|
||||||
* lwmbs is licensed under Mulan PSL v2. You can use this
|
|
||||||
* software according to the terms and conditions of the
|
|
||||||
* Mulan PSL v2. You may obtain a copy of Mulan PSL v2 at:
|
|
||||||
*
|
|
||||||
* http://license.coscl.org.cn/MulanPSL2
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,
|
|
||||||
* INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
|
|
||||||
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
|
|
||||||
*
|
|
||||||
* See the Mulan PSL v2 for more details.
|
|
||||||
*/
|
|
||||||
|
|
||||||
declare(strict_types=1);
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
declare(strict_types=1);
|
|
||||||
|
|
||||||
namespace SPC\builder\traits;
|
|
||||||
|
|
||||||
trait LibraryTrait {}
|
|
||||||
@@ -12,8 +12,6 @@ use SPC\store\FileSystem;
|
|||||||
|
|
||||||
trait UnixLibraryTrait
|
trait UnixLibraryTrait
|
||||||
{
|
{
|
||||||
use LibraryTrait;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @throws RuntimeException
|
* @throws RuntimeException
|
||||||
* @throws FileSystemException
|
* @throws FileSystemException
|
||||||
@@ -50,7 +48,7 @@ trait UnixLibraryTrait
|
|||||||
* @throws RuntimeException
|
* @throws RuntimeException
|
||||||
* @throws WrongUsageException
|
* @throws WrongUsageException
|
||||||
*/
|
*/
|
||||||
public function makeAutoconfEnv(string $prefix = null): string
|
public function makeAutoconfEnv(?string $prefix = null): string
|
||||||
{
|
{
|
||||||
if ($prefix === null) {
|
if ($prefix === null) {
|
||||||
$prefix = str_replace('-', '_', strtoupper(static::NAME));
|
$prefix = str_replace('-', '_', strtoupper(static::NAME));
|
||||||
@@ -101,4 +99,19 @@ trait UnixLibraryTrait
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function getLibExtraCFlags(): string
|
||||||
|
{
|
||||||
|
return getenv($this->getSnakeCaseName() . '_CFLAGS') ?: '';
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getLibExtraLdFlags(): string
|
||||||
|
{
|
||||||
|
return getenv($this->getSnakeCaseName() . '_LDFLAGS') ?: '';
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getLibExtraLibs(): string
|
||||||
|
{
|
||||||
|
return getenv($this->getSnakeCaseName() . '_LIBS') ?: '';
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,15 +2,19 @@
|
|||||||
|
|
||||||
declare(strict_types=1);
|
declare(strict_types=1);
|
||||||
|
|
||||||
namespace SPC\builder\traits;
|
namespace SPC\builder\unix;
|
||||||
|
|
||||||
|
use SPC\builder\BuilderBase;
|
||||||
use SPC\builder\linux\LinuxBuilder;
|
use SPC\builder\linux\LinuxBuilder;
|
||||||
use SPC\exception\FileSystemException;
|
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\FileSystem;
|
use SPC\store\FileSystem;
|
||||||
|
use SPC\store\SourceManager;
|
||||||
|
use SPC\util\DependencyUtil;
|
||||||
|
|
||||||
trait UnixBuilderTrait
|
abstract class UnixBuilderBase extends BuilderBase
|
||||||
{
|
{
|
||||||
/** @var string cflags */
|
/** @var string cflags */
|
||||||
public string $arch_c_flags;
|
public string $arch_c_flags;
|
||||||
@@ -86,6 +90,55 @@ trait UnixBuilderTrait
|
|||||||
return $extra;
|
return $extra;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function proveLibs(array $sorted_libraries): void
|
||||||
|
{
|
||||||
|
// search all supported libs
|
||||||
|
$support_lib_list = [];
|
||||||
|
$classes = FileSystem::getClassesPsr4(
|
||||||
|
ROOT_DIR . '/src/SPC/builder/' . osfamily2dir() . '/library',
|
||||||
|
'SPC\builder\\' . osfamily2dir() . '\library'
|
||||||
|
);
|
||||||
|
foreach ($classes as $class) {
|
||||||
|
if (defined($class . '::NAME') && $class::NAME !== 'unknown' && Config::getLib($class::NAME) !== null) {
|
||||||
|
$support_lib_list[$class::NAME] = $class;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// if no libs specified, compile all supported libs
|
||||||
|
if ($sorted_libraries === [] && $this->isLibsOnly()) {
|
||||||
|
$libraries = array_keys($support_lib_list);
|
||||||
|
$sorted_libraries = DependencyUtil::getLibs($libraries);
|
||||||
|
}
|
||||||
|
|
||||||
|
// pkg-config must be compiled first, whether it is specified or not
|
||||||
|
if (!in_array('pkg-config', $sorted_libraries)) {
|
||||||
|
array_unshift($sorted_libraries, 'pkg-config');
|
||||||
|
}
|
||||||
|
|
||||||
|
// add lib object for builder
|
||||||
|
foreach ($sorted_libraries as $library) {
|
||||||
|
// if some libs are not supported (but in config "lib.json", throw exception)
|
||||||
|
if (!isset($support_lib_list[$library])) {
|
||||||
|
throw new WrongUsageException('library [' . $library . '] is in the lib.json list but not supported to compile, but in the future I will support it!');
|
||||||
|
}
|
||||||
|
$lib = new ($support_lib_list[$library])($this);
|
||||||
|
$this->addLib($lib);
|
||||||
|
}
|
||||||
|
|
||||||
|
// calculate and check dependencies
|
||||||
|
foreach ($this->libs as $lib) {
|
||||||
|
$lib->calcDependency();
|
||||||
|
}
|
||||||
|
|
||||||
|
// patch point
|
||||||
|
$this->emitPatchPoint('before-libs-extract');
|
||||||
|
|
||||||
|
// extract sources
|
||||||
|
SourceManager::initSource(libs: $sorted_libraries);
|
||||||
|
|
||||||
|
$this->emitPatchPoint('after-libs-extract');
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sanity check after build complete
|
* Sanity check after build complete
|
||||||
*
|
*
|
||||||
@@ -103,24 +156,27 @@ trait UnixBuilderTrait
|
|||||||
|
|
||||||
foreach ($this->exts as $ext) {
|
foreach ($this->exts as $ext) {
|
||||||
logger()->debug('testing ext: ' . $ext->getName());
|
logger()->debug('testing ext: ' . $ext->getName());
|
||||||
$ext->runCliCheck();
|
$ext->runCliCheckUnix();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 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') .
|
}
|
||||||
'<?php echo "hello";'
|
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) {
|
||||||
if ($ret !== 0 || trim($out = implode('', $output2)) !== 'hello') {
|
if (!$closure($ret, $out)) {
|
||||||
throw new RuntimeException('micro failed sanity check, ret[' . $ret . '], out[' . ($out ?? 'NULL') . ']');
|
$raw_out = trim(implode('', $out));
|
||||||
|
throw new RuntimeException("micro failed sanity check: {$task_name}, condition [{$condition}], ret[{$ret}], out[{$raw_out}]");
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -18,14 +18,15 @@ trait brotli
|
|||||||
{
|
{
|
||||||
FileSystem::resetDir($this->source_dir . '/build-dir');
|
FileSystem::resetDir($this->source_dir . '/build-dir');
|
||||||
shell()->cd($this->source_dir . '/build-dir')
|
shell()->cd($this->source_dir . '/build-dir')
|
||||||
->exec(
|
->setEnv(['CFLAGS' => $this->getLibExtraCFlags(), 'LDFLAGS' => $this->getLibExtraLdFlags(), 'LIBS' => $this->getLibExtraLibs()])
|
||||||
|
->execWithEnv(
|
||||||
'cmake ' .
|
'cmake ' .
|
||||||
"{$this->builder->makeCmakeArgs()} " .
|
"{$this->builder->makeCmakeArgs()} " .
|
||||||
'-DBUILD_SHARED_LIBS=OFF ' .
|
'-DBUILD_SHARED_LIBS=OFF ' .
|
||||||
'..'
|
'..'
|
||||||
)
|
)
|
||||||
->exec("cmake --build . -j {$this->builder->concurrency}")
|
->execWithEnv("cmake --build . -j {$this->builder->concurrency}")
|
||||||
->exec('make install DESTDIR=' . BUILD_ROOT_PATH);
|
->execWithEnv('make install DESTDIR=' . BUILD_ROOT_PATH);
|
||||||
$this->patchPkgconfPrefix(['libbrotlicommon.pc', 'libbrotlidec.pc', 'libbrotlienc.pc']);
|
$this->patchPkgconfPrefix(['libbrotlicommon.pc', 'libbrotlidec.pc', 'libbrotlienc.pc']);
|
||||||
shell()->cd(BUILD_ROOT_PATH . '/lib')->exec('ln -sf libbrotlicommon.a libbrotli.a');
|
shell()->cd(BUILD_ROOT_PATH . '/lib')->exec('ln -sf libbrotlicommon.a libbrotli.a');
|
||||||
foreach (FileSystem::scanDirFiles(BUILD_ROOT_PATH . '/lib/', false, true) as $filename) {
|
foreach (FileSystem::scanDirFiles(BUILD_ROOT_PATH . '/lib/', false, true) as $filename) {
|
||||||
|
|||||||
@@ -9,8 +9,9 @@ trait bzip2
|
|||||||
protected function build(): void
|
protected function build(): void
|
||||||
{
|
{
|
||||||
shell()->cd($this->source_dir)
|
shell()->cd($this->source_dir)
|
||||||
->exec("make PREFIX='" . BUILD_ROOT_PATH . "' clean")
|
->setEnv(['CFLAGS' => $this->getLibExtraCFlags(), 'LDFLAGS' => $this->getLibExtraLdFlags(), 'LIBS' => $this->getLibExtraLibs()])
|
||||||
->exec("make -j{$this->builder->concurrency} {$this->builder->getEnvString()} PREFIX='" . BUILD_ROOT_PATH . "' libbz2.a")
|
->execWithEnv("make PREFIX='" . BUILD_ROOT_PATH . "' clean")
|
||||||
|
->execWithEnv("make -j{$this->builder->concurrency} {$this->builder->getEnvString()} PREFIX='" . BUILD_ROOT_PATH . "' libbz2.a")
|
||||||
->exec('cp libbz2.a ' . BUILD_LIB_PATH)
|
->exec('cp libbz2.a ' . BUILD_LIB_PATH)
|
||||||
->exec('cp bzlib.h ' . BUILD_INCLUDE_PATH);
|
->exec('cp bzlib.h ' . BUILD_INCLUDE_PATH);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -51,10 +51,11 @@ trait curl
|
|||||||
FileSystem::resetDir($this->source_dir . '/build');
|
FileSystem::resetDir($this->source_dir . '/build');
|
||||||
// compile!
|
// compile!
|
||||||
shell()->cd($this->source_dir . '/build')
|
shell()->cd($this->source_dir . '/build')
|
||||||
|
->setEnv(['CFLAGS' => $this->getLibExtraCFlags(), 'LDFLAGS' => $this->getLibExtraLdFlags(), 'LIBS' => $this->getLibExtraLibs()])
|
||||||
->exec('sed -i.save s@\${CMAKE_C_IMPLICIT_LINK_LIBRARIES}@@ ../CMakeLists.txt')
|
->exec('sed -i.save s@\${CMAKE_C_IMPLICIT_LINK_LIBRARIES}@@ ../CMakeLists.txt')
|
||||||
->exec("cmake {$this->builder->makeCmakeArgs()} -DBUILD_SHARED_LIBS=OFF -DBUILD_CURL_EXE=OFF {$extra} ..")
|
->execWithEnv("cmake {$this->builder->makeCmakeArgs()} -DBUILD_SHARED_LIBS=OFF -DBUILD_CURL_EXE=OFF -DBUILD_LIBCURL_DOCS=OFF {$extra} ..")
|
||||||
->exec("make -j{$this->builder->concurrency}")
|
->execWithEnv("make -j{$this->builder->concurrency}")
|
||||||
->exec('make install DESTDIR=' . BUILD_ROOT_PATH);
|
->execWithEnv('make install DESTDIR=' . BUILD_ROOT_PATH);
|
||||||
// patch pkgconf
|
// patch pkgconf
|
||||||
$this->patchPkgconfPrefix(['libcurl.pc']);
|
$this->patchPkgconfPrefix(['libcurl.pc']);
|
||||||
shell()->cd(BUILD_LIB_PATH . '/cmake/CURL/')
|
shell()->cd(BUILD_LIB_PATH . '/cmake/CURL/')
|
||||||
|
|||||||
@@ -26,15 +26,16 @@ trait freetype
|
|||||||
$suggested .= ' ';
|
$suggested .= ' ';
|
||||||
|
|
||||||
shell()->cd($this->source_dir)
|
shell()->cd($this->source_dir)
|
||||||
|
->setEnv(['CFLAGS' => $this->getLibExtraCFlags(), 'LDFLAGS' => $this->getLibExtraLdFlags(), 'LIBS' => $this->getLibExtraLibs()])
|
||||||
->exec('sh autogen.sh')
|
->exec('sh autogen.sh')
|
||||||
->exec(
|
->execWithEnv(
|
||||||
'./configure ' .
|
'./configure ' .
|
||||||
'--enable-static --disable-shared --without-harfbuzz --prefix= ' .
|
'--enable-static --disable-shared --without-harfbuzz --prefix= ' .
|
||||||
$suggested
|
$suggested
|
||||||
)
|
)
|
||||||
->exec('make clean')
|
->execWithEnv('make clean')
|
||||||
->exec("make -j{$this->builder->concurrency}")
|
->execWithEnv("make -j{$this->builder->concurrency}")
|
||||||
->exec('make install DESTDIR=' . BUILD_ROOT_PATH);
|
->execWithEnv('make install DESTDIR=' . BUILD_ROOT_PATH);
|
||||||
$this->patchPkgconfPrefix(['freetype2.pc']);
|
$this->patchPkgconfPrefix(['freetype2.pc']);
|
||||||
FileSystem::replaceFileStr(
|
FileSystem::replaceFileStr(
|
||||||
BUILD_ROOT_PATH . '/lib/pkgconfig/freetype2.pc',
|
BUILD_ROOT_PATH . '/lib/pkgconfig/freetype2.pc',
|
||||||
|
|||||||
29
src/SPC/builder/unix/library/gettext.php
Normal file
29
src/SPC/builder/unix/library/gettext.php
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace SPC\builder\unix\library;
|
||||||
|
|
||||||
|
trait gettext
|
||||||
|
{
|
||||||
|
protected function build(): void
|
||||||
|
{
|
||||||
|
$extra = $this->builder->getLib('ncurses') ? ('--with-libncurses-prefix=' . BUILD_ROOT_PATH . ' ') : '';
|
||||||
|
$extra .= $this->builder->getLib('libxml2') ? ('--with-libxml2-prefix=' . BUILD_ROOT_PATH . ' ') : '';
|
||||||
|
shell()->cd($this->source_dir)
|
||||||
|
->setEnv(['CFLAGS' => $this->getLibExtraCFlags(), 'LDFLAGS' => $this->getLibExtraLdFlags(), 'LIBS' => $this->getLibExtraLibs()])
|
||||||
|
->execWithEnv(
|
||||||
|
'./configure ' .
|
||||||
|
'--enable-static ' .
|
||||||
|
'--disable-shared ' .
|
||||||
|
'--disable-java ' .
|
||||||
|
'--disable-c+ ' .
|
||||||
|
$extra .
|
||||||
|
'--with-libiconv-prefix=' . BUILD_ROOT_PATH . ' ' .
|
||||||
|
'--prefix=' . BUILD_ROOT_PATH
|
||||||
|
)
|
||||||
|
->execWithEnv('make clean')
|
||||||
|
->execWithEnv("make -j{$this->builder->concurrency}")
|
||||||
|
->execWithEnv('make install');
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -16,13 +16,14 @@ trait gmp
|
|||||||
protected function build(): void
|
protected function build(): void
|
||||||
{
|
{
|
||||||
shell()->cd($this->source_dir)
|
shell()->cd($this->source_dir)
|
||||||
->exec(
|
->setEnv(['CFLAGS' => $this->getLibExtraCFlags(), 'LDFLAGS' => $this->getLibExtraLdFlags(), 'LIBS' => $this->getLibExtraLibs()])
|
||||||
|
->execWithEnv(
|
||||||
'./configure ' .
|
'./configure ' .
|
||||||
'--enable-static --disable-shared ' .
|
'--enable-static --disable-shared ' .
|
||||||
'--prefix='
|
'--prefix='
|
||||||
)
|
)
|
||||||
->exec('make clean')
|
->execWithEnv('make clean')
|
||||||
->exec("make -j{$this->builder->concurrency}")
|
->execWithEnv("make -j{$this->builder->concurrency}")
|
||||||
->exec('make install DESTDIR=' . BUILD_ROOT_PATH);
|
->exec('make install DESTDIR=' . BUILD_ROOT_PATH);
|
||||||
$this->patchPkgconfPrefix(['gmp.pc']);
|
$this->patchPkgconfPrefix(['gmp.pc']);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ trait imagemagick
|
|||||||
protected function build(): void
|
protected function build(): void
|
||||||
{
|
{
|
||||||
// TODO: imagemagick build with bzip2 failed with bugs, we need to fix it in the future
|
// TODO: imagemagick build with bzip2 failed with bugs, we need to fix it in the future
|
||||||
$extra = '--without-jxl --without-x --disable-openmp --without-bzlib ';
|
$extra = '--without-jxl --without-x --enable-openmp --without-bzlib ';
|
||||||
$required_libs = '';
|
$required_libs = '';
|
||||||
$optional_libs = [
|
$optional_libs = [
|
||||||
'libzip' => 'zip',
|
'libzip' => 'zip',
|
||||||
@@ -39,15 +39,18 @@ trait imagemagick
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$ldflags = $this instanceof LinuxLibraryBase ? ('LDFLAGS="-static" ') : '';
|
$ldflags = $this instanceof LinuxLibraryBase ? ('-static') : '';
|
||||||
|
|
||||||
// libxml iconv patch
|
// libxml iconv patch
|
||||||
$required_libs .= $this instanceof MacOSLibraryBase ? (' -liconv') : '';
|
$required_libs .= $this instanceof MacOSLibraryBase ? ('-liconv') : '';
|
||||||
shell()->cd($this->source_dir)
|
shell()->cd($this->source_dir)
|
||||||
->exec(
|
->setEnv([
|
||||||
'PKG_CONFIG="$PKG_CONFIG --static" ' .
|
'CFLAGS' => $this->getLibExtraCFlags(),
|
||||||
$ldflags .
|
'LDFLAGS' => $this->getLibExtraLdFlags() ?: $ldflags,
|
||||||
"LIBS='{$required_libs}' " .
|
'LIBS' => $this->getLibExtraLibs() ?: $required_libs,
|
||||||
|
'PKG_CONFIG' => '$PKG_CONFIG --static',
|
||||||
|
])
|
||||||
|
->execWithEnv(
|
||||||
'./configure ' .
|
'./configure ' .
|
||||||
'--enable-static --disable-shared ' .
|
'--enable-static --disable-shared ' .
|
||||||
$extra .
|
$extra .
|
||||||
|
|||||||
@@ -25,9 +25,15 @@ trait ldap
|
|||||||
$alt .= $this->builder->getLib('libsodium') ? '--with-argon2=libsodium ' : '--enable-argon2=no ';
|
$alt .= $this->builder->getLib('libsodium') ? '--with-argon2=libsodium ' : '--enable-argon2=no ';
|
||||||
f_putenv('PKG_CONFIG=' . BUILD_ROOT_PATH . '/bin/pkg-config');
|
f_putenv('PKG_CONFIG=' . BUILD_ROOT_PATH . '/bin/pkg-config');
|
||||||
f_putenv('PKG_CONFIG_PATH=' . BUILD_LIB_PATH . '/pkgconfig');
|
f_putenv('PKG_CONFIG_PATH=' . BUILD_LIB_PATH . '/pkgconfig');
|
||||||
|
$ldflags = '-L' . BUILD_LIB_PATH;
|
||||||
shell()->cd($this->source_dir)
|
shell()->cd($this->source_dir)
|
||||||
->exec(
|
->setEnv([
|
||||||
$this->builder->makeAutoconfFlags(AUTOCONF_LDFLAGS | AUTOCONF_CPPFLAGS) .
|
'CFLAGS' => $this->getLibExtraCFlags(),
|
||||||
|
'LDFLAGS' => $this->getLibExtraLdFlags() ?: $ldflags,
|
||||||
|
'LIBS' => $this->getLibExtraLibs(),
|
||||||
|
])
|
||||||
|
->execWithEnv(
|
||||||
|
$this->builder->makeAutoconfFlags(AUTOCONF_CPPFLAGS) .
|
||||||
' ./configure ' .
|
' ./configure ' .
|
||||||
'--enable-static ' .
|
'--enable-static ' .
|
||||||
'--disable-shared ' .
|
'--disable-shared ' .
|
||||||
|
|||||||
@@ -11,9 +11,10 @@ trait libargon2
|
|||||||
protected function build()
|
protected function build()
|
||||||
{
|
{
|
||||||
shell()->cd($this->source_dir)
|
shell()->cd($this->source_dir)
|
||||||
|
->setEnv(['CFLAGS' => $this->getLibExtraCFlags(), 'LDFLAGS' => $this->getLibExtraLdFlags(), 'LIBS' => $this->getLibExtraLibs()])
|
||||||
->exec("make PREFIX='' clean")
|
->exec("make PREFIX='' clean")
|
||||||
->exec("make -j{$this->builder->concurrency} PREFIX=''")
|
->execWithEnv("make -j{$this->builder->concurrency} PREFIX=''")
|
||||||
->exec("make install PREFIX='' DESTDIR=" . BUILD_ROOT_PATH);
|
->execWithEnv("make install PREFIX='' DESTDIR=" . BUILD_ROOT_PATH);
|
||||||
|
|
||||||
$this->patchPkgconfPrefix(['libargon2.pc']);
|
$this->patchPkgconfPrefix(['libargon2.pc']);
|
||||||
|
|
||||||
|
|||||||
@@ -22,9 +22,10 @@ trait libavif
|
|||||||
FileSystem::resetDir($this->source_dir . '/build');
|
FileSystem::resetDir($this->source_dir . '/build');
|
||||||
// Start build
|
// Start build
|
||||||
shell()->cd($this->source_dir . '/build')
|
shell()->cd($this->source_dir . '/build')
|
||||||
->exec("cmake {$this->builder->makeCmakeArgs()} -DBUILD_SHARED_LIBS=OFF ..")
|
->setEnv(['CFLAGS' => $this->getLibExtraCFlags(), 'LDFLAGS' => $this->getLibExtraLdFlags(), 'LIBS' => $this->getLibExtraLibs()])
|
||||||
->exec("cmake --build . -j {$this->builder->concurrency}")
|
->execWithEnv("cmake {$this->builder->makeCmakeArgs()} -DBUILD_SHARED_LIBS=OFF ..")
|
||||||
->exec('make install DESTDIR=' . BUILD_ROOT_PATH);
|
->execWithEnv("cmake --build . -j {$this->builder->concurrency}")
|
||||||
|
->execWithEnv('make install DESTDIR=' . BUILD_ROOT_PATH);
|
||||||
// patch pkgconfig
|
// patch pkgconfig
|
||||||
$this->patchPkgconfPrefix(['libavif.pc']);
|
$this->patchPkgconfPrefix(['libavif.pc']);
|
||||||
$this->cleanLaFiles();
|
$this->cleanLaFiles();
|
||||||
|
|||||||
@@ -5,17 +5,29 @@ 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
|
||||||
*/
|
*/
|
||||||
protected function build(): void
|
protected function build(): void
|
||||||
{
|
{
|
||||||
shell()->cd($this->source_dir)
|
shell()->cd($this->source_dir)
|
||||||
->exec('./configure --prefix=' . BUILD_ROOT_PATH . ' --enable-static --disable-shared --disable-tests')
|
->setEnv(['CFLAGS' => $this->getLibExtraCFlags(), 'LDFLAGS' => $this->getLibExtraLdFlags(), 'LIBS' => $this->getLibExtraLibs()])
|
||||||
->exec("make -j {$this->builder->concurrency}")
|
->execWithEnv('./configure --prefix=' . BUILD_ROOT_PATH . ' --enable-static --disable-shared --disable-tests')
|
||||||
|
->execWithEnv("make -j {$this->builder->concurrency}")
|
||||||
->exec('make install');
|
->exec('make install');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,7 +20,8 @@ trait libevent
|
|||||||
FileSystem::resetDir($this->source_dir . '/build');
|
FileSystem::resetDir($this->source_dir . '/build');
|
||||||
// Start build
|
// Start build
|
||||||
shell()->cd($this->source_dir . '/build')
|
shell()->cd($this->source_dir . '/build')
|
||||||
->exec(
|
->setEnv(['CFLAGS' => $this->getLibExtraCFlags(), 'LDFLAGS' => $this->getLibExtraLdFlags(), 'LIBS' => $this->getLibExtraLibs()])
|
||||||
|
->execWithEnv(
|
||||||
'cmake ' .
|
'cmake ' .
|
||||||
'-DCMAKE_INSTALL_PREFIX=' . BUILD_ROOT_PATH . ' ' .
|
'-DCMAKE_INSTALL_PREFIX=' . BUILD_ROOT_PATH . ' ' .
|
||||||
"-DCMAKE_TOOLCHAIN_FILE={$this->builder->cmake_toolchain_file} " .
|
"-DCMAKE_TOOLCHAIN_FILE={$this->builder->cmake_toolchain_file} " .
|
||||||
@@ -33,7 +34,7 @@ trait libevent
|
|||||||
'-DEVENT__DISABLE_SAMPLES=ON ' .
|
'-DEVENT__DISABLE_SAMPLES=ON ' .
|
||||||
'..'
|
'..'
|
||||||
)
|
)
|
||||||
->exec("cmake --build . -j {$this->builder->concurrency}")
|
->execWithEnv("cmake --build . -j {$this->builder->concurrency}")
|
||||||
->exec('make install');
|
->exec('make install');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
35
src/SPC/builder/unix/library/librabbitmq.php
Normal file
35
src/SPC/builder/unix/library/librabbitmq.php
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace SPC\builder\unix\library;
|
||||||
|
|
||||||
|
use SPC\exception\FileSystemException;
|
||||||
|
use SPC\exception\RuntimeException;
|
||||||
|
use SPC\store\FileSystem;
|
||||||
|
|
||||||
|
trait librabbitmq
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @throws RuntimeException
|
||||||
|
* @throws FileSystemException
|
||||||
|
*/
|
||||||
|
protected function build(): void
|
||||||
|
{
|
||||||
|
// CMake needs a clean build directory
|
||||||
|
FileSystem::resetDir($this->source_dir . '/build');
|
||||||
|
// Start build
|
||||||
|
shell()->cd($this->source_dir . '/build')
|
||||||
|
->exec(
|
||||||
|
'cmake ' .
|
||||||
|
'-DCMAKE_INSTALL_PREFIX=' . BUILD_ROOT_PATH . ' ' .
|
||||||
|
"-DCMAKE_TOOLCHAIN_FILE={$this->builder->cmake_toolchain_file} " .
|
||||||
|
'-DCMAKE_BUILD_TYPE=Release ' .
|
||||||
|
'-DBUILD_SHARED_LIBS=OFF ' .
|
||||||
|
'-DBUILD_STATIC_LIBS=ON ' .
|
||||||
|
'..'
|
||||||
|
)
|
||||||
|
->exec("cmake --build . -j {$this->builder->concurrency}")
|
||||||
|
->exec('make install');
|
||||||
|
}
|
||||||
|
}
|
||||||
36
src/SPC/builder/unix/library/libtiff.php
Normal file
36
src/SPC/builder/unix/library/libtiff.php
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace SPC\builder\unix\library;
|
||||||
|
|
||||||
|
use SPC\exception\FileSystemException;
|
||||||
|
use SPC\exception\RuntimeException;
|
||||||
|
|
||||||
|
trait libtiff
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @throws FileSystemException
|
||||||
|
* @throws RuntimeException
|
||||||
|
*/
|
||||||
|
protected function build(): void
|
||||||
|
{
|
||||||
|
$shell = shell()->cd($this->source_dir)
|
||||||
|
->exec(
|
||||||
|
'./configure ' .
|
||||||
|
'--enable-static --disable-shared ' .
|
||||||
|
'--disable-cxx ' .
|
||||||
|
'--prefix='
|
||||||
|
);
|
||||||
|
|
||||||
|
// TODO: Remove this check when https://gitlab.com/libtiff/libtiff/-/merge_requests/635 will be merged and released
|
||||||
|
if (file_exists($this->source_dir . '/html')) {
|
||||||
|
$shell->exec('make clean');
|
||||||
|
}
|
||||||
|
|
||||||
|
$shell
|
||||||
|
->exec("make -j{$this->builder->concurrency}")
|
||||||
|
->exec('make install DESTDIR=' . BUILD_ROOT_PATH);
|
||||||
|
$this->patchPkgconfPrefix(['libtiff-4.pc']);
|
||||||
|
}
|
||||||
|
}
|
||||||
46
src/SPC/builder/unix/library/libuuid.php
Normal file
46
src/SPC/builder/unix/library/libuuid.php
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace SPC\builder\unix\library;
|
||||||
|
|
||||||
|
use SPC\exception\FileSystemException;
|
||||||
|
use SPC\exception\RuntimeException;
|
||||||
|
use SPC\store\FileSystem;
|
||||||
|
|
||||||
|
trait libuuid
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @throws FileSystemException
|
||||||
|
* @throws RuntimeException
|
||||||
|
*/
|
||||||
|
protected function build(): void
|
||||||
|
{
|
||||||
|
FileSystem::resetDir($this->source_dir . '/build');
|
||||||
|
shell()->cd($this->source_dir . '/build')
|
||||||
|
->exec(
|
||||||
|
'cmake ' .
|
||||||
|
"{$this->builder->makeCmakeArgs()} " .
|
||||||
|
'..'
|
||||||
|
)
|
||||||
|
->exec("cmake --build . -j {$this->builder->concurrency}");
|
||||||
|
copy($this->source_dir . '/build/libuuid.a', BUILD_LIB_PATH . '/libuuid.a');
|
||||||
|
FileSystem::createDir(BUILD_INCLUDE_PATH . '/uuid');
|
||||||
|
copy($this->source_dir . '/uuid.h', BUILD_INCLUDE_PATH . '/uuid/uuid.h');
|
||||||
|
$pc = FileSystem::readFile($this->source_dir . '/uuid.pc.in');
|
||||||
|
$pc = str_replace([
|
||||||
|
'@prefix@',
|
||||||
|
'@exec_prefix@',
|
||||||
|
'@libdir@',
|
||||||
|
'@includedir@',
|
||||||
|
'@LIBUUID_VERSION@',
|
||||||
|
], [
|
||||||
|
BUILD_ROOT_PATH,
|
||||||
|
'${prefix}',
|
||||||
|
'${prefix}/lib',
|
||||||
|
'${prefix}/include',
|
||||||
|
'1.0.3',
|
||||||
|
], $pc);
|
||||||
|
FileSystem::writeFile(BUILD_LIB_PATH . '/pkgconfig/uuid.pc', $pc);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -17,13 +17,13 @@ trait ncurses
|
|||||||
'--with-curses-h ' .
|
'--with-curses-h ' .
|
||||||
'--enable-pc-files ' .
|
'--enable-pc-files ' .
|
||||||
'--enable-echo ' .
|
'--enable-echo ' .
|
||||||
// '--enable-widec ' .
|
'--disable-widec ' .
|
||||||
'--with-normal ' .
|
'--with-normal ' .
|
||||||
'--with-ticlib ' .
|
'--with-ticlib ' .
|
||||||
'--without-tests ' .
|
'--without-tests ' .
|
||||||
'--without-dlsym ' .
|
'--without-dlsym ' .
|
||||||
'--without-debug ' .
|
'--without-debug ' .
|
||||||
'-enable-symlinks' .
|
'-enable-symlinks ' .
|
||||||
'--bindir=' . BUILD_ROOT_PATH . '/bin ' .
|
'--bindir=' . BUILD_ROOT_PATH . '/bin ' .
|
||||||
'--includedir=' . BUILD_ROOT_PATH . '/include ' .
|
'--includedir=' . BUILD_ROOT_PATH . '/include ' .
|
||||||
'--libdir=' . BUILD_ROOT_PATH . '/lib ' .
|
'--libdir=' . BUILD_ROOT_PATH . '/lib ' .
|
||||||
|
|||||||
@@ -8,19 +8,18 @@ trait pkgconfig
|
|||||||
{
|
{
|
||||||
protected function build(): void
|
protected function build(): void
|
||||||
{
|
{
|
||||||
$macos_env = "CFLAGS='{$this->builder->arch_c_flags} -Wimplicit-function-declaration' ";
|
$cflags = PHP_OS_FAMILY !== 'Linux' ? "{$this->builder->arch_c_flags} -Wimplicit-function-declaration -Wno-int-conversion" : '';
|
||||||
$linux_env = 'LDFLAGS=--static ';
|
$ldflags = PHP_OS_FAMILY !== 'Linux' ? '' : '--static';
|
||||||
|
|
||||||
shell()->cd($this->source_dir)
|
shell()->cd($this->source_dir)
|
||||||
->exec(
|
->setEnv(['CFLAGS' => $this->getLibExtraCFlags() ?: $cflags, 'LDFLAGS' => $this->getLibExtraLdFlags() ?: $ldflags, 'LIBS' => $this->getLibExtraLibs()])
|
||||||
match (PHP_OS_FAMILY) {
|
->execWithEnv(
|
||||||
'Darwin' => $macos_env,
|
|
||||||
default => $linux_env,
|
|
||||||
} .
|
|
||||||
'./configure ' .
|
'./configure ' .
|
||||||
'--disable-shared ' .
|
'--disable-shared ' .
|
||||||
'--enable-static ' .
|
'--enable-static ' .
|
||||||
'--with-internal-glib ' .
|
'--with-internal-glib ' .
|
||||||
|
'--disable-host-tool ' .
|
||||||
|
'--with-pic ' .
|
||||||
'--prefix=' . BUILD_ROOT_PATH . ' ' .
|
'--prefix=' . BUILD_ROOT_PATH . ' ' .
|
||||||
'--without-sysroot ' .
|
'--without-sysroot ' .
|
||||||
'--without-system-include-path ' .
|
'--without-system-include-path ' .
|
||||||
@@ -28,7 +27,8 @@ trait pkgconfig
|
|||||||
'--without-pc-path'
|
'--without-pc-path'
|
||||||
)
|
)
|
||||||
->exec('make clean')
|
->exec('make clean')
|
||||||
->exec("make -j{$this->builder->concurrency}")
|
->execWithEnv("make -j{$this->builder->concurrency}")
|
||||||
->exec('make install');
|
->execWithEnv('make install-exec');
|
||||||
|
shell()->exec('strip ' . BUILD_ROOT_PATH . '/bin/pkg-config');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -27,26 +27,31 @@ trait postgresql
|
|||||||
'libxslt' => 'libxslt',
|
'libxslt' => 'libxslt',
|
||||||
'icu' => 'icu-i18n',
|
'icu' => 'icu-i18n',
|
||||||
];
|
];
|
||||||
|
$error_exec_cnt = 0;
|
||||||
|
|
||||||
foreach ($optional_packages as $lib => $pkg) {
|
foreach ($optional_packages as $lib => $pkg) {
|
||||||
if ($this->getBuilder()->getLib($lib)) {
|
if ($this->getBuilder()->getLib($lib)) {
|
||||||
$packages .= ' ' . $pkg;
|
$packages .= ' ' . $pkg;
|
||||||
$output = shell()->execWithResult("pkg-config --static {$pkg}");
|
$output = shell()->execWithResult("pkg-config --static {$pkg}");
|
||||||
|
$error_exec_cnt += $output[0] === 0 ? 0 : 1;
|
||||||
logger()->info(var_export($output[1], true));
|
logger()->info(var_export($output[1], true));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$output = shell()->execWithResult("pkg-config --cflags-only-I --static {$packages}");
|
$output = shell()->execWithResult("pkg-config --cflags-only-I --static {$packages}");
|
||||||
|
$error_exec_cnt += $output[0] === 0 ? 0 : 1;
|
||||||
if (!empty($output[1][0])) {
|
if (!empty($output[1][0])) {
|
||||||
$cppflags = $output[1][0];
|
$cppflags = $output[1][0];
|
||||||
$envs .= " CPPFLAGS=\"{$cppflags}\"";
|
$envs .= " CPPFLAGS=\"{$cppflags}\"";
|
||||||
}
|
}
|
||||||
$output = shell()->execWithResult("pkg-config --libs-only-L --static {$packages}");
|
$output = shell()->execWithResult("pkg-config --libs-only-L --static {$packages}");
|
||||||
|
$error_exec_cnt += $output[0] === 0 ? 0 : 1;
|
||||||
if (!empty($output[1][0])) {
|
if (!empty($output[1][0])) {
|
||||||
$ldflags = $output[1][0];
|
$ldflags = $output[1][0];
|
||||||
$envs .= $this instanceof MacOSLibraryBase ? " LDFLAGS=\"{$ldflags}\" " : " LDFLAGS=\"{$ldflags} -static\" ";
|
$envs .= $this instanceof MacOSLibraryBase ? " LDFLAGS=\"{$ldflags}\" " : " LDFLAGS=\"{$ldflags} -static\" ";
|
||||||
}
|
}
|
||||||
$output = shell()->execWithResult("pkg-config --libs-only-l --static {$packages}");
|
$output = shell()->execWithResult("pkg-config --libs-only-l --static {$packages}");
|
||||||
|
$error_exec_cnt += $output[0] === 0 ? 0 : 1;
|
||||||
if (!empty($output[1][0])) {
|
if (!empty($output[1][0])) {
|
||||||
$libs = $output[1][0];
|
$libs = $output[1][0];
|
||||||
$libcpp = '';
|
$libcpp = '';
|
||||||
@@ -55,14 +60,23 @@ trait postgresql
|
|||||||
}
|
}
|
||||||
$envs .= " LIBS=\"{$libs}{$libcpp}\" ";
|
$envs .= " LIBS=\"{$libs}{$libcpp}\" ";
|
||||||
}
|
}
|
||||||
|
if ($error_exec_cnt > 0) {
|
||||||
|
throw new RuntimeException('Failed to get pkg-config information!');
|
||||||
|
}
|
||||||
|
|
||||||
FileSystem::resetDir($this->source_dir . '/build');
|
FileSystem::resetDir($this->source_dir . '/build');
|
||||||
|
|
||||||
# 有静态链接配置 参考文件: src/interfaces/libpq/Makefile
|
$version = $this->getVersion();
|
||||||
shell()->cd($this->source_dir . '/build')
|
// 16.1 workaround
|
||||||
->exec('sed -i.backup "s/invokes exit\'; exit 1;/invokes exit\';/" ../src/interfaces/libpq/Makefile')
|
if (version_compare($version, '16.1') >= 0) {
|
||||||
->exec('sed -i.backup "278 s/^/# /" ../src/Makefile.shlib')
|
# 有静态链接配置 参考文件: src/interfaces/libpq/Makefile
|
||||||
->exec('sed -i.backup "402 s/^/# /" ../src/Makefile.shlib');
|
shell()->cd($this->source_dir . '/build')
|
||||||
|
->exec('sed -i.backup "s/invokes exit\'; exit 1;/invokes exit\';/" ../src/interfaces/libpq/Makefile')
|
||||||
|
->exec('sed -i.backup "278 s/^/# /" ../src/Makefile.shlib')
|
||||||
|
->exec('sed -i.backup "402 s/^/# /" ../src/Makefile.shlib');
|
||||||
|
} else {
|
||||||
|
throw new RuntimeException('Unsupported version for postgresql: ' . $version . ' !');
|
||||||
|
}
|
||||||
|
|
||||||
// configure
|
// configure
|
||||||
shell()->cd($this->source_dir . '/build')
|
shell()->cd($this->source_dir . '/build')
|
||||||
@@ -101,4 +115,17 @@ trait postgresql
|
|||||||
->exec("rm -rf {$builddir}/lib/*.so")
|
->exec("rm -rf {$builddir}/lib/*.so")
|
||||||
->exec("rm -rf {$builddir}/lib/*.dylib");
|
->exec("rm -rf {$builddir}/lib/*.dylib");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private function getVersion(): string
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
$file = FileSystem::readFile($this->source_dir . '/meson.build');
|
||||||
|
if (preg_match("/^\\s+version:\\s?'(.*)'/m", $file, $match)) {
|
||||||
|
return $match[1];
|
||||||
|
}
|
||||||
|
return 'unknown';
|
||||||
|
} catch (FileSystemException) {
|
||||||
|
return 'unknown';
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
33
src/SPC/builder/unix/library/qdbm.php
Normal file
33
src/SPC/builder/unix/library/qdbm.php
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace SPC\builder\unix\library;
|
||||||
|
|
||||||
|
use SPC\builder\macos\library\MacOSLibraryBase;
|
||||||
|
use SPC\exception\FileSystemException;
|
||||||
|
use SPC\exception\RuntimeException;
|
||||||
|
use SPC\store\FileSystem;
|
||||||
|
|
||||||
|
trait qdbm
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @throws FileSystemException
|
||||||
|
* @throws RuntimeException
|
||||||
|
*/
|
||||||
|
protected function build(): void
|
||||||
|
{
|
||||||
|
shell()->cd($this->source_dir)
|
||||||
|
->exec(
|
||||||
|
'./configure ' .
|
||||||
|
'--enable-static --disable-shared ' .
|
||||||
|
'--prefix='
|
||||||
|
)
|
||||||
|
->exec('make clean');
|
||||||
|
FileSystem::replaceFileRegex($this->source_dir . '/Makefile', '/MYLIBS = libqdbm.a.*/m', 'MYLIBS = libqdbm.a');
|
||||||
|
shell()->cd($this->source_dir)
|
||||||
|
->exec("make -j{$this->builder->concurrency}" . ($this instanceof MacOSLibraryBase ? ' mac' : ''))
|
||||||
|
->exec('make install DESTDIR=' . BUILD_ROOT_PATH);
|
||||||
|
$this->patchPkgconfPrefix(['qdbm.pc']);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -20,7 +20,6 @@ trait xz
|
|||||||
'./configure ' .
|
'./configure ' .
|
||||||
'--enable-static ' .
|
'--enable-static ' .
|
||||||
'--disable-shared ' .
|
'--disable-shared ' .
|
||||||
"--host={$this->builder->getOption('gnu-arch')}-unknown-linux " .
|
|
||||||
'--disable-scripts ' .
|
'--disable-scripts ' .
|
||||||
'--disable-doc ' .
|
'--disable-doc ' .
|
||||||
'--with-libiconv ' .
|
'--with-libiconv ' .
|
||||||
|
|||||||
@@ -4,17 +4,25 @@ declare(strict_types=1);
|
|||||||
|
|
||||||
namespace SPC\builder\windows;
|
namespace SPC\builder\windows;
|
||||||
|
|
||||||
|
use SPC\exception\FileSystemException;
|
||||||
|
use SPC\store\FileSystem;
|
||||||
|
|
||||||
class SystemUtil
|
class SystemUtil
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
* @param string $name 命令名称
|
* Find windows program using executable name.
|
||||||
* @param array $paths 寻找的目标路径(如果不传入,则使用环境变量 PATH)
|
*
|
||||||
* @return null|string 找到了返回命令路径,找不到返回 null
|
* @param string $name command name (xxx.exe)
|
||||||
|
* @param array $paths search path (default use env path)
|
||||||
|
* @return null|string null if not found, string is absolute path
|
||||||
*/
|
*/
|
||||||
public static function findCommand(string $name, array $paths = []): ?string
|
public static function findCommand(string $name, array $paths = [], bool $include_sdk_bin = false): ?string
|
||||||
{
|
{
|
||||||
if (!$paths) {
|
if (!$paths) {
|
||||||
$paths = explode(PATH_SEPARATOR, getenv('Path'));
|
$paths = explode(PATH_SEPARATOR, getenv('Path'));
|
||||||
|
if ($include_sdk_bin) {
|
||||||
|
$paths[] = PHP_SDK_PATH . '\bin';
|
||||||
|
}
|
||||||
}
|
}
|
||||||
foreach ($paths as $path) {
|
foreach ($paths as $path) {
|
||||||
if (file_exists($path . DIRECTORY_SEPARATOR . $name)) {
|
if (file_exists($path . DIRECTORY_SEPARATOR . $name)) {
|
||||||
@@ -23,4 +31,75 @@ class SystemUtil
|
|||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Find Visual Studio installation.
|
||||||
|
*
|
||||||
|
* @return array<string, string>|false False if not installed, array contains 'version' and 'dir'
|
||||||
|
*/
|
||||||
|
public static function findVisualStudio(): array|false
|
||||||
|
{
|
||||||
|
$check_path = [
|
||||||
|
'C:\Program Files\Microsoft Visual Studio\2022\Community\MSBuild\Current\Bin\MSBuild.exe' => 'vs17',
|
||||||
|
'C:\Program Files\Microsoft Visual Studio\2022\Professional\MSBuild\Current\Bin\MSBuild.exe' => 'vs17',
|
||||||
|
'C:\Program Files\Microsoft Visual Studio\2022\Enterprise\MSBuild\Current\Bin\MSBuild.exe' => 'vs17',
|
||||||
|
'C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Current\Bin\MSBuild.exe' => 'vs16',
|
||||||
|
'C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\MSBuild\Current\Bin\MSBuild.exe' => 'vs16',
|
||||||
|
'C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\MSBuild\Current\Bin\MSBuild.exe' => 'vs16',
|
||||||
|
];
|
||||||
|
foreach ($check_path as $path => $vs_version) {
|
||||||
|
if (file_exists($path)) {
|
||||||
|
$vs_ver = $vs_version;
|
||||||
|
$d_dir = dirname($path, 4);
|
||||||
|
return [
|
||||||
|
'version' => $vs_ver,
|
||||||
|
'dir' => $d_dir,
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get CPU count for concurrency.
|
||||||
|
*/
|
||||||
|
public static function getCpuCount(): int
|
||||||
|
{
|
||||||
|
$result = f_exec('echo %NUMBER_OF_PROCESSORS%', $out, $code);
|
||||||
|
if ($code !== 0 || !$result) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
return intval($result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create CMake toolchain file.
|
||||||
|
*
|
||||||
|
* @param null|string $cflags CFLAGS for cmake, default use '/MT /Os /Ob1 /DNDEBUG /D_ACRTIMP= /D_CRTIMP='
|
||||||
|
* @param null|string $ldflags LDFLAGS for cmake, default use '/nodefaultlib:msvcrt /nodefaultlib:msvcrtd /defaultlib:libcmt'
|
||||||
|
* @throws FileSystemException
|
||||||
|
*/
|
||||||
|
public static function makeCmakeToolchainFile(?string $cflags = null, ?string $ldflags = null): string
|
||||||
|
{
|
||||||
|
if ($cflags === null) {
|
||||||
|
$cflags = '/MT /Os /Ob1 /DNDEBUG /D_ACRTIMP= /D_CRTIMP=';
|
||||||
|
}
|
||||||
|
if ($ldflags === null) {
|
||||||
|
$ldflags = '/nodefaultlib:msvcrt /nodefaultlib:msvcrtd /defaultlib:libcmt';
|
||||||
|
}
|
||||||
|
$buildroot = str_replace('\\', '\\\\', BUILD_ROOT_PATH);
|
||||||
|
$toolchain = <<<CMAKE
|
||||||
|
set(CMAKE_SYSTEM_NAME Windows)
|
||||||
|
SET(CMAKE_SYSTEM_PROCESSOR x64)
|
||||||
|
SET(CMAKE_C_FLAGS "{$cflags}")
|
||||||
|
SET(CMAKE_C_FLAGS_DEBUG "{$cflags}")
|
||||||
|
SET(CMAKE_CXX_FLAGS "{$cflags}")
|
||||||
|
SET(CMAKE_CXX_FLAGS_DEBUG "{$cflags}")
|
||||||
|
SET(CMAKE_EXE_LINKER_FLAGS "{$ldflags}")
|
||||||
|
SET(CMAKE_FIND_ROOT_PATH "{$buildroot}")
|
||||||
|
SET(CMAKE_MSVC_RUNTIME_LIBRARY MultiThreaded)
|
||||||
|
CMAKE;
|
||||||
|
FileSystem::writeFile(SOURCE_PATH . '\toolchain.cmake', $toolchain);
|
||||||
|
return realpath(SOURCE_PATH . '\toolchain.cmake');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user