mirror of
https://github.com/crazywhalecc/static-php-cli.git
synced 2026-07-02 22:35:43 +08:00
Compare commits
1700 Commits
2.5.0
...
release-os
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d622a12101 | ||
|
|
f680731f9d | ||
|
|
0fe1442f7e | ||
|
|
1e4780397b | ||
|
|
6b67cb90fc | ||
|
|
b89ff3c083 | ||
|
|
0cfa2036f0 | ||
|
|
c5882c1f8e | ||
|
|
4531c9fe57 | ||
|
|
223dd10ac6 | ||
|
|
1c28f0f455 | ||
|
|
b3c450291a | ||
|
|
372760e469 | ||
|
|
6cf4c40cd2 | ||
|
|
af75ffaf24 | ||
|
|
ae0217b3a1 | ||
|
|
1e2b4017ac | ||
|
|
19f941797e | ||
|
|
0b863cbc70 | ||
|
|
b09337de09 | ||
|
|
d902e70b4d | ||
|
|
cd2dc5bce4 | ||
|
|
34910d18e9 | ||
|
|
3a17cec521 | ||
|
|
94644d374f | ||
|
|
f8b0c2c980 | ||
|
|
6bbb3c969c | ||
|
|
76025b95c1 | ||
|
|
1be353fd13 | ||
|
|
54001ab868 | ||
|
|
890ff475f1 | ||
|
|
559a2909a9 | ||
|
|
fff2484529 | ||
|
|
d1b194999d | ||
|
|
64f7a3553e | ||
|
|
a06cc32491 | ||
|
|
022fdb2fc5 | ||
|
|
7688a55656 | ||
|
|
08388c0b15 | ||
|
|
e7a88f1df7 | ||
|
|
2f3122627e | ||
|
|
93a35908de | ||
|
|
5ef4623051 | ||
|
|
e952f1c76a | ||
|
|
09b89a30f9 | ||
|
|
9a681a9fa6 | ||
|
|
8650ce4f8f | ||
|
|
f7ca621efe | ||
|
|
6b5200002e | ||
|
|
53f7cdefe0 | ||
|
|
e1a14bbb9f | ||
|
|
9e051c8c80 | ||
|
|
e677be74d7 | ||
|
|
037d224fd7 | ||
|
|
ce44e00bd4 | ||
|
|
0247458853 | ||
|
|
656a58c3fa | ||
|
|
9fdfef5057 | ||
|
|
18c5ccfe9d | ||
|
|
d064e1353c | ||
|
|
3c89ce6c7f | ||
|
|
07ea1e2887 | ||
|
|
f0b5e4f59e | ||
|
|
a54021bf19 | ||
|
|
dce63d3c87 | ||
|
|
47ab5d7584 | ||
|
|
b2182b4fe1 | ||
|
|
1d5aec037b | ||
|
|
6b5f702719 | ||
|
|
7bdcda1d62 | ||
|
|
66840a8eed | ||
|
|
98773ee5a6 | ||
|
|
719d818fd1 | ||
|
|
b8444070ee | ||
|
|
5b4f4f8e55 | ||
|
|
22d263c0a8 | ||
|
|
150d866c15 | ||
|
|
c051a48d56 | ||
|
|
b965ffcd82 | ||
|
|
7f863d182f | ||
|
|
d1041c57dc | ||
|
|
14b822a185 | ||
|
|
7204d277b4 | ||
|
|
5a0fd40dc4 | ||
|
|
59a6e27532 | ||
|
|
6b3b841c0e | ||
|
|
e6591ffe9c | ||
|
|
e316971764 | ||
|
|
d55278714f | ||
|
|
cb7eca9049 | ||
|
|
5b8c9e6f09 | ||
|
|
5d1043334d | ||
|
|
f24cbcf909 | ||
|
|
76a07c32ba | ||
|
|
e0c69086dc | ||
|
|
5606b70c1c | ||
|
|
28ae4242a6 | ||
|
|
f14df1925c | ||
|
|
e9ad3c0011 | ||
|
|
e2ad31e858 | ||
|
|
af614cd7ce | ||
|
|
e21b0ec89d | ||
|
|
3069b51c09 | ||
|
|
1662ac4cf8 | ||
|
|
1e09017549 | ||
|
|
84e9f13688 | ||
|
|
2b0a0bdad9 | ||
|
|
e8d1970f55 | ||
|
|
6861e9c2c7 | ||
|
|
376b8e7569 | ||
|
|
875e1d05cd | ||
|
|
9382161b6f | ||
|
|
a1b8d201ae | ||
|
|
1fed8f2802 | ||
|
|
ecea6c12cd | ||
|
|
81dce02431 | ||
|
|
a33ca44ca9 | ||
|
|
aee733b51f | ||
|
|
54ceca8680 | ||
|
|
90981e3877 | ||
|
|
d69826eb4a | ||
|
|
dc83282019 | ||
|
|
23c0d6f4aa | ||
|
|
8e4d4b7be5 | ||
|
|
ee906aaff9 | ||
|
|
e2b80e7f03 | ||
|
|
09073c5517 | ||
|
|
00050f4d0e | ||
|
|
cff6ec17ea | ||
|
|
64079d9331 | ||
|
|
541889d17b | ||
|
|
c91128995d | ||
|
|
fd2b7af1dc | ||
|
|
081e2d2846 | ||
|
|
9edb9417a1 | ||
|
|
4ae4165ba2 | ||
|
|
e441a575ea | ||
|
|
1575016885 | ||
|
|
987ad4b846 | ||
|
|
f4b03ae835 | ||
|
|
d6de01d05c | ||
|
|
09b7159119 | ||
|
|
4198ddd5d1 | ||
|
|
8332ed87e0 | ||
|
|
f6b091498f | ||
|
|
a45f314447 | ||
|
|
8c8cb70174 | ||
|
|
f09c18e78f | ||
|
|
f5d93d2f54 | ||
|
|
7402fbf7c1 | ||
|
|
2c590e5895 | ||
|
|
463a98b1bf | ||
|
|
6d1c6d7f61 | ||
|
|
08362fb6e5 | ||
|
|
4d5641f6ec | ||
|
|
f34ecf9468 | ||
|
|
aa5c829fae | ||
|
|
fc118d709e | ||
|
|
589a4a9803 | ||
|
|
944e314bab | ||
|
|
0b17ce9e61 | ||
|
|
ed4978bb89 | ||
|
|
7a4f28e939 | ||
|
|
5cb6a75e7d | ||
|
|
757af25d8f | ||
|
|
5e3e7eccbf | ||
|
|
9738fcd6cd | ||
|
|
5a6a33303c | ||
|
|
ae15d6c5f5 | ||
|
|
ff15973a25 | ||
|
|
b88a68dab8 | ||
|
|
b05bdcd83d | ||
|
|
6a4ad34324 | ||
|
|
9a2d94cc33 | ||
|
|
f1d1d4fe10 | ||
|
|
fa6fa1c425 | ||
|
|
f8c8300c9c | ||
|
|
09198b431f | ||
|
|
f426ced789 | ||
|
|
bab330b64e | ||
|
|
b59a06face | ||
|
|
bb44e88c3b | ||
|
|
8649068159 | ||
|
|
5476385553 | ||
|
|
56bac35768 | ||
|
|
4cdc6a07ae | ||
|
|
c30b34ae5c | ||
|
|
da5c6fd084 | ||
|
|
a4b6499530 | ||
|
|
eb4445ea59 | ||
|
|
be51bcfdfc | ||
|
|
7bc4131c02 | ||
|
|
da8debdade | ||
|
|
ef5e664981 | ||
|
|
8e50af3a7e | ||
|
|
8e96c64918 | ||
|
|
8a9c8a279d | ||
|
|
72ca0cecd1 | ||
|
|
3564f6d0a7 | ||
|
|
d3e2b4b5b2 | ||
|
|
c6de6e7056 | ||
|
|
55322a282c | ||
|
|
6789ea81ff | ||
|
|
ac8a9af89c | ||
|
|
553b817b2a | ||
|
|
96592bce3e | ||
|
|
4e393886aa | ||
|
|
2e13be2a7a | ||
|
|
41fb29eba4 | ||
|
|
b519291fa2 | ||
|
|
dd752cd5be | ||
|
|
6a153f9aa0 | ||
|
|
bba390dbcc | ||
|
|
32efeb970c | ||
|
|
310335813f | ||
|
|
487980c9a8 | ||
|
|
f8801e224f | ||
|
|
5e229a0b01 | ||
|
|
49cfcbe92d | ||
|
|
4e4ce282db | ||
|
|
e2fd3e18d6 | ||
|
|
605c06f85c | ||
|
|
4cdefeab81 | ||
|
|
8ab09898f0 | ||
|
|
9c8b4d627c | ||
|
|
8923077120 | ||
|
|
29c31d90e5 | ||
|
|
e281d26a3a | ||
|
|
8ed68f481a | ||
|
|
b1abff61a5 | ||
|
|
15638cea4c | ||
|
|
9ed77c10e0 | ||
|
|
ccf262d202 | ||
|
|
4be894bc10 | ||
|
|
6440863ce4 | ||
|
|
25d7c72b6e | ||
|
|
dc4dd6ffa4 | ||
|
|
bf79134405 | ||
|
|
4f8b9d0f81 | ||
|
|
70bda268e5 | ||
|
|
e559dce9d5 | ||
|
|
6a98a6bf5e | ||
|
|
9b53133ba4 | ||
|
|
5b319b0df1 | ||
|
|
572bf919aa | ||
|
|
1d960a9084 | ||
|
|
4b28d1c2df | ||
|
|
9c8fd4d45d | ||
|
|
b62f029da7 | ||
|
|
c711a3666e | ||
|
|
487c6da4ac | ||
|
|
e942b13d73 | ||
|
|
c5ae719b9c | ||
|
|
7b6e707e24 | ||
|
|
0114700dad | ||
|
|
ec9364db69 | ||
|
|
033e29985e | ||
|
|
61cba2342d | ||
|
|
a3acad4ef3 | ||
|
|
1e13eb4abe | ||
|
|
1bac06fe3c | ||
|
|
762a768969 | ||
|
|
d0a6e3a860 | ||
|
|
995187d258 | ||
|
|
5333a04e1c | ||
|
|
19be5263b5 | ||
|
|
6e79401ab5 | ||
|
|
903036f1c0 | ||
|
|
6bd3eea0fe | ||
|
|
f28a3cf5a3 | ||
|
|
c828c2c6e4 | ||
|
|
26ccaa4449 | ||
|
|
ae1193ab16 | ||
|
|
6d6a29368e | ||
|
|
897cb00351 | ||
|
|
8a1689b79d | ||
|
|
018dfae15e | ||
|
|
c83e803c85 | ||
|
|
fa4d33671d | ||
|
|
f8d77b9b50 | ||
|
|
6594811536 | ||
|
|
cc7eb7cd84 | ||
|
|
e6408b4693 | ||
|
|
330c3486af | ||
|
|
b9dfb5afe3 | ||
|
|
565ac87b65 | ||
|
|
f0c39c1770 | ||
|
|
896cf889e4 | ||
|
|
6b91570054 | ||
|
|
31906b36e5 | ||
|
|
4e2d4f3f05 | ||
|
|
ffdc2dc85a | ||
|
|
911bc74bf4 | ||
|
|
3467c9d291 | ||
|
|
15cd8543f1 | ||
|
|
864db0ebc5 | ||
|
|
9ee623112d | ||
|
|
d789b1a472 | ||
|
|
17a25b44e2 | ||
|
|
781260f3fc | ||
|
|
6c43fa55b1 | ||
|
|
c4440668bb | ||
|
|
e437bf2ffe | ||
|
|
0f2d2d5734 | ||
|
|
a49ae05599 | ||
|
|
8ae2755dbe | ||
|
|
3966bd5f0a | ||
|
|
384ba54c79 | ||
|
|
26dbc922eb | ||
|
|
31a4498056 | ||
|
|
044275d909 | ||
|
|
c5316f9231 | ||
|
|
2d1a61d184 | ||
|
|
f7744188f4 | ||
|
|
5b6c923eef | ||
|
|
b0b031afb2 | ||
|
|
fe09d8c03e | ||
|
|
c2813d5736 | ||
|
|
8b2b658ced | ||
|
|
e862bacc8a | ||
|
|
cac57dbf79 | ||
|
|
345fe783cc | ||
|
|
55efe6d65b | ||
|
|
dccbc30972 | ||
|
|
f914a82379 | ||
|
|
18979d8fb6 | ||
|
|
21149f6807 | ||
|
|
93e6dcab1d | ||
|
|
59dedbea2c | ||
|
|
8bda4fd31e | ||
|
|
8039ea49f9 | ||
|
|
fc90b4ae23 | ||
|
|
e02be69e40 | ||
|
|
35a90f2769 | ||
|
|
fa87149631 | ||
|
|
8dfe722e14 | ||
|
|
dcbfe1e0ab | ||
|
|
e11946fd10 | ||
|
|
44399cd185 | ||
|
|
927d7f55ba | ||
|
|
e323d7b155 | ||
|
|
d0b253c346 | ||
|
|
81430e6853 | ||
|
|
83696e92b7 | ||
|
|
b0538c09bf | ||
|
|
40f89d1dca | ||
|
|
fa2e041cc9 | ||
|
|
3c614663a3 | ||
|
|
b5c7185374 | ||
|
|
d0a9a3a594 | ||
|
|
2e6329bb86 | ||
|
|
d3ba04fc5b | ||
|
|
7a78ea0185 | ||
|
|
36b04f9eba | ||
|
|
79ab6490fd | ||
|
|
191d345250 | ||
|
|
311ee40ae4 | ||
|
|
808d224b08 | ||
|
|
4247883664 | ||
|
|
3198cc40c1 | ||
|
|
8680e83af3 | ||
|
|
0156f33a20 | ||
|
|
df8b2dbf16 | ||
|
|
30e174ac95 | ||
|
|
b9f8f02d98 | ||
|
|
0b0ae270da | ||
|
|
893ce31b17 | ||
|
|
e35d6c2651 | ||
|
|
8dd0512335 | ||
|
|
5c1194ea92 | ||
|
|
953ed83df5 | ||
|
|
c330d02e78 | ||
|
|
af6a23011c | ||
|
|
882ae07deb | ||
|
|
be7c002869 | ||
|
|
e621e4a5a1 | ||
|
|
bd815d4ea2 | ||
|
|
4bc30b0b6f | ||
|
|
4d3501118e | ||
|
|
8d303348d9 | ||
|
|
2a2f4120b9 | ||
|
|
15f8887f14 | ||
|
|
fe945ab3ea | ||
|
|
e2b6f4cedd | ||
|
|
d82c86cf62 | ||
|
|
9df2867175 | ||
|
|
5c803d1553 | ||
|
|
d45b1853f8 | ||
|
|
1ac621fb9c | ||
|
|
4e74ac1937 | ||
|
|
959734ac31 | ||
|
|
166f3de52f | ||
|
|
e3adfff16f | ||
|
|
7cbc374278 | ||
|
|
129041402d | ||
|
|
9ac578dfd6 | ||
|
|
ef709a169b | ||
|
|
2eeba33f94 | ||
|
|
f4b2b9ae7d | ||
|
|
e44efb2a54 | ||
|
|
598f6d55c5 | ||
|
|
a2c5c7e6e6 | ||
|
|
4f6e646812 | ||
|
|
a79564f685 | ||
|
|
a77e49cbc9 | ||
|
|
cefb737fd2 | ||
|
|
8c8aba2dd5 | ||
|
|
97b18e9121 | ||
|
|
ddc9cc2237 | ||
|
|
aff803f334 | ||
|
|
38ec03fe30 | ||
|
|
55836771c9 | ||
|
|
08a68796bf | ||
|
|
3b9efcb2d4 | ||
|
|
022ba3dce4 | ||
|
|
86973e622d | ||
|
|
0fa38bad6d | ||
|
|
465bd3ce85 | ||
|
|
0c9130ab6c | ||
|
|
6c75ecf0c4 | ||
|
|
d533a0591b | ||
|
|
3f74d58503 | ||
|
|
1ba92ccc99 | ||
|
|
75db184077 | ||
|
|
66902d74c4 | ||
|
|
f6cc6af39c | ||
|
|
0da8dcf04a | ||
|
|
190be6c7b9 | ||
|
|
2972ab31d7 | ||
|
|
4b4ae9b014 | ||
|
|
20db00afcc | ||
|
|
56c90ca4a3 | ||
|
|
fad2314539 | ||
|
|
460eb02086 | ||
|
|
5a30d509e7 | ||
|
|
0f0050115c | ||
|
|
bf55db959e | ||
|
|
39a9840d49 | ||
|
|
866ca264d9 | ||
|
|
f18725083a | ||
|
|
20fbbb1dbe | ||
|
|
1a7bf2d070 | ||
|
|
fc7e8ebc53 | ||
|
|
532360886e | ||
|
|
117a54d077 | ||
|
|
f2c131a2cc | ||
|
|
6f0310e8f7 | ||
|
|
c7141003db | ||
|
|
d32bdb2825 | ||
|
|
a66abfa583 | ||
|
|
2551772de4 | ||
|
|
25fe794acc | ||
|
|
694fd2f1e0 | ||
|
|
5a4b920ae2 | ||
|
|
95f1b65bca | ||
|
|
25401e5959 | ||
|
|
3da58d5c24 | ||
|
|
08ab3c17d6 | ||
|
|
ecdb94b429 | ||
|
|
00892c20fa | ||
|
|
c433aed521 | ||
|
|
1243fb9678 | ||
|
|
d9c2247f99 | ||
|
|
0d4d4283d1 | ||
|
|
effefd4844 | ||
|
|
2d409db2f9 | ||
|
|
00f262571c | ||
|
|
4eac953c71 | ||
|
|
43352ab986 | ||
|
|
9803bf6c3f | ||
|
|
ba326973e5 | ||
|
|
a1f2126c00 | ||
|
|
b1da64d46b | ||
|
|
2694dd9e21 | ||
|
|
37e0f1d3f3 | ||
|
|
f80aee5133 | ||
|
|
65ee7479ac | ||
|
|
868f6d408b | ||
|
|
efdfbf437a | ||
|
|
2b57bca55c | ||
|
|
99ccbf8a40 | ||
|
|
9fe322375f | ||
|
|
d13e369994 | ||
|
|
a46ad7b81e | ||
|
|
324ba0d3dc | ||
|
|
1c7fa0132d | ||
|
|
93223a9d44 | ||
|
|
b6d4af218b | ||
|
|
448941f741 | ||
|
|
7e0e9091be | ||
|
|
8104ff7236 | ||
|
|
75f734daa8 | ||
|
|
779a724875 | ||
|
|
e975e151f9 | ||
|
|
a5351e1546 | ||
|
|
af90b840ee | ||
|
|
2558c02470 | ||
|
|
df60ccff0e | ||
|
|
2ed8bbf391 | ||
|
|
ef3025798d | ||
|
|
bea3bd8392 | ||
|
|
99e8900aba | ||
|
|
1c4a6ca02e | ||
|
|
b5fa7be53f | ||
|
|
3804e842bb | ||
|
|
e6832ecf61 | ||
|
|
ed3e29bade | ||
|
|
811aeb58ea | ||
|
|
6b5aaa38ae | ||
|
|
4e9545262d | ||
|
|
d48c84d81b | ||
|
|
cbddb2652d | ||
|
|
5f629253ac | ||
|
|
8d84a95c01 | ||
|
|
2cabaf6402 | ||
|
|
ad25ac49b8 | ||
|
|
d0412a88df | ||
|
|
a3ae1eb2f0 | ||
|
|
2e616af836 | ||
|
|
4fd8afcee4 | ||
|
|
e96b4f5541 | ||
|
|
9978a56b1e | ||
|
|
d3a5be13ea | ||
|
|
5ba0de12eb | ||
|
|
a73c097c94 | ||
|
|
d3840b19fa | ||
|
|
b34b6594de | ||
|
|
2fba61e9bd | ||
|
|
1e9434221b | ||
|
|
afd6791075 | ||
|
|
b3b53b6b4d | ||
|
|
b8b8cf6ea9 | ||
|
|
9a340e1ad8 | ||
|
|
29dc5e4ea7 | ||
|
|
08fa49b791 | ||
|
|
333b776e77 | ||
|
|
f68f060be2 | ||
|
|
722bb31815 | ||
|
|
e28580de00 | ||
|
|
cc447a089a | ||
|
|
0c9a30256e | ||
|
|
fa10142f13 | ||
|
|
c342741670 | ||
|
|
64d49003e0 | ||
|
|
b0c93c7418 | ||
|
|
085abd635e | ||
|
|
3789c7c335 | ||
|
|
4fb4e42896 | ||
|
|
81e7a0c554 | ||
|
|
4cbe4ea82d | ||
|
|
ea4905cd0d | ||
|
|
3c09ba59d7 | ||
|
|
430f436b79 | ||
|
|
93001dce88 | ||
|
|
2d6d25cadf | ||
|
|
b644da8210 | ||
|
|
f1a9a28ed7 | ||
|
|
643926886c | ||
|
|
9a5a59d876 | ||
|
|
e7fe91faef | ||
|
|
e6cf05ddff | ||
|
|
c3e9a2816b | ||
|
|
0bb8e83d68 | ||
|
|
d0053534ab | ||
|
|
38725c2bb4 | ||
|
|
b8fe70e5ee | ||
|
|
3960a21e05 | ||
|
|
e14301d991 | ||
|
|
65f74044d8 | ||
|
|
f6eba32be5 | ||
|
|
af62e55da8 | ||
|
|
22a8191b97 | ||
|
|
17ff5f63bf | ||
|
|
48a7d814f8 | ||
|
|
2c5cf07e9c | ||
|
|
cace504a63 | ||
|
|
efa47af347 | ||
|
|
1c9fbdb032 | ||
|
|
ac2eb3adae | ||
|
|
d6081ee10f | ||
|
|
8b9b72958e | ||
|
|
34edb6e329 | ||
|
|
9487051796 | ||
|
|
7d0577460f | ||
|
|
6b23f4b34a | ||
|
|
451de4a6f6 | ||
|
|
33d587ee9e | ||
|
|
6b381238fe | ||
|
|
07d66ade85 | ||
|
|
e1c9240698 | ||
|
|
d3e8af23bc | ||
|
|
5f9fe2948c | ||
|
|
4c54d99621 | ||
|
|
72beba76c3 | ||
|
|
1047d471ed | ||
|
|
0496af47df | ||
|
|
0ae4bcbd6f | ||
|
|
c58bc038f4 | ||
|
|
ecaa31f38d | ||
|
|
96a7aabda0 | ||
|
|
be857913cd | ||
|
|
601444d0a5 | ||
|
|
3c972ac905 | ||
|
|
6984c29a3a | ||
|
|
cb0ea67a28 | ||
|
|
fcdb029b10 | ||
|
|
5f33a07f4c | ||
|
|
357c04def0 | ||
|
|
0dfa6e63bd | ||
|
|
af10cacdff | ||
|
|
5f5d934d58 | ||
|
|
fda637bb03 | ||
|
|
76d17ebef0 | ||
|
|
df76ecb60f | ||
|
|
83dae09208 | ||
|
|
430364aacd | ||
|
|
81f359dbcf | ||
|
|
9ed3c8b498 | ||
|
|
72abd63b69 | ||
|
|
ed67393d33 | ||
|
|
e8bc892d8b | ||
|
|
fafe7d5778 | ||
|
|
a968b19be0 | ||
|
|
e9dbeb1e34 | ||
|
|
feaff0a08c | ||
|
|
342192fd67 | ||
|
|
4efb3dfc9a | ||
|
|
b9bec5b526 | ||
|
|
1ae0752933 | ||
|
|
0696acb9c5 | ||
|
|
3087dc86f8 | ||
|
|
973c8f082f | ||
|
|
85e89e4326 | ||
|
|
fb106a3d41 | ||
|
|
fb2d676293 | ||
|
|
944cca709f | ||
|
|
5b4cbbb669 | ||
|
|
a8492f06bb | ||
|
|
b6f673cd68 | ||
|
|
42b4272965 | ||
|
|
5beb083c55 | ||
|
|
cf529adc79 | ||
|
|
5a4da8ed5d | ||
|
|
bd3092ae90 | ||
|
|
76094fd305 | ||
|
|
e1edaa24cc | ||
|
|
d0d51ccf82 | ||
|
|
05053b5cd6 | ||
|
|
978552136c | ||
|
|
fb62a0e338 | ||
|
|
630f861c62 | ||
|
|
c2b3b78846 | ||
|
|
6e74dabc1c | ||
|
|
2cb1a95132 | ||
|
|
70a9ffe4a2 | ||
|
|
3cbd52c1f9 | ||
|
|
753c720716 | ||
|
|
d627363132 | ||
|
|
da8c38575e | ||
|
|
a355e4d0e7 | ||
|
|
5482f130ba | ||
|
|
18a5215da9 | ||
|
|
a3efe86cac | ||
|
|
ed3a78b56d | ||
|
|
af63723794 | ||
|
|
a0edca5e5b | ||
|
|
a9fab86269 | ||
|
|
821411cfd6 | ||
|
|
a8be88d771 | ||
|
|
b4392aded7 | ||
|
|
37a453b3cd | ||
|
|
51fcc6b231 | ||
|
|
199b3b5582 | ||
|
|
6c3ff7da32 | ||
|
|
a375ab9780 | ||
|
|
f47c3a2d20 | ||
|
|
029f2db620 | ||
|
|
0acf238c74 | ||
|
|
27a4d5af54 | ||
|
|
ea56e460d0 | ||
|
|
00e78dd84f | ||
|
|
7eb5fb4520 | ||
|
|
8ff52e2e36 | ||
|
|
8c5dc91895 | ||
|
|
155e22a9f9 | ||
|
|
7177afd7f8 | ||
|
|
eca7a43a01 | ||
|
|
dd99f258c1 | ||
|
|
5c9a3e236b | ||
|
|
7b07137b5b | ||
|
|
eb898a8867 | ||
|
|
c86360c9c4 | ||
|
|
1d6b2bd002 | ||
|
|
41bb3e7319 | ||
|
|
f500945298 | ||
|
|
6da3f78df6 | ||
|
|
407f6d4671 | ||
|
|
6c76187f5d | ||
|
|
8c8800f156 | ||
|
|
b3f1103143 | ||
|
|
84e470d213 | ||
|
|
52a623f31e | ||
|
|
abd7d3cfb4 | ||
|
|
f543b55f19 | ||
|
|
f2a3ae409f | ||
|
|
4e4cf4bbc7 | ||
|
|
d532b57810 | ||
|
|
aa337c0c84 | ||
|
|
cc1f899948 | ||
|
|
848c30547c | ||
|
|
c8cc0131da | ||
|
|
b0c0ecb59c | ||
|
|
45f257ef14 | ||
|
|
fa38fa1410 | ||
|
|
ee492dcde1 | ||
|
|
22bec873a8 | ||
|
|
958fd0cdcb | ||
|
|
0d0c789d8b | ||
|
|
3d19299d30 | ||
|
|
4c56c96326 | ||
|
|
42e2f6a89d | ||
|
|
c715f20fe3 | ||
|
|
e02ce4c151 | ||
|
|
9f7a7a5703 | ||
|
|
147fd396cf | ||
|
|
293a95da6d | ||
|
|
952ecb2eec | ||
|
|
31e7cd31c1 | ||
|
|
51ec8199e4 | ||
|
|
f75c58b7d2 | ||
|
|
f8970a21be | ||
|
|
b6be20727d | ||
|
|
9c4a6b46b6 | ||
|
|
779c7cec30 | ||
|
|
154a21fbaf | ||
|
|
a2e0efaed3 | ||
|
|
0d408e0df1 | ||
|
|
b5ceda5955 | ||
|
|
ffa5219d23 | ||
|
|
099425abc8 | ||
|
|
dea3c4afeb | ||
|
|
4cdafe2497 | ||
|
|
a88f9933d2 | ||
|
|
a095d489f3 | ||
|
|
2c81ca2bf8 | ||
|
|
f2ccabf062 | ||
|
|
6dd4406782 | ||
|
|
062cc84d51 | ||
|
|
dfbc9a7fff | ||
|
|
1888b735d1 | ||
|
|
a44dc0a5f6 | ||
|
|
6634ade6b4 | ||
|
|
6962d24b52 | ||
|
|
eb56690684 | ||
|
|
4b7020fbbb | ||
|
|
f9a8231820 | ||
|
|
7e977414a7 | ||
|
|
c96d503dae | ||
|
|
8c603d59c6 | ||
|
|
bdb705e89a | ||
|
|
9172c39a26 | ||
|
|
3ca7c15208 | ||
|
|
cfda1e93a0 | ||
|
|
8f8a493b20 | ||
|
|
5aa9255909 | ||
|
|
107fb08e34 | ||
|
|
95a94da66f | ||
|
|
c8eb62e8f0 | ||
|
|
4010a84d88 | ||
|
|
c0db3a69d7 | ||
|
|
5dbf401615 | ||
|
|
c5811ae947 | ||
|
|
e1595e1091 | ||
|
|
aa366d4213 | ||
|
|
20ab4afb4b | ||
|
|
1300919c44 | ||
|
|
81b96c2b30 | ||
|
|
a98f72cc32 | ||
|
|
9ba9b87405 | ||
|
|
1e42ef042b | ||
|
|
206bc95ee2 | ||
|
|
b746e50233 | ||
|
|
a8dcfce99e | ||
|
|
f69f8d1e4a | ||
|
|
9c9ffb615f | ||
|
|
62a58d410f | ||
|
|
9e7e2e30a4 | ||
|
|
3350888af6 | ||
|
|
22552262b3 | ||
|
|
a0f474db20 | ||
|
|
d5cd42b0e7 | ||
|
|
307d3dda20 | ||
|
|
86e3e51b5a | ||
|
|
4fc081fcc6 | ||
|
|
ff30e0f99a | ||
|
|
6594f6b653 | ||
|
|
0942637d12 | ||
|
|
bb96db4395 | ||
|
|
f31f0d6168 | ||
|
|
1f4a3e4b8f | ||
|
|
b30f2bc193 | ||
|
|
b43d0746f4 | ||
|
|
227210209c | ||
|
|
3dd3cf2814 | ||
|
|
e98e221d93 | ||
|
|
81a59be0c4 | ||
|
|
8eb7723114 | ||
|
|
45d96734dd | ||
|
|
915ffd84c8 | ||
|
|
161a92aff7 | ||
|
|
9b207807eb | ||
|
|
0bdafed92f | ||
|
|
2ebd230a08 | ||
|
|
6d60000952 | ||
|
|
1b6422eed3 | ||
|
|
a643c44ac6 | ||
|
|
02732036de | ||
|
|
c0483b4b34 | ||
|
|
eff6c0666b | ||
|
|
ed97669d9e | ||
|
|
ddb14e2db7 | ||
|
|
c452252a7d | ||
|
|
6fcd301cf5 | ||
|
|
52862a3d63 | ||
|
|
ff092b4e9d | ||
|
|
0d6453751d | ||
|
|
082b9a907b | ||
|
|
5675a1e2ad | ||
|
|
8601c26f2d | ||
|
|
ece7a04437 | ||
|
|
9d2d3d2d0a | ||
|
|
cec445eab5 | ||
|
|
8116e8898e | ||
|
|
be0dbcd9eb | ||
|
|
5c44703f53 | ||
|
|
c364970e05 | ||
|
|
b2385cf80c | ||
|
|
2b1d03d9d4 | ||
|
|
5b6f33a2a1 | ||
|
|
352955d608 | ||
|
|
e07b281577 | ||
|
|
71f4e45256 | ||
|
|
828f51500d | ||
|
|
4a0a7e0df3 | ||
|
|
3c8b588312 | ||
|
|
711d61d120 | ||
|
|
bce363e543 | ||
|
|
d66d7b3a73 | ||
|
|
024542d361 | ||
|
|
7d85aacace | ||
|
|
31b2e6779d | ||
|
|
2b39a6d535 | ||
|
|
e490a1763a | ||
|
|
bf4b35aa0a | ||
|
|
1f7d3ec91d | ||
|
|
23412d6bfa | ||
|
|
bd0042f079 | ||
|
|
0ccf1a1c5d | ||
|
|
76d7002646 | ||
|
|
38cc4cfe7e | ||
|
|
d91b476f33 | ||
|
|
f7080c61d5 | ||
|
|
26842fba27 | ||
|
|
dce1065af5 | ||
|
|
f0af17abe4 | ||
|
|
fbd56da7ad | ||
|
|
0ef8b8c175 | ||
|
|
230879a0db | ||
|
|
2ef64e4597 | ||
|
|
6c18862fd1 | ||
|
|
6c109c52f6 | ||
|
|
f3400b8756 | ||
|
|
b79b1f5750 | ||
|
|
9b72f57463 | ||
|
|
6f9a45b54a | ||
|
|
683461d918 | ||
|
|
ada203c00c | ||
|
|
01887d652c | ||
|
|
fff23649cf | ||
|
|
c7762a5b65 | ||
|
|
d07fadde76 | ||
|
|
ac7a09edd1 | ||
|
|
f30f095f00 | ||
|
|
d91a66ee8d | ||
|
|
7db7ed97ee | ||
|
|
6b9d49eb71 | ||
|
|
7c9e8e3e40 | ||
|
|
5586f627d3 | ||
|
|
04f3f0872d | ||
|
|
e4921087d9 | ||
|
|
005b78413c | ||
|
|
c752f4d4b5 | ||
|
|
991e2dee5a | ||
|
|
33d974bb3d | ||
|
|
0a1677af95 | ||
|
|
7ffbb10587 | ||
|
|
3d45890a2d | ||
|
|
bb5eb64b28 | ||
|
|
e6a050de82 | ||
|
|
7e7eb844a7 | ||
|
|
e56c628bec | ||
|
|
c604f88685 | ||
|
|
83db186972 | ||
|
|
e675af9a18 | ||
|
|
ca8cd7ff3d | ||
|
|
b05002ee9b | ||
|
|
b3c665907b | ||
|
|
64776e3868 | ||
|
|
df4d66ad4b | ||
|
|
f0612591be | ||
|
|
5838c87140 | ||
|
|
1ce3ba0f30 | ||
|
|
dc8f7de75a | ||
|
|
d3f8e94fe9 | ||
|
|
88cf0184cc | ||
|
|
b9e096abfa | ||
|
|
ec959f6239 | ||
|
|
5f2459ae43 | ||
|
|
9af3b745a2 | ||
|
|
a5cd5fcb31 | ||
|
|
ec153fa6ff | ||
|
|
dd72b32559 | ||
|
|
4f4e1ca80d | ||
|
|
dd6c1d9607 | ||
|
|
7b5f4e9dd0 | ||
|
|
9cd17fca1c | ||
|
|
385a46b96f | ||
|
|
04cbba3f4e | ||
|
|
5ab5908ef5 | ||
|
|
9bf65ffe83 | ||
|
|
10c8fe1f26 | ||
|
|
01517f82b8 | ||
|
|
67277ccc21 | ||
|
|
b12cb3350f | ||
|
|
3ff8c504f8 | ||
|
|
939b9eb8a8 | ||
|
|
9935eba336 | ||
|
|
4024f9d6dd | ||
|
|
a097484a51 | ||
|
|
b0cfb4b2c4 | ||
|
|
05f3abe944 | ||
|
|
a191c136dc | ||
|
|
e31e228d10 | ||
|
|
47cbdf555f | ||
|
|
26aca723cb | ||
|
|
93d6a45a78 | ||
|
|
2ac20cf3af | ||
|
|
112f607d6e | ||
|
|
c9d33bffc8 | ||
|
|
59f9143a3c | ||
|
|
d7f3005b69 | ||
|
|
5f8cd972cd | ||
|
|
013a19e25b | ||
|
|
94c38df1ba | ||
|
|
d65d82ff0a | ||
|
|
3070376fb6 | ||
|
|
e019b65ef7 | ||
|
|
ccdb6a031f | ||
|
|
e5c5b77a9a | ||
|
|
3444e308fd | ||
|
|
8b37c64088 | ||
|
|
f6a1065cd7 | ||
|
|
4a2b28e88c | ||
|
|
6355a97b47 | ||
|
|
20c4056561 | ||
|
|
a5a87b975b | ||
|
|
456d12fb58 | ||
|
|
c735960ff8 | ||
|
|
cebd95b2c7 | ||
|
|
aff3373b78 | ||
|
|
420fe497a5 | ||
|
|
f6a292b57b | ||
|
|
39ffb8d99d | ||
|
|
2ac5438f6b | ||
|
|
76b36cef35 | ||
|
|
4b38da76b1 | ||
|
|
cc285ae8d8 | ||
|
|
a5a020eef1 | ||
|
|
6f68d7b7f1 | ||
|
|
abe27598de | ||
|
|
5577cd0fab | ||
|
|
0695fb9381 | ||
|
|
b5aa7fc213 | ||
|
|
b16638d813 | ||
|
|
a0564628c4 | ||
|
|
719bde87b7 | ||
|
|
d8ee308a5f | ||
|
|
a5d26d6517 | ||
|
|
8b3a22cbe4 | ||
|
|
8d47e56010 | ||
|
|
a6d68b9ecf | ||
|
|
d275d6cc69 | ||
|
|
e5ea32e9c0 | ||
|
|
5bc4504e37 | ||
|
|
fd89e83798 | ||
|
|
88f9172866 | ||
|
|
27f57cc23a | ||
|
|
f6c6011061 | ||
|
|
408b3b4060 | ||
|
|
55fd7ba8e6 | ||
|
|
e34eb502db | ||
|
|
292df38c10 | ||
|
|
a483c42893 | ||
|
|
bebcb978f6 | ||
|
|
ba7f994a71 | ||
|
|
9c7e2171f6 | ||
|
|
b7e8587608 | ||
|
|
0a33fba23e | ||
|
|
5370af4a84 | ||
|
|
df0d5fdbe8 | ||
|
|
7b33ee79dd | ||
|
|
ad8322b6a6 | ||
|
|
c43a10027b | ||
|
|
2ebdc4509c | ||
|
|
4cb4c9c6a5 | ||
|
|
9190335a70 | ||
|
|
4e244789a2 | ||
|
|
6de7b8e63b | ||
|
|
68e500eea0 | ||
|
|
840e09a684 | ||
|
|
d00a5223d3 | ||
|
|
3965a899c7 | ||
|
|
956667bf08 | ||
|
|
51e23d21cd | ||
|
|
44c6d6288e | ||
|
|
e5848086c3 | ||
|
|
138e5588e9 | ||
|
|
ab5828a560 | ||
|
|
1839f13149 | ||
|
|
320c21d272 | ||
|
|
e1e48922de | ||
|
|
3940f032af | ||
|
|
956688d9f4 | ||
|
|
7f45f4aeec | ||
|
|
78666ff7de | ||
|
|
dbdf10c75a | ||
|
|
2564da2615 | ||
|
|
bd25de15cc | ||
|
|
fcaa7c5f42 | ||
|
|
e36800b951 | ||
|
|
977fbaa8ef | ||
|
|
6ed62aa05c | ||
|
|
1d29ac228c | ||
|
|
a44d90671c | ||
|
|
d6b0912492 | ||
|
|
d588e6e4fd | ||
|
|
19ddddf618 | ||
|
|
a7bf1e9676 | ||
|
|
02f2837f86 | ||
|
|
0598eff9c5 | ||
|
|
a6364389ba | ||
|
|
9e9474a026 | ||
|
|
c23c5ae614 | ||
|
|
de3cb2f686 | ||
|
|
454b5a77ad | ||
|
|
4a493f3f6d | ||
|
|
61274cb865 | ||
|
|
8145a7536b | ||
|
|
e41d7899c7 | ||
|
|
88d99a7dea | ||
|
|
90823e3b17 | ||
|
|
3357f286ab | ||
|
|
ad080da026 | ||
|
|
25c2def710 | ||
|
|
604131b31d | ||
|
|
924da6ae69 | ||
|
|
12aadf18cc | ||
|
|
aa516522aa | ||
|
|
efb1ff5a93 | ||
|
|
aff9ff20e8 | ||
|
|
4c8a173213 | ||
|
|
b6240f16fb | ||
|
|
f5281535d9 | ||
|
|
96babd0939 | ||
|
|
464c2dca85 | ||
|
|
43dc04b4d0 | ||
|
|
e92f043cfa | ||
|
|
ff95b464ce | ||
|
|
69e1acd5ae | ||
|
|
e162a0ecd6 | ||
|
|
383045d1c0 | ||
|
|
e6bec8eb57 | ||
|
|
d2dea83c63 | ||
|
|
797aaf1ea8 | ||
|
|
5a7fd8c24e | ||
|
|
cc4ec4b598 | ||
|
|
55d78579c8 | ||
|
|
d94542049c | ||
|
|
6dec25b4f4 | ||
|
|
8c7049913b | ||
|
|
7edd8e6e19 | ||
|
|
2b4eb7127d | ||
|
|
9a3ce775a8 | ||
|
|
2ff78e531e | ||
|
|
03a33d87ff | ||
|
|
176e5627e5 | ||
|
|
5801d05047 | ||
|
|
815ba75c76 | ||
|
|
fff16b4019 | ||
|
|
e408a2cf1d | ||
|
|
b535600297 | ||
|
|
762c554468 | ||
|
|
a8c7057aba | ||
|
|
935f3fc37c | ||
|
|
fae2878c41 | ||
|
|
d30ccb810c | ||
|
|
8d75a85d6d | ||
|
|
625bfd1bec | ||
|
|
b04ffadf13 | ||
|
|
b142610800 | ||
|
|
5681722c09 | ||
|
|
9a3a536479 | ||
|
|
55f01149e4 | ||
|
|
6f5fc43490 | ||
|
|
cb62ffdfc2 | ||
|
|
40ac705c46 | ||
|
|
3ac4a71085 | ||
|
|
2963ced1d5 | ||
|
|
175aafee50 | ||
|
|
b75a3d6e81 | ||
|
|
5334727528 | ||
|
|
253206de22 | ||
|
|
5a60f4c02b | ||
|
|
63fcdd9db4 | ||
|
|
832c0230e2 | ||
|
|
e1028b0348 | ||
|
|
2433752273 | ||
|
|
1b0b551fc6 | ||
|
|
74849a8d48 | ||
|
|
ee0de6933f | ||
|
|
bd863dba34 | ||
|
|
f9af24e246 | ||
|
|
864c55feaf | ||
|
|
7628847a46 | ||
|
|
955b586908 | ||
|
|
32a1fd45df | ||
|
|
15fbde29d4 | ||
|
|
2cce02bfa9 | ||
|
|
7e35de8a0e | ||
|
|
9a98fd9cff | ||
|
|
f6d25153c6 | ||
|
|
1409d1b47b | ||
|
|
853294e168 | ||
|
|
1a4296386a | ||
|
|
c464f78340 | ||
|
|
8992c96014 | ||
|
|
62a13f2da6 | ||
|
|
f9005757bd | ||
|
|
cd6aca832d | ||
|
|
1b4eb039ae | ||
|
|
6c47065686 | ||
|
|
9bfcea6feb | ||
|
|
58d979712e | ||
|
|
a0f99858e3 | ||
|
|
2abbb75f98 | ||
|
|
3f92df0865 | ||
|
|
be0b98c467 | ||
|
|
7d45415990 | ||
|
|
f3f581fe2d | ||
|
|
f6837079d3 | ||
|
|
5cd987ba3a | ||
|
|
8293160a01 | ||
|
|
625ee2703d | ||
|
|
c3b520c3d4 | ||
|
|
80687dfea3 | ||
|
|
7f9da6478f | ||
|
|
056971fcbc | ||
|
|
ba26359dde | ||
|
|
a2f0640b1b | ||
|
|
16a4245ad7 | ||
|
|
608a5559ac | ||
|
|
dfac385d21 | ||
|
|
40d602c82e | ||
|
|
fbd6360bda | ||
|
|
a0047e3ad7 | ||
|
|
437d6810b7 | ||
|
|
82ec7733ba | ||
|
|
1357990c4c | ||
|
|
61a9264802 | ||
|
|
4a70f260f3 | ||
|
|
bcea2007bd | ||
|
|
fcf2c967ab | ||
|
|
2f8e225abd | ||
|
|
5f3f999222 | ||
|
|
2bc9fef758 | ||
|
|
aec03b2f24 | ||
|
|
ba6ed137c6 | ||
|
|
32dc5d3cdb | ||
|
|
597db25178 | ||
|
|
c2d6b9ad2c | ||
|
|
4977286936 | ||
|
|
cc09184183 | ||
|
|
a9713c3bfa | ||
|
|
3af40a66dd | ||
|
|
6e70f16e1b | ||
|
|
16fccf8184 | ||
|
|
804468f7b9 | ||
|
|
7dc3b7c8ac | ||
|
|
b42409efd1 | ||
|
|
cb010d81ac | ||
|
|
15979d4636 | ||
|
|
1a164fa057 | ||
|
|
a76f49f927 | ||
|
|
becee5b426 | ||
|
|
4ecaffd908 | ||
|
|
74b1dda884 | ||
|
|
d6858e18df | ||
|
|
92284e92c9 | ||
|
|
f709f3bb18 | ||
|
|
8e2dffc3b5 | ||
|
|
ae569316ff | ||
|
|
eee2ff6d61 | ||
|
|
65b828c424 | ||
|
|
f10ba86218 | ||
|
|
24e19deb58 | ||
|
|
f7a3f80689 | ||
|
|
b4168d09b5 | ||
|
|
ba0ea5b40a | ||
|
|
04cefda66c | ||
|
|
8c6a708764 | ||
|
|
a1e76d9d02 | ||
|
|
82ee6f0dee | ||
|
|
d58534b07d | ||
|
|
f37c863092 | ||
|
|
e71f76288b | ||
|
|
d094824d76 | ||
|
|
d635b10e24 | ||
|
|
dca43d6d8d | ||
|
|
abf3bfb98e | ||
|
|
c46f8513dd | ||
|
|
92338d478e | ||
|
|
c1e68323c7 | ||
|
|
f64eb0dea5 | ||
|
|
c1870af1b1 | ||
|
|
71783088c0 | ||
|
|
7057a135cf | ||
|
|
5cb107b844 | ||
|
|
57b22782d3 | ||
|
|
cb0a90d1d9 | ||
|
|
1c439a01a1 | ||
|
|
2bfc8e92ef | ||
|
|
68548cf248 | ||
|
|
3a64feefd0 | ||
|
|
da75d2d707 | ||
|
|
3a85d96fa4 | ||
|
|
883cc4b6fd | ||
|
|
aa61a9e77b | ||
|
|
9de5c62136 | ||
|
|
7b3ea7e12e | ||
|
|
bafa67c8de | ||
|
|
0d3a80e582 | ||
|
|
5a401a5f92 | ||
|
|
0e88cdb258 | ||
|
|
e5cd3adf97 | ||
|
|
6253b7a912 | ||
|
|
fe455bf901 | ||
|
|
3a0d21eb44 | ||
|
|
45ec0cef24 | ||
|
|
1468bb99f0 | ||
|
|
3efabee153 | ||
|
|
962de5b25f | ||
|
|
b265d6dd56 | ||
|
|
302cf8345d | ||
|
|
d249391816 | ||
|
|
0a24a6af1f | ||
|
|
52f40b7f9f | ||
|
|
8fbe6ee8ff | ||
|
|
5a3a8db772 | ||
|
|
56cd6711ce | ||
|
|
29339b962c | ||
|
|
d9cd4d7e36 | ||
|
|
56080f40ef | ||
|
|
bb0a3589c1 | ||
|
|
db109e3586 | ||
|
|
289f4b300a | ||
|
|
0ee9a0cfa4 | ||
|
|
d9f7aa760e | ||
|
|
01ab0d3530 | ||
|
|
8bd7794a2e | ||
|
|
fcfbb59637 | ||
|
|
089b94d753 | ||
|
|
bfba598ef4 | ||
|
|
e2efaab2b2 | ||
|
|
28e5e584b4 | ||
|
|
e0734fe848 | ||
|
|
2ea8a7e662 | ||
|
|
c0ea47ce75 | ||
|
|
84fb354bc0 | ||
|
|
9f35c954ac | ||
|
|
78b3778442 | ||
|
|
0e092284eb | ||
|
|
4be1e75128 | ||
|
|
62a581393d | ||
|
|
cec5274ea3 | ||
|
|
80f2912026 | ||
|
|
70b91867cb | ||
|
|
a1ccddb53c | ||
|
|
5a7db86471 | ||
|
|
518ed3a7fd | ||
|
|
d322be1666 | ||
|
|
a503aaa8a0 | ||
|
|
a7771e95f2 | ||
|
|
311de9381c | ||
|
|
c3aa7356ec | ||
|
|
63656cf383 | ||
|
|
6d3e2d9316 | ||
|
|
dcdd167db3 | ||
|
|
9ed62b02b6 | ||
|
|
6b330fa869 | ||
|
|
5cc753dec4 | ||
|
|
f7a0f50f87 | ||
|
|
8466970a1f | ||
|
|
48cb87ada2 | ||
|
|
145fe7ce13 | ||
|
|
b320eb853a | ||
|
|
474fe63ad3 | ||
|
|
da45aa7f15 | ||
|
|
11f21304f9 | ||
|
|
6cb2cdd5a2 | ||
|
|
9e8119e69c | ||
|
|
25c2bafa88 | ||
|
|
ae56bed032 | ||
|
|
4c8f9e154d | ||
|
|
0ed6f2924e | ||
|
|
8896d477aa | ||
|
|
1b08a250f6 | ||
|
|
8b09e1a446 | ||
|
|
720251458f | ||
|
|
a48680c26f | ||
|
|
684b5d4534 | ||
|
|
aedcc86fc5 | ||
|
|
978975d396 | ||
|
|
c9e9119bff | ||
|
|
20f222d19e | ||
|
|
187d51e501 | ||
|
|
fa744bb802 | ||
|
|
bed5b9d4ef | ||
|
|
13540c8008 | ||
|
|
48df491c31 | ||
|
|
3fbf8fcfb8 | ||
|
|
104038bc7e | ||
|
|
bb37c0058e | ||
|
|
f4e1d7d4c1 | ||
|
|
e6c9a82cd3 | ||
|
|
0ca71b62db | ||
|
|
936c4d8696 | ||
|
|
1c1f7b19dd | ||
|
|
0558d67240 | ||
|
|
3bb9a7b1f8 | ||
|
|
123cc92756 | ||
|
|
9babe7f1d2 | ||
|
|
f46b714990 | ||
|
|
3497b2a760 | ||
|
|
acd10bd978 | ||
|
|
802950d941 | ||
|
|
f158fba48d | ||
|
|
059d134990 | ||
|
|
f7871c0036 | ||
|
|
42943b315c | ||
|
|
37b9ccfaa8 | ||
|
|
1cf2a3dd3f | ||
|
|
1718806042 | ||
|
|
7d26aa533a | ||
|
|
521af84797 | ||
|
|
53eb6dcc80 | ||
|
|
6ed440d861 | ||
|
|
a99c4a3fee | ||
|
|
0ebd44bc4f | ||
|
|
2f53915064 | ||
|
|
08d3849c43 | ||
|
|
bb1f086674 | ||
|
|
f4771b4f21 | ||
|
|
2093b4ec85 | ||
|
|
e5f483de1d | ||
|
|
23be5484e3 | ||
|
|
0b8543e6dd | ||
|
|
a3025479e7 | ||
|
|
a6ea49981d | ||
|
|
2a39fb0bd5 | ||
|
|
2dde53760a | ||
|
|
a7e48a8d3b | ||
|
|
4fae158a3c | ||
|
|
7d87856f4a | ||
|
|
cfa525351a | ||
|
|
f9de43c7d4 | ||
|
|
e00227f0c6 | ||
|
|
e31942bf1e | ||
|
|
111de20a57 | ||
|
|
635fbae3c9 | ||
|
|
f29ee95176 | ||
|
|
0d91ad7d94 | ||
|
|
715650c4db | ||
|
|
a68212672b | ||
|
|
fce115d39c | ||
|
|
301f2d8a97 | ||
|
|
500c19d900 | ||
|
|
617b0de31f | ||
|
|
92ad792eff | ||
|
|
560f684f7f | ||
|
|
a0c0555089 | ||
|
|
9fa1fb7b44 | ||
|
|
f5fa49338d | ||
|
|
df7cfa0d6a | ||
|
|
a0579efbc2 | ||
|
|
b6a1182876 | ||
|
|
4582e1f508 | ||
|
|
621e396373 | ||
|
|
300723419b | ||
|
|
f75ab9f428 | ||
|
|
dbc7ff5de7 | ||
|
|
856db3df08 | ||
|
|
1479bef00d | ||
|
|
3761a9c8ba | ||
|
|
7c4c8c6275 | ||
|
|
3b9670c202 | ||
|
|
861010af0e | ||
|
|
57b527c886 | ||
|
|
31652e8b04 | ||
|
|
8b94a7174f | ||
|
|
01a79fcc6e | ||
|
|
17b4c18830 | ||
|
|
86541b1aa8 | ||
|
|
e022a45048 | ||
|
|
94e31f1953 | ||
|
|
ad8581db97 | ||
|
|
e2191113b0 | ||
|
|
161a553948 | ||
|
|
80f63e66c3 | ||
|
|
2f25409475 | ||
|
|
67320d3eb3 | ||
|
|
92aeb2d816 | ||
|
|
3420f6ca42 | ||
|
|
8e5efb923f | ||
|
|
ab4e0bc406 | ||
|
|
8993b3f4f0 | ||
|
|
499c281931 | ||
|
|
bb7e0f6f89 | ||
|
|
8919a2fcca | ||
|
|
ba0796c9ea | ||
|
|
1b7404f194 | ||
|
|
5add534848 | ||
|
|
ef7ebdfd1f | ||
|
|
42f356d322 | ||
|
|
dabf52511f | ||
|
|
df85f97646 | ||
|
|
a9d37bb2a2 | ||
|
|
6b689f1584 | ||
|
|
4b0fa94b3c | ||
|
|
c53b06c3d2 | ||
|
|
ed87a7cd67 | ||
|
|
108bf34cca | ||
|
|
8b98792ccf | ||
|
|
7c009b6dce | ||
|
|
5ae5a3d75d | ||
|
|
396ddd3e6f | ||
|
|
da7a125faf | ||
|
|
febf9b1815 | ||
|
|
55b4ba5832 | ||
|
|
3bc5ac28be | ||
|
|
93eb6378ba | ||
|
|
61837f0d68 | ||
|
|
c44b8b1029 | ||
|
|
8312ce4d4c | ||
|
|
3052b1cca5 | ||
|
|
ad3860981a | ||
|
|
2dbcbc6963 | ||
|
|
8767181a80 | ||
|
|
4c64707138 | ||
|
|
764fdd4d08 | ||
|
|
4c124770ed | ||
|
|
78b2a89b0a | ||
|
|
6147721314 | ||
|
|
2a5915f4b6 | ||
|
|
5382362168 | ||
|
|
3867b9933d | ||
|
|
4299abf68b | ||
|
|
b68701f51b | ||
|
|
c551efb75c | ||
|
|
92acb95a58 | ||
|
|
e2ea10d2eb | ||
|
|
d833d8946c | ||
|
|
3662e079ac | ||
|
|
c972a94876 | ||
|
|
234df8d11f | ||
|
|
14ca782672 | ||
|
|
9665473669 | ||
|
|
a8987d48ed | ||
|
|
f83715c370 | ||
|
|
a9d5dcf4a2 | ||
|
|
e568041143 | ||
|
|
4ce7374ac9 | ||
|
|
ed35b65390 | ||
|
|
15dc672bcf | ||
|
|
51891478e4 | ||
|
|
c2d5afc4e9 | ||
|
|
835fc1e360 | ||
|
|
2a70b998e3 | ||
|
|
5eecd14ce0 | ||
|
|
0afe0e5f46 | ||
|
|
396d4b341f | ||
|
|
bc002d500e | ||
|
|
6a86b28977 | ||
|
|
b91c83b6cd | ||
|
|
4b8412dfdb | ||
|
|
3713ae8c93 | ||
|
|
310be957b6 | ||
|
|
c29ca9722f | ||
|
|
64b6f98ce7 | ||
|
|
4a44282556 | ||
|
|
e3d7969b96 | ||
|
|
b68d71b7b7 | ||
|
|
b376d1682f | ||
|
|
af51469b62 | ||
|
|
fc7df585bd | ||
|
|
3ff31d20cf | ||
|
|
11c116480f | ||
|
|
fd5bc54cd0 | ||
|
|
95380168ef | ||
|
|
d349627fa1 | ||
|
|
3f8d297fb1 | ||
|
|
aae6c2c98b | ||
|
|
7698ceb108 | ||
|
|
495e868a71 | ||
|
|
95a2f4600b | ||
|
|
c43423a7d0 | ||
|
|
fa285ecc82 | ||
|
|
f47daac3cc | ||
|
|
03ca3f4f59 | ||
|
|
a9f81dd38e | ||
|
|
93c6928624 | ||
|
|
1e50dac5a6 | ||
|
|
545a653c0d | ||
|
|
20b6870f90 | ||
|
|
ca6f19f77d | ||
|
|
14a0e1a6cc | ||
|
|
38dfcdabd0 | ||
|
|
683371adaa | ||
|
|
7ba1948101 | ||
|
|
5bd53ed714 | ||
|
|
bff99fa537 | ||
|
|
54ff71798c | ||
|
|
81474336c1 | ||
|
|
6b50700d8c | ||
|
|
f708907d99 | ||
|
|
117923791a | ||
|
|
ea7c145c62 | ||
|
|
bdd764218b | ||
|
|
1fbd2c1adc | ||
|
|
2ff300970a | ||
|
|
f88c10d4aa | ||
|
|
eab8c27e4a | ||
|
|
c1e91e1ccb | ||
|
|
05e9129a66 | ||
|
|
76a9be2167 | ||
|
|
872673655e | ||
|
|
1ae27c7b5a | ||
|
|
b402b735d6 | ||
|
|
22001792cd | ||
|
|
9557c9ef21 | ||
|
|
6fe8b591ce | ||
|
|
23ae3f60f3 | ||
|
|
03b634b961 | ||
|
|
2897fdda04 | ||
|
|
f5fffafd43 | ||
|
|
e884f97621 | ||
|
|
e4028da886 | ||
|
|
a65bc95091 | ||
|
|
14563417a7 | ||
|
|
a3ee3e5a24 | ||
|
|
16a36b8315 | ||
|
|
861c49c9bc | ||
|
|
b3dacf9c5a | ||
|
|
2c13eb257b | ||
|
|
348decf72f | ||
|
|
92483cf188 | ||
|
|
8143b1d768 | ||
|
|
e7d6f37e98 | ||
|
|
d275a44895 | ||
|
|
f755d66342 | ||
|
|
22a438ed5e | ||
|
|
a014294d58 | ||
|
|
39953b5223 | ||
|
|
bd341db54a | ||
|
|
455ed7d503 | ||
|
|
637ae89583 | ||
|
|
7fd858b472 | ||
|
|
74d8377400 | ||
|
|
a29992b907 | ||
|
|
57097d1275 | ||
|
|
b21c62c11d | ||
|
|
0b3421e3cd | ||
|
|
a7adec1341 | ||
|
|
a236ee3ac3 | ||
|
|
d7b9e5a7d4 | ||
|
|
3d1738b14b | ||
|
|
f0e634a4fa | ||
|
|
0f5f60e477 | ||
|
|
9fe09f57f6 | ||
|
|
cf24b88bc8 | ||
|
|
d34fa0ba4e | ||
|
|
f40170ee6f | ||
|
|
2da750d5f9 | ||
|
|
720e700701 | ||
|
|
b452f7f32a | ||
|
|
7bfb8d6f53 | ||
|
|
b06db1f920 | ||
|
|
61eafa48ff | ||
|
|
8b07b15f6c | ||
|
|
5e67133495 | ||
|
|
30b740b7f0 | ||
|
|
7501ae4b4d | ||
|
|
4391c30299 | ||
|
|
536641eadd | ||
|
|
21594cd4c0 | ||
|
|
d4b263bc9f | ||
|
|
4e4eaed123 | ||
|
|
610843398e | ||
|
|
615e680b9b | ||
|
|
4e67c63808 | ||
|
|
f556f375ee | ||
|
|
f21f833aed | ||
|
|
0c6dd7a577 | ||
|
|
fc4872c5d6 | ||
|
|
3fe50e9ca3 | ||
|
|
a5e4d6a5ec | ||
|
|
0524129b64 | ||
|
|
7ce13751a0 | ||
|
|
e149ee0d70 | ||
|
|
2f3c71e55a | ||
|
|
5c04638cb4 | ||
|
|
6dd6d807b6 | ||
|
|
237d39f09c | ||
|
|
7a2f77193f | ||
|
|
d21980170e | ||
|
|
7dec34bdfe | ||
|
|
62d619b6cd | ||
|
|
67afffeb96 | ||
|
|
c58ea0c3bd | ||
|
|
acb8cea437 | ||
|
|
11f0957963 | ||
|
|
2d7c052fd9 | ||
|
|
23bd216cc7 | ||
|
|
50cfc5899b | ||
|
|
01d3cb4b11 | ||
|
|
a940200164 | ||
|
|
4e5c0f0a48 | ||
|
|
8e5657eff0 | ||
|
|
631a1b5864 | ||
|
|
67d2ad5511 | ||
|
|
ab4d7fae7d | ||
|
|
0e4a3f5e2b | ||
|
|
87c0535624 | ||
|
|
5648681ecc | ||
|
|
2c0bb1f7ba | ||
|
|
16d82212dd | ||
|
|
6ea1d06460 | ||
|
|
936413a6d9 | ||
|
|
88ce2eafab | ||
|
|
3915c8410b | ||
|
|
4115e42dc6 | ||
|
|
48f257f85a | ||
|
|
acdec64144 | ||
|
|
0beb97648a | ||
|
|
5564559192 | ||
|
|
8cb93bc1fe | ||
|
|
ae23b721b3 | ||
|
|
df06a4bb2c | ||
|
|
f37110605e | ||
|
|
8459754692 | ||
|
|
fc08e5cf23 | ||
|
|
6dec44bdc3 | ||
|
|
8cd69b2b70 | ||
|
|
625a03e799 | ||
|
|
aa4d4db11f | ||
|
|
76c353e790 | ||
|
|
8909b62dc4 | ||
|
|
371a588396 | ||
|
|
ee54b6d347 | ||
|
|
3ba215c35c | ||
|
|
161a3924d2 | ||
|
|
7b6fae6d92 | ||
|
|
71b52e58b2 | ||
|
|
d0a66ab16b | ||
|
|
9d75265e25 | ||
|
|
744e066d5f | ||
|
|
1791b443bc | ||
|
|
e850df505c | ||
|
|
918223e7da | ||
|
|
1552d992df | ||
|
|
f0a895691b | ||
|
|
1f7c805da4 | ||
|
|
1ad33556e9 | ||
|
|
6b5e83b98e | ||
|
|
6fb9c2df3b | ||
|
|
1b29803ed2 | ||
|
|
3477857584 | ||
|
|
0ce2c894e9 | ||
|
|
92470a35da | ||
|
|
6447fec028 | ||
|
|
0bc143cac3 |
16
.editorconfig
Normal file
16
.editorconfig
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
root = true
|
||||||
|
|
||||||
|
[*]
|
||||||
|
charset = utf-8
|
||||||
|
end_of_line = lf
|
||||||
|
insert_final_newline = true
|
||||||
|
indent_style = space
|
||||||
|
indent_size = 4
|
||||||
|
trim_trailing_whitespace = true
|
||||||
|
|
||||||
|
[*.md]
|
||||||
|
trim_trailing_whitespace = false
|
||||||
|
indent_size = 2
|
||||||
|
|
||||||
|
[*.{yml,yaml,vue,ts}]
|
||||||
|
indent_size = 2
|
||||||
13
.github/ISSUE_TEMPLATE/bug_report.md
vendored
13
.github/ISSUE_TEMPLATE/bug_report.md
vendored
@@ -3,6 +3,15 @@ name: Bug report
|
|||||||
about: Build PHP or library failed, download failed, doesn't seem to work...
|
about: Build PHP or library failed, download failed, doesn't seem to work...
|
||||||
title: ''
|
title: ''
|
||||||
labels: bug
|
labels: bug
|
||||||
assignees: crazywhalecc
|
body:
|
||||||
|
- type: textarea
|
||||||
|
id: what-happened
|
||||||
|
attributes:
|
||||||
|
label: What happened?
|
||||||
|
description: |
|
||||||
|
Please tell us what you do, what you get and what you expected.
|
||||||
|
Provide with some step-by-step instructions to reproduce the issue.
|
||||||
|
If possible, attach a screenshot or log files in ./log directory.
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
---
|
---
|
||||||
|
|||||||
2
.github/ISSUE_TEMPLATE/feature_request.md
vendored
2
.github/ISSUE_TEMPLATE/feature_request.md
vendored
@@ -3,6 +3,6 @@ name: Feature request
|
|||||||
about: Suggest an idea for this project
|
about: Suggest an idea for this project
|
||||||
title: ''
|
title: ''
|
||||||
labels: new feature
|
labels: new feature
|
||||||
assignees: ''
|
assignees: crazywhalecc
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|||||||
12
.github/pull_request_template.md
vendored
12
.github/pull_request_template.md
vendored
@@ -7,7 +7,11 @@
|
|||||||
> If your PR involves the changes mentioned below and completed the action, please tick the corresponding option.
|
> If your PR involves the changes mentioned below and completed the action, please tick the corresponding option.
|
||||||
> If a modification is not involved, please skip it directly.
|
> If a modification is not involved, please skip it directly.
|
||||||
|
|
||||||
- [ ] If you modified `*.php`, run `composer cs-fix` at local machine.
|
- If you modified `*.php` or `*.json`, run them locally to ensure your changes are valid:
|
||||||
- [ ] If it's an extension or dependency update, make sure adding related extensions in `src/global/test-extensions.php`.
|
- [ ] `composer cs-fix`
|
||||||
- [ ] If you changed the behavior of static-php-cli, update docs in `./docs/`.
|
- [ ] `composer analyse`
|
||||||
- [ ] If you updated `config/xxx.json` content, run `bin/spc dev:sort-config xxx`.
|
- [ ] `composer test`
|
||||||
|
- [ ] `bin/spc dev:sort-config`
|
||||||
|
- If it's an extension or dependency update, please ensure the following:
|
||||||
|
- [ ] Add your test combination to `src/globals/test-extensions.php`.
|
||||||
|
- [ ] If adding new or fixing bugs, add commit message containing `extension test` or `test extensions` to trigger full test suite.
|
||||||
|
|||||||
75
.github/workflows/build-unix.yml
vendored
75
.github/workflows/build-unix.yml
vendored
@@ -6,10 +6,13 @@ on:
|
|||||||
os:
|
os:
|
||||||
required: true
|
required: true
|
||||||
description: Build target OS
|
description: Build target OS
|
||||||
|
default: 'linux-x86_64'
|
||||||
type: choice
|
type: choice
|
||||||
options:
|
options:
|
||||||
- 'linux-x86_64'
|
- 'linux-x86_64'
|
||||||
- 'linux-aarch64'
|
- 'linux-aarch64'
|
||||||
|
- 'linux-x86_64-glibc'
|
||||||
|
- 'linux-aarch64-glibc'
|
||||||
- 'macos-x86_64'
|
- 'macos-x86_64'
|
||||||
- 'macos-aarch64'
|
- 'macos-aarch64'
|
||||||
php-version:
|
php-version:
|
||||||
@@ -22,7 +25,46 @@ on:
|
|||||||
- '8.3'
|
- '8.3'
|
||||||
- '8.2'
|
- '8.2'
|
||||||
- '8.1'
|
- '8.1'
|
||||||
- '8.0'
|
extensions:
|
||||||
|
description: Extensions to build (comma separated)
|
||||||
|
required: true
|
||||||
|
type: string
|
||||||
|
extra-libs:
|
||||||
|
description: Extra libraries to build (optional, comma separated)
|
||||||
|
type: string
|
||||||
|
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
|
||||||
|
prefer-pre-built:
|
||||||
|
description: Prefer pre-built binaries (reduce build time)
|
||||||
|
type: boolean
|
||||||
|
default: true
|
||||||
|
debug:
|
||||||
|
description: Show full build logs
|
||||||
|
type: boolean
|
||||||
|
no-strip:
|
||||||
|
description: Keep debug symbols for debugging
|
||||||
|
type: boolean
|
||||||
|
default: false
|
||||||
|
workflow_call:
|
||||||
|
inputs:
|
||||||
|
os:
|
||||||
|
required: true
|
||||||
|
description: Build target OS
|
||||||
|
default: 'linux-x86_64'
|
||||||
|
type: string
|
||||||
|
php-version:
|
||||||
|
required: true
|
||||||
|
description: PHP version to compile
|
||||||
|
default: '8.4'
|
||||||
|
type: string
|
||||||
extensions:
|
extensions:
|
||||||
description: Extensions to build (comma separated)
|
description: Extensions to build (comma separated)
|
||||||
required: true
|
required: true
|
||||||
@@ -77,19 +119,29 @@ jobs:
|
|||||||
RUNS_ON="ubuntu-latest"
|
RUNS_ON="ubuntu-latest"
|
||||||
;;
|
;;
|
||||||
linux-aarch64)
|
linux-aarch64)
|
||||||
DOWN_CMD="SPC_USE_ARCH=aarch64 ./bin/spc-alpine-docker download"
|
DOWN_CMD="./bin/spc-alpine-docker download"
|
||||||
BUILD_CMD="SPC_USE_ARCH=aarch64 ./bin/spc-alpine-docker build"
|
BUILD_CMD="./bin/spc-alpine-docker build"
|
||||||
RUNS_ON="ubuntu-latest"
|
RUNS_ON="ubuntu-24.04-arm"
|
||||||
|
;;
|
||||||
|
linux-x86_64-glibc)
|
||||||
|
DOWN_CMD="./bin/spc-gnu-docker download"
|
||||||
|
BUILD_CMD="./bin/spc-gnu-docker build"
|
||||||
|
RUNS_ON="ubuntu-22.04"
|
||||||
|
;;
|
||||||
|
linux-aarch64-glibc)
|
||||||
|
DOWN_CMD="./bin/spc-gnu-docker download"
|
||||||
|
BUILD_CMD="./bin/spc-gnu-docker build"
|
||||||
|
RUNS_ON="ubuntu-22.04-arm"
|
||||||
;;
|
;;
|
||||||
macos-x86_64)
|
macos-x86_64)
|
||||||
DOWN_CMD="composer update --no-dev --classmap-authoritative && ./bin/spc doctor --auto-fix && ./bin/spc download"
|
DOWN_CMD="composer update --no-dev --classmap-authoritative && ./bin/spc doctor --auto-fix && ./bin/spc download"
|
||||||
BUILD_CMD="./bin/spc build"
|
BUILD_CMD="./bin/spc build"
|
||||||
RUNS_ON="macos-13"
|
RUNS_ON="macos-15-intel"
|
||||||
;;
|
;;
|
||||||
macos-aarch64)
|
macos-aarch64)
|
||||||
DOWN_CMD="composer update --no-dev --classmap-authoritative && ./bin/spc doctor --auto-fix && ./bin/spc download"
|
DOWN_CMD="composer update --no-dev --classmap-authoritative && ./bin/spc doctor --auto-fix && ./bin/spc download"
|
||||||
BUILD_CMD="./bin/spc build"
|
BUILD_CMD="./bin/spc build"
|
||||||
RUNS_ON="macos-14"
|
RUNS_ON="macos-15"
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
DOWN_CMD="$DOWN_CMD --with-php=${{ inputs.php-version }} --for-extensions=${{ inputs.extensions }} --ignore-cache-sources=php-src"
|
DOWN_CMD="$DOWN_CMD --with-php=${{ inputs.php-version }} --for-extensions=${{ inputs.extensions }} --ignore-cache-sources=php-src"
|
||||||
@@ -142,14 +194,13 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
path: downloads
|
path: downloads
|
||||||
key: php-dependencies-${{ inputs.os }}
|
key: php-dependencies-${{ inputs.os }}
|
||||||
|
|
||||||
- name: "Download sources"
|
- name: "Download sources"
|
||||||
run: ${{ needs.define-build.outputs.download }}
|
run: ${{ needs.define-build.outputs.download }}
|
||||||
- name: "Build PHP"
|
- name: "Build PHP"
|
||||||
run: ${{ needs.define-build.outputs.build }}
|
run: ${{ needs.define-build.outputs.build }}
|
||||||
#- name: Setup tmate session
|
# - name: Setup tmate session
|
||||||
# if: ${{ failure() }}
|
# if: ${{ failure() }}
|
||||||
# uses: mxschmitt/action-tmate@v3
|
# uses: mxschmitt/action-tmate@v3
|
||||||
|
|
||||||
# Upload cli executable
|
# Upload cli executable
|
||||||
- if: ${{ inputs.build-cli == true }}
|
- if: ${{ inputs.build-cli == true }}
|
||||||
@@ -179,12 +230,12 @@ jobs:
|
|||||||
- uses: actions/upload-artifact@v4
|
- uses: actions/upload-artifact@v4
|
||||||
name: "Upload License Files"
|
name: "Upload License Files"
|
||||||
with:
|
with:
|
||||||
name: license-files
|
name: license-files-${{ inputs.php-version }}-${{ inputs.os }}
|
||||||
path: buildroot/license/
|
path: buildroot/license/
|
||||||
- uses: actions/upload-artifact@v4
|
- uses: actions/upload-artifact@v4
|
||||||
name: "Upload Build Metadata"
|
name: "Upload Build Metadata"
|
||||||
with:
|
with:
|
||||||
name: build-meta
|
name: build-meta-${{ inputs.php-version }}-${{ inputs.os }}
|
||||||
path: |
|
path: |
|
||||||
buildroot/build-extensions.json
|
buildroot/build-extensions.json
|
||||||
buildroot/build-libraries.json
|
buildroot/build-libraries.json
|
||||||
|
|||||||
27
.github/workflows/ext-matrix-tests.yml
vendored
27
.github/workflows/ext-matrix-tests.yml
vendored
@@ -1,16 +1,14 @@
|
|||||||
name: "Extension matrix tests"
|
name: "Extension Matrix Tests"
|
||||||
|
|
||||||
on:
|
on:
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
pull_request:
|
push:
|
||||||
branches: [ "main" ]
|
|
||||||
paths:
|
|
||||||
- '.github/workflows/ext-matrix-tests.yml'
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
test:
|
test:
|
||||||
name: "${{ matrix.extension }} (PHP ${{ matrix.php-version }} on ${{ matrix.operating-system }})"
|
name: "${{ matrix.extension }} (PHP ${{ matrix.php-version }} on ${{ matrix.operating-system }})"
|
||||||
runs-on: ${{ matrix.operating-system }}
|
runs-on: ${{ matrix.operating-system }}
|
||||||
|
if: contains(github.event.head_commit.message, 'extension test') || contains(github.event.head_commit.message, 'test extensions')
|
||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
@@ -67,7 +65,7 @@ jobs:
|
|||||||
- sqlsrv
|
- sqlsrv
|
||||||
- ssh2
|
- ssh2
|
||||||
- swoole
|
- swoole
|
||||||
- swoole,swoole-hook-pgsql,swoole-hook-mysql,swoole-hook-sqlite
|
- swoole,swoole-hook-pgsql,swoole-hook-mysql,swoole-hook-sqlite,swoole-hook-odbc
|
||||||
- swow
|
- swow
|
||||||
- sysvmsg,sysvsem,sysvshm
|
- sysvmsg,sysvsem,sysvshm
|
||||||
- tidy
|
- tidy
|
||||||
@@ -87,9 +85,9 @@ jobs:
|
|||||||
- "8.4"
|
- "8.4"
|
||||||
operating-system:
|
operating-system:
|
||||||
- "ubuntu-latest"
|
- "ubuntu-latest"
|
||||||
#- "macos-13"
|
#- "macos-15-intel"
|
||||||
#- "debian-arm64-self-hosted"
|
#- "debian-arm64-self-hosted"
|
||||||
- "macos-14"
|
- "macos-15"
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: "Checkout"
|
- name: "Checkout"
|
||||||
@@ -101,11 +99,11 @@ jobs:
|
|||||||
OS=""
|
OS=""
|
||||||
if [ "${{ matrix.operating-system }}" = "ubuntu-latest" ]; then
|
if [ "${{ matrix.operating-system }}" = "ubuntu-latest" ]; then
|
||||||
OS="linux-x86_64"
|
OS="linux-x86_64"
|
||||||
elif [ "${{ matrix.operating-system }}" = "macos-13" ]; then
|
elif [ "${{ matrix.operating-system }}" = "macos-15-intel" ]; then
|
||||||
OS="macos-x86_64"
|
OS="macos-x86_64"
|
||||||
elif [ "${{ matrix.operating-system }}" = "debian-arm64-self-hosted" ]; then
|
elif [ "${{ matrix.operating-system }}" = "debian-arm64-self-hosted" ]; then
|
||||||
OS="linux-aarch64"
|
OS="linux-aarch64"
|
||||||
elif [ "${{ matrix.operating-system }}" = "macos-14" ]; then
|
elif [ "${{ matrix.operating-system }}" = "macos-15" ]; then
|
||||||
OS="macos-aarch64"
|
OS="macos-aarch64"
|
||||||
fi
|
fi
|
||||||
echo "OS=$OS" >> $GITHUB_ENV
|
echo "OS=$OS" >> $GITHUB_ENV
|
||||||
@@ -138,11 +136,4 @@ jobs:
|
|||||||
- name: "Build library: ${{ matrix.library }}"
|
- name: "Build library: ${{ matrix.library }}"
|
||||||
run: |
|
run: |
|
||||||
SPC_USE_SUDO=yes ./bin/spc doctor --auto-fix
|
SPC_USE_SUDO=yes ./bin/spc doctor --auto-fix
|
||||||
if [ "${{ env.OS }}" = "linux-x86_64" ]; then
|
./bin/spc build --build-cli --build-micro --build-fpm ${{ matrix.extension }} --debug --with-suggested-libs --with-suggested-exts
|
||||||
./bin/spc install-pkg upx
|
|
||||||
UPX=--with-upx-pack
|
|
||||||
elif [ "${{ env.OS }}" = "linux-aarch64" ]; then
|
|
||||||
./bin/spc install-pkg upx
|
|
||||||
UPX=--with-upx-pack
|
|
||||||
fi
|
|
||||||
./bin/spc build --build-cli --build-micro --build-fpm ${{ matrix.extension }} --debug $UPX --with-suggested-libs --with-suggested-exts
|
|
||||||
|
|||||||
64
.github/workflows/release-build.yml
vendored
64
.github/workflows/release-build.yml
vendored
@@ -3,6 +3,10 @@ name: Build SPC Binary
|
|||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
branches: [ "main" ]
|
branches: [ "main" ]
|
||||||
|
pull_request:
|
||||||
|
branches: [ "main" ]
|
||||||
|
paths:
|
||||||
|
- '.github/workflows/release-build.yml'
|
||||||
release:
|
release:
|
||||||
types:
|
types:
|
||||||
- published
|
- published
|
||||||
@@ -10,7 +14,7 @@ on:
|
|||||||
|
|
||||||
env:
|
env:
|
||||||
PHP_VERSION: 8.4
|
PHP_VERSION: 8.4
|
||||||
MICRO_VERSION: 8.4.4
|
MICRO_VERSION: 8.4.11
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build-release-artifacts:
|
build-release-artifacts:
|
||||||
@@ -23,7 +27,7 @@ jobs:
|
|||||||
os: "ubuntu-latest"
|
os: "ubuntu-latest"
|
||||||
filename: "spc-linux-x86_64.tar.gz"
|
filename: "spc-linux-x86_64.tar.gz"
|
||||||
- name: "macos-x86_64"
|
- name: "macos-x86_64"
|
||||||
os: "macos-13"
|
os: "macos-15-intel"
|
||||||
filename: "spc-macos-x86_64.tar.gz"
|
filename: "spc-macos-x86_64.tar.gz"
|
||||||
- name: "linux-aarch64"
|
- name: "linux-aarch64"
|
||||||
os: "ubuntu-latest"
|
os: "ubuntu-latest"
|
||||||
@@ -42,12 +46,13 @@ jobs:
|
|||||||
run: echo "SPC_BUILD_DEBUG=--debug" >> $GITHUB_ENV
|
run: echo "SPC_BUILD_DEBUG=--debug" >> $GITHUB_ENV
|
||||||
|
|
||||||
- name: "Install PHP for official runners"
|
- name: "Install PHP for official runners"
|
||||||
uses: "shivammathur/setup-php@v2"
|
uses: shivammathur/setup-php@v2
|
||||||
with:
|
with:
|
||||||
coverage: none
|
coverage: none
|
||||||
tools: composer:v2
|
tools: composer:v2
|
||||||
php-version: "${{ env.PHP_VERSION }}"
|
php-version: "${{ env.PHP_VERSION }}"
|
||||||
ini-values: memory_limit=-1
|
ini-values: memory_limit=-1
|
||||||
|
extensions: curl, openssl, mbstring
|
||||||
|
|
||||||
- name: "Get Composer Cache Directory"
|
- name: "Get Composer Cache Directory"
|
||||||
id: composer-cache
|
id: composer-cache
|
||||||
@@ -115,8 +120,9 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
files: dist/${{ matrix.operating-system.filename }}
|
files: dist/${{ matrix.operating-system.filename }}
|
||||||
|
|
||||||
- name: "Deploy to self-hosted OSS"
|
- name: "Deploy to self-hosted OSS (nightly)"
|
||||||
if: github.repository == 'crazywhalecc/static-php-cli'
|
# only run this step if the repository is static-php-cli and the branch is main
|
||||||
|
if: github.repository == 'crazywhalecc/static-php-cli' && github.ref == 'refs/heads/main'
|
||||||
uses: static-php/upload-s3-action@v1.0.0
|
uses: static-php/upload-s3-action@v1.0.0
|
||||||
with:
|
with:
|
||||||
aws_key_id: ${{ secrets.AWS_KEY_ID }}
|
aws_key_id: ${{ secrets.AWS_KEY_ID }}
|
||||||
@@ -126,8 +132,56 @@ jobs:
|
|||||||
destination_dir: static-php-cli/spc-bin/nightly/
|
destination_dir: static-php-cli/spc-bin/nightly/
|
||||||
endpoint: ${{ secrets.AWS_ENDPOINT }}
|
endpoint: ${{ secrets.AWS_ENDPOINT }}
|
||||||
|
|
||||||
|
- name: "Deploy to self-hosted OSS (release)"
|
||||||
|
# only run this step if the repository is static-php-cli and release tag
|
||||||
|
if: github.repository == 'crazywhalecc/static-php-cli' && startsWith(github.ref, 'refs/tags/')
|
||||||
|
uses: static-php/upload-s3-action@v1.0.0
|
||||||
|
with:
|
||||||
|
aws_key_id: ${{ secrets.AWS_KEY_ID }}
|
||||||
|
aws_secret_access_key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
|
||||||
|
aws_bucket: ${{ secrets.AWS_BUCKET }}
|
||||||
|
source_dir: "dist/"
|
||||||
|
destination_dir: static-php-cli/spc-bin/${{ github.event.release.tag_name }}/
|
||||||
|
endpoint: ${{ secrets.AWS_ENDPOINT }}
|
||||||
|
|
||||||
- name: "Upload Artifact"
|
- name: "Upload Artifact"
|
||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
path: spc${{ env.SUFFIX }}
|
path: spc${{ env.SUFFIX }}
|
||||||
name: spc-${{ matrix.operating-system.name }}${{ env.SUFFIX }}
|
name: spc-${{ matrix.operating-system.name }}${{ env.SUFFIX }}
|
||||||
|
test-spc:
|
||||||
|
name: "Test SPC Binary for ${{ matrix.operating-system.name }}"
|
||||||
|
runs-on: ${{ matrix.operating-system.os }}
|
||||||
|
needs: [build-release-artifacts]
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
operating-system:
|
||||||
|
- name: "linux-x86_64"
|
||||||
|
os: "ubuntu-latest"
|
||||||
|
- name: "macos-x86_64"
|
||||||
|
os: "macos-15-intel"
|
||||||
|
- name: "linux-aarch64"
|
||||||
|
os: "ubuntu-24.04-arm"
|
||||||
|
- name: "macos-aarch64"
|
||||||
|
os: "macos-15"
|
||||||
|
- name: "windows-x64"
|
||||||
|
os: "windows-latest"
|
||||||
|
steps:
|
||||||
|
- name: "Checkout"
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: "Download Artifact"
|
||||||
|
uses: actions/download-artifact@v4
|
||||||
|
env:
|
||||||
|
SUFFIX: ${{ matrix.operating-system.name == 'windows-x64' && '.exe' || '' }}
|
||||||
|
with:
|
||||||
|
name: spc-${{ matrix.operating-system.name }}${{ env.SUFFIX }}
|
||||||
|
|
||||||
|
- name: "Chmod"
|
||||||
|
if: matrix.operating-system.name != 'windows-x64'
|
||||||
|
run: chmod +x spc
|
||||||
|
|
||||||
|
- name: "Run SPC Tests"
|
||||||
|
env:
|
||||||
|
SUFFIX: ${{ matrix.operating-system.name == 'windows-x64' && '.exe' || '' }}
|
||||||
|
run: ./spc${{ env.SUFFIX }} dev:extensions
|
||||||
|
|||||||
45
.github/workflows/tests.yml
vendored
45
.github/workflows/tests.yml
vendored
@@ -1,13 +1,9 @@
|
|||||||
name: Tests
|
name: Tests
|
||||||
|
|
||||||
on:
|
on:
|
||||||
push:
|
|
||||||
branches:
|
|
||||||
- main
|
|
||||||
paths:
|
|
||||||
- 'src/globals/test-extensions.php'
|
|
||||||
pull_request:
|
pull_request:
|
||||||
branches: [ "main" ]
|
branches: [ "main" ]
|
||||||
|
types: [ opened, synchronize, reopened ]
|
||||||
paths:
|
paths:
|
||||||
- 'src/**'
|
- 'src/**'
|
||||||
- 'config/**'
|
- 'config/**'
|
||||||
@@ -17,8 +13,7 @@ on:
|
|||||||
- 'box.json'
|
- 'box.json'
|
||||||
- '.php-cs-fixer.php'
|
- '.php-cs-fixer.php'
|
||||||
|
|
||||||
permissions:
|
permissions: read-all
|
||||||
contents: read
|
|
||||||
|
|
||||||
env:
|
env:
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
@@ -40,7 +35,7 @@ jobs:
|
|||||||
tools: pecl, composer, php-cs-fixer
|
tools: pecl, composer, php-cs-fixer
|
||||||
|
|
||||||
- name: Run PHP-CS-Fixer fix
|
- name: Run PHP-CS-Fixer fix
|
||||||
run: PHP_CS_FIXER_IGNORE_ENV=1 php-cs-fixer fix --dry-run --diff --ansi
|
run: php-cs-fixer fix --dry-run --diff --ansi
|
||||||
|
|
||||||
phpstan:
|
phpstan:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
@@ -56,6 +51,8 @@ jobs:
|
|||||||
extensions: curl, openssl, mbstring
|
extensions: curl, openssl, mbstring
|
||||||
ini-values: memory_limit=-1
|
ini-values: memory_limit=-1
|
||||||
tools: composer
|
tools: composer
|
||||||
|
env:
|
||||||
|
phpts: zts
|
||||||
|
|
||||||
- name: "Cache Composer packages"
|
- name: "Cache Composer packages"
|
||||||
id: composer-cache
|
id: composer-cache
|
||||||
@@ -122,6 +119,7 @@ jobs:
|
|||||||
uses: shivammathur/setup-php@v2
|
uses: shivammathur/setup-php@v2
|
||||||
with:
|
with:
|
||||||
php-version: 8.4
|
php-version: 8.4
|
||||||
|
extensions: curl, openssl, mbstring
|
||||||
|
|
||||||
- name: Define
|
- name: Define
|
||||||
id: gendef
|
id: gendef
|
||||||
@@ -135,7 +133,7 @@ jobs:
|
|||||||
build:
|
build:
|
||||||
name: "Build PHP Test (PHP ${{ matrix.php }} ${{ matrix.os }})"
|
name: "Build PHP Test (PHP ${{ matrix.php }} ${{ matrix.os }})"
|
||||||
runs-on: ${{ matrix.os }}
|
runs-on: ${{ matrix.os }}
|
||||||
needs: define-matrix
|
needs: [define-matrix, php-cs-fixer, phpstan, phpunit]
|
||||||
timeout-minutes: 120
|
timeout-minutes: 120
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
@@ -143,6 +141,10 @@ jobs:
|
|||||||
os: ${{ fromJSON(needs.define-matrix.outputs.os) }}
|
os: ${{ fromJSON(needs.define-matrix.outputs.os) }}
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
steps:
|
steps:
|
||||||
|
- name: "Update runner packages"
|
||||||
|
if: ${{ startsWith(matrix.os, 'ubuntu-') }}
|
||||||
|
run: sudo apt-get update && sudo apt-get install -y ca-certificates
|
||||||
|
|
||||||
- name: "Checkout"
|
- name: "Checkout"
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
@@ -173,21 +175,21 @@ jobs:
|
|||||||
key: php-dependencies-${{ matrix.os }}
|
key: php-dependencies-${{ matrix.os }}
|
||||||
|
|
||||||
- name: "Install Dependencies"
|
- name: "Install Dependencies"
|
||||||
run: composer update -q --no-ansi --no-interaction --no-scripts --no-progress --prefer-dist
|
run: composer update -vvv --no-ansi --no-interaction --no-scripts --no-progress --prefer-dist --no-plugins
|
||||||
|
|
||||||
- name: "Run Build Tests (doctor)"
|
- name: "Run Build Tests (doctor)"
|
||||||
run: bin/spc doctor --auto-fix --debug
|
run: php src/globals/test-extensions.php doctor_cmd ${{ matrix.os }} ${{ matrix.php }}
|
||||||
|
|
||||||
- name: "Prepare UPX for Windows"
|
- name: "Prepare UPX for Windows"
|
||||||
if: matrix.os == 'windows-latest'
|
if: ${{ startsWith(matrix.os, 'windows-') }}
|
||||||
run: |
|
run: |
|
||||||
bin/spc install-pkg upx
|
php src/globals/test-extensions.php install_upx_cmd ${{ matrix.os }} ${{ matrix.php }}
|
||||||
echo "UPX_CMD=$(php src/globals/test-extensions.php upx)" >> $env:GITHUB_ENV
|
echo "UPX_CMD=$(php src/globals/test-extensions.php upx)" >> $env:GITHUB_ENV
|
||||||
|
|
||||||
- name: "Prepare UPX for Linux"
|
- name: "Prepare UPX for Linux"
|
||||||
if: matrix.os == 'ubunut-latest'
|
if: ${{ startsWith(matrix.os, 'ubuntu-') }}
|
||||||
run: |
|
run: |
|
||||||
bin/spc install-pkg upx
|
php src/globals/test-extensions.php install_upx_cmd ${{ matrix.os }} ${{ matrix.php }}
|
||||||
echo "UPX_CMD=$(php src/globals/test-extensions.php upx)" >> $GITHUB_ENV
|
echo "UPX_CMD=$(php src/globals/test-extensions.php upx)" >> $GITHUB_ENV
|
||||||
|
|
||||||
- name: "Run Build Tests (download)"
|
- name: "Run Build Tests (download)"
|
||||||
@@ -197,5 +199,16 @@ jobs:
|
|||||||
run: php src/globals/test-extensions.php build_cmd ${{ matrix.os }} ${{ matrix.php }}
|
run: php src/globals/test-extensions.php build_cmd ${{ matrix.os }} ${{ matrix.php }}
|
||||||
|
|
||||||
- name: "Run Build Tests (build - embed for non-windows)"
|
- name: "Run Build Tests (build - embed for non-windows)"
|
||||||
if: matrix.os != 'windows-latest'
|
if: ${{ !startsWith(matrix.os, 'windows-') }}
|
||||||
run: php src/globals/test-extensions.php build_embed_cmd ${{ matrix.os }} ${{ matrix.php }}
|
run: php src/globals/test-extensions.php build_embed_cmd ${{ matrix.os }} ${{ matrix.php }}
|
||||||
|
|
||||||
|
- name: "Upload logs"
|
||||||
|
if: ${{ always() && hashFiles('log/**') != '' }}
|
||||||
|
uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: build-logs-${{ matrix.os }}-${{ matrix.php }}
|
||||||
|
path: log
|
||||||
|
|
||||||
|
# - name: Setup tmate session
|
||||||
|
# if: ${{ failure() }}
|
||||||
|
# uses: mxschmitt/action-tmate@v3
|
||||||
|
|||||||
4
.github/workflows/vitepress-deploy.yml
vendored
4
.github/workflows/vitepress-deploy.yml
vendored
@@ -21,7 +21,6 @@ jobs:
|
|||||||
|
|
||||||
- uses: actions/setup-node@v3
|
- uses: actions/setup-node@v3
|
||||||
with:
|
with:
|
||||||
node-version: 18
|
|
||||||
cache: yarn
|
cache: yarn
|
||||||
|
|
||||||
- run: yarn install --frozen-lockfile
|
- run: yarn install --frozen-lockfile
|
||||||
@@ -32,12 +31,13 @@ jobs:
|
|||||||
cp -r config/* docs/.vitepress/config/
|
cp -r config/* docs/.vitepress/config/
|
||||||
|
|
||||||
- name: "Install PHP for official runners"
|
- name: "Install PHP for official runners"
|
||||||
uses: "shivammathur/setup-php@v2"
|
uses: shivammathur/setup-php@v2
|
||||||
with:
|
with:
|
||||||
coverage: none
|
coverage: none
|
||||||
tools: composer:v2
|
tools: composer:v2
|
||||||
php-version: 8.4
|
php-version: 8.4
|
||||||
ini-values: memory_limit=-1
|
ini-values: memory_limit=-1
|
||||||
|
extensions: curl, openssl, mbstring
|
||||||
|
|
||||||
- name: "Get Composer Cache Directory"
|
- name: "Get Composer Cache Directory"
|
||||||
id: composer-cache
|
id: composer-cache
|
||||||
|
|||||||
32
.gitignore
vendored
32
.gitignore
vendored
@@ -5,22 +5,28 @@ docker/extensions/
|
|||||||
docker/source/
|
docker/source/
|
||||||
|
|
||||||
# Vendor files
|
# Vendor files
|
||||||
/vendor/
|
/vendor/**
|
||||||
|
|
||||||
# default source extract directory
|
# default source extract directory
|
||||||
/source/
|
/source/**
|
||||||
|
|
||||||
|
# built by shared embed tests
|
||||||
|
/locale/
|
||||||
|
|
||||||
# default source download directory
|
# default source download directory
|
||||||
/downloads/
|
/downloads/**
|
||||||
|
|
||||||
# default source build root directory
|
# default source build root directory
|
||||||
/buildroot/
|
/buildroot/**
|
||||||
|
|
||||||
# default package root directory
|
# default package root directory
|
||||||
/pkgroot/
|
/pkgroot/**
|
||||||
|
|
||||||
|
# Windows PHP SDK binary tools
|
||||||
|
/php-sdk-binary-tools/**
|
||||||
|
|
||||||
# default pack:lib and release directory
|
# default pack:lib and release directory
|
||||||
/dist/
|
/dist/**
|
||||||
packlib_files.txt
|
packlib_files.txt
|
||||||
|
|
||||||
# tools cache files
|
# tools cache files
|
||||||
@@ -31,9 +37,7 @@ packlib_files.txt
|
|||||||
/bin/*
|
/bin/*
|
||||||
!/bin/spc*
|
!/bin/spc*
|
||||||
!/bin/setup-runtime*
|
!/bin/setup-runtime*
|
||||||
!/bin/spc-alpine-docker
|
!/bin/docker-entrypoint.sh
|
||||||
!/bin/php-cs-fixer-wrapper
|
|
||||||
!/bin/build-static-frankenphp
|
|
||||||
|
|
||||||
# exclude windows build tools
|
# exclude windows build tools
|
||||||
/php-sdk-binary-tools/
|
/php-sdk-binary-tools/
|
||||||
@@ -47,3 +51,13 @@ packlib_files.txt
|
|||||||
/docs/.vitepress/cache/
|
/docs/.vitepress/cache/
|
||||||
package-lock.json
|
package-lock.json
|
||||||
pnpm-lock.yaml
|
pnpm-lock.yaml
|
||||||
|
|
||||||
|
# craft
|
||||||
|
craft.yml
|
||||||
|
|
||||||
|
# SPC logs
|
||||||
|
log/
|
||||||
|
|
||||||
|
# spc.phar
|
||||||
|
spc.phar
|
||||||
|
spc.exe
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ declare(strict_types=1);
|
|||||||
|
|
||||||
return (new PhpCsFixer\Config())
|
return (new PhpCsFixer\Config())
|
||||||
->setRiskyAllowed(true)
|
->setRiskyAllowed(true)
|
||||||
|
->setUnsupportedPhpVersionAllowed(true)
|
||||||
->setRules([
|
->setRules([
|
||||||
'@PSR12' => true,
|
'@PSR12' => true,
|
||||||
'@Symfony' => true,
|
'@Symfony' => true,
|
||||||
@@ -69,4 +70,5 @@ return (new PhpCsFixer\Config())
|
|||||||
])
|
])
|
||||||
->setFinder(
|
->setFinder(
|
||||||
PhpCsFixer\Finder::create()->in([__DIR__ . '/src', __DIR__ . '/tests/SPC'])
|
PhpCsFixer\Finder::create()->in([__DIR__ . '/src', __DIR__ . '/tests/SPC'])
|
||||||
);
|
)
|
||||||
|
->setParallelConfig(PhpCsFixer\Runner\Parallel\ParallelConfigFactory::detect());
|
||||||
|
|||||||
346
README-zh.md
346
README-zh.md
@@ -5,302 +5,168 @@
|
|||||||
[](https://github.com/crazywhalecc/static-php-cli/releases)
|
[](https://github.com/crazywhalecc/static-php-cli/releases)
|
||||||
[](https://github.com/crazywhalecc/static-php-cli/actions/workflows/tests.yml)
|
[](https://github.com/crazywhalecc/static-php-cli/actions/workflows/tests.yml)
|
||||||
[](https://github.com/crazywhalecc/static-php-cli/blob/main/LICENSE)
|
[](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 运行时的强大工具,支持众多流行扩展。
|
||||||
|
|
||||||
目前 static-php-cli 支持 `cli`、`fpm`、`embed` 和 `micro` SAPI。
|
|
||||||
|
|
||||||
**static-php-cli**也支持将 PHP 代码和 PHP 运行时打包为一个文件并运行。
|
|
||||||
|
|
||||||
## 特性
|
## 特性
|
||||||
|
|
||||||
static-php-cli(简称 `spc`)有许多特性:
|
- :elephant: **支持多 PHP 版本** - 支持 PHP 8.1, 8.2, 8.3, 8.4, 8.5
|
||||||
|
- :handbag: **单文件 PHP 可执行文件** - 构建零依赖的独立 PHP
|
||||||
|
- :hamburger: **phpmicro 集成** - 构建 **[phpmicro](https://github.com/dixyes/phpmicro)** 自解压可执行文件(将 PHP 二进制文件和源代码合并为一个文件)
|
||||||
|
- :pill: **智能环境检查器** - 自动构建环境检查器,具备自动修复功能
|
||||||
|
- :zap: **跨平台支持** - 支持 Linux、macOS、FreeBSD 和 Windows
|
||||||
|
- :wrench: **可配置补丁** - 可自定义的源代码补丁系统
|
||||||
|
- :books: **智能依赖管理** - 自动处理构建依赖
|
||||||
|
- 📦 **自包含工具** - 提供使用 [box](https://github.com/box-project/box) 构建的 `spc` 可执行文件
|
||||||
|
- :fire: **广泛的扩展支持** - 支持 75+ 流行 [扩展](https://static-php.dev/zh/guide/extensions.html)
|
||||||
|
- :floppy_disk: **UPX 压缩** - 减小二进制文件大小 30-50%(仅 Linux/Windows)
|
||||||
|
|
||||||
- :handbag: 构建独立的单文件 PHP 解释器,无需任何依赖
|
**单文件独立 php-cli:**
|
||||||
- :hamburger: 构建 **[phpmicro](https://github.com/dixyes/phpmicro)** 自执行二进制(将 PHP 代码和 PHP 解释器打包为一个文件)
|
|
||||||
- :pill: 提供一键检查和修复编译环境的 Doctor 模块
|
|
||||||
- :zap: 支持多个系统:`Linux`、`macOS`、`FreeBSD`、`Windows`
|
|
||||||
- :wrench: 高度自定义的代码 patch 功能
|
|
||||||
- :books: 自带编译依赖管理
|
|
||||||
- 📦 提供由自身编译的独立 `spc` 二进制(使用 spc 和 [box](https://github.com/box-project/box) 构建)
|
|
||||||
- :fire: 支持大量 [扩展](https://static-php.dev/zh/guide/extensions.html)
|
|
||||||
- :floppy_disk: 整合 UPX 工具(减小二进制文件体积)
|
|
||||||
|
|
||||||
**静态 php-cli:**
|
|
||||||
|
|
||||||
<img width="700" alt="out1" src="https://github.com/crazywhalecc/static-php-cli/assets/20330940/01a2e60f-13b0-4242-a645-f7afa4936396">
|
<img width="700" alt="out1" src="https://github.com/crazywhalecc/static-php-cli/assets/20330940/01a2e60f-13b0-4242-a645-f7afa4936396">
|
||||||
|
|
||||||
**使用 phpmicro 打包 PHP 代码:**
|
**使用 phpmicro 将 PHP 代码与 PHP 解释器结合:**
|
||||||
|
|
||||||
<img width="700" alt="out2" src="https://github.com/crazywhalecc/static-php-cli/assets/20330940/46b7128d-fb72-4169-957e-48564c3ff3e2">
|
<img width="700" alt="out2" src="https://github.com/crazywhalecc/static-php-cli/assets/20330940/46b7128d-fb72-4169-957e-48564c3ff3e2">
|
||||||
|
|
||||||
## 文档
|
## 快速开始
|
||||||
|
|
||||||
目前 README 编写了基本用法。有关 static-php-cli 所有的功能,请点击这里查看文档:<https://static-php.dev>。
|
### 1. 下载 spc 二进制文件
|
||||||
|
|
||||||
## 直接下载
|
|
||||||
|
|
||||||
如果你不想自行编译 PHP,可以从本项目现有的示例 Action 下载 Artifact,也可以从自托管的服务器下载。
|
|
||||||
|
|
||||||
| 组合名称 | 组合扩展数 | 系统 | 备注 |
|
|
||||||
|---------------------------------------------------------------------|----------------------------------------------------------------------------|-------------|--------------|
|
|
||||||
| [common](https://dl.static-php.dev/static-php-cli/common/) | [30+](https://dl.static-php.dev/static-php-cli/common/README.txt) | Linux/macOS | 体积为 7.5MB 左右 |
|
|
||||||
| [bulk](https://dl.static-php.dev/static-php-cli/bulk/) | [50+](https://dl.static-php.dev/static-php-cli/bulk/README.txt) | Linux/macOS | 体积为 25MB 左右 |
|
|
||||||
| [minimal](https://dl.static-php.dev/static-php-cli/minimal/) | [5](https://dl.static-php.dev/static-php-cli/minimal/README.txt) | Linux/macOS | 体积为 3MB 左右 |
|
|
||||||
| [spc-min](https://dl.static-php.dev/static-php-cli/windows/spc-min) | [5](https://dl.static-php.dev/static-php-cli/windows/spc-min/README.txt) | Windows | 体积为 3MB 左右 |
|
|
||||||
| [spc-max](https://dl.static-php.dev/static-php-cli/windows/spc-max) | [40+](https://dl.static-php.dev/static-php-cli/windows/spc-max/README.txt) | Windows | 体积为 8.5MB 左右 |
|
|
||||||
|
|
||||||
> Linux 和 Windows 默认启用了 UPX 压缩,可减小 30~50% 的 PHP 二进制体积。
|
|
||||||
> macOS 当前不支持 UPX,所以上述预编译的 macOS 版本体积可能较大。
|
|
||||||
|
|
||||||
## 使用 static-php-cli 构建 PHP
|
|
||||||
|
|
||||||
### 编译环境需求
|
|
||||||
|
|
||||||
- PHP >= 8.4(这是 spc 自身需要的版本,不是支持的构建版本)
|
|
||||||
- 扩展:`mbstring,tokenizer,phar`
|
|
||||||
- 系统安装了 `curl` 和 `git`
|
|
||||||
|
|
||||||
是的,本项目采用 PHP 编写,编译前需要一个 PHP 环境,比较滑稽。
|
|
||||||
但本项目默认可通过自身构建的 micro 和 static-php 二进制运行,其他只需要包含上面提到的扩展和 PHP 版本大于等于 8.1 即可。
|
|
||||||
|
|
||||||
下面是架构支持情况,:octocat: 代表支持 GitHub Action 构建,:computer: 代表支持本地构建,空 代表暂不支持。
|
|
||||||
|
|
||||||
| | x86_64 | aarch64 |
|
|
||||||
|---------|----------------------|----------------------|
|
|
||||||
| macOS | :octocat: :computer: | :octocat: :computer: |
|
|
||||||
| Linux | :octocat: :computer: | :octocat: :computer: |
|
|
||||||
| Windows | :octocat: :computer: | |
|
|
||||||
| FreeBSD | :computer: | :computer: |
|
|
||||||
|
|
||||||
当前支持编译的 PHP 版本:
|
|
||||||
|
|
||||||
> :warning: 支持,但 static-php-cli 作者可能不再提供补丁修复
|
|
||||||
>
|
|
||||||
> :heavy_check_mark: 支持
|
|
||||||
>
|
|
||||||
> :x: 不支持
|
|
||||||
|
|
||||||
| PHP Version | Status | Comment |
|
|
||||||
|-------------|--------------------|----------------------------------------------|
|
|
||||||
| 7.2 | :x: | |
|
|
||||||
| 7.3 | :x: | phpmicro 和许多扩展不支持 7.3、7.4 版本 |
|
|
||||||
| 7.4 | :x: | phpmicro 和许多扩展不支持 7.3、7.4 版本 |
|
|
||||||
| 8.0 | :warning: | PHP 官方已停止 8.0 的维护,我们不再处理 8.0 相关的 backport 支持 |
|
|
||||||
| 8.1 | :heavy_check_mark: | PHP 官方仅对 8.1 提供安全更新 |
|
|
||||||
| 8.2 | :heavy_check_mark: | |
|
|
||||||
| 8.3 | :heavy_check_mark: | |
|
|
||||||
| 8.4 | :heavy_check_mark: | |
|
|
||||||
|
|
||||||
> 这个表格的支持状态是 static-php-cli 对构建对应版本的支持情况,不是 PHP 官方对该版本的支持情况。
|
|
||||||
|
|
||||||
### 支持的扩展
|
|
||||||
|
|
||||||
请先根据下方扩展列表选择你要编译的扩展。
|
|
||||||
|
|
||||||
- [扩展支持列表](https://static-php.dev/zh/guide/extensions.html)
|
|
||||||
- [编译命令生成器](https://static-php.dev/zh/guide/cli-generator.html)
|
|
||||||
|
|
||||||
> 如果这里没有你需要的扩展,可以提交 Issue。
|
|
||||||
|
|
||||||
### 在线构建(使用 GitHub Actions)
|
|
||||||
|
|
||||||
使用 GitHub Action 可以方便地构建一个静态编译的 PHP,同时可以自行定义要编译的扩展。
|
|
||||||
|
|
||||||
1. Fork 本项目。
|
|
||||||
2. 进入项目的 Actions,选择 CI。
|
|
||||||
3. 选择 `Run workflow`,填入你要编译的 PHP 版本、目标类型、扩展列表。(扩展列表使用英文逗号分割,例如 `bcmath,curl,mbstring`)
|
|
||||||
4. 等待大约一段时间后,进入对应的任务中,获取 `Artifacts`。
|
|
||||||
|
|
||||||
如果你选择了 `debug`,则会在构建时输出所有日志,包括编译的日志,以供排查错误。
|
|
||||||
|
|
||||||
### 本地构建(使用 spc 二进制,推荐)
|
|
||||||
|
|
||||||
该项目提供了 static-php-cli 的二进制文件:`spc`。
|
|
||||||
您可以使用 `spc` 二进制文件,无需安装任何运行时(用起来就像 golang 程序)。
|
|
||||||
目前,`spc` 二进制文件提供的平台有 Linux 和 macOS。
|
|
||||||
|
|
||||||
使用以下命令从自托管服务器下载:
|
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Download from self-hosted nightly builds (sync with main branch)
|
# Linux x86_64
|
||||||
# For Linux x86_64
|
|
||||||
curl -fsSL -o spc https://dl.static-php.dev/static-php-cli/spc-bin/nightly/spc-linux-x86_64
|
curl -fsSL -o spc https://dl.static-php.dev/static-php-cli/spc-bin/nightly/spc-linux-x86_64
|
||||||
# For Linux aarch64
|
# Linux aarch64
|
||||||
curl -fsSL -o spc https://dl.static-php.dev/static-php-cli/spc-bin/nightly/spc-linux-aarch64
|
curl -fsSL -o spc https://dl.static-php.dev/static-php-cli/spc-bin/nightly/spc-linux-aarch64
|
||||||
# macOS x86_64 (Intel)
|
# macOS x86_64 (Intel)
|
||||||
curl -fsSL -o spc https://dl.static-php.dev/static-php-cli/spc-bin/nightly/spc-macos-x86_64
|
curl -fsSL -o spc https://dl.static-php.dev/static-php-cli/spc-bin/nightly/spc-macos-x86_64
|
||||||
# macOS aarch64 (Apple)
|
# macOS aarch64 (Apple)
|
||||||
curl -fsSL -o spc https://dl.static-php.dev/static-php-cli/spc-bin/nightly/spc-macos-aarch64
|
curl -fsSL -o spc https://dl.static-php.dev/static-php-cli/spc-bin/nightly/spc-macos-aarch64
|
||||||
# Windows (x86_64, win10 build 17063 or later)
|
# Windows (x86_64, win10 build 17063 或更高版本,请先安装 VS2022)
|
||||||
curl.exe -fsSL -o spc.exe https://dl.static-php.dev/static-php-cli/spc-bin/nightly/spc-windows-x64.exe
|
curl.exe -fsSL -o spc.exe https://dl.static-php.dev/static-php-cli/spc-bin/nightly/spc-windows-x64.exe
|
||||||
|
```
|
||||||
|
|
||||||
# Add execute perm (Linux and macOS only)
|
对于 macOS 和 Linux,请先添加执行权限:
|
||||||
|
|
||||||
|
```bash
|
||||||
chmod +x ./spc
|
chmod +x ./spc
|
||||||
|
|
||||||
# Run (Linux and macOS)
|
|
||||||
./spc --version
|
|
||||||
# Run (Windows powershell)
|
|
||||||
.\spc.exe --version
|
|
||||||
```
|
```
|
||||||
|
|
||||||
自托管 `spc` 由 GitHub Actions 构建,你也可以从 Actions 直接下载:[此处](https://github.com/crazywhalecc/static-php-cli/actions/workflows/release-build.yml)。
|
### 2. 构建静态 PHP
|
||||||
|
|
||||||
### 本地构建(使用 git 源码)
|
首先,创建一个 `craft.yml` 文件,并从 [扩展列表](https://static-php.dev/zh/guide/extensions.html) 或 [命令生成器](https://static-php.dev/zh/guide/cli-generator.html) 中指定要包含的扩展:
|
||||||
|
|
||||||
如果你需要修改 static-php-cli 源码,或者使用 spc 二进制构建有问题,你可以使用 git 源码下载 static-php-cli。
|
```yml
|
||||||
|
# PHP 版本支持:8.1, 8.2, 8.3, 8.4, 8.5
|
||||||
|
php-version: 8.4
|
||||||
|
# 在此处放置您的扩展列表
|
||||||
|
extensions: "apcu,bcmath,calendar,ctype,curl,dba,dom,exif,fileinfo,filter,gd,iconv,mbregex,mbstring,mysqli,mysqlnd,opcache,openssl,pcntl,pdo,pdo_mysql,pdo_sqlite,phar,posix,readline,redis,session,simplexml,sockets,sodium,sqlite3,tokenizer,xml,xmlreader,xmlwriter,xsl,zip,zlib"
|
||||||
|
sapi:
|
||||||
|
- cli
|
||||||
|
- micro
|
||||||
|
- fpm
|
||||||
|
download-options:
|
||||||
|
prefer-pre-built: true
|
||||||
|
```
|
||||||
|
|
||||||
|
运行命令:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# clone 仓库即可
|
./spc craft
|
||||||
git clone https://github.com/crazywhalecc/static-php-cli.git
|
|
||||||
|
# 输出完整控制台日志
|
||||||
|
./spc craft --debug
|
||||||
```
|
```
|
||||||
|
|
||||||
如果您的系统上尚未安装 php,我们建议你使用内置的 setup-runtime 自动安装 PHP 和 Composer。
|
### 3. 静态 PHP 使用
|
||||||
|
|
||||||
```bash
|
现在您可以将 static-php-cli 构建的二进制文件复制到另一台机器上,无需依赖即可运行:
|
||||||
cd static-php-cli
|
|
||||||
chmod +x bin/setup-runtime
|
```
|
||||||
# it will download static php (from self-hosted server) and composer (from getcomposer)
|
# php-cli
|
||||||
bin/setup-runtime
|
buildroot/bin/php -v
|
||||||
# initialize composer deps
|
|
||||||
bin/composer install
|
# phpmicro
|
||||||
# chmod
|
echo '<?php echo "Hello world!\n";' > a.php
|
||||||
chmod +x bin/spc
|
./spc micro:combine a.php -O my-app
|
||||||
bin/spc --version
|
./my-app
|
||||||
|
|
||||||
|
# php-fpm
|
||||||
|
buildroot/bin/php-fpm -v
|
||||||
```
|
```
|
||||||
|
|
||||||
### 开始构建 PHP
|
## 文档
|
||||||
|
|
||||||
下面是使用 static-php-cli 的基础用法:
|
当前 README 包含基本用法。有关 static-php-cli 的所有功能,
|
||||||
|
请访问 <https://static-php.dev>。
|
||||||
|
|
||||||
> 如果你使用的是打包好的 `spc` 二进制,你需要将下列命令的 `./bin/spc` 替换为 `./spc`。
|
## 直接下载
|
||||||
|
|
||||||
```bash
|
如果您不想构建或想先测试,可以从 [Actions](https://github.com/static-php/static-php-cli-hosted/actions/workflows/build-php-bulk.yml) 下载示例预编译工件,或从自托管服务器下载。
|
||||||
# 检查环境依赖,并根据尝试自动安装缺失的编译工具
|
|
||||||
./bin/spc doctor --auto-fix
|
|
||||||
|
|
||||||
# 输出目标项目依赖的扩展列表
|
以下是几个具有不同扩展组合的预编译静态 PHP 二进制文件,
|
||||||
./bin/spc dump-extensions /path/to/your/project --format=text
|
您可以根据需要直接下载。
|
||||||
|
|
||||||
# 拉取所有依赖库
|
| 组合名称 | 扩展数量 | 系统 | 备注 |
|
||||||
./bin/spc download --all
|
|----------------------------------------------------------------------|----------------------------------------------------------------------------|--------------|--------------------|
|
||||||
# 只拉取编译指定扩展需要的所有依赖(推荐)
|
| [common](https://dl.static-php.dev/static-php-cli/common/) | [30+](https://dl.static-php.dev/static-php-cli/common/README.txt) | Linux, macOS | 二进制文件大小约为 7.5MB |
|
||||||
./bin/spc download --for-extensions="openssl,pcntl,mbstring,pdo_sqlite"
|
| [bulk](https://dl.static-php.dev/static-php-cli/bulk/) | [50+](https://dl.static-php.dev/static-php-cli/bulk/README.txt) | Linux, macOS | 二进制文件大小约为 25MB |
|
||||||
# 下载依赖时,优先下载有预编译的库(节省编译依赖的时间)
|
| [gnu-bulk](https://dl.static-php.dev/static-php-cli/gnu-bulk/) | [50+](https://dl.static-php.dev/static-php-cli/bulk/README.txt) | Linux, macOS | 使用 glibc 的 bulk 组合 |
|
||||||
./bin/spc download --for-extensions="openssl,curl,mbstring,mbregex" --prefer-pre-built
|
| [minimal](https://dl.static-php.dev/static-php-cli/minimal/) | [5](https://dl.static-php.dev/static-php-cli/minimal/README.txt) | Linux, macOS | 二进制文件大小约为 3MB |
|
||||||
# 下载编译不同版本的 PHP (--with-php=x.y 或 --with-php=x.y.z,推荐 8.1 ~ 8.3)
|
| [spc-min](https://dl.static-php.dev/static-php-cli/windows/spc-min/) | [5](https://dl.static-php.dev/static-php-cli/windows/spc-min/README.txt) | Windows | 二进制文件大小约为 3MB |
|
||||||
./bin/spc download --for-extensions="openssl,curl,mbstring" --with-php=8.1
|
| [spc-max](https://dl.static-php.dev/static-php-cli/windows/spc-max/) | [40+](https://dl.static-php.dev/static-php-cli/windows/spc-max/README.txt) | Windows | 二进制文件大小约为 8.5MB |
|
||||||
|
|
||||||
# 构建包含 bcmath,openssl,tokenizer,sqlite3,pdo_sqlite,ftp,curl 扩展的 php-cli 和 micro.sfx
|
> Linux 和 Windows 支持对二进制文件进行 UPX 压缩,可以将二进制文件大小减少 30% 到 50%。
|
||||||
./bin/spc build "bcmath,openssl,tokenizer,sqlite3,pdo_sqlite,ftp,curl" --build-cli --build-micro
|
> macOS 不支持 UPX 压缩,因此 mac 的预构建二进制文件大小较大。
|
||||||
# 编译线程安全版本 (--enable-zts)
|
|
||||||
./bin/spc build "curl,phar" --enable-zts --build-cli
|
|
||||||
# 编译后使用 UPX 减小可执行文件体积 (仅 Linux、Windows 可用) (至少压缩至原来的 30~50%)
|
|
||||||
./bin/spc build "curl,phar" --enable-zts --build-cli --with-upx-pack
|
|
||||||
```
|
|
||||||
|
|
||||||
其中,目前支持构建 cli,micro,fpm 和 embed,使用以下参数的一个或多个来指定编译的 SAPI:
|
### 在线构建(使用 GitHub Actions)
|
||||||
|
|
||||||
- `--build-cli`:构建 cli 二进制
|
上方直接下载的二进制不能满足需求时,可使用 GitHub Action 可以轻松构建静态编译的 PHP,
|
||||||
- `--build-micro`:构建 phpmicro 自执行二进制
|
同时自行定义要编译的扩展。
|
||||||
- `--build-fpm`:构建 fpm
|
|
||||||
- `--build-embed`:构建 embed(libphp)
|
|
||||||
- `--build-all`:构建所有
|
|
||||||
|
|
||||||
如果出现了任何错误,可以使用 `--debug` 参数来展示完整的输出日志,以供排查错误:
|
1. Fork 本项目。
|
||||||
|
2. 进入项目的 Actions 并选择 `CI`。
|
||||||
|
3. 选择 `Run workflow`,填入您要编译的 PHP 版本、目标类型和扩展列表。(扩展用逗号分隔,例如 `bcmath,curl,mbstring`)
|
||||||
|
4. 等待一段时间后,进入相应的任务并获取 `Artifacts`。
|
||||||
|
|
||||||
```bash
|
如果您启用 `debug`,构建时将输出所有日志,包括编译日志,以便故障排除。
|
||||||
./bin/spc build "openssl,pcntl,mbstring" --debug --build-all
|
|
||||||
./bin/spc download --all --debug
|
|
||||||
```
|
|
||||||
|
|
||||||
## 不同 SAPI 的使用
|
|
||||||
|
|
||||||
### 使用 cli
|
|
||||||
|
|
||||||
> php-cli 是一个静态的二进制文件,类似 Go、Rust 语言编译后的单个可移植的二进制文件。
|
|
||||||
|
|
||||||
采用参数 `--build-cli` 或`--build-all` 参数时,最后编译结果会输出一个 `./php` 的二进制文件,此文件可分发、可直接使用。
|
|
||||||
该文件编译后会存放在 `buildroot/bin/` 目录中,名称为 `php`,拷贝出来即可。
|
|
||||||
|
|
||||||
```bash
|
|
||||||
cd buildroot/bin/
|
|
||||||
./php -v # 检查版本
|
|
||||||
./php -m # 检查编译的扩展
|
|
||||||
./php your_code.php # 运行代码
|
|
||||||
./php your_project.phar # 运行打包为 phar 单文件的项目
|
|
||||||
```
|
|
||||||
|
|
||||||
### 使用 micro
|
|
||||||
|
|
||||||
> phpmicro 是一个提供自执行二进制 PHP 的项目,本项目依赖 phpmicro 进行编译自执行二进制。详见 [dixyes/phpmicro](https://github.com/dixyes/phpmicro)。
|
|
||||||
|
|
||||||
采用项目参数 `--build-micro` 或 `--build-all` 时,最后编译结果会输出一个 `./micro.sfx` 的文件,此文件需要配合你的 PHP 源码使用。
|
|
||||||
该文件编译后会存放在 `buildroot/bin/` 目录中,拷贝出来即可。
|
|
||||||
|
|
||||||
使用时应准备好你的项目源码文件,可以是单个 PHP 文件,也可以是 Phar 文件。
|
|
||||||
|
|
||||||
```bash
|
|
||||||
echo "<?php echo 'Hello world' . PHP_EOL;" > code.php
|
|
||||||
cat micro.sfx code.php > single-app && chmod +x single-app
|
|
||||||
./single-app
|
|
||||||
```
|
|
||||||
|
|
||||||
如果打包 PHAR 文件,仅需把 code.php 更换为 phar 文件路径即可。
|
|
||||||
你可以使用 [box-project/box](https://github.com/box-project/box) 将你的 CLI 项目打包为 Phar,
|
|
||||||
然后将它与 phpmicro 结合,生成独立可执行的二进制文件。
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# 使用 static-php-cli 生成的 micro.sfx 结合,也可以直接使用 cat 命令结合它们
|
|
||||||
bin/spc micro:combine my-app.phar
|
|
||||||
cat buildroot/bin/micro.sfx my-app.phar > my-app && chmod +x my-app
|
|
||||||
|
|
||||||
# 使用 micro:combine 结合可以将 INI 选项注入到二进制中
|
|
||||||
bin/spc micro:combine my-app.phar -I "memory_limit=4G" -I "disable_functions=system" --output my-app-2
|
|
||||||
```
|
|
||||||
|
|
||||||
> 有些情况下的 phar 文件或 PHP 项目可能无法在 micro 环境下运行。
|
|
||||||
|
|
||||||
### 使用 fpm
|
|
||||||
|
|
||||||
采用项目参数 `--build-fpm` 或 `--build-all` 时,最后编译结果会输出一个 `./php-fpm` 的文件。
|
|
||||||
该文件存放在 `buildroot/bin/` 目录,拷贝出来即可使用。
|
|
||||||
|
|
||||||
在正常的 Linux 发行版和 macOS 系统中,安装 php-fpm 后包管理会自动生成默认的 fpm 配置文件。
|
|
||||||
因为 php-fpm 必须指定配置文件才可启动,本项目编译的 php-fpm 不会带任何配置文件,所以需自行编写 `php-fpm.conf` 和 `pool.conf` 配置文件。
|
|
||||||
|
|
||||||
指定 `php-fpm.conf` 可以使用命令参数 `-y`,例如:`./php-fpm -y php-fpm.conf`。
|
|
||||||
|
|
||||||
### 使用 embed
|
|
||||||
|
|
||||||
采用项目参数 `--build-embed` 或 `--build-all` 时,最后编译结果会输出一个 `libphp.a`、`php-config` 以及一系列头文件,存放在 `buildroot/`,你可以在你的其他代码中引入它们。
|
|
||||||
|
|
||||||
如果你知道 [embed SAPI](https://github.com/php/php-src/tree/master/sapi/embed),你应该知道如何使用它。对于有可能编译用到引入其他库的问题,你可以使用 `buildroot/bin/php-config` 来获取编译时的配置。
|
|
||||||
|
|
||||||
另外,有关如何使用此功能的高级示例,请查看[如何使用它构建 FrankenPHP 的静态版本](https://github.com/dunglas/frankenphp/blob/main/docs/static.md)。
|
|
||||||
|
|
||||||
## 贡献
|
## 贡献
|
||||||
|
|
||||||
如果缺少你需要的扩展,可发起 Issue。如果你对本项目较熟悉,也欢迎为本项目发起 Pull Request。
|
如果您需要的扩展缺失,可以创建 issue。
|
||||||
|
如果您熟悉本项目,也欢迎发起 pull request。
|
||||||
|
|
||||||
另外,添加新扩展的贡献方式,可以参考下方 `进阶`。
|
如果您想贡献文档,请直接编辑 `docs/` 目录。
|
||||||
|
|
||||||
如果你想贡献文档内容,请直接修改 `docs/` 目录。
|
现在有一个 [static-php](https://github.com/static-php) 组织,用于存储与项目相关的仓库。
|
||||||
|
|
||||||
## 赞助本项目
|
## 赞助本项目
|
||||||
|
|
||||||
你可以在 [我的个人赞助页](https://github.com/crazywhalecc/crazywhalecc/blob/master/FUNDING.md) 支持我和我的项目。你捐赠的一部分将会被用于维护 **static-php.dev** 服务器。
|
您可以从 [GitHub Sponsor](https://github.com/crazywhalecc) 赞助我或我的项目。您捐赠的一部分将用于维护 **static-php.dev** 服务器。
|
||||||
|
|
||||||
## 开源协议
|
**特别感谢以下赞助商**:
|
||||||
|
|
||||||
本项目采用 MIT License 许可开源,下面是类似的项目:
|
<a href="https://beyondco.de/"><img src="/docs/public/images/beyondcode-seeklogo.png" width="300" alt="Beyond Code Logo" /></a>
|
||||||
|
|
||||||
|
<a href="https://nativephp.com/"><img src="/docs/public/images/nativephp-logo.svg" width="300" alt="NativePHP Logo" /></a>
|
||||||
|
|
||||||
|
## 开源许可证
|
||||||
|
|
||||||
|
本项目本身基于 MIT 许可证,
|
||||||
|
一些新添加的扩展和依赖可能来自其他项目,
|
||||||
|
这些代码文件的头部也会给出额外的许可证和作者说明。
|
||||||
|
|
||||||
|
这些是类似的项目:
|
||||||
|
|
||||||
- [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)
|
||||||
|
|
||||||
该项目使用了 [dixyes/lwmbs](https://github.com/dixyes/lwmbs) 中的一些代码,例如 Windows 静态构建目标和 libiconv 库支持。
|
本项目使用了 [dixyes/lwmbs](https://github.com/dixyes/lwmbs) 的一些代码,例如 Windows 静态构建目标和 libiconv 支持。
|
||||||
lwmbs 使用 [Mulan PSL 2](http://license.coscl.org.cn/MulanPSL2) 许可进行分发。对应文件有关于作者和许可的特殊说明,除此之外,均使用 MIT 授权许可。
|
lwmbs 基于 [Mulan PSL 2](http://license.coscl.org.cn/MulanPSL2) 许可证。
|
||||||
|
|
||||||
因本项目的特殊性,使用项目编译过程中会使用很多其他开源项目,例如 curl、protobuf 等,它们都有各自的开源协议。
|
由于本项目的特殊性,
|
||||||
请在编译完成后,使用命令 `bin/spc dump-license` 导出项目使用项目的开源协议,并遵守对应项目的 LICENSE。
|
项目编译过程中会使用许多其他开源项目,如 curl 和 protobuf,
|
||||||
|
它们都有自己的开源许可证。
|
||||||
|
|
||||||
|
请在编译后使用 `bin/spc dump-license` 命令导出项目中使用的开源许可证,
|
||||||
|
并遵守相应项目的 LICENSE。
|
||||||
|
|||||||
333
README.md
333
README.md
@@ -5,29 +5,22 @@
|
|||||||
[](https://github.com/crazywhalecc/static-php-cli/releases)
|
[](https://github.com/crazywhalecc/static-php-cli/releases)
|
||||||
[](https://github.com/crazywhalecc/static-php-cli/actions/workflows/tests.yml)
|
[](https://github.com/crazywhalecc/static-php-cli/actions/workflows/tests.yml)
|
||||||
[](https://github.com/crazywhalecc/static-php-cli/blob/main/LICENSE)
|
[](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.
|
||||||
|
|
||||||
Static PHP built by **static-php-cli** supports `cli`, `fpm`, `embed` and `micro` SAPI.
|
|
||||||
|
|
||||||
**static-php-cli** also has the ability to package PHP projects
|
|
||||||
along with the PHP interpreter into one single executable file.
|
|
||||||
|
|
||||||
## Features
|
## Features
|
||||||
|
|
||||||
static-php-cli (you can call it `spc`) has a lot of features:
|
- :elephant: Support multiple PHP versions - PHP 8.1, 8.2, 8.3, 8.4, 8.5
|
||||||
|
- :handbag: Build single-file PHP executable with zero dependencies
|
||||||
- :handbag: Build single-file php executable, without any dependencies
|
- :hamburger:Build **[phpmicro](https://github.com/dixyes/phpmicro)** self-extracting executables (combines PHP binary and 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 with auto-fix capabilities
|
||||||
- :pill: Automatic build environment checker (Doctor module)
|
|
||||||
- :zap: `Linux`, `macOS`, `FreeBSD`, `Windows` support
|
- :zap: `Linux`, `macOS`, `FreeBSD`, `Windows` support
|
||||||
- :wrench: Configurable source code patches
|
- :wrench: Configurable source code patching
|
||||||
- :books: Build dependency management
|
- :books: Intelligent dependency management
|
||||||
- 📦 Provide `spc` own standalone executable (built by spc and [box](https://github.com/box-project/box))
|
- 📦 Self-contained `spc` executable (built with [box](https://github.com/box-project/box))
|
||||||
- :fire: Support many popular [extensions](https://static-php.dev/en/guide/extensions.html)
|
- :fire: Support 100+ popular [extensions](https://static-php.dev/en/guide/extensions.html)
|
||||||
- :floppy_disk: UPX integration (significantly reduces binary size)
|
- :floppy_disk: UPX compression support (reduces binary size by 30-50%)
|
||||||
|
|
||||||
**Single-file standalone php-cli:**
|
**Single-file standalone php-cli:**
|
||||||
|
|
||||||
@@ -37,6 +30,72 @@ static-php-cli (you can call it `spc`) has a lot of features:
|
|||||||
|
|
||||||
<img width="700" alt="out2" src="https://github.com/crazywhalecc/static-php-cli/assets/20330940/46b7128d-fb72-4169-957e-48564c3ff3e2">
|
<img width="700" alt="out2" src="https://github.com/crazywhalecc/static-php-cli/assets/20330940/46b7128d-fb72-4169-957e-48564c3ff3e2">
|
||||||
|
|
||||||
|
## Quickstart
|
||||||
|
|
||||||
|
### 1. Download spc binary
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# For Linux x86_64
|
||||||
|
curl -fsSL -o spc https://dl.static-php.dev/static-php-cli/spc-bin/nightly/spc-linux-x86_64
|
||||||
|
# For Linux aarch64
|
||||||
|
curl -fsSL -o spc https://dl.static-php.dev/static-php-cli/spc-bin/nightly/spc-linux-aarch64
|
||||||
|
# macOS x86_64 (Intel)
|
||||||
|
curl -fsSL -o spc https://dl.static-php.dev/static-php-cli/spc-bin/nightly/spc-macos-x86_64
|
||||||
|
# macOS aarch64 (Apple)
|
||||||
|
curl -fsSL -o spc https://dl.static-php.dev/static-php-cli/spc-bin/nightly/spc-macos-aarch64
|
||||||
|
# Windows (x86_64, win10 build 17063 or later, please install VS2022 first)
|
||||||
|
curl.exe -fsSL -o spc.exe https://dl.static-php.dev/static-php-cli/spc-bin/nightly/spc-windows-x64.exe
|
||||||
|
```
|
||||||
|
|
||||||
|
For macOS and Linux, add execute permission first:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
chmod +x ./spc
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. Build Static PHP
|
||||||
|
|
||||||
|
First, create a `craft.yml` file and specify which extensions you want to include from [extension list](https://static-php.dev/en/guide/extensions.html) or [command generator](https://static-php.dev/en/guide/cli-generator.html):
|
||||||
|
|
||||||
|
```yml
|
||||||
|
# PHP version support: 8.1, 8.2, 8.3, 8.4, 8.5
|
||||||
|
php-version: 8.4
|
||||||
|
# Put your extension list here
|
||||||
|
extensions: "apcu,bcmath,calendar,ctype,curl,dba,dom,exif,fileinfo,filter,gd,iconv,mbregex,mbstring,mysqli,mysqlnd,opcache,openssl,pcntl,pdo,pdo_mysql,pdo_sqlite,phar,posix,readline,redis,session,simplexml,sockets,sodium,sqlite3,tokenizer,xml,xmlreader,xmlwriter,xsl,zip,zlib"
|
||||||
|
sapi:
|
||||||
|
- cli
|
||||||
|
- micro
|
||||||
|
- fpm
|
||||||
|
download-options:
|
||||||
|
prefer-pre-built: true
|
||||||
|
```
|
||||||
|
|
||||||
|
Run command:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
./spc craft
|
||||||
|
|
||||||
|
# Output full console log
|
||||||
|
./spc craft --debug
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. Static PHP usage
|
||||||
|
|
||||||
|
Now you can copy binaries built by static-php-cli to another machine and run with no dependencies:
|
||||||
|
|
||||||
|
```
|
||||||
|
# php-cli
|
||||||
|
buildroot/bin/php -v
|
||||||
|
|
||||||
|
# phpmicro
|
||||||
|
echo '<?php echo "Hello world!\n";' > a.php
|
||||||
|
./spc micro:combine a.php -O my-app
|
||||||
|
./my-app
|
||||||
|
|
||||||
|
# php-fpm
|
||||||
|
buildroot/bin/php-fpm -v
|
||||||
|
```
|
||||||
|
|
||||||
## Documentation
|
## Documentation
|
||||||
|
|
||||||
The current README contains basic usage. For all the features of static-php-cli,
|
The current README contains basic usage. For all the features of static-php-cli,
|
||||||
@@ -53,6 +112,7 @@ which can be downloaded directly according to your needs.
|
|||||||
|----------------------------------------------------------------------|----------------------------------------------------------------------------|--------------|--------------------------------|
|
|----------------------------------------------------------------------|----------------------------------------------------------------------------|--------------|--------------------------------|
|
||||||
| [common](https://dl.static-php.dev/static-php-cli/common/) | [30+](https://dl.static-php.dev/static-php-cli/common/README.txt) | Linux, macOS | The binary size is about 7.5MB |
|
| [common](https://dl.static-php.dev/static-php-cli/common/) | [30+](https://dl.static-php.dev/static-php-cli/common/README.txt) | Linux, macOS | The binary size is about 7.5MB |
|
||||||
| [bulk](https://dl.static-php.dev/static-php-cli/bulk/) | [50+](https://dl.static-php.dev/static-php-cli/bulk/README.txt) | Linux, macOS | The binary size is about 25MB |
|
| [bulk](https://dl.static-php.dev/static-php-cli/bulk/) | [50+](https://dl.static-php.dev/static-php-cli/bulk/README.txt) | Linux, macOS | The binary size is about 25MB |
|
||||||
|
| [gnu-bulk](https://dl.static-php.dev/static-php-cli/gnu-bulk/) | [50+](https://dl.static-php.dev/static-php-cli/bulk/README.txt) | Linux, macOS | Using shared glibc |
|
||||||
| [minimal](https://dl.static-php.dev/static-php-cli/minimal/) | [5](https://dl.static-php.dev/static-php-cli/minimal/README.txt) | Linux, macOS | The binary size is about 3MB |
|
| [minimal](https://dl.static-php.dev/static-php-cli/minimal/) | [5](https://dl.static-php.dev/static-php-cli/minimal/README.txt) | Linux, macOS | The binary size is about 3MB |
|
||||||
| [spc-min](https://dl.static-php.dev/static-php-cli/windows/spc-min/) | [5](https://dl.static-php.dev/static-php-cli/windows/spc-min/README.txt) | Windows | The binary size is about 3MB |
|
| [spc-min](https://dl.static-php.dev/static-php-cli/windows/spc-min/) | [5](https://dl.static-php.dev/static-php-cli/windows/spc-min/README.txt) | Windows | The binary size is about 3MB |
|
||||||
| [spc-max](https://dl.static-php.dev/static-php-cli/windows/spc-max/) | [40+](https://dl.static-php.dev/static-php-cli/windows/spc-max/README.txt) | Windows | The binary size is about 8.5MB |
|
| [spc-max](https://dl.static-php.dev/static-php-cli/windows/spc-max/) | [40+](https://dl.static-php.dev/static-php-cli/windows/spc-max/README.txt) | Windows | The binary size is about 8.5MB |
|
||||||
@@ -60,63 +120,10 @@ which can be downloaded directly according to your needs.
|
|||||||
> Linux and Windows supports UPX compression for binaries, which can reduce the size of the binary by 30% to 50%.
|
> 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.
|
> macOS does not support UPX compression, so the size of the pre-built binaries for mac is larger.
|
||||||
|
|
||||||
## Build
|
|
||||||
|
|
||||||
### Compilation Requirements
|
|
||||||
|
|
||||||
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 extensions mentioned below.
|
|
||||||
|
|
||||||
- PHP >= 8.4 (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,
|
|
||||||
:computer: represents support for local manual builds, and blank represents not currently supported.
|
|
||||||
|
|
||||||
| | x86_64 | aarch64 |
|
|
||||||
|---------|----------------------|----------------------|
|
|
||||||
| macOS | :octocat: :computer: | :octocat: :computer: |
|
|
||||||
| Linux | :octocat: :computer: | :octocat: :computer: |
|
|
||||||
| Windows | :octocat: :computer: | |
|
|
||||||
| FreeBSD | :computer: | :computer: |
|
|
||||||
|
|
||||||
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 | :x: | phpmicro and some extensions not supported on 7.x |
|
|
||||||
| 7.4 | :x: | phpmicro and some extensions not supported on 7.x |
|
|
||||||
| 8.0 | :warning: | PHP official has stopped maintenance of 8.0, we no longer provide backport support for version 8.0 |
|
|
||||||
| 8.1 | :heavy_check_mark: | PHP official has security fixes only |
|
|
||||||
| 8.2 | :heavy_check_mark: | |
|
|
||||||
| 8.3 | :heavy_check_mark: | |
|
|
||||||
| 8.4 | :heavy_check_mark: | |
|
|
||||||
|
|
||||||
> This table shows the support status for static-php-cli in building the corresponding version,
|
|
||||||
> not the official PHP support status for that version.
|
|
||||||
|
|
||||||
### Supported Extensions
|
|
||||||
|
|
||||||
Please first select the extension you want to compile based on the extension list below.
|
|
||||||
|
|
||||||
- [Supported Extension List](https://static-php.dev/en/guide/extensions.html)
|
|
||||||
- [Command Generator](https://static-php.dev/en/guide/cli-generator.html)
|
|
||||||
|
|
||||||
> If an extension you need is missing, you can submit an issue.
|
|
||||||
|
|
||||||
Here is the current planned roadmap for extension support: [#152](https://github.com/crazywhalecc/static-php-cli/issues/152) .
|
|
||||||
|
|
||||||
### Build Online (using GitHub Actions)
|
### Build Online (using GitHub Actions)
|
||||||
|
|
||||||
Use GitHub Action to easily build a statically compiled PHP,
|
When the above direct download binaries cannot meet your needs,
|
||||||
|
you can use GitHub Action to easily build a statically compiled PHP,
|
||||||
and at the same time define the extensions to be compiled by yourself.
|
and at the same time define the extensions to be compiled by yourself.
|
||||||
|
|
||||||
1. Fork me.
|
1. Fork me.
|
||||||
@@ -126,184 +133,6 @@ and at the same time define the extensions to be compiled by yourself.
|
|||||||
|
|
||||||
If you enable `debug`, all logs will be output at build time, including compiled logs, for troubleshooting.
|
If you enable `debug`, all logs will be output at build time, including compiled logs, for troubleshooting.
|
||||||
|
|
||||||
### Build Locally (using SPC binary, recommended)
|
|
||||||
|
|
||||||
This project provides a binary file of static-php-cli: `spc`.
|
|
||||||
You can use `spc` binary instead of installing any runtime like golang app.
|
|
||||||
Currently, the platforms supported by `spc` binary are Linux and macOS.
|
|
||||||
|
|
||||||
Download from self-hosted nightly builds using commands below:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Download from self-hosted nightly builds (sync with main branch)
|
|
||||||
# For Linux x86_64
|
|
||||||
curl -fsSL -o spc https://dl.static-php.dev/static-php-cli/spc-bin/nightly/spc-linux-x86_64
|
|
||||||
# For Linux aarch64
|
|
||||||
curl -fsSL -o spc https://dl.static-php.dev/static-php-cli/spc-bin/nightly/spc-linux-aarch64
|
|
||||||
# macOS x86_64 (Intel)
|
|
||||||
curl -fsSL -o spc https://dl.static-php.dev/static-php-cli/spc-bin/nightly/spc-macos-x86_64
|
|
||||||
# macOS aarch64 (Apple)
|
|
||||||
curl -fsSL -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 -fsSL -o spc.exe https://dl.static-php.dev/static-php-cli/spc-bin/nightly/spc-windows-x64.exe
|
|
||||||
|
|
||||||
# Add execute perm (Linux and macOS only)
|
|
||||||
chmod +x ./spc
|
|
||||||
|
|
||||||
# Run (Linux and macOS)
|
|
||||||
./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).
|
|
||||||
|
|
||||||
### Build Locally (using git source)
|
|
||||||
|
|
||||||
If you need to modify the static-php-cli source code, or have problems using the spc binary build,
|
|
||||||
you can download static-php-cli using the git source code.
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# just clone me!
|
|
||||||
git clone https://github.com/crazywhalecc/static-php-cli.git
|
|
||||||
```
|
|
||||||
|
|
||||||
If you have not installed php on your system, we recommend that you use the built-in setup-runtime to install PHP and Composer automatically.
|
|
||||||
|
|
||||||
```bash
|
|
||||||
cd static-php-cli
|
|
||||||
chmod +x bin/setup-runtime
|
|
||||||
# it will download static php (from self-hosted server) and composer (from getcomposer)
|
|
||||||
bin/setup-runtime
|
|
||||||
# initialize composer deps
|
|
||||||
bin/composer install
|
|
||||||
# chmod
|
|
||||||
chmod +x bin/spc
|
|
||||||
bin/spc --version
|
|
||||||
```
|
|
||||||
|
|
||||||
### Start Building PHP
|
|
||||||
|
|
||||||
Basic usage for building php with some extensions:
|
|
||||||
|
|
||||||
> 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
|
|
||||||
# Check system tool dependencies, auto-fix them if possible
|
|
||||||
./bin/spc doctor --auto-fix
|
|
||||||
|
|
||||||
# fetch all libraries
|
|
||||||
./bin/spc download --all
|
|
||||||
# dump a list of extensions required by your project
|
|
||||||
./bin/spc dump-extensions /path/to/your/project --format=text
|
|
||||||
# only fetch necessary sources by needed extensions (recommended)
|
|
||||||
./bin/spc download --for-extensions="openssl,pcntl,mbstring,pdo_sqlite"
|
|
||||||
# download pre-built libraries first (save time for compiling dependencies)
|
|
||||||
./bin/spc download --for-extensions="openssl,curl,mbstring,mbregex" --prefer-pre-built
|
|
||||||
# download different PHP version (--with-php=x.y or --with-php=x.y.z, recommend 8.3 ~ 8.4)
|
|
||||||
./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
|
|
||||||
./bin/spc build "bcmath,openssl,tokenizer,sqlite3,pdo_sqlite,ftp,curl" --build-cli --build-micro
|
|
||||||
# build thread-safe (ZTS) version (--enable-zts)
|
|
||||||
./bin/spc build "curl,phar" --enable-zts --build-cli
|
|
||||||
# build, pack executable with UPX (linux and windows only) (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:
|
|
||||||
|
|
||||||
- `--build-cli`: build static cli executable
|
|
||||||
- `--build-micro`: build static phpmicro self-extracted executable
|
|
||||||
- `--build-fpm`: build static fpm binary
|
|
||||||
- `--build-embed`: build embed (libphp)
|
|
||||||
- `--build-all`: build all
|
|
||||||
|
|
||||||
If anything goes wrong, use `--debug` option to display full terminal output:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
./bin/spc build "openssl,pcntl,mbstring" --debug --build-all
|
|
||||||
./bin/spc download --all --debug
|
|
||||||
```
|
|
||||||
|
|
||||||
## Different SAPI Usage
|
|
||||||
|
|
||||||
### Use cli
|
|
||||||
|
|
||||||
> php-cli is a single static binary, you can use it like normal php installed on your system.
|
|
||||||
|
|
||||||
When using the parameter `--build-cli` or `--build-all`,
|
|
||||||
the final compilation result will output a binary file named `./php`,
|
|
||||||
which can be distributed and used directly.
|
|
||||||
This file will be located in the directory `buildroot/bin/`, copy it out for use.
|
|
||||||
|
|
||||||
```bash
|
|
||||||
cd buildroot/bin/
|
|
||||||
./php -v # check version
|
|
||||||
./php -m # check extensions
|
|
||||||
./php your_code.php # run your php code
|
|
||||||
./php your_project.phar # run your phar (project archive)
|
|
||||||
```
|
|
||||||
|
|
||||||
### Use micro
|
|
||||||
|
|
||||||
> phpmicro is a SelF-extracted eXecutable SAPI module,
|
|
||||||
> provided by [phpmicro](https://github.com/dixyes/phpmicro) project.
|
|
||||||
> But this project is using a [fork](https://github.com/static-php/phpmicro) of phpmicro, because we need to add some features to it.
|
|
||||||
> It can put php runtime and your source code together.
|
|
||||||
|
|
||||||
When using the parameter `--build-all` or `--build-micro`,
|
|
||||||
the final compilation result will output a file named `./micro.sfx`,
|
|
||||||
which needs to be used with your PHP source code like `code.php`.
|
|
||||||
This file will be located in the path `buildroot/bin/micro.sfx`, simply copy it out for use.
|
|
||||||
|
|
||||||
Prepare your project source code, which can be a single PHP file or a Phar file, for use.
|
|
||||||
|
|
||||||
```bash
|
|
||||||
echo "<?php echo 'Hello world' . PHP_EOL;" > code.php
|
|
||||||
cat micro.sfx code.php > single-app && chmod +x single-app
|
|
||||||
./single-app
|
|
||||||
```
|
|
||||||
|
|
||||||
If you package a PHAR file, just replace `code.php` with the phar file path.
|
|
||||||
You can use [box-project/box](https://github.com/box-project/box) to package your CLI project as Phar,
|
|
||||||
It is then combined with phpmicro to produce a standalone executable binary.
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Use the micro.sfx generated by static-php-cli to combine,
|
|
||||||
bin/spc micro:combine my-app.phar
|
|
||||||
# or you can directly use the cat command to combine them.
|
|
||||||
cat buildroot/bin/micro.sfx my-app.phar > my-app && chmod +x my-app
|
|
||||||
|
|
||||||
# Use micro:combine combination to inject INI options into the binary.
|
|
||||||
bin/spc micro:combine my-app.phar -I "memory_limit=4G" -I "disable_functions=system" --output my-app-2
|
|
||||||
```
|
|
||||||
|
|
||||||
> In some cases, PHAR files may not run in a micro environment. Overall, micro is not production ready.
|
|
||||||
|
|
||||||
### Use fpm
|
|
||||||
|
|
||||||
When using the parameter `--build-all` or `--build-fpm`,
|
|
||||||
the final compilation result will output a file named `./php-fpm`,
|
|
||||||
This file will be located in the path `buildroot/bin/`, simply copy it out for use.
|
|
||||||
|
|
||||||
In common Linux distributions and macOS systems, the package manager will automatically generate a default fpm configuration file after installing php-fpm.
|
|
||||||
Because php-fpm must specify a configuration file before running, the php-fpm compiled by this project will not have any configuration files, so you need to write `php-fpm.conf` and `pool.conf` configuration files yourself.
|
|
||||||
|
|
||||||
Specifying `php-fpm.conf` can use the command parameter `-y`, for example: `./php-fpm -y php-fpm.conf`.
|
|
||||||
|
|
||||||
### Use embed
|
|
||||||
|
|
||||||
When using the project parameters `--build-embed` or `--build-all`,
|
|
||||||
the final compilation result will output a `libphp.a`, `php-config` and a series of header files,
|
|
||||||
stored in `buildroot/`. You can introduce them in your other projects.
|
|
||||||
|
|
||||||
If you know [embed SAPI](https://github.com/php/php-src/tree/master/sapi/embed), you should know how to use it.
|
|
||||||
You may require the introduction of other libraries during compilation,
|
|
||||||
you can use `buildroot/bin/php-config` to obtain the compile-time configuration.
|
|
||||||
|
|
||||||
For an advanced example of how to use this feature, take a look at [how to use it to build a static version of FrankenPHP](https://github.com/dunglas/frankenphp/blob/main/docs/static.md).
|
|
||||||
|
|
||||||
## Contribution
|
## Contribution
|
||||||
|
|
||||||
If the extension you need is missing, you can create an issue.
|
If the extension you need is missing, you can create an issue.
|
||||||
@@ -317,6 +146,12 @@ Now there is a [static-php](https://github.com/static-php) organization, which i
|
|||||||
|
|
||||||
You can sponsor me or my project from [GitHub Sponsor](https://github.com/crazywhalecc). A portion of your donation will be used to maintain the **static-php.dev** server.
|
You can sponsor me or my project from [GitHub Sponsor](https://github.com/crazywhalecc). A portion of your donation will be used to maintain the **static-php.dev** server.
|
||||||
|
|
||||||
|
**Special thanks to sponsors below**:
|
||||||
|
|
||||||
|
<a href="https://beyondco.de/"><img src="/docs/public/images/beyondcode-seeklogo.png" width="300" alt="Beyond Code Logo" /></a>
|
||||||
|
|
||||||
|
<a href="https://nativephp.com/"><img src="/docs/public/images/nativephp-logo.svg" width="300" alt="NativePHP Logo" /></a>
|
||||||
|
|
||||||
## Open-Source License
|
## Open-Source License
|
||||||
|
|
||||||
This project itself is based on MIT License,
|
This project itself is based on MIT License,
|
||||||
|
|||||||
@@ -1,158 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
|
|
||||||
# This file is using docker to run commands
|
|
||||||
set -e
|
|
||||||
|
|
||||||
# Detect docker can run
|
|
||||||
if ! which docker >/dev/null; then
|
|
||||||
echo "Docker is not installed, please install docker first !"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
DOCKER_EXECUTABLE="docker"
|
|
||||||
# shellcheck disable=SC2046
|
|
||||||
if [ $(id -u) -ne 0 ]; then
|
|
||||||
if ! docker info > /dev/null 2>&1; then
|
|
||||||
if [ "$SPC_USE_SUDO" != "yes" ]; then
|
|
||||||
echo "Docker command requires sudo"
|
|
||||||
# shellcheck disable=SC2039
|
|
||||||
echo -n 'To use sudo to run docker, run "export SPC_USE_SUDO=yes" and run command again'
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
DOCKER_EXECUTABLE="sudo docker"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# to check if qemu-docker run
|
|
||||||
if [ "$SPC_USE_ARCH" = "" ]; then
|
|
||||||
SPC_USE_ARCH=current
|
|
||||||
fi
|
|
||||||
case $SPC_USE_ARCH in
|
|
||||||
current)
|
|
||||||
BASE_ARCH=$(uname -m)
|
|
||||||
if [ "$BASE_ARCH" = "arm64" ]; then
|
|
||||||
BASE_ARCH=aarch64
|
|
||||||
GO_ARCH=arm64
|
|
||||||
else
|
|
||||||
GO_ARCH=amd64
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
aarch64)
|
|
||||||
BASE_ARCH=aarch64
|
|
||||||
GO_ARCH=arm64
|
|
||||||
# shellcheck disable=SC2039
|
|
||||||
echo -e "\e[033m* Using different arch needs to setup qemu-static for docker !\e[0m"
|
|
||||||
$DOCKER_EXECUTABLE run --rm --privileged multiarch/qemu-user-static:register --reset > /dev/null
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
echo "Current arch is not supported to run in docker: $SPC_USE_ARCH"
|
|
||||||
exit 1
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
# Detect docker env is setup
|
|
||||||
if ! $DOCKER_EXECUTABLE images | grep -q cwcc-frankenphp-gnu-$SPC_USE_ARCH; then
|
|
||||||
echo "Docker container does not exist. Building docker image ..."
|
|
||||||
$DOCKER_EXECUTABLE build -t cwcc-frankenphp-gnu-$SPC_USE_ARCH -f- . <<EOF
|
|
||||||
FROM centos:7
|
|
||||||
RUN sed -i 's/mirror.centos.org/vault.centos.org/g' /etc/yum.repos.d/*.repo && \
|
|
||||||
sed -i 's/^#.*baseurl=http/baseurl=http/g' /etc/yum.repos.d/*.repo && \
|
|
||||||
sed -i 's/^mirrorlist=http/#mirrorlist=http/g' /etc/yum.repos.d/*.repo
|
|
||||||
RUN yum clean all && \
|
|
||||||
yum makecache && \
|
|
||||||
yum update -y && \
|
|
||||||
localedef -c -i en_US -f UTF-8 en_US.UTF-8
|
|
||||||
|
|
||||||
RUN yum install -y centos-release-scl
|
|
||||||
|
|
||||||
RUN if [ "$BASE_ARCH" = "aarch64" ]; then \
|
|
||||||
sed -i 's|mirror.centos.org/centos|vault.centos.org/altarch|g' /etc/yum.repos.d/CentOS-SCLo-scl-rh.repo ; \
|
|
||||||
sed -i 's|mirror.centos.org/centos|vault.centos.org/altarch|g' /etc/yum.repos.d/CentOS-SCLo-scl.repo ; \
|
|
||||||
else \
|
|
||||||
sed -i 's/mirror.centos.org/vault.centos.org/g' /etc/yum.repos.d/*.repo ; \
|
|
||||||
fi
|
|
||||||
RUN sed -i 's/^#.*baseurl=http/baseurl=http/g' /etc/yum.repos.d/*.repo && \
|
|
||||||
sed -i 's/^mirrorlist=http/#mirrorlist=http/g' /etc/yum.repos.d/*.repo
|
|
||||||
|
|
||||||
RUN yum update -y && \
|
|
||||||
yum install -y devtoolset-10-gcc-*
|
|
||||||
RUN echo "source scl_source enable devtoolset-10" >> /etc/bashrc
|
|
||||||
RUN source /etc/bashrc
|
|
||||||
|
|
||||||
RUN curl -o cmake.tgz -fsSL https://github.com/Kitware/CMake/releases/download/v3.31.4/cmake-3.31.4-linux-$BASE_ARCH.tar.gz && \
|
|
||||||
mkdir /cmake && \
|
|
||||||
tar -xzf cmake.tgz -C /cmake --strip-components 1
|
|
||||||
|
|
||||||
WORKDIR /app
|
|
||||||
ADD ./src /app/src
|
|
||||||
COPY ./composer.* /app/
|
|
||||||
ADD ./bin/setup-runtime /app/bin/setup-runtime
|
|
||||||
ADD ./bin/spc /app/bin/spc
|
|
||||||
RUN /app/bin/setup-runtime
|
|
||||||
RUN /app/bin/php /app/bin/composer install --no-dev --classmap-authoritative
|
|
||||||
ENV PATH="/app/bin:/cmake/bin:/usr/local/go/bin:$PATH"
|
|
||||||
ENV SPC_LIBC=glibc
|
|
||||||
|
|
||||||
ADD ./config/env.ini /app/config/env.ini
|
|
||||||
RUN bin/spc doctor --auto-fix --debug
|
|
||||||
|
|
||||||
RUN curl -o make.tgz -fsSL https://ftp.gnu.org/gnu/make/make-4.4.tar.gz && \
|
|
||||||
tar -zxvf make.tgz && \
|
|
||||||
cd make-4.4 && \
|
|
||||||
./configure && \
|
|
||||||
make && \
|
|
||||||
make install && \
|
|
||||||
ln -sf /usr/local/bin/make /usr/bin/make
|
|
||||||
|
|
||||||
RUN curl -o automake.tgz -fsSL https://ftp.gnu.org/gnu/automake/automake-1.17.tar.xz && \
|
|
||||||
tar -xvf automake.tgz && \
|
|
||||||
cd automake-1.17 && \
|
|
||||||
./configure && \
|
|
||||||
make && \
|
|
||||||
make install && \
|
|
||||||
ln -sf /usr/local/bin/automake /usr/bin/automake
|
|
||||||
|
|
||||||
RUN git clone https://github.com/static-php/gnu-frankenphp --depth=1 /frankenphp
|
|
||||||
WORKDIR /frankenphp
|
|
||||||
|
|
||||||
RUN curl -o go.tgz -fsSL https://go.dev/dl/go1.24.1.linux-$GO_ARCH.tar.gz && \
|
|
||||||
rm -rf /usr/local/go && tar -C /usr/local -xzf go.tgz
|
|
||||||
EOF
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Check if in ci (local terminal can execute with -it)
|
|
||||||
if [ -t 0 ]; then
|
|
||||||
INTERACT=-it
|
|
||||||
else
|
|
||||||
INTERACT=''
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Mounting volumes
|
|
||||||
MOUNT_LIST=""
|
|
||||||
# shellcheck disable=SC2089
|
|
||||||
MOUNT_LIST="$MOUNT_LIST -v ""$(pwd)""/config:/app/config"
|
|
||||||
MOUNT_LIST="$MOUNT_LIST -v ""$(pwd)""/src:/app/src"
|
|
||||||
MOUNT_LIST="$MOUNT_LIST -v ""$(pwd)""/buildroot:/app/buildroot"
|
|
||||||
MOUNT_LIST="$MOUNT_LIST -v ""$(pwd)""/source:/app/source"
|
|
||||||
MOUNT_LIST="$MOUNT_LIST -v ""$(pwd)""/dist:/app/dist"
|
|
||||||
MOUNT_LIST="$MOUNT_LIST -v ""$(pwd)""/downloads:/app/downloads"
|
|
||||||
MOUNT_LIST="$MOUNT_LIST -v ""$(pwd)""/pkgroot:/app/pkgroot"
|
|
||||||
MOUNT_LIST="$MOUNT_LIST -v ""$(pwd)""/frankenphp-dist:/frankenphp/dist"
|
|
||||||
|
|
||||||
# Apply env in temp env file
|
|
||||||
echo 'CC=/opt/rh/devtoolset-10/root/usr/bin/gcc' > /tmp/spc-gnu-docker.env
|
|
||||||
echo 'CXX=/opt/rh/devtoolset-10/root/usr/bin/g++' >> /tmp/spc-gnu-docker.env
|
|
||||||
echo 'AR=/opt/rh/devtoolset-10/root/usr/bin/ar' >> /tmp/spc-gnu-docker.env
|
|
||||||
echo 'LD=/opt/rh/devtoolset-10/root/usr/bin/ld' >> /tmp/spc-gnu-docker.env
|
|
||||||
echo 'SPC_DEFAULT_C_FLAGS=-fPIE -fPIC' >> /tmp/spc-gnu-docker.env
|
|
||||||
echo 'SPC_LIBC=glibc' >> /tmp/spc-gnu-docker.env
|
|
||||||
echo 'SPC_CMD_VAR_PHP_MAKE_EXTRA_LDFLAGS_PROGRAM="-Wl,-O1 -pie"' >> /tmp/spc-gnu-docker.env
|
|
||||||
echo 'SPC_CMD_VAR_PHP_MAKE_EXTRA_LIBS="-ldl -lpthread -lm -lresolv -lutil -lrt"' >> /tmp/spc-gnu-docker.env
|
|
||||||
|
|
||||||
# Run docker
|
|
||||||
# shellcheck disable=SC2068
|
|
||||||
# shellcheck disable=SC2086
|
|
||||||
# shellcheck disable=SC2090
|
|
||||||
|
|
||||||
$DOCKER_EXECUTABLE run --rm $INTERACT -e SPC_FIX_DEPLOY_ROOT="$(pwd)" --env-file /tmp/spc-gnu-docker.env $MOUNT_LIST cwcc-frankenphp-gnu-$SPC_USE_ARCH ./build-static.sh
|
|
||||||
11
bin/docker-entrypoint.sh
Normal file
11
bin/docker-entrypoint.sh
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
set -e
|
||||||
|
TARGET_DIR="/app/pkgroot/$(uname -m)-linux"
|
||||||
|
BACKUP_DIR="/app/pkgroot-private"
|
||||||
|
# copy private pkgroot to pkgroot if pkgroot is empty
|
||||||
|
if [ ! -d "$TARGET_DIR" ] || [ -z "$(ls -A "$TARGET_DIR")" ]; then
|
||||||
|
echo "* Copying private pkgroot to pkgroot ..."
|
||||||
|
rm -rf "$TARGET_DIR"
|
||||||
|
cp -r "$BACKUP_DIR" "$TARGET_DIR"
|
||||||
|
fi
|
||||||
|
exec "$@"
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
|
|
||||||
# get parent dir, and run the php-cs-fixer
|
|
||||||
PHP_CS_FIXER_IGNORE_ENV=1 "$(dirname "$0")/../vendor/bin/php-cs-fixer" "$@"
|
|
||||||
@@ -25,7 +25,7 @@ __DIR__=$(cd "$(dirname "$0")" && pwd)
|
|||||||
__PROJECT__=$(cd "${__DIR__}"/../ && pwd)
|
__PROJECT__=$(cd "${__DIR__}"/../ && pwd)
|
||||||
|
|
||||||
# set download dir
|
# set download dir
|
||||||
__PHP_RUNTIME_URL__="https://dl.static-php.dev/static-php-cli/bulk/php-8.4.4-cli-${__OS_FIXED__}-${__ARCH__}.tar.gz"
|
__PHP_RUNTIME_URL__="https://dl.static-php.dev/static-php-cli/bulk/php-8.4.12-cli-${__OS_FIXED__}-${__ARCH__}.tar.gz"
|
||||||
__COMPOSER_URL__="https://getcomposer.org/download/latest-stable/composer.phar"
|
__COMPOSER_URL__="https://getcomposer.org/download/latest-stable/composer.phar"
|
||||||
|
|
||||||
# use china mirror
|
# use china mirror
|
||||||
@@ -45,7 +45,7 @@ done
|
|||||||
|
|
||||||
case "$mirror" in
|
case "$mirror" in
|
||||||
china)
|
china)
|
||||||
__PHP_RUNTIME_URL__="https://dl.static-php.dev/static-php-cli/bulk/php-8.4.4-cli-${__OS_FIXED__}-${__ARCH__}.tar.gz"
|
__PHP_RUNTIME_URL__="https://dl.static-php.dev/static-php-cli/bulk/php-8.4.12-cli-${__OS_FIXED__}-${__ARCH__}.tar.gz"
|
||||||
__COMPOSER_URL__="https://mirrors.tencent.com/composer/composer.phar"
|
__COMPOSER_URL__="https://mirrors.tencent.com/composer/composer.phar"
|
||||||
;;
|
;;
|
||||||
|
|
||||||
|
|||||||
@@ -1,11 +1,14 @@
|
|||||||
#!/usr/bin/env sh
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
# This file is using docker to run commands
|
# This file is using docker to run commands
|
||||||
|
SPC_DOCKER_VERSION=v6
|
||||||
|
|
||||||
# Detect docker can run
|
# Detect docker can run
|
||||||
if ! which docker >/dev/null; then
|
if ! which docker >/dev/null; then
|
||||||
echo "Docker is not installed, please install docker first !"
|
echo "Docker is not installed, please install docker first !"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
DOCKER_EXECUTABLE="docker"
|
DOCKER_EXECUTABLE="docker"
|
||||||
# shellcheck disable=SC2046
|
# shellcheck disable=SC2046
|
||||||
@@ -21,27 +24,48 @@ if [ $(id -u) -ne 0 ]; then
|
|||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# Convert uname to gnu arch
|
||||||
|
CURRENT_ARCH=$(uname -m)
|
||||||
# to check if qemu-docker run
|
if [ "$CURRENT_ARCH" = "arm64" ]; then
|
||||||
if [ "$SPC_USE_ARCH" = "" ]; then
|
CURRENT_ARCH=aarch64
|
||||||
SPC_USE_ARCH=x86_64
|
|
||||||
fi
|
fi
|
||||||
|
if [ -z "$SPC_USE_ARCH" ]; then
|
||||||
|
SPC_USE_ARCH=$CURRENT_ARCH
|
||||||
|
fi
|
||||||
|
# parse SPC_USE_ARCH
|
||||||
case $SPC_USE_ARCH in
|
case $SPC_USE_ARCH in
|
||||||
x86_64)
|
x86_64|amd64)
|
||||||
ALPINE_FROM=alpine:edge
|
SPC_USE_ARCH=x86_64
|
||||||
|
if [ "$CURRENT_ARCH" != "x86_64" ]; then
|
||||||
|
PLATFORM_ARG="--platform linux/amd64"
|
||||||
|
ALPINE_FROM=multiarch/alpine:x86_64-edge
|
||||||
|
fi
|
||||||
;;
|
;;
|
||||||
aarch64)
|
aarch64|arm64)
|
||||||
ALPINE_FROM=multiarch/alpine:aarch64-edge
|
SPC_USE_ARCH=aarch64
|
||||||
# shellcheck disable=SC2039
|
if [ "$CURRENT_ARCH" != "aarch64" ]; then
|
||||||
echo -e "\e[033m* Using different arch needs to setup qemu-static for docker !\e[0m"
|
PLATFORM_ARG="--platform linux/arm64"
|
||||||
$DOCKER_EXECUTABLE run --rm --privileged multiarch/qemu-user-static:register --reset > /dev/null
|
ALPINE_FROM=multiarch/alpine:aarch64-edge
|
||||||
|
fi
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
echo "Current arch is not supported to run in docker: $SPC_USE_ARCH"
|
echo "Current arch is not supported to run in docker: $SPC_USE_ARCH"
|
||||||
exit 1
|
exit 1
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
# if ALPINE_FROM is not set, use alpine:3.21
|
||||||
|
if [ -z "$ALPINE_FROM" ]; then
|
||||||
|
ALPINE_FROM=alpine:3.21
|
||||||
|
fi
|
||||||
|
if [ "$SPC_USE_ARCH" != "$CURRENT_ARCH" ]; then
|
||||||
|
echo "* Using different arch needs to setup qemu-static for docker !"
|
||||||
|
ALPINE_FROM=multiarch/alpine:$SPC_USE_ARCH-edge
|
||||||
|
if [ "$(uname -s)" = "Linux" ]; then
|
||||||
|
$DOCKER_EXECUTABLE run --rm --privileged multiarch/qemu-user-static:register --reset > /dev/null
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
ALPINE_FROM=alpine:3.21
|
||||||
|
fi
|
||||||
|
|
||||||
if [ "$SPC_USE_MIRROR" = "yes" ]; then
|
if [ "$SPC_USE_MIRROR" = "yes" ]; then
|
||||||
SPC_USE_MIRROR="RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.tuna.tsinghua.edu.cn/g' /etc/apk/repositories"
|
SPC_USE_MIRROR="RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.tuna.tsinghua.edu.cn/g' /etc/apk/repositories"
|
||||||
@@ -50,9 +74,9 @@ else
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
# Detect docker env is setup
|
# Detect docker env is setup
|
||||||
if ! $DOCKER_EXECUTABLE images | grep -q cwcc-spc-$SPC_USE_ARCH-v2; then
|
if ! $DOCKER_EXECUTABLE images | grep -q cwcc-spc-$SPC_USE_ARCH-$SPC_DOCKER_VERSION; then
|
||||||
echo "Docker container does not exist. Building docker image ..."
|
echo "Docker container does not exist. Building docker image ..."
|
||||||
$DOCKER_EXECUTABLE build -t cwcc-spc-$SPC_USE_ARCH-v2 -f- . <<EOF
|
$DOCKER_EXECUTABLE build $PLATFORM_ARG -t cwcc-spc-$SPC_USE_ARCH-$SPC_DOCKER_VERSION -f- . <<EOF
|
||||||
FROM $ALPINE_FROM
|
FROM $ALPINE_FROM
|
||||||
$SPC_USE_MIRROR
|
$SPC_USE_MIRROR
|
||||||
RUN apk update; \
|
RUN apk update; \
|
||||||
@@ -80,6 +104,7 @@ RUN apk update; \
|
|||||||
m4 \
|
m4 \
|
||||||
make \
|
make \
|
||||||
pkgconfig \
|
pkgconfig \
|
||||||
|
re2c \
|
||||||
wget \
|
wget \
|
||||||
xz \
|
xz \
|
||||||
gettext-dev \
|
gettext-dev \
|
||||||
@@ -95,7 +120,15 @@ WORKDIR /app
|
|||||||
ADD ./src /app/src
|
ADD ./src /app/src
|
||||||
COPY ./composer.* /app/
|
COPY ./composer.* /app/
|
||||||
ADD ./bin /app/bin
|
ADD ./bin /app/bin
|
||||||
RUN composer install --no-dev --classmap-authoritative
|
RUN composer install --no-dev
|
||||||
|
ADD ./config /app/config
|
||||||
|
RUN bin/spc doctor --auto-fix
|
||||||
|
RUN bin/spc install-pkg upx
|
||||||
|
|
||||||
|
RUN mv /app/pkgroot/\$(uname -m)-linux /app/pkgroot-private
|
||||||
|
ADD bin/docker-entrypoint.sh /bin/docker-entrypoint.sh
|
||||||
|
RUN chmod +x /bin/docker-entrypoint.sh
|
||||||
|
ENTRYPOINT ["/bin/docker-entrypoint.sh"]
|
||||||
EOF
|
EOF
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@@ -116,13 +149,79 @@ MOUNT_LIST="$MOUNT_LIST -v ""$(pwd)""/source:/app/source"
|
|||||||
MOUNT_LIST="$MOUNT_LIST -v ""$(pwd)""/dist:/app/dist"
|
MOUNT_LIST="$MOUNT_LIST -v ""$(pwd)""/dist:/app/dist"
|
||||||
MOUNT_LIST="$MOUNT_LIST -v ""$(pwd)""/downloads:/app/downloads"
|
MOUNT_LIST="$MOUNT_LIST -v ""$(pwd)""/downloads:/app/downloads"
|
||||||
MOUNT_LIST="$MOUNT_LIST -v ""$(pwd)""/pkgroot:/app/pkgroot"
|
MOUNT_LIST="$MOUNT_LIST -v ""$(pwd)""/pkgroot:/app/pkgroot"
|
||||||
|
MOUNT_LIST="$MOUNT_LIST -v ""$(pwd)""/log:/app/log"
|
||||||
|
if [ -f "$(pwd)/craft.yml" ]; then
|
||||||
|
MOUNT_LIST="$MOUNT_LIST -v ""$(pwd)""/craft.yml:/app/craft.yml"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Environment variable passthrough
|
||||||
|
ENV_LIST=""
|
||||||
|
ENV_LIST="$ENV_LIST -e SPC_FIX_DEPLOY_ROOT="$(pwd)""
|
||||||
|
if [ ! -z "$GITHUB_TOKEN" ]; then
|
||||||
|
ENV_LIST="$ENV_LIST -e GITHUB_TOKEN=$GITHUB_TOKEN"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Intercept and rewrite --with-frankenphp-app option, and mount host path to /app/app
|
||||||
|
FRANKENPHP_APP_PATH=""
|
||||||
|
NEW_ARGS=()
|
||||||
|
while [ $# -gt 0 ]; do
|
||||||
|
case "$1" in
|
||||||
|
--with-frankenphp-app=*)
|
||||||
|
FRANKENPHP_APP_PATH="${1#*=}"
|
||||||
|
NEW_ARGS+=("--with-frankenphp-app=/app/app")
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
--with-frankenphp-app)
|
||||||
|
if [ -n "${2:-}" ]; then
|
||||||
|
FRANKENPHP_APP_PATH="$2"
|
||||||
|
NEW_ARGS+=("--with-frankenphp-app=/app/app")
|
||||||
|
shift 2
|
||||||
|
else
|
||||||
|
NEW_ARGS+=("$1")
|
||||||
|
shift
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
NEW_ARGS+=("$1")
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
# Normalize the path and add mount if provided
|
||||||
|
if [ -n "$FRANKENPHP_APP_PATH" ]; then
|
||||||
|
# expand ~ to $HOME
|
||||||
|
if [ "${FRANKENPHP_APP_PATH#~}" != "$FRANKENPHP_APP_PATH" ]; then
|
||||||
|
FRANKENPHP_APP_PATH="$HOME${FRANKENPHP_APP_PATH#~}"
|
||||||
|
fi
|
||||||
|
# make absolute if relative
|
||||||
|
case "$FRANKENPHP_APP_PATH" in
|
||||||
|
/*) ABS_APP_PATH="$FRANKENPHP_APP_PATH" ;;
|
||||||
|
*) ABS_APP_PATH="$(pwd)/$FRANKENPHP_APP_PATH" ;;
|
||||||
|
esac
|
||||||
|
MOUNT_LIST="$MOUNT_LIST -v $ABS_APP_PATH:/app/app"
|
||||||
|
fi
|
||||||
|
|
||||||
# Run docker
|
# Run docker
|
||||||
# shellcheck disable=SC2068
|
# shellcheck disable=SC2068
|
||||||
# shellcheck disable=SC2086
|
# shellcheck disable=SC2086
|
||||||
# shellcheck disable=SC2090
|
# shellcheck disable=SC2090
|
||||||
if [ "$SPC_DOCKER_DEBUG" = "yes" ]; then
|
if [ "$SPC_DOCKER_DEBUG" = "yes" ]; then
|
||||||
$DOCKER_EXECUTABLE run --rm $INTERACT -e SPC_FIX_DEPLOY_ROOT="$(pwd)" $MOUNT_LIST cwcc-spc-$SPC_USE_ARCH-v2
|
echo "* Debug mode enabled, run docker in interactive mode."
|
||||||
|
echo "* You can use 'exit' to exit the docker container."
|
||||||
|
echo "* You can use 'bin/spc' like normal builds."
|
||||||
|
echo "*"
|
||||||
|
echo "* Mounted directories:"
|
||||||
|
echo "* ./config: $(pwd)/config"
|
||||||
|
echo "* ./src: $(pwd)/src"
|
||||||
|
echo "* ./buildroot: $(pwd)/buildroot"
|
||||||
|
echo "* ./source: $(pwd)/source"
|
||||||
|
echo "* ./dist: $(pwd)/dist"
|
||||||
|
echo "* ./downloads: $(pwd)/downloads"
|
||||||
|
echo "* ./pkgroot: $(pwd)/pkgroot"
|
||||||
|
echo "*"
|
||||||
|
set -ex
|
||||||
|
$DOCKER_EXECUTABLE run $PLATFORM_ARG --rm $INTERACT $ENV_LIST $MOUNT_LIST cwcc-spc-$SPC_USE_ARCH-$SPC_DOCKER_VERSION /bin/bash
|
||||||
else
|
else
|
||||||
$DOCKER_EXECUTABLE run --rm $INTERACT -e SPC_FIX_DEPLOY_ROOT="$(pwd)" $MOUNT_LIST cwcc-spc-$SPC_USE_ARCH-v2 bin/spc $@
|
$DOCKER_EXECUTABLE run $PLATFORM_ARG --rm $INTERACT $ENV_LIST $MOUNT_LIST cwcc-spc-$SPC_USE_ARCH-$SPC_DOCKER_VERSION bin/spc "${NEW_ARGS[@]}"
|
||||||
fi
|
fi
|
||||||
|
|||||||
@@ -1,8 +1,10 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
# This file is using docker to run commands
|
|
||||||
set -e
|
set -e
|
||||||
|
|
||||||
|
# This file is using docker to run commands
|
||||||
|
SPC_DOCKER_VERSION=v6
|
||||||
|
|
||||||
# Detect docker can run
|
# Detect docker can run
|
||||||
if ! which docker >/dev/null; then
|
if ! which docker >/dev/null; then
|
||||||
echo "Docker is not installed, please install docker first !"
|
echo "Docker is not installed, please install docker first !"
|
||||||
@@ -12,7 +14,7 @@ DOCKER_EXECUTABLE="docker"
|
|||||||
# shellcheck disable=SC2046
|
# shellcheck disable=SC2046
|
||||||
if [ $(id -u) -ne 0 ]; then
|
if [ $(id -u) -ne 0 ]; then
|
||||||
if ! docker info > /dev/null 2>&1; then
|
if ! docker info > /dev/null 2>&1; then
|
||||||
if [ "$SPC_USE_SUDO" != "yes" ]; then
|
if [ "$SPC_USE_SUDO" != "yes" ] && [ "$SPC_DOCKER_DEBUG" != "yes" ]; then
|
||||||
echo "Docker command requires sudo"
|
echo "Docker command requires sudo"
|
||||||
# shellcheck disable=SC2039
|
# shellcheck disable=SC2039
|
||||||
echo -n 'To use sudo to run docker, run "export SPC_USE_SUDO=yes" and run command again'
|
echo -n 'To use sudo to run docker, run "export SPC_USE_SUDO=yes" and run command again'
|
||||||
@@ -22,35 +24,47 @@ if [ $(id -u) -ne 0 ]; then
|
|||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# Convert uname to gnu arch
|
||||||
|
CURRENT_ARCH=$(uname -m)
|
||||||
# to check if qemu-docker run
|
if [ "$CURRENT_ARCH" = "arm64" ]; then
|
||||||
if [ "$SPC_USE_ARCH" = "" ]; then
|
CURRENT_ARCH=aarch64
|
||||||
SPC_USE_ARCH=current
|
|
||||||
fi
|
fi
|
||||||
|
if [ -z "$SPC_USE_ARCH" ]; then
|
||||||
|
SPC_USE_ARCH=$CURRENT_ARCH
|
||||||
|
fi
|
||||||
|
# parse SPC_USE_ARCH
|
||||||
case $SPC_USE_ARCH in
|
case $SPC_USE_ARCH in
|
||||||
current)
|
x86_64|amd64)
|
||||||
BASE_ARCH=$(uname -m)
|
SPC_USE_ARCH=x86_64
|
||||||
if [ "$BASE_ARCH" = "arm64" ]; then
|
SPC_USE_ARCH_DOCKER=amd64
|
||||||
BASE_ARCH=aarch64
|
if [ "$CURRENT_ARCH" != "x86_64" ]; then
|
||||||
|
PLATFORM_ARG="--platform linux/amd64"
|
||||||
fi
|
fi
|
||||||
;;
|
;;
|
||||||
aarch64)
|
aarch64|arm64)
|
||||||
BASE_ARCH=aarch64
|
SPC_USE_ARCH=aarch64
|
||||||
# shellcheck disable=SC2039
|
SPC_USE_ARCH_DOCKER=arm64
|
||||||
echo -e "\e[033m* Using different arch needs to setup qemu-static for docker !\e[0m"
|
if [ "$CURRENT_ARCH" != "aarch64" ]; then
|
||||||
$DOCKER_EXECUTABLE run --rm --privileged multiarch/qemu-user-static:register --reset > /dev/null
|
PLATFORM_ARG="--platform linux/arm64"
|
||||||
|
fi
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
echo "Current arch is not supported to run in docker: $SPC_USE_ARCH"
|
echo "Current arch is not supported to run in docker: $SPC_USE_ARCH"
|
||||||
exit 1
|
exit 1
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
# detect if we need to use qemu-static
|
||||||
|
if [ "$SPC_USE_ARCH" != "$CURRENT_ARCH" ]; then
|
||||||
|
if [ "$(uname -s)" = "Linux" ]; then
|
||||||
|
echo "* Using different arch needs to setup qemu-static for docker !"
|
||||||
|
$DOCKER_EXECUTABLE run --rm --privileged multiarch/qemu-user-static --reset -p yes > /dev/null
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
# Detect docker env is setup
|
# Detect docker env is setup
|
||||||
if ! $DOCKER_EXECUTABLE images | grep -q cwcc-spc-gnu-$SPC_USE_ARCH; then
|
if ! $DOCKER_EXECUTABLE images | grep -q cwcc-spc-gnu-$SPC_USE_ARCH-$SPC_DOCKER_VERSION; then
|
||||||
echo "Docker container does not exist. Building docker image ..."
|
echo "Docker container does not exist. Building docker image ..."
|
||||||
$DOCKER_EXECUTABLE build -t cwcc-spc-gnu-$SPC_USE_ARCH -f- . <<EOF
|
$DOCKER_EXECUTABLE buildx build $PLATFORM_ARG -t cwcc-spc-gnu-$SPC_USE_ARCH-$SPC_DOCKER_VERSION -f- . <<EOF
|
||||||
FROM centos:7
|
FROM centos:7
|
||||||
RUN sed -i 's/mirror.centos.org/vault.centos.org/g' /etc/yum.repos.d/*.repo && \
|
RUN sed -i 's/mirror.centos.org/vault.centos.org/g' /etc/yum.repos.d/*.repo && \
|
||||||
sed -i 's/^#.*baseurl=http/baseurl=http/g' /etc/yum.repos.d/*.repo && \
|
sed -i 's/^#.*baseurl=http/baseurl=http/g' /etc/yum.repos.d/*.repo && \
|
||||||
@@ -62,36 +76,42 @@ RUN yum clean all && \
|
|||||||
|
|
||||||
RUN yum install -y centos-release-scl
|
RUN yum install -y centos-release-scl
|
||||||
|
|
||||||
RUN if [ "$BASE_ARCH" = "aarch64" ]; then \
|
RUN if [ "$SPC_USE_ARCH" = "aarch64" ]; then \
|
||||||
sed -i 's|mirror.centos.org/centos|vault.centos.org/altarch|g' /etc/yum.repos.d/CentOS-SCLo-scl-rh.repo ; \
|
sed -i 's|mirror.centos.org/centos|vault.centos.org/altarch|g' /etc/yum.repos.d/CentOS-SCLo-scl-rh.repo ; \
|
||||||
sed -i 's|mirror.centos.org/centos|vault.centos.org/altarch|g' /etc/yum.repos.d/CentOS-SCLo-scl.repo ; \
|
sed -i 's|mirror.centos.org/centos|vault.centos.org/altarch|g' /etc/yum.repos.d/CentOS-SCLo-scl.repo ; \
|
||||||
else \
|
else \
|
||||||
sed -i 's/mirror.centos.org/vault.centos.org/g' /etc/yum.repos.d/*.repo ; \
|
sed -i 's/mirror.centos.org/vault.centos.org/g' /etc/yum.repos.d/*.repo ; \
|
||||||
fi
|
fi
|
||||||
RUN sed -i 's/^#.*baseurl=http/baseurl=http/g' /etc/yum.repos.d/*.repo && \
|
RUN sed -i 's/^#.*baseurl=http/baseurl=http/g' /etc/yum.repos.d/*.repo && \
|
||||||
sed -i 's/^mirrorlist=http/#mirrorlist=http/g' /etc/yum.repos.d/*.repo
|
sed -i 's/^mirrorlist=http/#mirrorlist=http/g' /etc/yum.repos.d/*.repo && \
|
||||||
|
sed -i 's|http://|https://|g' /etc/yum.repos.d/*.repo
|
||||||
|
|
||||||
RUN yum update -y && \
|
RUN yum update -y && \
|
||||||
yum install -y devtoolset-10-gcc-*
|
yum install -y devtoolset-10-gcc-* devtoolset-10-libatomic-devel
|
||||||
RUN echo "source scl_source enable devtoolset-10" >> /etc/bashrc
|
RUN echo "source scl_source enable devtoolset-10" >> /etc/bashrc
|
||||||
RUN source /etc/bashrc
|
RUN source /etc/bashrc
|
||||||
|
RUN yum install -y which
|
||||||
|
|
||||||
RUN curl -o cmake.tgz -fsSL https://github.com/Kitware/CMake/releases/download/v3.31.4/cmake-3.31.4-linux-$BASE_ARCH.tar.gz && \
|
RUN curl -o cmake.tgz -#fSL https://github.com/Kitware/CMake/releases/download/v3.31.4/cmake-3.31.4-linux-$SPC_USE_ARCH.tar.gz && \
|
||||||
mkdir /cmake && \
|
mkdir /cmake && \
|
||||||
tar -xzf cmake.tgz -C /cmake --strip-components 1
|
tar -xzf cmake.tgz -C /cmake --strip-components 1
|
||||||
|
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
ADD ./src /app/src
|
|
||||||
COPY ./composer.* /app/
|
COPY ./composer.* /app/
|
||||||
ADD ./bin/setup-runtime /app/bin/setup-runtime
|
ADD ./bin/setup-runtime /app/bin/setup-runtime
|
||||||
ADD ./bin/spc /app/bin/spc
|
ADD ./bin/spc /app/bin/spc
|
||||||
RUN /app/bin/setup-runtime
|
RUN /app/bin/setup-runtime
|
||||||
RUN /app/bin/php /app/bin/composer install --no-dev --classmap-authoritative
|
ADD ./src /app/src
|
||||||
ENV PATH="/app/bin:/cmake/bin:$PATH"
|
RUN /app/bin/php /app/bin/composer install --no-dev
|
||||||
ENV SPC_LIBC=glibc
|
ENV SPC_LIBC=glibc
|
||||||
|
ENV PATH="/app/bin:/cmake/bin:/opt/rh/devtoolset-10/root/usr/bin:\$PATH"
|
||||||
|
|
||||||
ADD ./config/env.ini /app/config/env.ini
|
ADD ./config /app/config
|
||||||
RUN bin/spc doctor --auto-fix --debug
|
RUN CC=gcc bin/spc doctor --auto-fix --debug
|
||||||
|
RUN bin/spc install-pkg upx
|
||||||
|
RUN if [ -f /app/buildroot/bin/re2c ]; then \
|
||||||
|
cp /app/buildroot/bin/re2c /usr/local/bin/re2c ;\
|
||||||
|
fi
|
||||||
|
|
||||||
RUN curl -o make.tgz -fsSL https://ftp.gnu.org/gnu/make/make-4.4.tar.gz && \
|
RUN curl -o make.tgz -fsSL https://ftp.gnu.org/gnu/make/make-4.4.tar.gz && \
|
||||||
tar -zxvf make.tgz && \
|
tar -zxvf make.tgz && \
|
||||||
@@ -109,6 +129,10 @@ RUN curl -o automake.tgz -fsSL https://ftp.gnu.org/gnu/automake/automake-1.17.ta
|
|||||||
make install && \
|
make install && \
|
||||||
ln -sf /usr/local/bin/automake /usr/bin/automake
|
ln -sf /usr/local/bin/automake /usr/bin/automake
|
||||||
|
|
||||||
|
RUN mv /app/pkgroot/\$(uname -m)-linux /app/pkgroot-private
|
||||||
|
ADD bin/docker-entrypoint.sh /bin/docker-entrypoint.sh
|
||||||
|
RUN chmod +x /bin/docker-entrypoint.sh
|
||||||
|
ENTRYPOINT ["/bin/docker-entrypoint.sh"]
|
||||||
EOF
|
EOF
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@@ -129,20 +153,84 @@ MOUNT_LIST="$MOUNT_LIST -v ""$(pwd)""/source:/app/source"
|
|||||||
MOUNT_LIST="$MOUNT_LIST -v ""$(pwd)""/dist:/app/dist"
|
MOUNT_LIST="$MOUNT_LIST -v ""$(pwd)""/dist:/app/dist"
|
||||||
MOUNT_LIST="$MOUNT_LIST -v ""$(pwd)""/downloads:/app/downloads"
|
MOUNT_LIST="$MOUNT_LIST -v ""$(pwd)""/downloads:/app/downloads"
|
||||||
MOUNT_LIST="$MOUNT_LIST -v ""$(pwd)""/pkgroot:/app/pkgroot"
|
MOUNT_LIST="$MOUNT_LIST -v ""$(pwd)""/pkgroot:/app/pkgroot"
|
||||||
|
MOUNT_LIST="$MOUNT_LIST -v ""$(pwd)""/log:/app/log"
|
||||||
|
if [ -f "$(pwd)/craft.yml" ]; then
|
||||||
|
MOUNT_LIST="$MOUNT_LIST -v ""$(pwd)""/craft.yml:/app/craft.yml"
|
||||||
|
fi
|
||||||
|
|
||||||
# Apply env in temp env file
|
# Apply env in temp env file
|
||||||
echo 'CC=/opt/rh/devtoolset-10/root/usr/bin/gcc' > /tmp/spc-gnu-docker.env
|
echo 'SPC_DEFAULT_C_FLAGS=-fPIC' > /tmp/spc-gnu-docker.env
|
||||||
echo 'CXX=/opt/rh/devtoolset-10/root/usr/bin/g++' >> /tmp/spc-gnu-docker.env
|
|
||||||
echo 'AR=/opt/rh/devtoolset-10/root/usr/bin/ar' >> /tmp/spc-gnu-docker.env
|
|
||||||
echo 'LD=/opt/rh/devtoolset-10/root/usr/bin/ld' >> /tmp/spc-gnu-docker.env
|
|
||||||
echo 'SPC_DEFAULT_C_FLAGS=-fPIE -fPIC' >> /tmp/spc-gnu-docker.env
|
|
||||||
echo 'SPC_LIBC=glibc' >> /tmp/spc-gnu-docker.env
|
echo 'SPC_LIBC=glibc' >> /tmp/spc-gnu-docker.env
|
||||||
echo 'SPC_CMD_VAR_PHP_MAKE_EXTRA_LDFLAGS_PROGRAM="-Wl,-O1 -pie"' >> /tmp/spc-gnu-docker.env
|
|
||||||
echo 'SPC_CMD_VAR_PHP_MAKE_EXTRA_LIBS="-ldl -lpthread -lm -lresolv -lutil -lrt"' >> /tmp/spc-gnu-docker.env
|
# Environment variable passthrough
|
||||||
|
ENV_LIST=""
|
||||||
|
ENV_LIST="$ENV_LIST -e SPC_FIX_DEPLOY_ROOT="$(pwd)""
|
||||||
|
if [ ! -z "$GITHUB_TOKEN" ]; then
|
||||||
|
ENV_LIST="$ENV_LIST -e GITHUB_TOKEN=$GITHUB_TOKEN"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Intercept and rewrite --with-frankenphp-app option, and mount host path to /app/app
|
||||||
|
FRANKENPHP_APP_PATH=""
|
||||||
|
NEW_ARGS=()
|
||||||
|
while [ $# -gt 0 ]; do
|
||||||
|
case "$1" in
|
||||||
|
--with-frankenphp-app=*)
|
||||||
|
FRANKENPHP_APP_PATH="${1#*=}"
|
||||||
|
NEW_ARGS+=("--with-frankenphp-app=/app/app")
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
--with-frankenphp-app)
|
||||||
|
if [ -n "${2:-}" ]; then
|
||||||
|
FRANKENPHP_APP_PATH="$2"
|
||||||
|
NEW_ARGS+=("--with-frankenphp-app=/app/app")
|
||||||
|
shift 2
|
||||||
|
else
|
||||||
|
NEW_ARGS+=("$1")
|
||||||
|
shift
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
NEW_ARGS+=("$1")
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
# Normalize the path and add mount if provided
|
||||||
|
if [ -n "$FRANKENPHP_APP_PATH" ]; then
|
||||||
|
# expand ~ to $HOME
|
||||||
|
if [ "${FRANKENPHP_APP_PATH#~}" != "$FRANKENPHP_APP_PATH" ]; then
|
||||||
|
FRANKENPHP_APP_PATH="$HOME${FRANKENPHP_APP_PATH#~}"
|
||||||
|
fi
|
||||||
|
# make absolute if relative
|
||||||
|
case "$FRANKENPHP_APP_PATH" in
|
||||||
|
/*) ABS_APP_PATH="$FRANKENPHP_APP_PATH" ;;
|
||||||
|
*) ABS_APP_PATH="$(pwd)/$FRANKENPHP_APP_PATH" ;;
|
||||||
|
esac
|
||||||
|
MOUNT_LIST="$MOUNT_LIST -v $ABS_APP_PATH:/app/app"
|
||||||
|
fi
|
||||||
|
|
||||||
# Run docker
|
# Run docker
|
||||||
# shellcheck disable=SC2068
|
# shellcheck disable=SC2068
|
||||||
# shellcheck disable=SC2086
|
# shellcheck disable=SC2086
|
||||||
# shellcheck disable=SC2090
|
# shellcheck disable=SC2090
|
||||||
|
|
||||||
$DOCKER_EXECUTABLE run --rm $INTERACT -e SPC_FIX_DEPLOY_ROOT="$(pwd)" --env-file /tmp/spc-gnu-docker.env $MOUNT_LIST cwcc-spc-gnu-$SPC_USE_ARCH bin/spc $@
|
if [ "$SPC_DOCKER_DEBUG" = "yes" ]; then
|
||||||
|
echo "* Debug mode enabled, run docker in interactive mode."
|
||||||
|
echo "* You can use 'exit' to exit the docker container."
|
||||||
|
echo "* You can use 'bin/spc' like normal builds."
|
||||||
|
echo "*"
|
||||||
|
echo "* Mounted directories:"
|
||||||
|
echo "* ./config: $(pwd)/config"
|
||||||
|
echo "* ./src: $(pwd)/src"
|
||||||
|
echo "* ./buildroot: $(pwd)/buildroot"
|
||||||
|
echo "* ./source: $(pwd)/source"
|
||||||
|
echo "* ./dist: $(pwd)/dist"
|
||||||
|
echo "* ./downloads: $(pwd)/downloads"
|
||||||
|
echo "* ./pkgroot: $(pwd)/pkgroot"
|
||||||
|
echo "*"
|
||||||
|
set -ex
|
||||||
|
$DOCKER_EXECUTABLE run $PLATFORM_ARG --privileged --rm -it $INTERACT $ENV_LIST --env-file /tmp/spc-gnu-docker.env $MOUNT_LIST cwcc-spc-gnu-$SPC_USE_ARCH-$SPC_DOCKER_VERSION /bin/bash
|
||||||
|
else
|
||||||
|
$DOCKER_EXECUTABLE run $PLATFORM_ARG --rm $INTERACT $ENV_LIST --env-file /tmp/spc-gnu-docker.env $MOUNT_LIST cwcc-spc-gnu-$SPC_USE_ARCH-$SPC_DOCKER_VERSION bin/spc "${NEW_ARGS[@]}"
|
||||||
|
fi
|
||||||
|
|||||||
@@ -14,14 +14,15 @@
|
|||||||
"ext-zlib": "*",
|
"ext-zlib": "*",
|
||||||
"laravel/prompts": "^0.1.12",
|
"laravel/prompts": "^0.1.12",
|
||||||
"symfony/console": "^5.4 || ^6 || ^7",
|
"symfony/console": "^5.4 || ^6 || ^7",
|
||||||
"zhamao/logger": "^1.0"
|
"symfony/process": "^7.2",
|
||||||
|
"symfony/yaml": "^7.2",
|
||||||
|
"zhamao/logger": "^1.1.3"
|
||||||
},
|
},
|
||||||
"require-dev": {
|
"require-dev": {
|
||||||
"captainhook/captainhook-phar": "^5.23",
|
"captainhook/captainhook-phar": "^5.23",
|
||||||
"captainhook/hook-installer": "^1.0",
|
"captainhook/hook-installer": "^1.0",
|
||||||
"friendsofphp/php-cs-fixer": "^3.60",
|
"friendsofphp/php-cs-fixer": "^3.60",
|
||||||
"humbug/box": "^4.5.0 || ^4.6.0",
|
"humbug/box": "^4.5.0 || ^4.6.0",
|
||||||
"nunomaduro/collision": "^7.8",
|
|
||||||
"phpstan/phpstan": "^1.10",
|
"phpstan/phpstan": "^1.10",
|
||||||
"phpunit/phpunit": "^10.3 || ^9.5"
|
"phpunit/phpunit": "^10.3 || ^9.5"
|
||||||
},
|
},
|
||||||
|
|||||||
1531
composer.lock
generated
1531
composer.lock
generated
File diff suppressed because it is too large
Load Diff
145
config/env.ini
145
config/env.ini
@@ -1,40 +1,41 @@
|
|||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
; static-php-cli (spc) env configuration
|
; static-php-cli (spc) env configuration
|
||||||
;
|
;
|
||||||
; This file is used to set default env vars for static-php-cli build.
|
; This file is used to set default env vars for static-php-cli build.
|
||||||
; As dynamic build process, some of these vars can be overwritten by CLI options.
|
; As dynamic build process, some of these vars can be overwritten by CLI options.
|
||||||
; And you can also overwrite these vars by setting them in your shell environment.
|
; And you can also overwrite these vars by setting them in your shell environment.
|
||||||
|
; The value should be changed only if you know what you are doing. Otherwise, please leave them as default.
|
||||||
;
|
;
|
||||||
; We need to use some pre-defined internal env vars, like `BUILD_ROOT_PATH`, `DOWNLOAD_PATH`, etc.
|
; We need to use some pre-defined internal env vars, like `BUILD_ROOT_PATH`, `DOWNLOAD_PATH`, etc.
|
||||||
; Please note that these vars cannot be defined in this file, they are only be defined before static-php-cli running.
|
; Please note that these vars cannot be defined in this file, they should only be defined before static-php-cli running.
|
||||||
;
|
;
|
||||||
; Here's a list of env vars, these value cannot be changed anywhere:
|
; Here's a list of env vars, these variables will be defined if not defined:
|
||||||
;
|
;
|
||||||
; WORKING_DIR: the working directory of the build process. (default: `$(pwd)`)
|
|
||||||
; ROOT_DIR: the root directory of static-php-cli. (default: `/path/to/static-php-cli`, when running in phar or micro mode: `phar://path/to/spc.phar`)
|
|
||||||
; BUILD_ROOT_PATH: the root path of the build process. (default: `$(pwd)/buildroot`)
|
; BUILD_ROOT_PATH: the root path of the build process. (default: `$(pwd)/buildroot`)
|
||||||
; BUILD_INCLUDE_PATH: the path of the include files. (default: `$BUILD_ROOT_PATH/include`)
|
; BUILD_INCLUDE_PATH: the path of the include files. (default: `$BUILD_ROOT_PATH/include`)
|
||||||
; BUILD_LIB_PATH: the path of the lib files. (default: `$BUILD_ROOT_PATH/lib`)
|
; BUILD_LIB_PATH: the path of the lib files. (default: `$BUILD_ROOT_PATH/lib`)
|
||||||
; BUILD_BIN_PATH: the path of the bin files. (default: `$BUILD_ROOT_PATH/bin`)
|
; BUILD_BIN_PATH: the path of the bin files. (default: `$BUILD_ROOT_PATH/bin`)
|
||||||
; PKG_ROOT_PATH: the root path of the package files. (default: `$(pwd)/pkgroot`)
|
; BUILD_MODULES_PATH: the path of the php modules (shared extensions) files. (default: `$BUILD_ROOT_PATH/modules`)
|
||||||
|
; PKG_ROOT_PATH: the root path of the package files. (default: `$(pwd)/pkgroot/$GNU_ARCH-{darwin|linux|windows}`)
|
||||||
; SOURCE_PATH: the path of the source files. (default: `$(pwd)/source`)
|
; SOURCE_PATH: the path of the source files. (default: `$(pwd)/source`)
|
||||||
; DOWNLOAD_PATH: the path of the download files. (default: `$(pwd)/downloads`)
|
; DOWNLOAD_PATH: the path of the download files. (default: `$(pwd)/downloads`)
|
||||||
; CPU_COUNT: the count of the CPU cores. (default: `$(nproc)`)
|
; PATH: (*nix only) static-php-cli will add `$BUILD_BIN_PATH` to PATH.
|
||||||
; SPC_ARCH: the arch of the current system, for some libraries needed `--host=XXX` args. (default: `$(uname -m)`, e.g. `x86_64`, `aarch64`, `arm64`)
|
; PKG_CONFIG_PATH: (*nix only) static-php-cli will set `$BUILD_LIB_PATH/pkgconfig` to PKG_CONFIG_PATH.
|
||||||
; GNU_ARCH: the GNU arch of the current system. (default: `$(uname -m)`, e.g. `x86_64`, `aarch64`)
|
|
||||||
; MAC_ARCH: the MAC arch of the current system. (default: `$(uname -m)`, e.g. `x86_64`, `arm64`)
|
|
||||||
;
|
;
|
||||||
; * These vars are only be defined in Unix (macOS, Linux, FreeBSD)Builder and cannot be changed anywhere:
|
; Here's a list of env vars, these variables is defined in SPC and cannot be changed anywhere:
|
||||||
; PATH: static-php-cli will add `$BUILD_BIN_PATH` to PATH.
|
|
||||||
; PKG_CONFIG: static-php-cli will set `$BUILD_BIN_PATH/pkg-config` to PKG_CONFIG.
|
|
||||||
; PKG_CONFIG_PATH: static-php-cli will set `$BUILD_LIB_PATH/pkgconfig` to PKG_CONFIG_PATH.
|
|
||||||
; SPC_PHP_DEFAULT_OPTIMIZE_CFLAGS: the default optimization CFLAGS for compiling php. (if --no-strip option is set: `-g -O0`, else: `-g -Os`)
|
|
||||||
;
|
;
|
||||||
; * These vars are only be defined in LinuxBuilder and cannot be changed anywhere:
|
; SPC_VERSION: the version of static-php-cli.
|
||||||
; SPC_LINUX_DEFAULT_CC: the default compiler for linux. (For alpine linux: `gcc`, default: `$GNU_ARCH-linux-musl-gcc`)
|
; WORKING_DIR: the working directory of the build process. (default: `$(pwd)`)
|
||||||
; SPC_LINUX_DEFAULT_CXX: the default c++ compiler for linux. (For alpine linux: `g++`, default: `$GNU_ARCH-linux-musl-g++`)
|
; ROOT_DIR: the root directory of static-php-cli. (default: `/path/to/static-php-cli`, when running in phar or micro mode: `phar://path/to/spc.phar`)
|
||||||
; SPC_LINUX_DEFAULT_AR: the default archiver for linux. (For alpine linux: `ar`, default: `$GNU_ARCH-linux-musl-ar`)
|
; CPU_COUNT: the count of the CPU cores. (default: `$(nproc)`)
|
||||||
|
; SPC_ARCH: the arch of the current system, for some libraries needed `--host=XXX` args. (default: `$(uname -m)`, e.g. `x86_64`, `aarch64`, `arm64`)
|
||||||
|
; GNU_ARCH: the GNU arch of the current system. (default: `$(uname -m)`, e.g. `x86_64`, `aarch64`)
|
||||||
|
; MAC_ARCH: the MAC arch of the current system. (default: `$(uname -m)`, e.g. `x86_64`, `arm64`)
|
||||||
|
; PKG_CONFIG: (*nix only) static-php-cli will set `$BUILD_BIN_PATH/pkg-config` to PKG_CONFIG.
|
||||||
|
; SPC_LINUX_DEFAULT_CC: (linux only) the default compiler for linux. (For alpine linux: `gcc`, default: `$GNU_ARCH-linux-musl-gcc`)
|
||||||
|
; SPC_LINUX_DEFAULT_CXX: (linux only) the default c++ compiler for linux. (For alpine linux: `g++`, default: `$GNU_ARCH-linux-musl-g++`)
|
||||||
|
; SPC_LINUX_DEFAULT_AR: (linux only) the default archiver for linux. (For alpine linux: `ar`, default: `$GNU_ARCH-linux-musl-ar`)
|
||||||
|
; SPC_EXTRA_PHP_VARS: (linux only) the extra vars for building php, used in `configure` and `make` command.
|
||||||
|
|
||||||
[global]
|
[global]
|
||||||
; Build concurrency for make -jN, default is CPU_COUNT, this value are used in every libs.
|
; Build concurrency for make -jN, default is CPU_COUNT, this value are used in every libs.
|
||||||
@@ -43,6 +44,11 @@ SPC_CONCURRENCY=${CPU_COUNT}
|
|||||||
SPC_SKIP_PHP_VERSION_CHECK="no"
|
SPC_SKIP_PHP_VERSION_CHECK="no"
|
||||||
; Ignore some check item for bin/spc doctor command, comma separated (e.g. SPC_SKIP_DOCTOR_CHECK_ITEMS="if homebrew has installed")
|
; Ignore some check item for bin/spc doctor command, comma separated (e.g. SPC_SKIP_DOCTOR_CHECK_ITEMS="if homebrew has installed")
|
||||||
SPC_SKIP_DOCTOR_CHECK_ITEMS=""
|
SPC_SKIP_DOCTOR_CHECK_ITEMS=""
|
||||||
|
; extra modules that xcaddy will include in the FrankenPHP build
|
||||||
|
SPC_CMD_VAR_FRANKENPHP_XCADDY_MODULES="--with github.com/dunglas/mercure/caddy --with github.com/dunglas/vulcain/caddy --with github.com/dunglas/caddy-cbrotli"
|
||||||
|
; The display message for php version output (PHP >= 8.4 available)
|
||||||
|
PHP_BUILD_PROVIDER="static-php-cli ${SPC_VERSION}"
|
||||||
|
|
||||||
; EXTENSION_DIR where the built php will look for extension when a .ini instructs to load them
|
; EXTENSION_DIR where the built php will look for extension when a .ini instructs to load them
|
||||||
; only useful for builds targeting not pure-static linking
|
; only useful for builds targeting not pure-static linking
|
||||||
; default paths
|
; default paths
|
||||||
@@ -50,93 +56,100 @@ SPC_SKIP_DOCTOR_CHECK_ITEMS=""
|
|||||||
; RHEL: /usr/lib64/php/modules
|
; RHEL: /usr/lib64/php/modules
|
||||||
; Alpine: /usr/lib/php{PHP_VERSION}/modules
|
; Alpine: /usr/lib/php{PHP_VERSION}/modules
|
||||||
; where {PHP_VERSION} is 84 for php 8.4
|
; where {PHP_VERSION} is 84 for php 8.4
|
||||||
EXTENSION_DIR=
|
; EXTENSION_DIR=
|
||||||
|
|
||||||
[windows]
|
[windows]
|
||||||
|
; build target: win7-static
|
||||||
|
SPC_TARGET=native-windows
|
||||||
; php-sdk-binary-tools path
|
; php-sdk-binary-tools path
|
||||||
PHP_SDK_PATH="${WORKING_DIR}\php-sdk-binary-tools"
|
PHP_SDK_PATH="${WORKING_DIR}\php-sdk-binary-tools"
|
||||||
; upx executable path
|
; upx executable path
|
||||||
UPX_EXEC="${PKG_ROOT_PATH}\bin\upx.exe"
|
UPX_EXEC="${PKG_ROOT_PATH}\bin\upx.exe"
|
||||||
; phpmicro patches, for more info, see: https://github.com/easysoft/phpmicro/tree/master/patches
|
; phpmicro patches, for more info, see: https://github.com/easysoft/phpmicro/tree/master/patches
|
||||||
SPC_MICRO_PATCHES=static_extensions_win32,cli_checks,disable_huge_page,vcruntime140,win32,zend_stream,cli_static
|
SPC_MICRO_PATCHES=static_extensions_win32,cli_checks,disable_huge_page,vcruntime140,win32,zend_stream,cli_static,win32_api
|
||||||
|
|
||||||
[linux]
|
[linux]
|
||||||
; include PATH for musl libc.
|
; Linux can use different build toolchains.
|
||||||
|
; - musl (default, when SPC_LIBC=musl): used for general linux distros, can build `musl` (statically linked) only.
|
||||||
|
; - zig (will become default): usable on all Linux distros, can build `-musl`, `arch-linux-musl -dynamic` and `arch-linux-gnu` targets. Can specify version such as `x86_64-linux-gnu.2.17`.
|
||||||
|
; - musl-native: used for alpine linux, can build `musl` and `musl -dynamic` target.
|
||||||
|
; - gnu-native: used for general linux distros, can build gnu target for the installed glibc version only.
|
||||||
|
|
||||||
|
; option to specify the target, superceded by SPC_TARGET if set
|
||||||
SPC_LIBC=musl
|
SPC_LIBC=musl
|
||||||
|
; uncomment to link libc dynamically on musl
|
||||||
|
; SPC_MUSL_DYNAMIC=true
|
||||||
|
|
||||||
|
; Recommended: specify your target here. Zig toolchain will be used.
|
||||||
|
; examples:
|
||||||
|
; `native-native-gnu` - links against glibc, current OS version
|
||||||
|
; `native-native-gnu.2.17` - links against glibc, version 2.17
|
||||||
|
; `native-native` - links against system libc dynamically
|
||||||
|
; `native-native-musl` - links against musl libc statically
|
||||||
|
; `native-native-musl -dynamic` - links against musl libc dynamically
|
||||||
|
; SPC_TARGET=
|
||||||
|
|
||||||
; compiler environments
|
; compiler environments
|
||||||
CC=${SPC_LINUX_DEFAULT_CC}
|
CC=${SPC_LINUX_DEFAULT_CC}
|
||||||
CXX=${SPC_LINUX_DEFAULT_CXX}
|
CXX=${SPC_LINUX_DEFAULT_CXX}
|
||||||
AR=${SPC_LINUX_DEFAULT_AR}
|
AR=${SPC_LINUX_DEFAULT_AR}
|
||||||
LD=ld.gold
|
LD=${SPC_LINUX_DEFAULT_LD}
|
||||||
; default compiler flags, used in CMake toolchain file, openssl and pkg-config build
|
; default compiler flags, used in CMake toolchain file, openssl and pkg-config build
|
||||||
SPC_DEFAULT_C_FLAGS="-fPIC"
|
SPC_DEFAULT_C_FLAGS="-fPIC -Os"
|
||||||
SPC_DEFAULT_CXX_FLAGS=
|
SPC_DEFAULT_CXX_FLAGS="-fPIC -Os"
|
||||||
; extra libs for building php executable, used in `make` command for building php (this value may changed by extension build process, space separated)
|
SPC_DEFAULT_LD_FLAGS=""
|
||||||
SPC_EXTRA_LIBS=
|
|
||||||
; upx executable path
|
; upx executable path
|
||||||
UPX_EXEC=${PKG_ROOT_PATH}/bin/upx
|
UPX_EXEC=${PKG_ROOT_PATH}/bin/upx
|
||||||
; phpmicro patches, for more info, see: https://github.com/easysoft/phpmicro/tree/master/patches
|
; phpmicro patches, for more info, see: https://github.com/easysoft/phpmicro/tree/master/patches
|
||||||
SPC_MICRO_PATCHES=static_extensions_win32,cli_checks,disable_huge_page,vcruntime140,win32,zend_stream
|
SPC_MICRO_PATCHES=cli_checks,disable_huge_page
|
||||||
|
|
||||||
; *** default build command for building php ***
|
; *** default build command for building php ***
|
||||||
; buildconf command
|
; buildconf command
|
||||||
SPC_CMD_PREFIX_PHP_BUILDCONF="./buildconf --force"
|
SPC_CMD_PREFIX_PHP_BUILDCONF="./buildconf --force"
|
||||||
; configure command
|
; configure command
|
||||||
SPC_CMD_PREFIX_PHP_CONFIGURE="./configure --prefix= --with-valgrind=no --enable-shared=no --enable-static=yes --disable-all --disable-cgi --disable-phpdbg --with-pic"
|
SPC_CMD_PREFIX_PHP_CONFIGURE="./configure --prefix= --with-valgrind=no --disable-shared --enable-static --disable-all --disable-phpdbg --with-pic"
|
||||||
; make command
|
|
||||||
SPC_CMD_PREFIX_PHP_MAKE="make -j${CPU_COUNT}"
|
|
||||||
; embed type for php, static (libphp.a) or shared (libphp.so)
|
|
||||||
SPC_CMD_VAR_PHP_EMBED_TYPE="static"
|
|
||||||
|
|
||||||
; *** default build vars for building php ***
|
; *** default build vars for building php ***
|
||||||
; CFLAGS for configuring php
|
; embed type for php, static (libphp.a) or shared (libphp.so)
|
||||||
SPC_CMD_VAR_PHP_CONFIGURE_CFLAGS="${SPC_DEFAULT_C_FLAGS} -fPIE"
|
SPC_CMD_VAR_PHP_EMBED_TYPE="static"
|
||||||
; CPPFLAGS for configuring php
|
; EXTRA_CFLAGS for `configure` and `make` php
|
||||||
SPC_CMD_VAR_PHP_CONFIGURE_CPPFLAGS="-I${BUILD_INCLUDE_PATH}"
|
SPC_CMD_VAR_PHP_MAKE_EXTRA_CFLAGS="-g -fstack-protector-strong -fno-ident -fPIE ${SPC_DEFAULT_C_FLAGS}"
|
||||||
; LDFLAGS for configuring php
|
; EXTRA_LDFLAGS for `make` php, can use -release to set a soname for libphp.so
|
||||||
SPC_CMD_VAR_PHP_CONFIGURE_LDFLAGS="-L${BUILD_LIB_PATH}"
|
SPC_CMD_VAR_PHP_MAKE_EXTRA_LDFLAGS=""
|
||||||
; LIBS for configuring php
|
|
||||||
SPC_CMD_VAR_PHP_CONFIGURE_LIBS="-ldl -lpthread -lm"
|
; optional, path to openssl conf. This affects where openssl will look for the default CA.
|
||||||
; EXTRA_CFLAGS for `make` php
|
; default on Debian/Alpine: /etc/ssl, default on RHEL: /etc/pki/tls
|
||||||
SPC_CMD_VAR_PHP_MAKE_EXTRA_CFLAGS="${SPC_PHP_DEFAULT_OPTIMIZE_CFLAGS} -fno-ident -fPIE -fPIC"
|
OPENSSLDIR=""
|
||||||
; EXTRA_LIBS for `make` php
|
|
||||||
SPC_CMD_VAR_PHP_MAKE_EXTRA_LIBS=""
|
|
||||||
; EXTRA_LDFLAGS_PROGRAM for `make` php
|
|
||||||
SPC_CMD_VAR_PHP_MAKE_EXTRA_LDFLAGS_PROGRAM="-all-static -Wl,-O1 -pie"
|
|
||||||
|
|
||||||
[macos]
|
[macos]
|
||||||
|
; build target: macho or macho (possibly we could support macho-universal in the future)
|
||||||
|
; Currently we do not support universal and cross-compilation for macOS.
|
||||||
|
SPC_TARGET=native-macos
|
||||||
; compiler environments
|
; compiler environments
|
||||||
CC=clang
|
CC=clang
|
||||||
CXX=clang++
|
CXX=clang++
|
||||||
|
AR=ar
|
||||||
|
LD=ld
|
||||||
; default compiler flags, used in CMake toolchain file, openssl and pkg-config build
|
; default compiler flags, used in CMake toolchain file, openssl and pkg-config build
|
||||||
SPC_DEFAULT_C_FLAGS="--target=${MAC_ARCH}-apple-darwin"
|
SPC_DEFAULT_C_FLAGS="--target=${MAC_ARCH}-apple-darwin -Os"
|
||||||
SPC_DEFAULT_CXX_FLAGS="--target=${MAC_ARCH}-apple-darwin"
|
SPC_DEFAULT_CXX_FLAGS="--target=${MAC_ARCH}-apple-darwin -Os"
|
||||||
; extra libs for building php executable, used in `make` command for building php (this value may changed by extension build process, space separated)
|
SPC_DEFAULT_LD_FLAGS=""
|
||||||
SPC_EXTRA_LIBS=
|
|
||||||
; phpmicro patches, for more info, see: https://github.com/easysoft/phpmicro/tree/master/patches
|
; phpmicro patches, for more info, see: https://github.com/easysoft/phpmicro/tree/master/patches
|
||||||
SPC_MICRO_PATCHES=static_extensions_win32,cli_checks,disable_huge_page,vcruntime140,win32,zend_stream,macos_iconv
|
SPC_MICRO_PATCHES=cli_checks,macos_iconv
|
||||||
|
|
||||||
; *** default build command for building php ***
|
; *** default build command for building php ***
|
||||||
; buildconf command
|
; buildconf command
|
||||||
SPC_CMD_PREFIX_PHP_BUILDCONF="./buildconf --force"
|
SPC_CMD_PREFIX_PHP_BUILDCONF="./buildconf --force"
|
||||||
; configure command
|
; configure command
|
||||||
SPC_CMD_PREFIX_PHP_CONFIGURE="./configure --prefix= --with-valgrind=no --enable-shared=no --enable-static=yes --disable-all --disable-cgi --disable-phpdbg"
|
SPC_CMD_PREFIX_PHP_CONFIGURE="./configure --prefix= --with-valgrind=no --enable-shared=no --enable-static=yes --disable-all --disable-phpdbg"
|
||||||
; make command
|
|
||||||
SPC_CMD_PREFIX_PHP_MAKE="make -j${CPU_COUNT}"
|
|
||||||
|
|
||||||
; *** default build vars for building php ***
|
; *** default build vars for building php ***
|
||||||
; CFLAGS for configuring php
|
|
||||||
SPC_CMD_VAR_PHP_CONFIGURE_CFLAGS="${SPC_DEFAULT_C_FLAGS} -Werror=unknown-warning-option"
|
|
||||||
; CPPFLAGS for configuring php
|
|
||||||
SPC_CMD_VAR_PHP_CONFIGURE_CPPFLAGS="-I${BUILD_INCLUDE_PATH}"
|
|
||||||
; LDFLAGS for configuring php
|
|
||||||
SPC_CMD_VAR_PHP_CONFIGURE_LDFLAGS="-L${BUILD_LIB_PATH}"
|
|
||||||
; EXTRA_CFLAGS for `make` php
|
|
||||||
SPC_CMD_VAR_PHP_MAKE_EXTRA_CFLAGS="${SPC_PHP_DEFAULT_OPTIMIZE_CFLAGS}"
|
|
||||||
; EXTRA_LIBS for `make` php
|
|
||||||
SPC_CMD_VAR_PHP_MAKE_EXTRA_LIBS="-lresolv"
|
|
||||||
; embed type for php, static (libphp.a) or shared (libphp.dylib)
|
; embed type for php, static (libphp.a) or shared (libphp.dylib)
|
||||||
SPC_CMD_VAR_PHP_EMBED_TYPE="static"
|
SPC_CMD_VAR_PHP_EMBED_TYPE="static"
|
||||||
|
; EXTRA_CFLAGS for `configure` and `make` php
|
||||||
|
SPC_CMD_VAR_PHP_MAKE_EXTRA_CFLAGS="-g -fstack-protector-strong -fpic -fpie -Werror=unknown-warning-option ${SPC_DEFAULT_C_FLAGS}"
|
||||||
|
; minimum compatible macOS version (LLVM vars, availability not guaranteed)
|
||||||
|
MACOSX_DEPLOYMENT_TARGET=12.0
|
||||||
|
|
||||||
[freebsd]
|
[freebsd]
|
||||||
; compiler environments
|
; compiler environments
|
||||||
|
|||||||
362
config/ext.json
362
config/ext.json
@@ -24,9 +24,17 @@
|
|||||||
"bcmath": {
|
"bcmath": {
|
||||||
"type": "builtin"
|
"type": "builtin"
|
||||||
},
|
},
|
||||||
|
"brotli": {
|
||||||
|
"type": "external",
|
||||||
|
"source": "ext-brotli",
|
||||||
|
"arg-type": "enable",
|
||||||
|
"lib-depends": [
|
||||||
|
"brotli"
|
||||||
|
]
|
||||||
|
},
|
||||||
"bz2": {
|
"bz2": {
|
||||||
"type": "builtin",
|
"type": "builtin",
|
||||||
"arg-type-unix": "with-prefix",
|
"arg-type-unix": "with-path",
|
||||||
"arg-type-windows": "with",
|
"arg-type-windows": "with",
|
||||||
"lib-depends": [
|
"lib-depends": [
|
||||||
"bzip2"
|
"bzip2"
|
||||||
@@ -35,6 +43,14 @@
|
|||||||
"calendar": {
|
"calendar": {
|
||||||
"type": "builtin"
|
"type": "builtin"
|
||||||
},
|
},
|
||||||
|
"com_dotnet": {
|
||||||
|
"support": {
|
||||||
|
"BSD": "no",
|
||||||
|
"Linux": "no",
|
||||||
|
"Darwin": "no"
|
||||||
|
},
|
||||||
|
"type": "builtin"
|
||||||
|
},
|
||||||
"ctype": {
|
"ctype": {
|
||||||
"type": "builtin"
|
"type": "builtin"
|
||||||
},
|
},
|
||||||
@@ -92,6 +108,14 @@
|
|||||||
},
|
},
|
||||||
"type": "wip"
|
"type": "wip"
|
||||||
},
|
},
|
||||||
|
"ev": {
|
||||||
|
"type": "external",
|
||||||
|
"source": "ev",
|
||||||
|
"arg-type-windows": "with",
|
||||||
|
"ext-depends": [
|
||||||
|
"sockets"
|
||||||
|
]
|
||||||
|
},
|
||||||
"event": {
|
"event": {
|
||||||
"support": {
|
"support": {
|
||||||
"Windows": "wip",
|
"Windows": "wip",
|
||||||
@@ -111,6 +135,14 @@
|
|||||||
"sockets"
|
"sockets"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
"excimer": {
|
||||||
|
"support": {
|
||||||
|
"Windows": "wip",
|
||||||
|
"BSD": "wip"
|
||||||
|
},
|
||||||
|
"type": "external",
|
||||||
|
"source": "ext-excimer"
|
||||||
|
},
|
||||||
"exif": {
|
"exif": {
|
||||||
"type": "builtin"
|
"type": "builtin"
|
||||||
},
|
},
|
||||||
@@ -169,7 +201,7 @@
|
|||||||
"BSD": "wip"
|
"BSD": "wip"
|
||||||
},
|
},
|
||||||
"type": "builtin",
|
"type": "builtin",
|
||||||
"arg-type": "with-prefix",
|
"arg-type": "with-path",
|
||||||
"lib-depends": [
|
"lib-depends": [
|
||||||
"gettext"
|
"gettext"
|
||||||
]
|
]
|
||||||
@@ -195,7 +227,7 @@
|
|||||||
"BSD": "wip"
|
"BSD": "wip"
|
||||||
},
|
},
|
||||||
"type": "builtin",
|
"type": "builtin",
|
||||||
"arg-type": "with-prefix",
|
"arg-type": "with-path",
|
||||||
"lib-depends": [
|
"lib-depends": [
|
||||||
"gmp"
|
"gmp"
|
||||||
]
|
]
|
||||||
@@ -216,11 +248,13 @@
|
|||||||
"BSD": "wip"
|
"BSD": "wip"
|
||||||
},
|
},
|
||||||
"type": "external",
|
"type": "external",
|
||||||
"source": "grpc",
|
"source": "ext-grpc",
|
||||||
"arg-type-unix": "custom",
|
"arg-type-unix": "enable-path",
|
||||||
"cpp-extension": true,
|
"cpp-extension": true,
|
||||||
"lib-depends": [
|
"lib-depends": [
|
||||||
"grpc"
|
"zlib",
|
||||||
|
"openssl",
|
||||||
|
"libcares"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"iconv": {
|
"iconv": {
|
||||||
@@ -228,7 +262,7 @@
|
|||||||
"BSD": "wip"
|
"BSD": "wip"
|
||||||
},
|
},
|
||||||
"type": "builtin",
|
"type": "builtin",
|
||||||
"arg-type": "with-prefix",
|
"arg-type": "with-path",
|
||||||
"arg-type-windows": "with",
|
"arg-type-windows": "with",
|
||||||
"lib-depends-unix": [
|
"lib-depends-unix": [
|
||||||
"libiconv"
|
"libiconv"
|
||||||
@@ -253,6 +287,7 @@
|
|||||||
"Windows": "wip",
|
"Windows": "wip",
|
||||||
"BSD": "wip"
|
"BSD": "wip"
|
||||||
},
|
},
|
||||||
|
"notes": true,
|
||||||
"type": "external",
|
"type": "external",
|
||||||
"source": "ext-imagick",
|
"source": "ext-imagick",
|
||||||
"arg-type": "custom",
|
"arg-type": "custom",
|
||||||
@@ -287,12 +322,14 @@
|
|||||||
},
|
},
|
||||||
"intl": {
|
"intl": {
|
||||||
"support": {
|
"support": {
|
||||||
"Windows": "no",
|
|
||||||
"BSD": "wip"
|
"BSD": "wip"
|
||||||
},
|
},
|
||||||
"type": "builtin",
|
"type": "builtin",
|
||||||
"lib-depends": [
|
"lib-depends-unix": [
|
||||||
"icu"
|
"icu"
|
||||||
|
],
|
||||||
|
"lib-depends-windows": [
|
||||||
|
"icu-static-win"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"ldap": {
|
"ldap": {
|
||||||
@@ -301,7 +338,7 @@
|
|||||||
"BSD": "wip"
|
"BSD": "wip"
|
||||||
},
|
},
|
||||||
"type": "builtin",
|
"type": "builtin",
|
||||||
"arg-type": "with-prefix",
|
"arg-type": "with-path",
|
||||||
"lib-depends": [
|
"lib-depends": [
|
||||||
"ldap"
|
"ldap"
|
||||||
],
|
],
|
||||||
@@ -321,11 +358,42 @@
|
|||||||
"arg-type": "none",
|
"arg-type": "none",
|
||||||
"ext-depends": [
|
"ext-depends": [
|
||||||
"xml"
|
"xml"
|
||||||
|
],
|
||||||
|
"build-with-php": true,
|
||||||
|
"target": [
|
||||||
|
"static"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"lz4": {
|
||||||
|
"support": {
|
||||||
|
"Windows": "wip",
|
||||||
|
"BSD": "wip"
|
||||||
|
},
|
||||||
|
"type": "external",
|
||||||
|
"source": "ext-lz4",
|
||||||
|
"arg-type": "custom",
|
||||||
|
"lib-depends": [
|
||||||
|
"liblz4"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"maxminddb": {
|
||||||
|
"support": {
|
||||||
|
"BSD": "wip",
|
||||||
|
"Windows": "wip"
|
||||||
|
},
|
||||||
|
"type": "external",
|
||||||
|
"source": "ext-maxminddb",
|
||||||
|
"arg-type": "with",
|
||||||
|
"lib-depends": [
|
||||||
|
"libmaxminddb"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"mbregex": {
|
"mbregex": {
|
||||||
"type": "builtin",
|
"type": "builtin",
|
||||||
"arg-type": "custom",
|
"arg-type": "custom",
|
||||||
|
"target": [
|
||||||
|
"static"
|
||||||
|
],
|
||||||
"ext-depends": [
|
"ext-depends": [
|
||||||
"mbstring"
|
"mbstring"
|
||||||
],
|
],
|
||||||
@@ -363,8 +431,7 @@
|
|||||||
"memcached": {
|
"memcached": {
|
||||||
"support": {
|
"support": {
|
||||||
"Windows": "wip",
|
"Windows": "wip",
|
||||||
"BSD": "wip",
|
"BSD": "wip"
|
||||||
"Linux": "no"
|
|
||||||
},
|
},
|
||||||
"type": "external",
|
"type": "external",
|
||||||
"source": "memcached",
|
"source": "memcached",
|
||||||
@@ -373,9 +440,21 @@
|
|||||||
"lib-depends": [
|
"lib-depends": [
|
||||||
"libmemcached"
|
"libmemcached"
|
||||||
],
|
],
|
||||||
|
"lib-depends-unix": [
|
||||||
|
"libmemcached",
|
||||||
|
"fastlz"
|
||||||
|
],
|
||||||
|
"lib-suggests": [
|
||||||
|
"zstd"
|
||||||
|
],
|
||||||
"ext-depends": [
|
"ext-depends": [
|
||||||
"session",
|
"session",
|
||||||
"zlib"
|
"zlib"
|
||||||
|
],
|
||||||
|
"ext-suggests": [
|
||||||
|
"igbinary",
|
||||||
|
"msgpack",
|
||||||
|
"session"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"mongodb": {
|
"mongodb": {
|
||||||
@@ -391,6 +470,10 @@
|
|||||||
"openssl",
|
"openssl",
|
||||||
"zstd",
|
"zstd",
|
||||||
"zlib"
|
"zlib"
|
||||||
|
],
|
||||||
|
"frameworks": [
|
||||||
|
"CoreFoundation",
|
||||||
|
"Security"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"msgpack": {
|
"msgpack": {
|
||||||
@@ -400,11 +483,15 @@
|
|||||||
"type": "external",
|
"type": "external",
|
||||||
"source": "msgpack",
|
"source": "msgpack",
|
||||||
"arg-type-unix": "with",
|
"arg-type-unix": "with",
|
||||||
"arg-type-win": "enable"
|
"arg-type-windows": "enable",
|
||||||
|
"ext-depends": [
|
||||||
|
"session"
|
||||||
|
]
|
||||||
},
|
},
|
||||||
"mysqli": {
|
"mysqli": {
|
||||||
"type": "builtin",
|
"type": "builtin",
|
||||||
"arg-type": "with",
|
"arg-type": "with",
|
||||||
|
"build-with-php": true,
|
||||||
"ext-depends": [
|
"ext-depends": [
|
||||||
"mysqlnd"
|
"mysqlnd"
|
||||||
]
|
]
|
||||||
@@ -412,10 +499,45 @@
|
|||||||
"mysqlnd": {
|
"mysqlnd": {
|
||||||
"type": "builtin",
|
"type": "builtin",
|
||||||
"arg-type-windows": "with",
|
"arg-type-windows": "with",
|
||||||
|
"build-with-php": true,
|
||||||
"lib-depends": [
|
"lib-depends": [
|
||||||
"zlib"
|
"zlib"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
"mysqlnd_ed25519": {
|
||||||
|
"type": "external",
|
||||||
|
"source": "mysqlnd_ed25519",
|
||||||
|
"arg-type": "enable",
|
||||||
|
"target": [
|
||||||
|
"shared"
|
||||||
|
],
|
||||||
|
"ext-depends": [
|
||||||
|
"mysqlnd"
|
||||||
|
],
|
||||||
|
"lib-depends": [
|
||||||
|
"libsodium"
|
||||||
|
],
|
||||||
|
"lib-suggests": [
|
||||||
|
"openssl"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"mysqlnd_parsec": {
|
||||||
|
"type": "external",
|
||||||
|
"source": "mysqlnd_parsec",
|
||||||
|
"arg-type": "enable",
|
||||||
|
"target": [
|
||||||
|
"shared"
|
||||||
|
],
|
||||||
|
"ext-depends": [
|
||||||
|
"mysqlnd"
|
||||||
|
],
|
||||||
|
"lib-depends": [
|
||||||
|
"libsodium"
|
||||||
|
],
|
||||||
|
"lib-suggests": [
|
||||||
|
"openssl"
|
||||||
|
]
|
||||||
|
},
|
||||||
"oci8": {
|
"oci8": {
|
||||||
"type": "wip",
|
"type": "wip",
|
||||||
"support": {
|
"support": {
|
||||||
@@ -426,15 +548,29 @@
|
|||||||
},
|
},
|
||||||
"notes": true
|
"notes": true
|
||||||
},
|
},
|
||||||
|
"odbc": {
|
||||||
|
"support": {
|
||||||
|
"BSD": "wip",
|
||||||
|
"Windows": "wip"
|
||||||
|
},
|
||||||
|
"type": "builtin",
|
||||||
|
"arg-type-unix": "custom",
|
||||||
|
"lib-depends-unix": [
|
||||||
|
"unixodbc"
|
||||||
|
]
|
||||||
|
},
|
||||||
"opcache": {
|
"opcache": {
|
||||||
"type": "builtin",
|
"type": "builtin",
|
||||||
"arg-type-unix": "custom"
|
"arg-type-unix": "custom",
|
||||||
|
"arg-type-windows": "enable",
|
||||||
|
"zend-extension": true
|
||||||
},
|
},
|
||||||
"openssl": {
|
"openssl": {
|
||||||
"notes": true,
|
"notes": true,
|
||||||
"type": "builtin",
|
"type": "builtin",
|
||||||
"arg-type": "custom",
|
"arg-type": "custom",
|
||||||
"arg-type-windows": "with",
|
"arg-type-windows": "with",
|
||||||
|
"build-with-php": true,
|
||||||
"lib-depends": [
|
"lib-depends": [
|
||||||
"openssl",
|
"openssl",
|
||||||
"zlib"
|
"zlib"
|
||||||
@@ -469,9 +605,10 @@
|
|||||||
},
|
},
|
||||||
"notes": true,
|
"notes": true,
|
||||||
"type": "builtin",
|
"type": "builtin",
|
||||||
"arg-type": "with-prefix",
|
"arg-type": "custom",
|
||||||
"lib-depends": [
|
"lib-depends": [
|
||||||
"libargon2"
|
"libargon2",
|
||||||
|
"openssl"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"pcntl": {
|
"pcntl": {
|
||||||
@@ -481,6 +618,13 @@
|
|||||||
"type": "builtin",
|
"type": "builtin",
|
||||||
"unix-only": true
|
"unix-only": true
|
||||||
},
|
},
|
||||||
|
"pcov": {
|
||||||
|
"type": "external",
|
||||||
|
"source": "pcov",
|
||||||
|
"target": [
|
||||||
|
"shared"
|
||||||
|
]
|
||||||
|
},
|
||||||
"pdo": {
|
"pdo": {
|
||||||
"type": "builtin"
|
"type": "builtin"
|
||||||
},
|
},
|
||||||
@@ -492,19 +636,36 @@
|
|||||||
"mysqlnd"
|
"mysqlnd"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"pdo_pgsql": {
|
"pdo_odbc": {
|
||||||
"support": {
|
"support": {
|
||||||
"Windows": "wip",
|
|
||||||
"BSD": "wip"
|
"BSD": "wip"
|
||||||
},
|
},
|
||||||
"type": "builtin",
|
"type": "builtin",
|
||||||
"arg-type": "with-prefix",
|
"arg-type": "custom",
|
||||||
|
"lib-depends-unix": [
|
||||||
|
"unixodbc"
|
||||||
|
],
|
||||||
|
"ext-depends": [
|
||||||
|
"pdo",
|
||||||
|
"odbc"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"pdo_pgsql": {
|
||||||
|
"support": {
|
||||||
|
"BSD": "wip"
|
||||||
|
},
|
||||||
|
"type": "builtin",
|
||||||
|
"arg-type": "with-path",
|
||||||
|
"arg-type-windows": "custom",
|
||||||
"ext-depends": [
|
"ext-depends": [
|
||||||
"pdo",
|
"pdo",
|
||||||
"pgsql"
|
"pgsql"
|
||||||
],
|
],
|
||||||
"lib-depends": [
|
"lib-depends-unix": [
|
||||||
"postgresql"
|
"postgresql"
|
||||||
|
],
|
||||||
|
"lib-depends-windows": [
|
||||||
|
"postgresql-win"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"pdo_sqlite": {
|
"pdo_sqlite": {
|
||||||
@@ -535,14 +696,16 @@
|
|||||||
},
|
},
|
||||||
"pgsql": {
|
"pgsql": {
|
||||||
"support": {
|
"support": {
|
||||||
"Windows": "wip",
|
|
||||||
"BSD": "wip"
|
"BSD": "wip"
|
||||||
},
|
},
|
||||||
"notes": true,
|
"notes": true,
|
||||||
"type": "builtin",
|
"type": "builtin",
|
||||||
"arg-type": "custom",
|
"arg-type": "custom",
|
||||||
"lib-depends": [
|
"lib-depends-unix": [
|
||||||
"postgresql"
|
"postgresql"
|
||||||
|
],
|
||||||
|
"lib-depends-windows": [
|
||||||
|
"postgresql-win"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"phar": {
|
"phar": {
|
||||||
@@ -595,9 +758,12 @@
|
|||||||
"BSD": "wip"
|
"BSD": "wip"
|
||||||
},
|
},
|
||||||
"type": "builtin",
|
"type": "builtin",
|
||||||
"arg-type": "with-prefix",
|
"arg-type": "with-path",
|
||||||
"lib-depends": [
|
"lib-depends": [
|
||||||
"readline"
|
"libedit"
|
||||||
|
],
|
||||||
|
"target": [
|
||||||
|
"static"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"redis": {
|
"redis": {
|
||||||
@@ -609,7 +775,8 @@
|
|||||||
"arg-type": "custom",
|
"arg-type": "custom",
|
||||||
"ext-suggests": [
|
"ext-suggests": [
|
||||||
"session",
|
"session",
|
||||||
"igbinary"
|
"igbinary",
|
||||||
|
"msgpack"
|
||||||
],
|
],
|
||||||
"lib-suggests-unix": [
|
"lib-suggests-unix": [
|
||||||
"zstd",
|
"zstd",
|
||||||
@@ -617,10 +784,12 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"session": {
|
"session": {
|
||||||
"type": "builtin"
|
"type": "builtin",
|
||||||
|
"build-with-php": true
|
||||||
},
|
},
|
||||||
"shmop": {
|
"shmop": {
|
||||||
"type": "builtin"
|
"type": "builtin",
|
||||||
|
"build-with-php": true
|
||||||
},
|
},
|
||||||
"simdjson": {
|
"simdjson": {
|
||||||
"type": "external",
|
"type": "external",
|
||||||
@@ -638,7 +807,8 @@
|
|||||||
],
|
],
|
||||||
"ext-depends-windows": [
|
"ext-depends-windows": [
|
||||||
"xml"
|
"xml"
|
||||||
]
|
],
|
||||||
|
"build-with-php": true
|
||||||
},
|
},
|
||||||
"snappy": {
|
"snappy": {
|
||||||
"support": {
|
"support": {
|
||||||
@@ -656,17 +826,27 @@
|
|||||||
"apcu"
|
"apcu"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
"snmp": {
|
||||||
|
"support": {
|
||||||
|
"Windows": "wip",
|
||||||
|
"BSD": "wip"
|
||||||
|
},
|
||||||
|
"type": "builtin",
|
||||||
|
"arg-type-unix": "with",
|
||||||
|
"arg-type-windows": "with",
|
||||||
|
"lib-depends": [
|
||||||
|
"net-snmp"
|
||||||
|
]
|
||||||
|
},
|
||||||
"soap": {
|
"soap": {
|
||||||
"support": {
|
"support": {
|
||||||
"BSD": "wip"
|
"BSD": "wip"
|
||||||
},
|
},
|
||||||
"type": "builtin",
|
"type": "builtin",
|
||||||
"arg-type": "custom",
|
"arg-type": "custom",
|
||||||
"lib-depends": [
|
"ext-depends": [
|
||||||
"libxml2"
|
"libxml",
|
||||||
],
|
"session"
|
||||||
"ext-depends-windows": [
|
|
||||||
"xml"
|
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"sockets": {
|
"sockets": {
|
||||||
@@ -700,8 +880,9 @@
|
|||||||
"BSD": "wip"
|
"BSD": "wip"
|
||||||
},
|
},
|
||||||
"type": "builtin",
|
"type": "builtin",
|
||||||
"arg-type": "with-prefix",
|
"arg-type": "with-path",
|
||||||
"arg-type-windows": "with",
|
"arg-type-windows": "with",
|
||||||
|
"build-with-php": true,
|
||||||
"lib-depends": [
|
"lib-depends": [
|
||||||
"sqlite"
|
"sqlite"
|
||||||
]
|
]
|
||||||
@@ -726,12 +907,12 @@
|
|||||||
},
|
},
|
||||||
"type": "external",
|
"type": "external",
|
||||||
"source": "ext-ssh2",
|
"source": "ext-ssh2",
|
||||||
"arg-type": "with-prefix",
|
"arg-type": "with-path",
|
||||||
"arg-type-windows": "with",
|
"arg-type-windows": "with",
|
||||||
"lib-depends": [
|
"lib-depends": [
|
||||||
"libssh2"
|
"libssh2"
|
||||||
],
|
],
|
||||||
"ext-depends-windows": [
|
"ext-depends": [
|
||||||
"openssl",
|
"openssl",
|
||||||
"zlib"
|
"zlib"
|
||||||
]
|
]
|
||||||
@@ -753,14 +934,23 @@
|
|||||||
"nghttp2",
|
"nghttp2",
|
||||||
"zlib"
|
"zlib"
|
||||||
],
|
],
|
||||||
|
"lib-suggests": [
|
||||||
|
"zstd"
|
||||||
|
],
|
||||||
|
"lib-suggests-linux": [
|
||||||
|
"zstd",
|
||||||
|
"liburing"
|
||||||
|
],
|
||||||
"ext-depends": [
|
"ext-depends": [
|
||||||
"openssl",
|
"openssl",
|
||||||
"curl"
|
"curl"
|
||||||
],
|
],
|
||||||
"ext-suggests": [
|
"ext-suggests": [
|
||||||
|
"sockets",
|
||||||
"swoole-hook-pgsql",
|
"swoole-hook-pgsql",
|
||||||
"swoole-hook-mysql",
|
"swoole-hook-mysql",
|
||||||
"swoole-hook-sqlite"
|
"swoole-hook-sqlite",
|
||||||
|
"swoole-hook-odbc"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"swoole-hook-mysql": {
|
"swoole-hook-mysql": {
|
||||||
@@ -770,16 +960,33 @@
|
|||||||
},
|
},
|
||||||
"notes": true,
|
"notes": true,
|
||||||
"type": "addon",
|
"type": "addon",
|
||||||
"arg-type": "custom",
|
"arg-type": "none",
|
||||||
"ext-depends": [
|
"ext-depends": [
|
||||||
"mysqlnd",
|
"mysqlnd",
|
||||||
"pdo",
|
"pdo",
|
||||||
"pdo_mysql"
|
"pdo_mysql",
|
||||||
|
"swoole"
|
||||||
],
|
],
|
||||||
"ext-suggests": [
|
"ext-suggests": [
|
||||||
"mysqli"
|
"mysqli"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
"swoole-hook-odbc": {
|
||||||
|
"support": {
|
||||||
|
"Windows": "no",
|
||||||
|
"BSD": "wip"
|
||||||
|
},
|
||||||
|
"notes": true,
|
||||||
|
"type": "addon",
|
||||||
|
"arg-type": "none",
|
||||||
|
"ext-depends": [
|
||||||
|
"pdo",
|
||||||
|
"swoole"
|
||||||
|
],
|
||||||
|
"lib-depends": [
|
||||||
|
"unixodbc"
|
||||||
|
]
|
||||||
|
},
|
||||||
"swoole-hook-pgsql": {
|
"swoole-hook-pgsql": {
|
||||||
"support": {
|
"support": {
|
||||||
"Windows": "no",
|
"Windows": "no",
|
||||||
@@ -788,10 +995,11 @@
|
|||||||
},
|
},
|
||||||
"notes": true,
|
"notes": true,
|
||||||
"type": "addon",
|
"type": "addon",
|
||||||
"arg-type": "custom",
|
"arg-type": "none",
|
||||||
"ext-depends": [
|
"ext-depends": [
|
||||||
"pgsql",
|
"pgsql",
|
||||||
"pdo"
|
"pdo",
|
||||||
|
"swoole"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"swoole-hook-sqlite": {
|
"swoole-hook-sqlite": {
|
||||||
@@ -801,10 +1009,11 @@
|
|||||||
},
|
},
|
||||||
"notes": true,
|
"notes": true,
|
||||||
"type": "addon",
|
"type": "addon",
|
||||||
"arg-type": "custom",
|
"arg-type": "none",
|
||||||
"ext-depends": [
|
"ext-depends": [
|
||||||
"sqlite3",
|
"sqlite3",
|
||||||
"pdo"
|
"pdo",
|
||||||
|
"swoole"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"swow": {
|
"swow": {
|
||||||
@@ -852,13 +1061,22 @@
|
|||||||
"BSD": "wip"
|
"BSD": "wip"
|
||||||
},
|
},
|
||||||
"type": "builtin",
|
"type": "builtin",
|
||||||
"arg-type": "with-prefix",
|
"arg-type": "with-path",
|
||||||
"lib-depends": [
|
"lib-depends": [
|
||||||
"tidy"
|
"tidy"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"tokenizer": {
|
"tokenizer": {
|
||||||
"type": "builtin"
|
"type": "builtin",
|
||||||
|
"build-with-php": true
|
||||||
|
},
|
||||||
|
"trader": {
|
||||||
|
"support": {
|
||||||
|
"BSD": "wip",
|
||||||
|
"Windows": "wip"
|
||||||
|
},
|
||||||
|
"type": "external",
|
||||||
|
"source": "ext-trader"
|
||||||
},
|
},
|
||||||
"uuid": {
|
"uuid": {
|
||||||
"support": {
|
"support": {
|
||||||
@@ -867,7 +1085,7 @@
|
|||||||
},
|
},
|
||||||
"type": "external",
|
"type": "external",
|
||||||
"source": "ext-uuid",
|
"source": "ext-uuid",
|
||||||
"arg-type": "with-prefix",
|
"arg-type": "with-path",
|
||||||
"lib-depends": [
|
"lib-depends": [
|
||||||
"libuuid"
|
"libuuid"
|
||||||
]
|
]
|
||||||
@@ -879,7 +1097,7 @@
|
|||||||
},
|
},
|
||||||
"type": "external",
|
"type": "external",
|
||||||
"source": "ext-uv",
|
"source": "ext-uv",
|
||||||
"arg-type": "with-prefix",
|
"arg-type": "with-path",
|
||||||
"lib-depends": [
|
"lib-depends": [
|
||||||
"libuv"
|
"libuv"
|
||||||
],
|
],
|
||||||
@@ -888,14 +1106,19 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"xdebug": {
|
"xdebug": {
|
||||||
"type": "builtin",
|
"type": "external",
|
||||||
|
"source": "xdebug",
|
||||||
|
"target": [
|
||||||
|
"shared"
|
||||||
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"Windows": "wip",
|
"Windows": "wip",
|
||||||
"BSD": "no",
|
"BSD": "no",
|
||||||
"Darwin": "no",
|
"Darwin": "partial",
|
||||||
"Linux": "no"
|
"Linux": "partial"
|
||||||
},
|
},
|
||||||
"notes": true
|
"notes": true,
|
||||||
|
"zend-extension": true
|
||||||
},
|
},
|
||||||
"xhprof": {
|
"xhprof": {
|
||||||
"support": {
|
"support": {
|
||||||
@@ -907,11 +1130,11 @@
|
|||||||
"source": "xhprof",
|
"source": "xhprof",
|
||||||
"ext-depends": [
|
"ext-depends": [
|
||||||
"ctype"
|
"ctype"
|
||||||
]
|
],
|
||||||
|
"build-with-php": true
|
||||||
},
|
},
|
||||||
"xlswriter": {
|
"xlswriter": {
|
||||||
"support": {
|
"support": {
|
||||||
"Windows": "wip",
|
|
||||||
"BSD": "wip"
|
"BSD": "wip"
|
||||||
},
|
},
|
||||||
"type": "external",
|
"type": "external",
|
||||||
@@ -938,7 +1161,8 @@
|
|||||||
],
|
],
|
||||||
"ext-depends-windows": [
|
"ext-depends-windows": [
|
||||||
"iconv"
|
"iconv"
|
||||||
]
|
],
|
||||||
|
"build-with-php": true
|
||||||
},
|
},
|
||||||
"xmlreader": {
|
"xmlreader": {
|
||||||
"support": {
|
"support": {
|
||||||
@@ -952,7 +1176,8 @@
|
|||||||
"ext-depends-windows": [
|
"ext-depends-windows": [
|
||||||
"xml",
|
"xml",
|
||||||
"dom"
|
"dom"
|
||||||
]
|
],
|
||||||
|
"build-with-php": true
|
||||||
},
|
},
|
||||||
"xmlwriter": {
|
"xmlwriter": {
|
||||||
"support": {
|
"support": {
|
||||||
@@ -965,7 +1190,8 @@
|
|||||||
],
|
],
|
||||||
"ext-depends-windows": [
|
"ext-depends-windows": [
|
||||||
"xml"
|
"xml"
|
||||||
]
|
],
|
||||||
|
"build-with-php": true
|
||||||
},
|
},
|
||||||
"xsl": {
|
"xsl": {
|
||||||
"support": {
|
"support": {
|
||||||
@@ -973,7 +1199,7 @@
|
|||||||
"BSD": "wip"
|
"BSD": "wip"
|
||||||
},
|
},
|
||||||
"type": "builtin",
|
"type": "builtin",
|
||||||
"arg-type": "with-prefix",
|
"arg-type": "with-path",
|
||||||
"lib-depends": [
|
"lib-depends": [
|
||||||
"libxslt"
|
"libxslt"
|
||||||
],
|
],
|
||||||
@@ -982,6 +1208,14 @@
|
|||||||
"dom"
|
"dom"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
"xz": {
|
||||||
|
"type": "external",
|
||||||
|
"source": "ext-xz",
|
||||||
|
"arg-type": "with",
|
||||||
|
"lib-depends": [
|
||||||
|
"xz"
|
||||||
|
]
|
||||||
|
},
|
||||||
"yac": {
|
"yac": {
|
||||||
"support": {
|
"support": {
|
||||||
"BSD": "wip"
|
"BSD": "wip"
|
||||||
@@ -989,6 +1223,9 @@
|
|||||||
"type": "external",
|
"type": "external",
|
||||||
"source": "yac",
|
"source": "yac",
|
||||||
"arg-type-unix": "custom",
|
"arg-type-unix": "custom",
|
||||||
|
"lib-depends-unix": [
|
||||||
|
"fastlz"
|
||||||
|
],
|
||||||
"ext-depends-unix": [
|
"ext-depends-unix": [
|
||||||
"igbinary"
|
"igbinary"
|
||||||
]
|
]
|
||||||
@@ -999,7 +1236,7 @@
|
|||||||
},
|
},
|
||||||
"type": "external",
|
"type": "external",
|
||||||
"source": "yaml",
|
"source": "yaml",
|
||||||
"arg-type-unix": "with-prefix",
|
"arg-type-unix": "with-path",
|
||||||
"arg-type-windows": "with",
|
"arg-type-windows": "with",
|
||||||
"lib-depends": [
|
"lib-depends": [
|
||||||
"libyaml"
|
"libyaml"
|
||||||
@@ -1009,8 +1246,9 @@
|
|||||||
"support": {
|
"support": {
|
||||||
"BSD": "wip"
|
"BSD": "wip"
|
||||||
},
|
},
|
||||||
"type": "builtin",
|
"type": "external",
|
||||||
"arg-type": "with-prefix",
|
"source": "ext-zip",
|
||||||
|
"arg-type": "custom",
|
||||||
"arg-type-windows": "enable",
|
"arg-type-windows": "enable",
|
||||||
"lib-depends-unix": [
|
"lib-depends-unix": [
|
||||||
"libzip"
|
"libzip"
|
||||||
@@ -1032,6 +1270,10 @@
|
|||||||
"arg-type-windows": "enable",
|
"arg-type-windows": "enable",
|
||||||
"lib-depends": [
|
"lib-depends": [
|
||||||
"zlib"
|
"zlib"
|
||||||
|
],
|
||||||
|
"build-with-php": true,
|
||||||
|
"target": [
|
||||||
|
"static"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"zstd": {
|
"zstd": {
|
||||||
|
|||||||
360
config/lib.json
360
config/lib.json
@@ -1,21 +1,35 @@
|
|||||||
{
|
{
|
||||||
"lib-base": {
|
"lib-base": {
|
||||||
"type": "root",
|
"type": "root"
|
||||||
"lib-depends-unix": [
|
|
||||||
"pkg-config"
|
|
||||||
]
|
|
||||||
},
|
},
|
||||||
"php": {
|
"php": {
|
||||||
"type": "root",
|
"type": "root",
|
||||||
"source": "php-src",
|
"source": "php-src",
|
||||||
"lib-depends": [
|
"lib-depends": [
|
||||||
"lib-base",
|
"lib-base",
|
||||||
"micro"
|
"micro",
|
||||||
|
"frankenphp"
|
||||||
|
],
|
||||||
|
"lib-depends-macos": [
|
||||||
|
"lib-base",
|
||||||
|
"micro",
|
||||||
|
"libxml2",
|
||||||
|
"frankenphp"
|
||||||
],
|
],
|
||||||
"lib-suggests-linux": [
|
"lib-suggests-linux": [
|
||||||
"libacl"
|
"libacl",
|
||||||
|
"brotli",
|
||||||
|
"watcher"
|
||||||
|
],
|
||||||
|
"lib-suggests-macos": [
|
||||||
|
"brotli",
|
||||||
|
"watcher"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
"frankenphp": {
|
||||||
|
"source": "frankenphp",
|
||||||
|
"type": "target"
|
||||||
|
},
|
||||||
"micro": {
|
"micro": {
|
||||||
"type": "target",
|
"type": "target",
|
||||||
"source": "micro"
|
"source": "micro"
|
||||||
@@ -35,10 +49,10 @@
|
|||||||
},
|
},
|
||||||
"brotli": {
|
"brotli": {
|
||||||
"source": "brotli",
|
"source": "brotli",
|
||||||
"static-libs-unix": [
|
"pkg-configs": [
|
||||||
"libbrotlidec.a",
|
"libbrotlicommon",
|
||||||
"libbrotlienc.a",
|
"libbrotlidec",
|
||||||
"libbrotlicommon.a"
|
"libbrotlienc"
|
||||||
],
|
],
|
||||||
"static-libs-windows": [
|
"static-libs-windows": [
|
||||||
"brotlicommon.lib",
|
"brotlicommon.lib",
|
||||||
@@ -68,7 +82,7 @@
|
|||||||
"libcurl.a"
|
"libcurl.a"
|
||||||
],
|
],
|
||||||
"static-libs-windows": [
|
"static-libs-windows": [
|
||||||
"libcurl.lib"
|
"libcurl_a.lib"
|
||||||
],
|
],
|
||||||
"headers": [
|
"headers": [
|
||||||
"curl"
|
"curl"
|
||||||
@@ -78,7 +92,6 @@
|
|||||||
"zlib"
|
"zlib"
|
||||||
],
|
],
|
||||||
"lib-depends-windows": [
|
"lib-depends-windows": [
|
||||||
"openssl",
|
|
||||||
"zlib",
|
"zlib",
|
||||||
"libssh2",
|
"libssh2",
|
||||||
"nghttp2"
|
"nghttp2"
|
||||||
@@ -87,8 +100,13 @@
|
|||||||
"libssh2",
|
"libssh2",
|
||||||
"brotli",
|
"brotli",
|
||||||
"nghttp2",
|
"nghttp2",
|
||||||
|
"nghttp3",
|
||||||
|
"ngtcp2",
|
||||||
"zstd",
|
"zstd",
|
||||||
"libcares"
|
"libcares",
|
||||||
|
"ldap",
|
||||||
|
"idn2",
|
||||||
|
"krb5"
|
||||||
],
|
],
|
||||||
"lib-suggests-windows": [
|
"lib-suggests-windows": [
|
||||||
"brotli",
|
"brotli",
|
||||||
@@ -100,6 +118,15 @@
|
|||||||
"SystemConfiguration"
|
"SystemConfiguration"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
"fastlz": {
|
||||||
|
"source": "fastlz",
|
||||||
|
"static-libs-unix": [
|
||||||
|
"libfastlz.a"
|
||||||
|
],
|
||||||
|
"headers": [
|
||||||
|
"fastlz/fastlz.h"
|
||||||
|
]
|
||||||
|
},
|
||||||
"freetype": {
|
"freetype": {
|
||||||
"source": "freetype",
|
"source": "freetype",
|
||||||
"static-libs-unix": [
|
"static-libs-unix": [
|
||||||
@@ -175,14 +202,15 @@
|
|||||||
},
|
},
|
||||||
"grpc": {
|
"grpc": {
|
||||||
"source": "grpc",
|
"source": "grpc",
|
||||||
"static-libs-unix": [
|
"pkg-configs": [
|
||||||
"libgrpc.a",
|
"grpc"
|
||||||
"libcares.a"
|
|
||||||
],
|
],
|
||||||
"lib-depends": [
|
"lib-depends": [
|
||||||
"zlib",
|
"zlib",
|
||||||
"openssl"
|
"openssl",
|
||||||
|
"libcares"
|
||||||
],
|
],
|
||||||
|
"cpp-library": true,
|
||||||
"frameworks": [
|
"frameworks": [
|
||||||
"CoreFoundation"
|
"CoreFoundation"
|
||||||
]
|
]
|
||||||
@@ -190,33 +218,64 @@
|
|||||||
"icu": {
|
"icu": {
|
||||||
"source": "icu",
|
"source": "icu",
|
||||||
"cpp-library": true,
|
"cpp-library": true,
|
||||||
"static-libs-unix": [
|
"pkg-configs": [
|
||||||
"libicui18n.a",
|
"icu-uc",
|
||||||
"libicuio.a",
|
"icu-i18n",
|
||||||
"libicuuc.a",
|
"icu-io"
|
||||||
"libicudata.a"
|
]
|
||||||
|
},
|
||||||
|
"icu-static-win": {
|
||||||
|
"source": "icu-static-win",
|
||||||
|
"static-libs-windows": [
|
||||||
|
"icudt.lib",
|
||||||
|
"icuin.lib",
|
||||||
|
"icuio.lib",
|
||||||
|
"icuuc.lib"
|
||||||
|
],
|
||||||
|
"headers-windows": [
|
||||||
|
"unicode"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"idn2": {
|
||||||
|
"source": "libidn2",
|
||||||
|
"pkg-configs": [
|
||||||
|
"libidn2"
|
||||||
|
],
|
||||||
|
"headers": [
|
||||||
|
"idn2.h"
|
||||||
|
],
|
||||||
|
"lib-suggests-unix": [
|
||||||
|
"libiconv",
|
||||||
|
"gettext",
|
||||||
|
"libunistring"
|
||||||
|
],
|
||||||
|
"lib-depends-macos": [
|
||||||
|
"libiconv",
|
||||||
|
"gettext"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"imagemagick": {
|
"imagemagick": {
|
||||||
"source": "imagemagick",
|
"source": "imagemagick",
|
||||||
"static-libs-unix": [
|
"cpp-library": true,
|
||||||
"libMagick++-7.Q16HDRI.a",
|
"pkg-configs": [
|
||||||
"libMagickWand-7.Q16HDRI.a",
|
"Magick++-7.Q16HDRI",
|
||||||
"libMagickCore-7.Q16HDRI.a"
|
"MagickCore-7.Q16HDRI",
|
||||||
|
"MagickWand-7.Q16HDRI"
|
||||||
],
|
],
|
||||||
"lib-depends": [
|
"lib-depends": [
|
||||||
"zlib",
|
"zlib",
|
||||||
"libpng",
|
|
||||||
"libjpeg",
|
"libjpeg",
|
||||||
|
"libjxl",
|
||||||
|
"libpng",
|
||||||
"libwebp",
|
"libwebp",
|
||||||
"freetype",
|
"freetype",
|
||||||
"libtiff",
|
"libtiff",
|
||||||
"libheif"
|
"libheif",
|
||||||
|
"bzip2"
|
||||||
],
|
],
|
||||||
"lib-suggests": [
|
"lib-suggests": [
|
||||||
"zstd",
|
"zstd",
|
||||||
"xz",
|
"xz",
|
||||||
"bzip2",
|
|
||||||
"libzip",
|
"libzip",
|
||||||
"libxml2"
|
"libxml2"
|
||||||
]
|
]
|
||||||
@@ -230,11 +289,43 @@
|
|||||||
"openssl"
|
"openssl"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
"jbig": {
|
||||||
|
"source": "jbig",
|
||||||
|
"static-libs-unix": [
|
||||||
|
"libjbig.a",
|
||||||
|
"libjbig85.a"
|
||||||
|
],
|
||||||
|
"headers": [
|
||||||
|
"jbig.h",
|
||||||
|
"jbig85.h",
|
||||||
|
"jbig_ar.h"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"krb5": {
|
||||||
|
"source": "krb5",
|
||||||
|
"pkg-configs": [
|
||||||
|
"krb5-gssapi"
|
||||||
|
],
|
||||||
|
"headers": [
|
||||||
|
"krb5.h",
|
||||||
|
"gssapi/gssapi.h"
|
||||||
|
],
|
||||||
|
"lib-depends": [
|
||||||
|
"openssl"
|
||||||
|
],
|
||||||
|
"lib-suggests": [
|
||||||
|
"ldap",
|
||||||
|
"libedit"
|
||||||
|
],
|
||||||
|
"frameworks": [
|
||||||
|
"Kerberos"
|
||||||
|
]
|
||||||
|
},
|
||||||
"ldap": {
|
"ldap": {
|
||||||
"source": "ldap",
|
"source": "ldap",
|
||||||
"static-libs-unix": [
|
"pkg-configs": [
|
||||||
"liblber.a",
|
"ldap",
|
||||||
"libldap.a"
|
"lber"
|
||||||
],
|
],
|
||||||
"lib-depends": [
|
"lib-depends": [
|
||||||
"openssl",
|
"openssl",
|
||||||
@@ -243,6 +334,13 @@
|
|||||||
"libsodium"
|
"libsodium"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
"lerc": {
|
||||||
|
"source": "lerc",
|
||||||
|
"static-libs-unix": [
|
||||||
|
"libLerc.a"
|
||||||
|
],
|
||||||
|
"cpp-library": true
|
||||||
|
},
|
||||||
"libacl": {
|
"libacl": {
|
||||||
"source": "libacl",
|
"source": "libacl",
|
||||||
"static-libs-unix": [
|
"static-libs-unix": [
|
||||||
@@ -263,6 +361,9 @@
|
|||||||
"source": "libargon2",
|
"source": "libargon2",
|
||||||
"static-libs-unix": [
|
"static-libs-unix": [
|
||||||
"libargon2.a"
|
"libargon2.a"
|
||||||
|
],
|
||||||
|
"lib-suggests": [
|
||||||
|
"libsodium"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"libavif": {
|
"libavif": {
|
||||||
@@ -282,8 +383,7 @@
|
|||||||
"headers-unix": [
|
"headers-unix": [
|
||||||
"ares.h",
|
"ares.h",
|
||||||
"ares_dns.h",
|
"ares_dns.h",
|
||||||
"ares_nameser.h",
|
"ares_nameser.h"
|
||||||
"ares_rules.h"
|
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"libde265": {
|
"libde265": {
|
||||||
@@ -293,6 +393,15 @@
|
|||||||
],
|
],
|
||||||
"cpp-library": true
|
"cpp-library": true
|
||||||
},
|
},
|
||||||
|
"libedit": {
|
||||||
|
"source": "libedit",
|
||||||
|
"static-libs-unix": [
|
||||||
|
"libedit.a"
|
||||||
|
],
|
||||||
|
"lib-depends": [
|
||||||
|
"ncurses"
|
||||||
|
]
|
||||||
|
},
|
||||||
"libevent": {
|
"libevent": {
|
||||||
"source": "libevent",
|
"source": "libevent",
|
||||||
"static-libs-unix": [
|
"static-libs-unix": [
|
||||||
@@ -379,17 +488,45 @@
|
|||||||
"zlib"
|
"zlib"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
"libjxl": {
|
||||||
|
"source": "libjxl",
|
||||||
|
"pkg-configs": [
|
||||||
|
"libjxl",
|
||||||
|
"libjxl_cms",
|
||||||
|
"libjxl_threads",
|
||||||
|
"libhwy"
|
||||||
|
],
|
||||||
|
"lib-depends": [
|
||||||
|
"brotli",
|
||||||
|
"libjpeg",
|
||||||
|
"libpng",
|
||||||
|
"libwebp"
|
||||||
|
]
|
||||||
|
},
|
||||||
"liblz4": {
|
"liblz4": {
|
||||||
"source": "liblz4",
|
"source": "liblz4",
|
||||||
"static-libs-unix": [
|
"static-libs-unix": [
|
||||||
"liblz4.a"
|
"liblz4.a"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
"libmaxminddb": {
|
||||||
|
"source": "libmaxminddb",
|
||||||
|
"static-libs-unix": [
|
||||||
|
"libmaxminddb.a"
|
||||||
|
],
|
||||||
|
"headers": [
|
||||||
|
"maxminddb.h",
|
||||||
|
"maxminddb_config.h"
|
||||||
|
]
|
||||||
|
},
|
||||||
"libmemcached": {
|
"libmemcached": {
|
||||||
"source": "libmemcached",
|
"source": "libmemcached",
|
||||||
|
"cpp-library": true,
|
||||||
"static-libs-unix": [
|
"static-libs-unix": [
|
||||||
"libmemcached.a",
|
"libmemcached.a",
|
||||||
"libmemcachedutil.a"
|
"libmemcachedprotocol.a",
|
||||||
|
"libmemcachedutil.a",
|
||||||
|
"libhashkit.a"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"libpng": {
|
"libpng": {
|
||||||
@@ -428,13 +565,16 @@
|
|||||||
},
|
},
|
||||||
"librdkafka": {
|
"librdkafka": {
|
||||||
"source": "librdkafka",
|
"source": "librdkafka",
|
||||||
"static-libs-unix": [
|
"pkg-configs": [
|
||||||
"librdkafka.a",
|
"rdkafka++-static",
|
||||||
"librdkafka++.a",
|
"rdkafka-static"
|
||||||
"librdkafka-static.a"
|
|
||||||
],
|
],
|
||||||
"cpp-library": true,
|
"cpp-library": true,
|
||||||
"lib-suggests": [
|
"lib-suggests": [
|
||||||
|
"curl",
|
||||||
|
"liblz4",
|
||||||
|
"openssl",
|
||||||
|
"zlib",
|
||||||
"zstd"
|
"zstd"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
@@ -462,9 +602,6 @@
|
|||||||
],
|
],
|
||||||
"lib-depends": [
|
"lib-depends": [
|
||||||
"openssl"
|
"openssl"
|
||||||
],
|
|
||||||
"lib-suggests": [
|
|
||||||
"zlib"
|
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"libtiff": {
|
"libtiff": {
|
||||||
@@ -475,6 +612,38 @@
|
|||||||
"lib-depends": [
|
"lib-depends": [
|
||||||
"zlib",
|
"zlib",
|
||||||
"libjpeg"
|
"libjpeg"
|
||||||
|
],
|
||||||
|
"lib-suggests-unix": [
|
||||||
|
"lerc",
|
||||||
|
"libwebp",
|
||||||
|
"jbig",
|
||||||
|
"xz",
|
||||||
|
"zstd"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"libunistring": {
|
||||||
|
"source": "libunistring",
|
||||||
|
"static-libs-unix": [
|
||||||
|
"libunistring.a"
|
||||||
|
],
|
||||||
|
"headers": [
|
||||||
|
"unistr.h",
|
||||||
|
"unistring/"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"liburing": {
|
||||||
|
"source": "liburing",
|
||||||
|
"pkg-configs": [
|
||||||
|
"liburing",
|
||||||
|
"liburing-ffi"
|
||||||
|
],
|
||||||
|
"static-libs-linux": [
|
||||||
|
"liburing.a",
|
||||||
|
"liburing-ffi.a"
|
||||||
|
],
|
||||||
|
"headers-linux": [
|
||||||
|
"liburing/",
|
||||||
|
"liburing.h"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"libuuid": {
|
"libuuid": {
|
||||||
@@ -494,12 +663,12 @@
|
|||||||
},
|
},
|
||||||
"libwebp": {
|
"libwebp": {
|
||||||
"source": "libwebp",
|
"source": "libwebp",
|
||||||
"static-libs-unix": [
|
"pkg-configs": [
|
||||||
"libwebp.a",
|
"libwebp",
|
||||||
"libwebpdecoder.a",
|
"libwebpdecoder",
|
||||||
"libwebpdemux.a",
|
"libwebpdemux",
|
||||||
"libwebpmux.a",
|
"libwebpmux",
|
||||||
"libsharpyuv.a"
|
"libsharpyuv"
|
||||||
],
|
],
|
||||||
"static-libs-windows": [
|
"static-libs-windows": [
|
||||||
"libwebp.lib",
|
"libwebp.lib",
|
||||||
@@ -510,8 +679,8 @@
|
|||||||
},
|
},
|
||||||
"libxml2": {
|
"libxml2": {
|
||||||
"source": "libxml2",
|
"source": "libxml2",
|
||||||
"static-libs-unix": [
|
"pkg-configs": [
|
||||||
"libxml2.a"
|
"libxml-2.0"
|
||||||
],
|
],
|
||||||
"static-libs-windows": [
|
"static-libs-windows": [
|
||||||
"libxml2s.lib",
|
"libxml2s.lib",
|
||||||
@@ -525,7 +694,6 @@
|
|||||||
],
|
],
|
||||||
"lib-suggests-unix": [
|
"lib-suggests-unix": [
|
||||||
"xz",
|
"xz",
|
||||||
"icu",
|
|
||||||
"zlib"
|
"zlib"
|
||||||
],
|
],
|
||||||
"lib-depends-windows": [
|
"lib-depends-windows": [
|
||||||
@@ -589,12 +757,29 @@
|
|||||||
"openssl"
|
"openssl"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
"mimalloc": {
|
||||||
|
"source": "mimalloc",
|
||||||
|
"static-libs-unix": [
|
||||||
|
"libmimalloc.a"
|
||||||
|
]
|
||||||
|
},
|
||||||
"ncurses": {
|
"ncurses": {
|
||||||
"source": "ncurses",
|
"source": "ncurses",
|
||||||
"static-libs-unix": [
|
"static-libs-unix": [
|
||||||
"libncurses.a"
|
"libncurses.a"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
"net-snmp": {
|
||||||
|
"source": "net-snmp",
|
||||||
|
"pkg-configs": [
|
||||||
|
"netsnmp",
|
||||||
|
"netsnmp-agent"
|
||||||
|
],
|
||||||
|
"lib-depends": [
|
||||||
|
"openssl",
|
||||||
|
"zlib"
|
||||||
|
]
|
||||||
|
},
|
||||||
"nghttp2": {
|
"nghttp2": {
|
||||||
"source": "nghttp2",
|
"source": "nghttp2",
|
||||||
"static-libs-unix": [
|
"static-libs-unix": [
|
||||||
@@ -611,7 +796,45 @@
|
|||||||
"openssl"
|
"openssl"
|
||||||
],
|
],
|
||||||
"lib-suggests": [
|
"lib-suggests": [
|
||||||
"libxml2"
|
"libxml2",
|
||||||
|
"nghttp3",
|
||||||
|
"ngtcp2"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"nghttp3": {
|
||||||
|
"source": "nghttp3",
|
||||||
|
"static-libs-unix": [
|
||||||
|
"libnghttp3.a"
|
||||||
|
],
|
||||||
|
"static-libs-windows": [
|
||||||
|
"nghttp3.lib"
|
||||||
|
],
|
||||||
|
"headers": [
|
||||||
|
"nghttp3"
|
||||||
|
],
|
||||||
|
"lib-depends": [
|
||||||
|
"openssl"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"ngtcp2": {
|
||||||
|
"source": "ngtcp2",
|
||||||
|
"static-libs-unix": [
|
||||||
|
"libngtcp2.a",
|
||||||
|
"libngtcp2_crypto_ossl.a"
|
||||||
|
],
|
||||||
|
"static-libs-windows": [
|
||||||
|
"ngtcp2.lib",
|
||||||
|
"ngtcp2_crypto_ossl.lib"
|
||||||
|
],
|
||||||
|
"headers": [
|
||||||
|
"ngtcp2"
|
||||||
|
],
|
||||||
|
"lib-depends": [
|
||||||
|
"openssl"
|
||||||
|
],
|
||||||
|
"lib-suggests": [
|
||||||
|
"nghttp3",
|
||||||
|
"brotli"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"onig": {
|
"onig": {
|
||||||
@@ -647,17 +870,15 @@
|
|||||||
},
|
},
|
||||||
"postgresql": {
|
"postgresql": {
|
||||||
"source": "postgresql",
|
"source": "postgresql",
|
||||||
"static-libs-unix": [
|
"pkg-configs": [
|
||||||
"libpq.a",
|
"libpq"
|
||||||
"libpgport.a",
|
|
||||||
"libpgcommon.a"
|
|
||||||
],
|
],
|
||||||
"lib-depends": [
|
"lib-depends": [
|
||||||
"libiconv",
|
"libiconv",
|
||||||
"libxml2",
|
"libxml2",
|
||||||
"openssl",
|
"openssl",
|
||||||
"zlib",
|
"zlib",
|
||||||
"readline"
|
"libedit"
|
||||||
],
|
],
|
||||||
"lib-suggests": [
|
"lib-suggests": [
|
||||||
"icu",
|
"icu",
|
||||||
@@ -666,6 +887,14 @@
|
|||||||
"zstd"
|
"zstd"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
"postgresql-win": {
|
||||||
|
"source": "postgresql-win",
|
||||||
|
"static-libs": [
|
||||||
|
"libpq.lib",
|
||||||
|
"libpgport.lib",
|
||||||
|
"libpgcommon.lib"
|
||||||
|
]
|
||||||
|
},
|
||||||
"pthreads4w": {
|
"pthreads4w": {
|
||||||
"source": "pthreads4w",
|
"source": "pthreads4w",
|
||||||
"static-libs-windows": [
|
"static-libs-windows": [
|
||||||
@@ -684,6 +913,12 @@
|
|||||||
"depot.h"
|
"depot.h"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
"re2c": {
|
||||||
|
"source": "re2c",
|
||||||
|
"bin-unix": [
|
||||||
|
"re2c"
|
||||||
|
]
|
||||||
|
},
|
||||||
"readline": {
|
"readline": {
|
||||||
"source": "readline",
|
"source": "readline",
|
||||||
"static-libs-unix": [
|
"static-libs-unix": [
|
||||||
@@ -695,6 +930,7 @@
|
|||||||
},
|
},
|
||||||
"snappy": {
|
"snappy": {
|
||||||
"source": "snappy",
|
"source": "snappy",
|
||||||
|
"cpp-library": true,
|
||||||
"static-libs-unix": [
|
"static-libs-unix": [
|
||||||
"libsnappy.a"
|
"libsnappy.a"
|
||||||
],
|
],
|
||||||
@@ -738,6 +974,16 @@
|
|||||||
"libiconv"
|
"libiconv"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
"watcher": {
|
||||||
|
"source": "watcher",
|
||||||
|
"cpp-library": true,
|
||||||
|
"static-libs-unix": [
|
||||||
|
"libwatcher-c.a"
|
||||||
|
],
|
||||||
|
"headers": [
|
||||||
|
"wtr/watcher-c.h"
|
||||||
|
]
|
||||||
|
},
|
||||||
"xz": {
|
"xz": {
|
||||||
"source": "xz",
|
"source": "xz",
|
||||||
"static-libs-unix": [
|
"static-libs-unix": [
|
||||||
|
|||||||
@@ -1,4 +1,16 @@
|
|||||||
{
|
{
|
||||||
|
"go-xcaddy-aarch64-linux": {
|
||||||
|
"type": "custom"
|
||||||
|
},
|
||||||
|
"go-xcaddy-aarch64-macos": {
|
||||||
|
"type": "custom"
|
||||||
|
},
|
||||||
|
"go-xcaddy-x86_64-linux": {
|
||||||
|
"type": "custom"
|
||||||
|
},
|
||||||
|
"go-xcaddy-x86_64-macos": {
|
||||||
|
"type": "custom"
|
||||||
|
},
|
||||||
"musl-toolchain-aarch64-linux": {
|
"musl-toolchain-aarch64-linux": {
|
||||||
"type": "url",
|
"type": "url",
|
||||||
"url": "https://dl.static-php.dev/static-php-cli/deps/musl-toolchain/aarch64-musl-toolchain.tgz"
|
"url": "https://dl.static-php.dev/static-php-cli/deps/musl-toolchain/aarch64-musl-toolchain.tgz"
|
||||||
@@ -9,10 +21,42 @@
|
|||||||
},
|
},
|
||||||
"nasm-x86_64-win": {
|
"nasm-x86_64-win": {
|
||||||
"type": "url",
|
"type": "url",
|
||||||
"url": "https://www.nasm.us/pub/nasm/releasebuilds/2.16.01/win64/nasm-2.16.01-win64.zip",
|
"url": "https://dl.static-php.dev/static-php-cli/deps/nasm/nasm-2.16.01-win64.zip",
|
||||||
"extract-files": {
|
"extract-files": {
|
||||||
"nasm-2.16.01/nasm.exe": "{php_sdk_path}/bin/nasm.exe",
|
"nasm.exe": "{php_sdk_path}/bin/nasm.exe",
|
||||||
"nasm-2.16.01/ndisasm.exe": "{php_sdk_path}/bin/ndisasm.exe"
|
"ndisasm.exe": "{php_sdk_path}/bin/ndisasm.exe"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"pkg-config-aarch64-linux": {
|
||||||
|
"type": "ghrel",
|
||||||
|
"repo": "static-php/static-php-cli-hosted",
|
||||||
|
"match": "pkg-config-aarch64-linux-musl-1.2.5.txz",
|
||||||
|
"extract-files": {
|
||||||
|
"bin/pkg-config": "{pkg_root_path}/bin/pkg-config"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"pkg-config-aarch64-macos": {
|
||||||
|
"type": "ghrel",
|
||||||
|
"repo": "static-php/static-php-cli-hosted",
|
||||||
|
"match": "pkg-config-aarch64-darwin.txz",
|
||||||
|
"extract-files": {
|
||||||
|
"bin/pkg-config": "{pkg_root_path}/bin/pkg-config"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"pkg-config-x86_64-linux": {
|
||||||
|
"type": "ghrel",
|
||||||
|
"repo": "static-php/static-php-cli-hosted",
|
||||||
|
"match": "pkg-config-x86_64-linux-musl-1.2.5.txz",
|
||||||
|
"extract-files": {
|
||||||
|
"bin/pkg-config": "{pkg_root_path}/bin/pkg-config"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"pkg-config-x86_64-macos": {
|
||||||
|
"type": "ghrel",
|
||||||
|
"repo": "static-php/static-php-cli-hosted",
|
||||||
|
"match": "pkg-config-x86_64-darwin.txz",
|
||||||
|
"extract-files": {
|
||||||
|
"bin/pkg-config": "{pkg_root_path}/bin/pkg-config"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"strawberry-perl-x86_64-win": {
|
"strawberry-perl-x86_64-win": {
|
||||||
@@ -40,7 +84,22 @@
|
|||||||
"repo": "upx/upx",
|
"repo": "upx/upx",
|
||||||
"match": "upx.+-win64\\.zip",
|
"match": "upx.+-win64\\.zip",
|
||||||
"extract-files": {
|
"extract-files": {
|
||||||
"upx-*-win64/upx.exe": "{pkg_root_path}/bin/upx.exe"
|
"upx.exe": "{pkg_root_path}/bin/upx.exe"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"zig-aarch64-linux": {
|
||||||
|
"type": "custom"
|
||||||
|
},
|
||||||
|
"zig-aarch64-macos": {
|
||||||
|
"type": "custom"
|
||||||
|
},
|
||||||
|
"zig-x86_64-linux": {
|
||||||
|
"type": "custom"
|
||||||
|
},
|
||||||
|
"zig-x86_64-macos": {
|
||||||
|
"type": "custom"
|
||||||
|
},
|
||||||
|
"zig-x86_64-win": {
|
||||||
|
"type": "custom"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
{
|
{
|
||||||
"repo": "static-php/static-php-cli-hosted",
|
"repo": "static-php/static-php-cli-hosted",
|
||||||
"prefer-stable": true,
|
"prefer-stable": true,
|
||||||
"match-pattern": "{name}-{arch}-{os}.txz",
|
"match-pattern-linux": "{name}-{arch}-{os}-{libc}-{libcver}.txz",
|
||||||
"suffix": "txz"
|
"match-pattern-macos": "{name}-{arch}-{os}.txz",
|
||||||
}
|
"match-pattern-windows": "{name}-{arch}-{os}.tgz"
|
||||||
|
}
|
||||||
|
|||||||
@@ -4,7 +4,8 @@
|
|||||||
"license": {
|
"license": {
|
||||||
"type": "file",
|
"type": "file",
|
||||||
"path": "LICENSE"
|
"path": "LICENSE"
|
||||||
}
|
},
|
||||||
|
"alt": false
|
||||||
},
|
},
|
||||||
"amqp": {
|
"amqp": {
|
||||||
"type": "url",
|
"type": "url",
|
||||||
@@ -37,18 +38,22 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"attr": {
|
"attr": {
|
||||||
"type": "git",
|
"alt": {
|
||||||
"rev": "v2.5.2",
|
"type": "url",
|
||||||
"url": "https://git.savannah.nongnu.org/git/attr.git",
|
"url": "https://mirror.souseiseki.middlendian.com/nongnu/attr/attr-2.5.2.tar.gz"
|
||||||
|
},
|
||||||
|
"type": "url",
|
||||||
|
"url": "https://download.savannah.nongnu.org/releases/attr/attr-2.5.2.tar.gz",
|
||||||
"provide-pre-built": true,
|
"provide-pre-built": true,
|
||||||
"license": {
|
"license": {
|
||||||
"type": "file",
|
"type": "file",
|
||||||
"path": "doc/COPYING"
|
"path": "doc/COPYING.LGPL"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"brotli": {
|
"brotli": {
|
||||||
"type": "ghtar",
|
"type": "ghtagtar",
|
||||||
"repo": "google/brotli",
|
"repo": "google/brotli",
|
||||||
|
"match": "v1\\.\\d.*",
|
||||||
"provide-pre-built": true,
|
"provide-pre-built": true,
|
||||||
"license": {
|
"license": {
|
||||||
"type": "file",
|
"type": "file",
|
||||||
@@ -89,6 +94,26 @@
|
|||||||
"path": "LICENSE"
|
"path": "LICENSE"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"ev": {
|
||||||
|
"type": "url",
|
||||||
|
"url": "https://pecl.php.net/get/ev",
|
||||||
|
"path": "php-src/ext/ev",
|
||||||
|
"filename": "ev.tgz",
|
||||||
|
"license": {
|
||||||
|
"type": "file",
|
||||||
|
"path": "LICENSE"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"ext-brotli": {
|
||||||
|
"type": "git",
|
||||||
|
"path": "php-src/ext/brotli",
|
||||||
|
"rev": "master",
|
||||||
|
"url": "https://github.com/kjdev/php-ext-brotli",
|
||||||
|
"license": {
|
||||||
|
"type": "file",
|
||||||
|
"path": "LICENSE"
|
||||||
|
}
|
||||||
|
},
|
||||||
"ext-ds": {
|
"ext-ds": {
|
||||||
"type": "url",
|
"type": "url",
|
||||||
"url": "https://pecl.php.net/get/ds",
|
"url": "https://pecl.php.net/get/ds",
|
||||||
@@ -101,13 +126,23 @@
|
|||||||
},
|
},
|
||||||
"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.1.4.tar.gz",
|
||||||
"path": "php-src/ext/event",
|
"path": "php-src/ext/event",
|
||||||
"license": {
|
"license": {
|
||||||
"type": "file",
|
"type": "file",
|
||||||
"path": "LICENSE"
|
"path": "LICENSE"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"ext-excimer": {
|
||||||
|
"type": "url",
|
||||||
|
"url": "https://pecl.php.net/get/excimer",
|
||||||
|
"path": "php-src/ext/excimer",
|
||||||
|
"filename": "excimer.tgz",
|
||||||
|
"license": {
|
||||||
|
"type": "file",
|
||||||
|
"path": "LICENSE"
|
||||||
|
}
|
||||||
|
},
|
||||||
"ext-glfw": {
|
"ext-glfw": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/mario-deluna/php-glfw",
|
"url": "https://github.com/mario-deluna/php-glfw",
|
||||||
@@ -126,6 +161,18 @@
|
|||||||
"path": "LICENSE"
|
"path": "LICENSE"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"ext-grpc": {
|
||||||
|
"type": "url",
|
||||||
|
"url": "https://pecl.php.net/get/grpc",
|
||||||
|
"path": "php-src/ext/grpc",
|
||||||
|
"filename": "grpc.tgz",
|
||||||
|
"license": {
|
||||||
|
"type": "file",
|
||||||
|
"path": [
|
||||||
|
"LICENSE"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
"ext-imagick": {
|
"ext-imagick": {
|
||||||
"type": "url",
|
"type": "url",
|
||||||
"url": "https://pecl.php.net/get/imagick",
|
"url": "https://pecl.php.net/get/imagick",
|
||||||
@@ -148,6 +195,26 @@
|
|||||||
]
|
]
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"ext-lz4": {
|
||||||
|
"type": "ghtagtar",
|
||||||
|
"repo": "kjdev/php-ext-lz4",
|
||||||
|
"path": "php-src/ext/lz4",
|
||||||
|
"license": {
|
||||||
|
"type": "file",
|
||||||
|
"path": [
|
||||||
|
"LICENSE"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"ext-maxminddb": {
|
||||||
|
"type": "url",
|
||||||
|
"url": "https://pecl.php.net/get/maxminddb",
|
||||||
|
"filename": "ext-maxminddb.tgz",
|
||||||
|
"license": {
|
||||||
|
"type": "file",
|
||||||
|
"path": "LICENSE"
|
||||||
|
}
|
||||||
|
},
|
||||||
"ext-memcache": {
|
"ext-memcache": {
|
||||||
"type": "url",
|
"type": "url",
|
||||||
"url": "https://pecl.php.net/get/memcache",
|
"url": "https://pecl.php.net/get/memcache",
|
||||||
@@ -197,6 +264,16 @@
|
|||||||
"path": "LICENSE"
|
"path": "LICENSE"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"ext-trader": {
|
||||||
|
"type": "url",
|
||||||
|
"url": "https://pecl.php.net/get/trader",
|
||||||
|
"path": "php-src/ext/trader",
|
||||||
|
"filename": "trader.tgz",
|
||||||
|
"license": {
|
||||||
|
"type": "file",
|
||||||
|
"path": "LICENSE"
|
||||||
|
}
|
||||||
|
},
|
||||||
"ext-uuid": {
|
"ext-uuid": {
|
||||||
"type": "url",
|
"type": "url",
|
||||||
"url": "https://pecl.php.net/get/uuid",
|
"url": "https://pecl.php.net/get/uuid",
|
||||||
@@ -217,6 +294,25 @@
|
|||||||
"path": "LICENSE"
|
"path": "LICENSE"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"ext-xz": {
|
||||||
|
"type": "git",
|
||||||
|
"path": "php-src/ext/xz",
|
||||||
|
"rev": "main",
|
||||||
|
"url": "https://github.com/codemasher/php-ext-xz",
|
||||||
|
"license": {
|
||||||
|
"type": "file",
|
||||||
|
"path": "LICENSE"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"ext-zip": {
|
||||||
|
"type": "url",
|
||||||
|
"url": "https://pecl.php.net/get/zip",
|
||||||
|
"filename": "ext-zip.tgz",
|
||||||
|
"license": {
|
||||||
|
"type": "file",
|
||||||
|
"path": "LICENSE"
|
||||||
|
}
|
||||||
|
},
|
||||||
"ext-zstd": {
|
"ext-zstd": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"path": "php-src/ext/zstd",
|
"path": "php-src/ext/zstd",
|
||||||
@@ -227,10 +323,28 @@
|
|||||||
"path": "LICENSE"
|
"path": "LICENSE"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"freetype": {
|
"fastlz": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"rev": "VER-2-13-2",
|
"url": "https://github.com/ariya/FastLZ.git",
|
||||||
"url": "https://github.com/freetype/freetype",
|
"rev": "master",
|
||||||
|
"license": {
|
||||||
|
"type": "file",
|
||||||
|
"path": "LICENSE.MIT"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"frankenphp": {
|
||||||
|
"type": "ghtar",
|
||||||
|
"repo": "php/frankenphp",
|
||||||
|
"prefer-stable": true,
|
||||||
|
"license": {
|
||||||
|
"type": "file",
|
||||||
|
"path": "LICENSE"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"freetype": {
|
||||||
|
"type": "ghtagtar",
|
||||||
|
"repo": "freetype/freetype",
|
||||||
|
"match": "VER-2-\\d+-\\d+",
|
||||||
"license": {
|
"license": {
|
||||||
"type": "file",
|
"type": "file",
|
||||||
"path": "LICENSE.TXT"
|
"path": "LICENSE.TXT"
|
||||||
@@ -242,16 +356,17 @@
|
|||||||
"regex": "/href=\"(?<file>gettext-(?<version>[^\"]+)\\.tar\\.xz)\"/",
|
"regex": "/href=\"(?<file>gettext-(?<version>[^\"]+)\\.tar\\.xz)\"/",
|
||||||
"license": {
|
"license": {
|
||||||
"type": "file",
|
"type": "file",
|
||||||
"path": "COPYING"
|
"path": "gettext-runtime/intl/COPYING.LIB"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"gmp": {
|
"gmp": {
|
||||||
"type": "url",
|
"type": "filelist",
|
||||||
"url": "https://dl.static-php.dev/static-php-cli/deps/gmp/gmp-6.3.0.tar.xz",
|
"url": "https://gmplib.org/download/gmp/",
|
||||||
|
"regex": "/href=\"(?<file>gmp-(?<version>[^\"]+)\\.tar\\.xz)\"/",
|
||||||
"provide-pre-built": true,
|
"provide-pre-built": true,
|
||||||
"alt": {
|
"alt": {
|
||||||
"type": "ghtagtar",
|
"type": "url",
|
||||||
"repo": "alisw/GMP"
|
"url": "https://dl.static-php.dev/static-php-cli/deps/gmp/gmp-6.3.0.tar.xz"
|
||||||
},
|
},
|
||||||
"license": {
|
"license": {
|
||||||
"type": "text",
|
"type": "text",
|
||||||
@@ -269,7 +384,7 @@
|
|||||||
},
|
},
|
||||||
"grpc": {
|
"grpc": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"rev": "v1.68.x",
|
"rev": "v1.75.x",
|
||||||
"url": "https://github.com/grpc/grpc.git",
|
"url": "https://github.com/grpc/grpc.git",
|
||||||
"provide-pre-built": true,
|
"provide-pre-built": true,
|
||||||
"license": {
|
"license": {
|
||||||
@@ -288,6 +403,14 @@
|
|||||||
"path": "LICENSE"
|
"path": "LICENSE"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"icu-static-win": {
|
||||||
|
"type": "url",
|
||||||
|
"url": "https://dl.static-php.dev/static-php-cli/deps/icu-static-windows-x64/icu-static-windows-x64.zip",
|
||||||
|
"license": {
|
||||||
|
"type": "text",
|
||||||
|
"text": "none"
|
||||||
|
}
|
||||||
|
},
|
||||||
"igbinary": {
|
"igbinary": {
|
||||||
"type": "url",
|
"type": "url",
|
||||||
"url": "https://pecl.php.net/get/igbinary",
|
"url": "https://pecl.php.net/get/igbinary",
|
||||||
@@ -325,6 +448,29 @@
|
|||||||
"path": "LICENSE"
|
"path": "LICENSE"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"jbig": {
|
||||||
|
"type": "url",
|
||||||
|
"url": "https://dl.static-php.dev/static-php-cli/deps/jbig/jbigkit-2.1.tar.gz",
|
||||||
|
"provide-pre-built": true,
|
||||||
|
"alt": {
|
||||||
|
"type": "url",
|
||||||
|
"url": "https://www.cl.cam.ac.uk/~mgk25/jbigkit/download/jbigkit-2.1.tar.gz"
|
||||||
|
},
|
||||||
|
"license": {
|
||||||
|
"type": "file",
|
||||||
|
"path": "COPYING"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"krb5": {
|
||||||
|
"type": "ghtagtar",
|
||||||
|
"repo": "krb5/krb5",
|
||||||
|
"match": "krb5.+-final",
|
||||||
|
"prefer-stable": true,
|
||||||
|
"license": {
|
||||||
|
"type": "file",
|
||||||
|
"path": "NOTICE"
|
||||||
|
}
|
||||||
|
},
|
||||||
"ldap": {
|
"ldap": {
|
||||||
"type": "filelist",
|
"type": "filelist",
|
||||||
"url": "https://www.openldap.org/software/download/OpenLDAP/openldap-release/",
|
"url": "https://www.openldap.org/software/download/OpenLDAP/openldap-release/",
|
||||||
@@ -334,14 +480,27 @@
|
|||||||
"path": "LICENSE"
|
"path": "LICENSE"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"libacl": {
|
"lerc": {
|
||||||
"type": "git",
|
"type": "ghtar",
|
||||||
"rev": "v2.3.2",
|
"repo": "Esri/lerc",
|
||||||
"url": "https://git.savannah.nongnu.org/git/acl.git",
|
"prefer-stable": true,
|
||||||
"provide-pre-built": true,
|
"provide-pre-built": true,
|
||||||
"license": {
|
"license": {
|
||||||
"type": "file",
|
"type": "file",
|
||||||
"path": "doc/COPYING"
|
"path": "LICENSE"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"libacl": {
|
||||||
|
"alt": {
|
||||||
|
"type": "url",
|
||||||
|
"url": "https://mirror.souseiseki.middlendian.com/nongnu/acl/acl-2.3.2.tar.gz"
|
||||||
|
},
|
||||||
|
"type": "url",
|
||||||
|
"url": "https://download.savannah.nongnu.org/releases/acl/acl-2.3.2.tar.gz",
|
||||||
|
"provide-pre-built": true,
|
||||||
|
"license": {
|
||||||
|
"type": "file",
|
||||||
|
"path": "doc/COPYING.LGPL"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"libaom": {
|
"libaom": {
|
||||||
@@ -400,6 +559,16 @@
|
|||||||
"path": "COPYING"
|
"path": "COPYING"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"libedit": {
|
||||||
|
"type": "filelist",
|
||||||
|
"url": "https://thrysoee.dk/editline/",
|
||||||
|
"regex": "/href=\"(?<file>libedit-(?<version>[^\"]+)\\.tar\\.gz)\"/",
|
||||||
|
"provide-pre-built": true,
|
||||||
|
"license": {
|
||||||
|
"type": "file",
|
||||||
|
"path": "COPYING"
|
||||||
|
}
|
||||||
|
},
|
||||||
"libevent": {
|
"libevent": {
|
||||||
"type": "ghrel",
|
"type": "ghrel",
|
||||||
"repo": "libevent/libevent",
|
"repo": "libevent/libevent",
|
||||||
@@ -448,7 +617,7 @@
|
|||||||
"provide-pre-built": true,
|
"provide-pre-built": true,
|
||||||
"license": {
|
"license": {
|
||||||
"type": "file",
|
"type": "file",
|
||||||
"path": "COPYING"
|
"path": "COPYING.LIB"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"libiconv-win": {
|
"libiconv-win": {
|
||||||
@@ -460,6 +629,15 @@
|
|||||||
"path": "source/COPYING"
|
"path": "source/COPYING"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"libidn2": {
|
||||||
|
"type": "filelist",
|
||||||
|
"url": "https://ftp.gnu.org/gnu/libidn/",
|
||||||
|
"regex": "/href=\"(?<file>libidn2-(?<version>[^\"]+)\\.tar\\.gz)\"/",
|
||||||
|
"license": {
|
||||||
|
"type": "file",
|
||||||
|
"path": "COPYING.LESSERv3"
|
||||||
|
}
|
||||||
|
},
|
||||||
"libjpeg": {
|
"libjpeg": {
|
||||||
"type": "ghtar",
|
"type": "ghtar",
|
||||||
"repo": "libjpeg-turbo/libjpeg-turbo",
|
"repo": "libjpeg-turbo/libjpeg-turbo",
|
||||||
@@ -468,6 +646,21 @@
|
|||||||
"path": "LICENSE.md"
|
"path": "LICENSE.md"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"libjxl": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/libjxl/libjxl",
|
||||||
|
"rev": "main",
|
||||||
|
"submodules": [
|
||||||
|
"third_party/highway",
|
||||||
|
"third_party/libjpeg-turbo",
|
||||||
|
"third_party/sjpeg",
|
||||||
|
"third_party/skcms"
|
||||||
|
],
|
||||||
|
"license": {
|
||||||
|
"type": "file",
|
||||||
|
"path": "LICENSE"
|
||||||
|
}
|
||||||
|
},
|
||||||
"liblz4": {
|
"liblz4": {
|
||||||
"type": "ghrel",
|
"type": "ghrel",
|
||||||
"repo": "lz4/lz4",
|
"repo": "lz4/lz4",
|
||||||
@@ -479,19 +672,30 @@
|
|||||||
"path": "LICENSE"
|
"path": "LICENSE"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"libmemcached": {
|
"libmaxminddb": {
|
||||||
"type": "git",
|
"type": "ghrel",
|
||||||
"url": "https://github.com/static-php/libmemcached-macos.git",
|
"repo": "maxmind/libmaxminddb",
|
||||||
"rev": "master",
|
"match": "libmaxminddb-.+\\.tar\\.gz",
|
||||||
|
"prefer-stable": true,
|
||||||
"license": {
|
"license": {
|
||||||
"type": "file",
|
"type": "file",
|
||||||
"path": "COPYING"
|
"path": "LICENSE"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"libmemcached": {
|
||||||
|
"type": "ghtagtar",
|
||||||
|
"repo": "awesomized/libmemcached",
|
||||||
|
"match": "1.\\d.\\d",
|
||||||
|
"license": {
|
||||||
|
"type": "file",
|
||||||
|
"path": "LICENSE"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"libpng": {
|
"libpng": {
|
||||||
"type": "git",
|
"type": "ghtagtar",
|
||||||
"url": "https://github.com/glennrp/libpng.git",
|
"repo": "pnggroup/libpng",
|
||||||
"rev": "libpng16",
|
"match": "v1\\.6\\.\\d+",
|
||||||
|
"query": "?per_page=150",
|
||||||
"provide-pre-built": true,
|
"provide-pre-built": true,
|
||||||
"license": {
|
"license": {
|
||||||
"type": "file",
|
"type": "file",
|
||||||
@@ -499,9 +703,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"librabbitmq": {
|
"librabbitmq": {
|
||||||
"type": "git",
|
"type": "ghtar",
|
||||||
"url": "https://github.com/alanxz/rabbitmq-c.git",
|
"repo": "alanxz/rabbitmq-c",
|
||||||
"rev": "master",
|
"prefer-stable": true,
|
||||||
"license": {
|
"license": {
|
||||||
"type": "file",
|
"type": "file",
|
||||||
"path": "LICENSE"
|
"path": "LICENSE"
|
||||||
@@ -518,7 +722,7 @@
|
|||||||
"libsodium": {
|
"libsodium": {
|
||||||
"type": "ghrel",
|
"type": "ghrel",
|
||||||
"repo": "jedisct1/libsodium",
|
"repo": "jedisct1/libsodium",
|
||||||
"match": "libsodium-\\d+(\\.\\d+)*\\.tar\\.gz",
|
"match": "libsodium-(?!1\\.0\\.21)\\d+(\\.\\d+)*\\.tar\\.gz",
|
||||||
"prefer-stable": true,
|
"prefer-stable": true,
|
||||||
"provide-pre-built": true,
|
"provide-pre-built": true,
|
||||||
"license": {
|
"license": {
|
||||||
@@ -531,6 +735,7 @@
|
|||||||
"repo": "libssh2/libssh2",
|
"repo": "libssh2/libssh2",
|
||||||
"match": "libssh2.+\\.tar\\.gz",
|
"match": "libssh2.+\\.tar\\.gz",
|
||||||
"prefer-stable": true,
|
"prefer-stable": true,
|
||||||
|
"provide-pre-built": true,
|
||||||
"license": {
|
"license": {
|
||||||
"type": "file",
|
"type": "file",
|
||||||
"path": "COPYING"
|
"path": "COPYING"
|
||||||
@@ -540,16 +745,35 @@
|
|||||||
"type": "filelist",
|
"type": "filelist",
|
||||||
"url": "https://download.osgeo.org/libtiff/",
|
"url": "https://download.osgeo.org/libtiff/",
|
||||||
"regex": "/href=\"(?<file>tiff-(?<version>[^\"]+)\\.tar\\.xz)\"/",
|
"regex": "/href=\"(?<file>tiff-(?<version>[^\"]+)\\.tar\\.xz)\"/",
|
||||||
"provide-pre-built": true,
|
|
||||||
"license": {
|
"license": {
|
||||||
"type": "file",
|
"type": "file",
|
||||||
"path": "LICENSE.md"
|
"path": "LICENSE.md"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"libunistring": {
|
||||||
|
"type": "filelist",
|
||||||
|
"url": "https://ftp.gnu.org/gnu/libunistring/",
|
||||||
|
"regex": "/href=\"(?<file>libunistring-(?<version>[^\"]+)\\.tar\\.gz)\"/",
|
||||||
|
"provide-pre-built": true,
|
||||||
|
"license": {
|
||||||
|
"type": "file",
|
||||||
|
"path": "COPYING.LIB"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"liburing": {
|
||||||
|
"type": "ghtar",
|
||||||
|
"repo": "axboe/liburing",
|
||||||
|
"prefer-stable": true,
|
||||||
|
"license": {
|
||||||
|
"type": "file",
|
||||||
|
"path": "COPYING"
|
||||||
|
}
|
||||||
|
},
|
||||||
"libuuid": {
|
"libuuid": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/static-php/libuuid.git",
|
"url": "https://github.com/static-php/libuuid.git",
|
||||||
"rev": "master",
|
"rev": "master",
|
||||||
|
"provide-pre-built": true,
|
||||||
"license": {
|
"license": {
|
||||||
"type": "file",
|
"type": "file",
|
||||||
"path": "COPYING"
|
"path": "COPYING"
|
||||||
@@ -570,8 +794,9 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"libwebp": {
|
"libwebp": {
|
||||||
"type": "url",
|
"type": "ghtagtar",
|
||||||
"url": "https://github.com/webmproject/libwebp/archive/refs/tags/v1.3.2.tar.gz",
|
"repo": "webmproject/libwebp",
|
||||||
|
"match": "v1\\.\\d+\\.\\d+$",
|
||||||
"provide-pre-built": true,
|
"provide-pre-built": true,
|
||||||
"license": {
|
"license": {
|
||||||
"type": "file",
|
"type": "file",
|
||||||
@@ -579,8 +804,10 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"libxml2": {
|
"libxml2": {
|
||||||
"type": "url",
|
"type": "ghtagtar",
|
||||||
"url": "https://github.com/GNOME/libxml2/archive/refs/tags/v2.12.5.tar.gz",
|
"repo": "GNOME/libxml2",
|
||||||
|
"match": "v2\\.\\d+\\.\\d+$",
|
||||||
|
"provide-pre-built": false,
|
||||||
"license": {
|
"license": {
|
||||||
"type": "file",
|
"type": "file",
|
||||||
"path": "Copyright"
|
"path": "Copyright"
|
||||||
@@ -629,13 +856,23 @@
|
|||||||
"micro": {
|
"micro": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"path": "php-src/sapi/micro",
|
"path": "php-src/sapi/micro",
|
||||||
"rev": "84beta",
|
"rev": "master",
|
||||||
"url": "https://github.com/static-php/phpmicro",
|
"url": "https://github.com/static-php/phpmicro",
|
||||||
"license": {
|
"license": {
|
||||||
"type": "file",
|
"type": "file",
|
||||||
"path": "LICENSE"
|
"path": "LICENSE"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"mimalloc": {
|
||||||
|
"type": "ghtagtar",
|
||||||
|
"repo": "microsoft/mimalloc",
|
||||||
|
"match": "v2\\.\\d\\.[^3].*",
|
||||||
|
"provide-pre-built": false,
|
||||||
|
"license": {
|
||||||
|
"type": "file",
|
||||||
|
"path": "LICENSE"
|
||||||
|
}
|
||||||
|
},
|
||||||
"mongodb": {
|
"mongodb": {
|
||||||
"type": "ghrel",
|
"type": "ghrel",
|
||||||
"repo": "mongodb/mongo-php-driver",
|
"repo": "mongodb/mongo-php-driver",
|
||||||
@@ -657,6 +894,24 @@
|
|||||||
"path": "LICENSE"
|
"path": "LICENSE"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"mysqlnd_ed25519": {
|
||||||
|
"type": "pie",
|
||||||
|
"repo": "mariadb/mysqlnd_ed25519",
|
||||||
|
"path": "php-src/ext/mysqlnd_ed25519",
|
||||||
|
"license": {
|
||||||
|
"type": "file",
|
||||||
|
"path": "LICENSE"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"mysqlnd_parsec": {
|
||||||
|
"type": "pie",
|
||||||
|
"repo": "mariadb/mysqlnd_parsec",
|
||||||
|
"path": "php-src/ext/mysqlnd_parsec",
|
||||||
|
"license": {
|
||||||
|
"type": "file",
|
||||||
|
"path": "LICENSE"
|
||||||
|
}
|
||||||
|
},
|
||||||
"ncurses": {
|
"ncurses": {
|
||||||
"type": "filelist",
|
"type": "filelist",
|
||||||
"url": "https://ftp.gnu.org/pub/gnu/ncurses/",
|
"url": "https://ftp.gnu.org/pub/gnu/ncurses/",
|
||||||
@@ -667,6 +922,14 @@
|
|||||||
"path": "COPYING"
|
"path": "COPYING"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"net-snmp": {
|
||||||
|
"type": "ghtagtar",
|
||||||
|
"repo": "net-snmp/net-snmp",
|
||||||
|
"license": {
|
||||||
|
"type": "file",
|
||||||
|
"path": "COPYING"
|
||||||
|
}
|
||||||
|
},
|
||||||
"nghttp2": {
|
"nghttp2": {
|
||||||
"type": "ghrel",
|
"type": "ghrel",
|
||||||
"repo": "nghttp2/nghttp2",
|
"repo": "nghttp2/nghttp2",
|
||||||
@@ -677,6 +940,26 @@
|
|||||||
"path": "COPYING"
|
"path": "COPYING"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"nghttp3": {
|
||||||
|
"type": "ghrel",
|
||||||
|
"repo": "ngtcp2/nghttp3",
|
||||||
|
"match": "nghttp3.+\\.tar\\.xz",
|
||||||
|
"prefer-stable": true,
|
||||||
|
"license": {
|
||||||
|
"type": "file",
|
||||||
|
"path": "COPYING"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"ngtcp2": {
|
||||||
|
"type": "ghrel",
|
||||||
|
"repo": "ngtcp2/ngtcp2",
|
||||||
|
"match": "ngtcp2.+\\.tar\\.xz",
|
||||||
|
"prefer-stable": true,
|
||||||
|
"license": {
|
||||||
|
"type": "file",
|
||||||
|
"path": "COPYING"
|
||||||
|
}
|
||||||
|
},
|
||||||
"onig": {
|
"onig": {
|
||||||
"type": "ghrel",
|
"type": "ghrel",
|
||||||
"repo": "kkos/oniguruma",
|
"repo": "kkos/oniguruma",
|
||||||
@@ -724,6 +1007,15 @@
|
|||||||
"path": "LICENSE"
|
"path": "LICENSE"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"pcov": {
|
||||||
|
"type": "url",
|
||||||
|
"url": "https://pecl.php.net/get/pcov",
|
||||||
|
"filename": "pcov.tgz",
|
||||||
|
"license": {
|
||||||
|
"type": "file",
|
||||||
|
"path": "LICENSE"
|
||||||
|
}
|
||||||
|
},
|
||||||
"pdo_sqlsrv": {
|
"pdo_sqlsrv": {
|
||||||
"type": "url",
|
"type": "url",
|
||||||
"url": "https://pecl.php.net/get/pdo_sqlsrv",
|
"url": "https://pecl.php.net/get/pdo_sqlsrv",
|
||||||
@@ -744,13 +1036,22 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"postgresql": {
|
"postgresql": {
|
||||||
"type": "url",
|
"type": "ghtagtar",
|
||||||
"url": "https://ftp.postgresql.org/pub/source/v16.2/postgresql-16.2.tar.bz2",
|
"repo": "postgres/postgres",
|
||||||
|
"match": "REL_18_\\d+",
|
||||||
"license": {
|
"license": {
|
||||||
"type": "file",
|
"type": "file",
|
||||||
"path": "COPYRIGHT"
|
"path": "COPYRIGHT"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"postgresql-win": {
|
||||||
|
"type": "url",
|
||||||
|
"url": "https://get.enterprisedb.com/postgresql/postgresql-16.8-1-windows-x64-binaries.zip",
|
||||||
|
"license": {
|
||||||
|
"type": "text",
|
||||||
|
"text": "PostgreSQL Database Management System\n(also known as Postgres, formerly as Postgres95)\n\nPortions Copyright (c) 1996-2025, The PostgreSQL Global Development Group\n\nPortions Copyright (c) 1994, The Regents of the University of California\n\nPermission to use, copy, modify, and distribute this software and its\ndocumentation for any purpose, without fee, and without a written\nagreement is hereby granted, provided that the above copyright notice\nand this paragraph and the following two paragraphs appear in all\ncopies.\n\nIN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY\nFOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES,\nINCLUDING LOST PROFITS, ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS\nDOCUMENTATION, EVEN IF THE UNIVERSITY OF CALIFORNIA HAS BEEN ADVISED OF\nTHE POSSIBILITY OF SUCH DAMAGE.\n\nTHE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES,\nINCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY\nAND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS\nON AN \"AS IS\" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATIONS\nTO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS."
|
||||||
|
}
|
||||||
|
},
|
||||||
"protobuf": {
|
"protobuf": {
|
||||||
"type": "url",
|
"type": "url",
|
||||||
"url": "https://pecl.php.net/get/protobuf",
|
"url": "https://pecl.php.net/get/protobuf",
|
||||||
@@ -789,6 +1090,20 @@
|
|||||||
"path": "LICENSE"
|
"path": "LICENSE"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"re2c": {
|
||||||
|
"type": "ghrel",
|
||||||
|
"repo": "skvadrik/re2c",
|
||||||
|
"match": "re2c.+\\.tar\\.xz",
|
||||||
|
"prefer-stable": true,
|
||||||
|
"alt": {
|
||||||
|
"type": "url",
|
||||||
|
"url": "https://dl.static-php.dev/static-php-cli/deps/re2c/re2c-4.3.tar.xz"
|
||||||
|
},
|
||||||
|
"license": {
|
||||||
|
"type": "file",
|
||||||
|
"path": "LICENSE"
|
||||||
|
}
|
||||||
|
},
|
||||||
"readline": {
|
"readline": {
|
||||||
"type": "filelist",
|
"type": "filelist",
|
||||||
"url": "https://ftp.gnu.org/pub/gnu/readline/",
|
"url": "https://ftp.gnu.org/pub/gnu/readline/",
|
||||||
@@ -814,7 +1129,6 @@
|
|||||||
},
|
},
|
||||||
"snappy": {
|
"snappy": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"repo": "google/snappy",
|
|
||||||
"rev": "main",
|
"rev": "main",
|
||||||
"url": "https://github.com/google/snappy",
|
"url": "https://github.com/google/snappy",
|
||||||
"license": {
|
"license": {
|
||||||
@@ -823,9 +1137,8 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"spx": {
|
"spx": {
|
||||||
"type": "git",
|
"type": "pie",
|
||||||
"rev": "master",
|
"repo": "noisebynorthwest/php-spx",
|
||||||
"url": "https://github.com/static-php/php-spx.git",
|
|
||||||
"path": "php-src/ext/spx",
|
"path": "php-src/ext/spx",
|
||||||
"license": {
|
"license": {
|
||||||
"type": "file",
|
"type": "file",
|
||||||
@@ -853,34 +1166,29 @@
|
|||||||
},
|
},
|
||||||
"swoole": {
|
"swoole": {
|
||||||
"path": "php-src/ext/swoole",
|
"path": "php-src/ext/swoole",
|
||||||
"type": "git",
|
"type": "ghtar",
|
||||||
"rev": "master",
|
"repo": "swoole/swoole-src",
|
||||||
"url": "https://github.com/swoole/swoole-src.git",
|
"match": "v6\\.+",
|
||||||
|
"prefer-stable": true,
|
||||||
"license": {
|
"license": {
|
||||||
"type": "file",
|
"type": "file",
|
||||||
"path": "LICENSE"
|
"path": "LICENSE"
|
||||||
},
|
|
||||||
"alt": {
|
|
||||||
"type": "ghtar",
|
|
||||||
"repo": "swoole/swoole-src",
|
|
||||||
"prefer-stable": true
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"swow": {
|
"swow": {
|
||||||
"type": "git",
|
|
||||||
"path": "php-src/ext/swow-src",
|
"path": "php-src/ext/swow-src",
|
||||||
"rev": "ci",
|
"type": "ghtar",
|
||||||
"url": "https://github.com/swow/swow",
|
"repo": "swow/swow",
|
||||||
"patch": "patchSwow",
|
"prefer-stable": true,
|
||||||
"license": {
|
"license": {
|
||||||
"type": "file",
|
"type": "file",
|
||||||
"path": "LICENSE"
|
"path": "LICENSE"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"tidy": {
|
"tidy": {
|
||||||
"type": "url",
|
"type": "ghtar",
|
||||||
"url": "https://github.com/htacg/tidy-html5/archive/refs/tags/5.8.0.tar.gz",
|
"repo": "htacg/tidy-html5",
|
||||||
"filename": "tidy-html5.tgz",
|
"prefer-stable": true,
|
||||||
"license": {
|
"license": {
|
||||||
"type": "file",
|
"type": "file",
|
||||||
"path": "README/LICENSE.md"
|
"path": "README/LICENSE.md"
|
||||||
@@ -895,6 +1203,23 @@
|
|||||||
"path": "COPYING"
|
"path": "COPYING"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"watcher": {
|
||||||
|
"type": "ghtar",
|
||||||
|
"repo": "e-dant/watcher",
|
||||||
|
"prefer-stable": true,
|
||||||
|
"license": {
|
||||||
|
"type": "file",
|
||||||
|
"path": "license"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"xdebug": {
|
||||||
|
"type": "pie",
|
||||||
|
"repo": "xdebug/xdebug",
|
||||||
|
"license": {
|
||||||
|
"type": "file",
|
||||||
|
"path": "LICENSE"
|
||||||
|
}
|
||||||
|
},
|
||||||
"xhprof": {
|
"xhprof": {
|
||||||
"type": "url",
|
"type": "url",
|
||||||
"url": "https://pecl.php.net/get/xhprof",
|
"url": "https://pecl.php.net/get/xhprof",
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
219
docs/.vitepress/components/Contributors.vue
Normal file
219
docs/.vitepress/components/Contributors.vue
Normal file
@@ -0,0 +1,219 @@
|
|||||||
|
<template>
|
||||||
|
<div class="contributors-container">
|
||||||
|
<div class="contributors-header">
|
||||||
|
<h2>Contributors</h2>
|
||||||
|
<p class="contributors-description">
|
||||||
|
Thanks to all the amazing people who have contributed to this project!
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div v-if="loading" class="loading-state">
|
||||||
|
<div class="spinner"></div>
|
||||||
|
<p>Loading contributors...</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div v-else-if="error" class="error-state">
|
||||||
|
<p>{{ error }}</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div v-else class="contributors-grid">
|
||||||
|
<a
|
||||||
|
v-for="contributor in contributors"
|
||||||
|
:key="contributor.id"
|
||||||
|
:href="contributor.html_url"
|
||||||
|
target="_blank"
|
||||||
|
rel="noopener noreferrer"
|
||||||
|
class="contributor-card"
|
||||||
|
:title="contributor.login"
|
||||||
|
>
|
||||||
|
<img
|
||||||
|
:src="contributor.avatar_url"
|
||||||
|
:alt="contributor.login"
|
||||||
|
class="contributor-avatar"
|
||||||
|
loading="lazy"
|
||||||
|
/>
|
||||||
|
<div class="contributor-name">{{ contributor.login }}</div>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup lang="ts">
|
||||||
|
import { ref, onMounted } from 'vue';
|
||||||
|
|
||||||
|
interface Contributor {
|
||||||
|
id: number;
|
||||||
|
login: string;
|
||||||
|
avatar_url: string;
|
||||||
|
html_url: string;
|
||||||
|
contributions: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
const contributors = ref<Contributor[]>([]);
|
||||||
|
const loading = ref(true);
|
||||||
|
const error = ref('');
|
||||||
|
|
||||||
|
const fetchContributors = async () => {
|
||||||
|
try {
|
||||||
|
loading.value = true;
|
||||||
|
error.value = '';
|
||||||
|
|
||||||
|
const response = await fetch(
|
||||||
|
'https://api.github.com/repos/crazywhalecc/static-php-cli/contributors?per_page=24'
|
||||||
|
);
|
||||||
|
|
||||||
|
if (!response.ok) {
|
||||||
|
throw new Error('Failed to fetch contributors');
|
||||||
|
}
|
||||||
|
|
||||||
|
const data = await response.json();
|
||||||
|
contributors.value = data;
|
||||||
|
} catch (err) {
|
||||||
|
error.value = 'Failed to load contributors. Please try again later.';
|
||||||
|
console.error('Error fetching contributors:', err);
|
||||||
|
} finally {
|
||||||
|
loading.value = false;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
onMounted(() => {
|
||||||
|
fetchContributors();
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style scoped>
|
||||||
|
.contributors-container {
|
||||||
|
margin: 48px auto;
|
||||||
|
padding: 32px 24px;
|
||||||
|
max-width: 1152px;
|
||||||
|
background: linear-gradient(135deg, var(--vp-c-bg-soft) 0%, var(--vp-c-bg) 100%);
|
||||||
|
border-radius: 16px;
|
||||||
|
border: 1px solid var(--vp-c-divider);
|
||||||
|
box-shadow: 0 4px 16px rgba(0, 0, 0, 0.05);
|
||||||
|
}
|
||||||
|
|
||||||
|
.contributors-header {
|
||||||
|
text-align: center;
|
||||||
|
margin-bottom: 24px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.contributors-header h2 {
|
||||||
|
font-size: 1.5rem;
|
||||||
|
font-weight: 700;
|
||||||
|
margin: 0 0 8px 0;
|
||||||
|
background: linear-gradient(120deg, var(--vp-c-brand-1), var(--vp-c-brand-2));
|
||||||
|
-webkit-background-clip: text;
|
||||||
|
-webkit-text-fill-color: transparent;
|
||||||
|
background-clip: text;
|
||||||
|
}
|
||||||
|
|
||||||
|
.contributors-description {
|
||||||
|
font-size: 0.95rem;
|
||||||
|
color: var(--vp-c-text-2);
|
||||||
|
margin: 0;
|
||||||
|
line-height: 1.5;
|
||||||
|
}
|
||||||
|
|
||||||
|
.loading-state,
|
||||||
|
.error-state {
|
||||||
|
text-align: center;
|
||||||
|
padding: 40px 20px;
|
||||||
|
color: var(--vp-c-text-2);
|
||||||
|
}
|
||||||
|
|
||||||
|
.spinner {
|
||||||
|
width: 40px;
|
||||||
|
height: 40px;
|
||||||
|
margin: 0 auto 16px;
|
||||||
|
border: 4px solid var(--vp-c-divider);
|
||||||
|
border-top-color: var(--vp-c-brand-1);
|
||||||
|
border-radius: 50%;
|
||||||
|
animation: spin 1s linear infinite;
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes spin {
|
||||||
|
to {
|
||||||
|
transform: rotate(360deg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.contributors-grid {
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: repeat(auto-fill, minmax(90px, 1fr));
|
||||||
|
gap: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.contributor-card {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: center;
|
||||||
|
padding: 12px;
|
||||||
|
background: var(--vp-c-bg);
|
||||||
|
border-radius: 12px;
|
||||||
|
border: 1px solid var(--vp-c-divider);
|
||||||
|
transition: all 0.3s ease;
|
||||||
|
text-decoration: none;
|
||||||
|
color: var(--vp-c-text-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
.contributor-card:hover {
|
||||||
|
transform: translateY(-4px);
|
||||||
|
box-shadow: 0 8px 24px rgba(0, 0, 0, 0.12);
|
||||||
|
border-color: var(--vp-c-brand-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
.contributor-avatar {
|
||||||
|
width: 60px;
|
||||||
|
height: 60px;
|
||||||
|
border-radius: 50%;
|
||||||
|
border: 2px solid var(--vp-c-divider);
|
||||||
|
transition: all 0.3s ease;
|
||||||
|
margin-bottom: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.contributor-card:hover .contributor-avatar {
|
||||||
|
border-color: var(--vp-c-brand-1);
|
||||||
|
transform: scale(1.05);
|
||||||
|
}
|
||||||
|
|
||||||
|
.contributor-name {
|
||||||
|
font-size: 12px;
|
||||||
|
font-weight: 500;
|
||||||
|
text-align: center;
|
||||||
|
word-break: break-word;
|
||||||
|
max-width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width: 768px) {
|
||||||
|
.contributors-container {
|
||||||
|
margin: 32px 16px;
|
||||||
|
padding: 24px 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.contributors-header h2 {
|
||||||
|
font-size: 1.25rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.contributors-description {
|
||||||
|
font-size: 0.9rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.contributors-grid {
|
||||||
|
grid-template-columns: repeat(auto-fill, minmax(70px, 1fr));
|
||||||
|
gap: 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.contributor-card {
|
||||||
|
padding: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.contributor-avatar {
|
||||||
|
width: 48px;
|
||||||
|
height: 48px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.contributor-name {
|
||||||
|
font-size: 11px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
@@ -4,7 +4,7 @@ import sidebarZh from "./sidebar.zh";
|
|||||||
|
|
||||||
// https://vitepress.dev/reference/site-config
|
// https://vitepress.dev/reference/site-config
|
||||||
export default {
|
export default {
|
||||||
title: "static-php-cli",
|
title: "Static PHP",
|
||||||
description: "Build single static PHP binary, with PHP project together, with popular extensions included.",
|
description: "Build single static PHP binary, with PHP project together, with popular extensions included.",
|
||||||
locales: {
|
locales: {
|
||||||
en: {
|
en: {
|
||||||
@@ -44,9 +44,22 @@ export default {
|
|||||||
},
|
},
|
||||||
themeConfig: {
|
themeConfig: {
|
||||||
// https://vitepress.dev/reference/default-theme-config
|
// https://vitepress.dev/reference/default-theme-config
|
||||||
|
logo: '/images/static-php_nobg.png',
|
||||||
nav: [],
|
nav: [],
|
||||||
socialLinks: [
|
socialLinks: [
|
||||||
{icon: 'github', link: 'https://github.com/crazywhalecc/static-php-cli'}
|
{icon: 'github', link: 'https://github.com/crazywhalecc/static-php-cli'}
|
||||||
]
|
],
|
||||||
|
footer: {
|
||||||
|
message: 'Released under the MIT License.',
|
||||||
|
copyright: 'Copyright © 2023-present crazywhalecc'
|
||||||
|
},
|
||||||
|
search: {
|
||||||
|
provider: 'algolia',
|
||||||
|
options: {
|
||||||
|
appId: 'IHJHUB1SF1',
|
||||||
|
apiKey: '8266d31cc2ffbd0e059f1c6e5bdaf8fc',
|
||||||
|
indexName: 'static-php docs',
|
||||||
|
},
|
||||||
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,56 +1,57 @@
|
|||||||
export default {
|
export default {
|
||||||
'/en/guide/': [
|
'/en/guide/': [
|
||||||
{
|
{
|
||||||
text: 'Basic Build Guides',
|
text: 'Basic Build Guides',
|
||||||
items: [
|
items: [
|
||||||
{text: 'Guide', link: '/en/guide/'},
|
{text: 'Guide', link: '/en/guide/'},
|
||||||
{text: 'Build (Local)', link: '/en/guide/manual-build'},
|
{text: 'Build (Local)', link: '/en/guide/manual-build'},
|
||||||
{text: 'Build (CI)', link: '/en/guide/action-build'},
|
{text: 'Build (CI)', link: '/en/guide/action-build'},
|
||||||
{text: 'Supported Extensions', link: '/en/guide/extensions'},
|
{text: 'Supported Extensions', link: '/en/guide/extensions'},
|
||||||
{text: 'Extension Notes', link: '/en/guide/extension-notes'},
|
{text: 'Extension Notes', link: '/en/guide/extension-notes'},
|
||||||
{text: 'Build Command Generator', link: '/en/guide/cli-generator'},
|
{text: 'Build Command Generator', link: '/en/guide/cli-generator'},
|
||||||
{text: 'Environment Variables', link: '/en/guide/env-vars', collapsed: true,},
|
{text: 'Environment Variables', link: '/en/guide/env-vars', collapsed: true,},
|
||||||
{text: 'Dependency Table', link: '/en/guide/deps-map'},
|
{text: 'Dependency Table', link: '/en/guide/deps-map'},
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
text: 'Extended Build Guides',
|
text: 'Extended Build Guides',
|
||||||
items: [
|
items: [
|
||||||
{text: 'Troubleshooting', link: '/en/guide/troubleshooting'},
|
{text: 'Troubleshooting', link: '/en/guide/troubleshooting'},
|
||||||
{text: 'Build on Windows', link: '/en/guide/build-on-windows'},
|
{text: 'Build on Windows', link: '/en/guide/build-on-windows'},
|
||||||
{text: 'Build with GNU libc', link: '/en/guide/build-with-glibc'},
|
{text: 'Build with GNU libc', link: '/en/guide/build-with-glibc'},
|
||||||
],
|
],
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
'/en/develop/': [
|
'/en/develop/': [
|
||||||
{
|
{
|
||||||
text: 'Development',
|
text: 'Development',
|
||||||
items: [
|
items: [
|
||||||
{text: 'Get Started', link: '/en/develop/'},
|
{text: 'Get Started', link: '/en/develop/'},
|
||||||
{text: 'Project Structure', link: '/en/develop/structure'},
|
{text: 'Project Structure', link: '/en/develop/structure'},
|
||||||
{text: 'PHP Source Modification', link: '/en/develop/php-src-changes'},
|
{text: 'PHP Source Modification', link: '/en/develop/php-src-changes'},
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
text: 'Module',
|
text: 'Module',
|
||||||
items: [
|
items: [
|
||||||
{text: 'Doctor ', link: '/en/develop/doctor-module'},
|
{text: 'Doctor ', link: '/en/develop/doctor-module'},
|
||||||
{text: 'Source', link: '/en/develop/source-module'},
|
{text: 'Source', link: '/en/develop/source-module'},
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
text: 'Extra',
|
text: 'Extra',
|
||||||
items: [
|
items: [
|
||||||
{text: 'Compilation Tools', link: '/en/develop/system-build-tools'},
|
{text: 'Compilation Tools', link: '/en/develop/system-build-tools'},
|
||||||
]
|
{text: 'craft.yml Configuration', link: '/zh/develop/craft-yml'},
|
||||||
}
|
]
|
||||||
],
|
}
|
||||||
'/en/contributing/': [
|
],
|
||||||
{
|
'/en/contributing/': [
|
||||||
text: 'Contributing',
|
{
|
||||||
items: [
|
text: 'Contributing',
|
||||||
{text: 'Contributing', link: '/en/contributing/'},
|
items: [
|
||||||
],
|
{text: 'Contributing', link: '/en/contributing/'},
|
||||||
}
|
],
|
||||||
],
|
}
|
||||||
|
],
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,56 +1,57 @@
|
|||||||
export default {
|
export default {
|
||||||
'/zh/guide/': [
|
'/zh/guide/': [
|
||||||
{
|
{
|
||||||
text: '构建指南',
|
text: '构建指南',
|
||||||
items: [
|
items: [
|
||||||
{text: '指南', link: '/zh/guide/'},
|
{text: '指南', link: '/zh/guide/'},
|
||||||
{text: '本地构建', link: '/zh/guide/manual-build'},
|
{text: '本地构建', link: '/zh/guide/manual-build'},
|
||||||
{text: 'Actions 构建', link: '/zh/guide/action-build'},
|
{text: 'Actions 构建', link: '/zh/guide/action-build'},
|
||||||
{text: '扩展列表', link: '/zh/guide/extensions'},
|
{text: '扩展列表', link: '/zh/guide/extensions'},
|
||||||
{text: '扩展注意事项', link: '/zh/guide/extension-notes'},
|
{text: '扩展注意事项', link: '/zh/guide/extension-notes'},
|
||||||
{text: '编译命令生成器', link: '/zh/guide/cli-generator'},
|
{text: '编译命令生成器', link: '/zh/guide/cli-generator'},
|
||||||
{text: '环境变量列表', link: '/zh/guide/env-vars'},
|
{text: '环境变量列表', link: '/zh/guide/env-vars'},
|
||||||
{text: '依赖关系图表', link: '/zh/guide/deps-map'},
|
{text: '依赖关系图表', link: '/zh/guide/deps-map'},
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
text: '扩展构建指南',
|
text: '扩展构建指南',
|
||||||
items: [
|
items: [
|
||||||
{text: '故障排除', link: '/zh/guide/troubleshooting'},
|
{text: '故障排除', link: '/zh/guide/troubleshooting'},
|
||||||
{text: '在 Windows 上构建', link: '/zh/guide/build-on-windows'},
|
{text: '在 Windows 上构建', link: '/zh/guide/build-on-windows'},
|
||||||
{text: '构建 GNU libc 兼容的二进制', link: '/zh/guide/build-with-glibc'},
|
{text: '构建 GNU libc 兼容的二进制', link: '/zh/guide/build-with-glibc'},
|
||||||
],
|
],
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
'/zh/develop/': [
|
'/zh/develop/': [
|
||||||
{
|
{
|
||||||
text: '开发指南',
|
text: '开发指南',
|
||||||
items: [
|
items: [
|
||||||
{ text: '开发简介', link: '/zh/develop/' },
|
{text: '开发简介', link: '/zh/develop/'},
|
||||||
{ text: '项目结构简介', link: '/zh/develop/structure' },
|
{text: '项目结构简介', link: '/zh/develop/structure'},
|
||||||
{text: '对 PHP 源码的修改', link: '/zh/develop/php-src-changes'},
|
{text: '对 PHP 源码的修改', link: '/zh/develop/php-src-changes'},
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
text: '模块',
|
text: '模块',
|
||||||
items: [
|
items: [
|
||||||
{ text: 'Doctor 环境检查工具', link: '/zh/develop/doctor-module' },
|
{text: 'Doctor 环境检查工具', link: '/zh/develop/doctor-module'},
|
||||||
{ text: '资源模块', link: '/zh/develop/source-module' },
|
{text: '资源模块', link: '/zh/develop/source-module'},
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
text: '其他',
|
text: '其他',
|
||||||
items: [
|
items: [
|
||||||
{text: '系统编译工具', link: '/zh/develop/system-build-tools'},
|
{text: '系统编译工具', link: '/zh/develop/system-build-tools'},
|
||||||
]
|
{text: 'craft.yml 配置详解', link: '/zh/develop/craft-yml'},
|
||||||
}
|
]
|
||||||
],
|
}
|
||||||
'/zh/contributing/': [
|
],
|
||||||
{
|
'/zh/contributing/': [
|
||||||
text: '贡献指南',
|
{
|
||||||
items: [
|
text: '贡献指南',
|
||||||
{text: '贡献指南', link: '/zh/contributing/'},
|
items: [
|
||||||
],
|
{text: '贡献指南', link: '/zh/contributing/'},
|
||||||
}
|
],
|
||||||
],
|
}
|
||||||
|
],
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
import DefaultTheme from 'vitepress/theme'
|
import DefaultTheme from 'vitepress/theme'
|
||||||
import {inBrowser, useData} from "vitepress";
|
import {inBrowser, useData} from "vitepress";
|
||||||
import {watchEffect} from "vue";
|
import {watchEffect} from "vue";
|
||||||
|
import './style.css';
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
...DefaultTheme,
|
...DefaultTheme,
|
||||||
@@ -13,4 +14,4 @@ export default {
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
24
docs/.vitepress/theme/style.css
Normal file
24
docs/.vitepress/theme/style.css
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
/** override default styles */
|
||||||
|
.vp-sponsor-grid-image {
|
||||||
|
max-height:36px !important;
|
||||||
|
max-width: 1000px !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.vp-doc .contributors-header h2 {
|
||||||
|
padding-top: 0;
|
||||||
|
border-top: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.vp-doc .sponsors-header h2 {
|
||||||
|
padding-top: 0;
|
||||||
|
border-top: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dark .VPImage.logo {
|
||||||
|
filter: contrast(0.7);
|
||||||
|
}
|
||||||
|
|
||||||
|
.dark .VPImage.image-src {
|
||||||
|
filter: contrast(0.7);
|
||||||
|
}
|
||||||
70
docs/deps-craft-yml.md
Normal file
70
docs/deps-craft-yml.md
Normal file
@@ -0,0 +1,70 @@
|
|||||||
|
```yaml
|
||||||
|
# PHP version to build (default: 8.4)
|
||||||
|
php-version: 8.4
|
||||||
|
# [REQUIRED] Static PHP extensions to build (list or comma-separated are both accepted)
|
||||||
|
extensions: bcmath,fileinfo,phar,zlib,sodium,posix,pcntl
|
||||||
|
# Extra libraries to build (list or comma-separated are both accepted)
|
||||||
|
libs: [ ]
|
||||||
|
# [REQUIRED] Build SAPIs (list or comma-separated are both accepted)
|
||||||
|
sapi: cli,micro,fpm
|
||||||
|
# Show full console output (default: false)
|
||||||
|
debug: false
|
||||||
|
# Build options (same as `build` command options, all options are optional)
|
||||||
|
build-options:
|
||||||
|
# Before build, remove all old build files and sources (default: false)
|
||||||
|
with-clean: false
|
||||||
|
# Build with all suggested libraries (default: false)
|
||||||
|
with-suggested-libs: false
|
||||||
|
# Build with all suggested extensions (default: false)
|
||||||
|
with-suggested-exts: false
|
||||||
|
# Build extra shared extensions (list or comma-separated are both accepted)
|
||||||
|
build-shared: [ ]
|
||||||
|
# Build without stripping the binary (default: false)
|
||||||
|
no-strip: false
|
||||||
|
# Disable Opcache JIT (default: false)
|
||||||
|
disable-opcache-jit: false
|
||||||
|
# PHP configuration options (same as --with-config-file-path)
|
||||||
|
with-config-file-path: ""
|
||||||
|
# PHP configuration options (same as --with-config-file-scan-dir)
|
||||||
|
with-config-file-scan-dir: ""
|
||||||
|
# Hardcoded INI options for cli and micro SAPI (e.g. "memory_limit=4G", list accepted)
|
||||||
|
with-hardcoded-ini: [ ]
|
||||||
|
# Pretend micro SAPI as cli SAPI to avoid some frameworks to limit the usage of micro SAPI
|
||||||
|
with-micro-fake-cli: false
|
||||||
|
# Additional patch point injection files (e.g. "path/to/patch.php", list accepted)
|
||||||
|
with-added-patch: [ ]
|
||||||
|
# Ignore micro extension tests (if you are using micro SAPI, default: false)
|
||||||
|
without-micro-ext-test: false
|
||||||
|
# UPX pack the binary (default: false)
|
||||||
|
with-upx-pack: false
|
||||||
|
# Set the micro.exe program icon (only for Windows, default: "")
|
||||||
|
with-micro-logo: ""
|
||||||
|
# Set micro SAPI as win32 mode, without this, micro SAPI will be compiled as a console application (only for Windows, default: false)
|
||||||
|
enable-micro-win32: false
|
||||||
|
|
||||||
|
# Build options for shared extensions (list or comma-separated are both accepted)
|
||||||
|
shared-extensions: [ ]
|
||||||
|
|
||||||
|
# Download options
|
||||||
|
download-options:
|
||||||
|
# Use custom url for specified sources, format: "{source-name}:{url}" (e.g. "php-src:https://example.com/php-8.4.0.tar.gz")
|
||||||
|
custom-url: [ ]
|
||||||
|
# Use custom git repo for specified sources, format: "{source-name}:{branch}:{url}" (e.g. "php-src:master:https://github.com/php/php-src.git")
|
||||||
|
custom-git: [ ]
|
||||||
|
# Retries count for downloading sources (default: 5)
|
||||||
|
retry: 5
|
||||||
|
# Use pre-built libraries if available (default: false)
|
||||||
|
prefer-pre-built: true
|
||||||
|
# Do not download from alternative sources (default: false)
|
||||||
|
no-alt: false
|
||||||
|
|
||||||
|
craft-options:
|
||||||
|
doctor: true
|
||||||
|
download: true
|
||||||
|
build: true
|
||||||
|
|
||||||
|
# Extra environment variables
|
||||||
|
extra-env:
|
||||||
|
# e.g. Use github token to avoid rate limit
|
||||||
|
GITHUB_TOKEN: your-github-token
|
||||||
|
```
|
||||||
7
docs/en/develop/craft-yml.md
Normal file
7
docs/en/develop/craft-yml.md
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
---
|
||||||
|
aside: false
|
||||||
|
---
|
||||||
|
|
||||||
|
# craft.yml Configuration
|
||||||
|
|
||||||
|
<!--@include: ../../deps-craft-yml.md-->
|
||||||
@@ -36,6 +36,7 @@ The following is the source download configuration corresponding to the `libeven
|
|||||||
The most important field here is `type`. Currently, the types it supports are:
|
The most important field here is `type`. Currently, the types it supports are:
|
||||||
|
|
||||||
- `url`: Directly use URL to download, for example: `https://download.libsodium.org/libsodium/releases/libsodium-1.0.18.tar.gz`.
|
- `url`: Directly use URL to download, for example: `https://download.libsodium.org/libsodium/releases/libsodium-1.0.18.tar.gz`.
|
||||||
|
- `pie`: Download PHP extensions from Packagist using the PIE (PHP Installer for Extensions) standard.
|
||||||
- `ghrel`: Use the GitHub Release API to download, download the artifacts uploaded from the latest version released by maintainers.
|
- `ghrel`: Use the GitHub Release API to download, download the artifacts uploaded from the latest version released by maintainers.
|
||||||
- `ghtar`: Use the GitHub Release API to download.
|
- `ghtar`: Use the GitHub Release API to download.
|
||||||
Different from `ghrel`, `ghtar` is downloaded from the `source code (tar.gz)` in the latest Release of the project.
|
Different from `ghrel`, `ghtar` is downloaded from the `source code (tar.gz)` in the latest Release of the project.
|
||||||
@@ -89,6 +90,37 @@ Example (download the imagick extension and extract it to the extension storage
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## Download type - pie
|
||||||
|
|
||||||
|
PIE (PHP Installer for Extensions) type sources refer to downloading PHP extensions from Packagist that follow the PIE standard.
|
||||||
|
This method automatically fetches extension information from the Packagist repository and downloads the appropriate distribution file.
|
||||||
|
|
||||||
|
The parameters included are:
|
||||||
|
|
||||||
|
- `repo`: The Packagist vendor/package name, such as `vendor/package-name`
|
||||||
|
|
||||||
|
Example (download a PHP extension from Packagist using PIE):
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"ext-example": {
|
||||||
|
"type": "pie",
|
||||||
|
"repo": "vendor/example-extension",
|
||||||
|
"path": "php-src/ext/example",
|
||||||
|
"license": {
|
||||||
|
"type": "file",
|
||||||
|
"path": "LICENSE"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
::: tip
|
||||||
|
The PIE download type will automatically detect the extension information from Packagist metadata,
|
||||||
|
including the download URL, version, and distribution type.
|
||||||
|
The extension must be marked as `type: php-ext` or contain `php-ext` metadata in its Packagist package definition.
|
||||||
|
:::
|
||||||
|
|
||||||
## Download type - ghrel
|
## Download type - ghrel
|
||||||
|
|
||||||
ghrel will download files from Assets uploaded in GitHub Release.
|
ghrel will download files from Assets uploaded in GitHub Release.
|
||||||
|
|||||||
@@ -38,17 +38,16 @@ buildroot/bin/php -d "zend_extension=/path/to/php{PHP_VER}-{ts/nts}/xdebug.so" -
|
|||||||
```
|
```
|
||||||
|
|
||||||
For macOS platform, almost all binaries under macOS cannot be truly purely statically linked, and almost all binaries will link macOS system libraries: `/usr/lib/libresolv.9.dylib` and `/usr/lib/libSystem.B.dylib`.
|
For macOS platform, almost all binaries under macOS cannot be truly purely statically linked, and almost all binaries will link macOS system libraries: `/usr/lib/libresolv.9.dylib` and `/usr/lib/libSystem.B.dylib`.
|
||||||
So on macOS, you can use statically compiled PHP binaries under certain compilation conditions, and dynamically linked extensions:
|
So on macOS, you can **directly** use SPC to build statically compiled PHP binaries with dynamically linked extensions:
|
||||||
|
|
||||||
1. Using the `--no-strip` parameter will not strip information such as debugging symbols from the binary file for use with external Zend extensions such as `Xdebug`.
|
1. Build shared extension `xxx.so` using: `--build-shared=XXX` option. e.g. `bin/spc build bcmath,zlib --build-shared=xdebug --build-cli`
|
||||||
2. If you want to compile some Zend extensions, use Homebrew, MacPorts, source code compilation, and install a normal version of PHP on your operating system.
|
2. You will get `buildroot/modules/xdebug.so` and `buildroot/bin/php`.
|
||||||
3. Use the `phpize && ./configure && make` command to compile the extensions you want to use.
|
3. The `xdebug.so` file could be used for php that version and thread-safe are the same.
|
||||||
4. Copy the extension file `xxxx.so` to the outside, use the statically compiled PHP binary, for example to use the Xdebug extension: `cd buildroot/bin/ && ./php -d "zend_extension=/path/to/xdebug.so"`.
|
|
||||||
|
|
||||||
```bash
|
For the Windows platform, since officially built extensions (such as `php_yaml.dll`) force the use of the `php8.dll` dynamic library as a link, and statically built PHP does not include any dynamic libraries other than system libraries,
|
||||||
# build statically linked php-cli but not stripped
|
php.exe built by static-php cannot load officially built dynamic extensions. Since static-php-cli does not yet support building dynamic extensions, there is currently no way to load dynamic extensions with static-php.
|
||||||
bin/spc build ffi --build-cli --no-strip
|
|
||||||
```
|
However, Windows can normally use the `FFI` extension to load other dll files and call them.
|
||||||
|
|
||||||
## Can it support Oracle database extension?
|
## Can it support Oracle database extension?
|
||||||
|
|
||||||
|
|||||||
@@ -61,6 +61,4 @@ If you have related issues or requirements, please indicate that you are buildin
|
|||||||
If you need to build glibc-based binaries without using Docker,
|
If you need to build glibc-based binaries without using Docker,
|
||||||
please refer to the `bin/spc-gnu-docker` script to manually create a similar environment.
|
please refer to the `bin/spc-gnu-docker` script to manually create a similar environment.
|
||||||
|
|
||||||
Since glibc binaries are not the main goal of the project,
|
Please keep in mind that we only support glibc build with `bin/spc-gnu-docker`. Compilation on RHEL 9 & 10 has been tested and is stable, but if you run into issues, we may choose not to fix them.
|
||||||
we generally do not test the compatibility of various libraries and extensions under glibc.
|
|
||||||
If any specific library builds successfully on musl-libc but fails on glibc, please submit an issue.
|
|
||||||
|
|||||||
@@ -6,6 +6,8 @@ which will be listed one by one here.
|
|||||||
|
|
||||||
## curl
|
## curl
|
||||||
|
|
||||||
|
HTTP3 support is not enabled by default, compile with `--with-libs="nghttp2,nghttp3,ngtcp2"` to enable HTTP3 support for PHP >= 8.4.
|
||||||
|
|
||||||
When using curl to request HTTPS, there may be an `error:80000002:system library::No such file or directory` error.
|
When using curl to request HTTPS, there may be an `error:80000002:system library::No such file or directory` error.
|
||||||
For details on the solution, see [FAQ - Unable to use ssl](../faq/#unable-to-use-ssl).
|
For details on the solution, see [FAQ - Unable to use ssl](../faq/#unable-to-use-ssl).
|
||||||
|
|
||||||
@@ -44,15 +46,27 @@ If you use `swoole,swoole-hook-sqlite`, you will enable the coroutine mode of Sw
|
|||||||
swoole-hook-sqlite conflicts with the `pdo_sqlite` extension. If you want to use Swoole and `pdo_sqlite`, please delete the pdo_sqlite extension and enable `swoole` and `swoole-hook-sqlite`.
|
swoole-hook-sqlite conflicts with the `pdo_sqlite` extension. If you want to use Swoole and `pdo_sqlite`, please delete the pdo_sqlite extension and enable `swoole` and `swoole-hook-sqlite`.
|
||||||
This extension contains an implementation of the coroutine environment for `pdo_sqlite`.
|
This extension contains an implementation of the coroutine environment for `pdo_sqlite`.
|
||||||
|
|
||||||
|
## swoole-hook-odbc
|
||||||
|
|
||||||
|
swoole-hook-odbc is not an extension, it's a Hook feature of Swoole.
|
||||||
|
If you use `swoole,swoole-hook-odbc`, you will enable the coroutine mode of Swoole's `odbc` extension.
|
||||||
|
|
||||||
|
swoole-hook-odbc conflicts with the `pdo_odbc` extension. If you want to use Swoole and `pdo_odbc`, please delete the `pdo_odbc` extension and enable `swoole` and `swoole-hook-odbc`.
|
||||||
|
This extension contains an implementation of the coroutine environment for `pdo_odbc`.
|
||||||
|
|
||||||
## swow
|
## swow
|
||||||
|
|
||||||
1. Only PHP 8.0 ~ 8.4 is supported.
|
1. Only PHP 8.0+ is supported.
|
||||||
|
|
||||||
|
## imagick
|
||||||
|
|
||||||
|
1. OpenMP support is disabled, this is recommended by the maintainers and also the case system packages.
|
||||||
|
|
||||||
## imap
|
## imap
|
||||||
|
|
||||||
1. Kerberos is not supported
|
1. Kerberos is not supported
|
||||||
2. ext-imap is not thread safe due to the underlying c-client. It's not possible to use it in --enable-zts builds.
|
2. ext-imap is not thread safe due to the underlying c-client. It's not possible to use it in `--enable-zts` builds.
|
||||||
3. Because the extension may be dropped from php, we recommend you look for an alternative implementation, such as [Webklex/php-imap](https://github.com/Webklex/php-imap)
|
3. The extension was dropped from php 8.4, we recommend you look for an alternative implementation, such as [Webklex/php-imap](https://github.com/Webklex/php-imap)
|
||||||
|
|
||||||
## gd
|
## gd
|
||||||
|
|
||||||
@@ -76,11 +90,9 @@ and this extension cannot be compiled into php by static linking, so it cannot b
|
|||||||
|
|
||||||
## xdebug
|
## xdebug
|
||||||
|
|
||||||
1. Xdebug is a Zend extension. The functions of Xdebug depend on PHP's Zend engine and underlying code.
|
1. Xdebug is only buildable as a shared extension. On Linux, you'll need to use a SPC_TARGET like `native-native -dynamic` or `native-native-gnu`.
|
||||||
If you want to statically compile it into PHP, you may need a huge amount of patch code, which is not feasible.
|
2. When using Linux/glibc or macOS, you can compile Xdebug as a shared extension using --build-shared="xdebug".
|
||||||
2. The macOS platform can compile an xdebug extension under PHP compiled on the same platform,
|
The compiled `./php` binary can be configured and run by specifying the INI, eg `./php -d 'zend_extension=/path/to/xdebug.so' your-code.php`.
|
||||||
extract the `xdebug.so` file, and then use the `--no-strip` parameter in static-php-cli to retain the debug symbol table and add the `ffi` extension.
|
|
||||||
The compiled `./php` binary can be configured and run by specifying the INI, eg `./php -d 'zend_extension=/path/to/xdebug.so' your-code.php`.
|
|
||||||
|
|
||||||
## xml
|
## xml
|
||||||
|
|
||||||
@@ -118,13 +130,13 @@ For details on the solution, see [FAQ - Unable to use ssl](../faq/#unable-to-use
|
|||||||
|
|
||||||
## password-argon2
|
## password-argon2
|
||||||
|
|
||||||
1. password-argon2 is not a standard extension, it is an additional algorithm for the `password_hash` function.
|
1. password-argon2 is not a standard extension. The algorithm `PASSWORD_ARGON2ID` for the `password_hash` function needs libsodium or libargon2 to work.
|
||||||
2. On Linux systems, `password-argon2` dependency `libargon2` conflicts with the `libsodium` library.
|
2. using password-argon2 enables multithread support for this.
|
||||||
|
|
||||||
## ffi
|
## ffi
|
||||||
|
|
||||||
1. Due to the limitation of Linux system, you cannot use it to load other `so` extensions in the purely static compiled state (spc defaults to pure static compilation).
|
1. Due to the limitation of musl libc's static linkage, you cannot use ffi because dynamic libraries cannot be loaded.
|
||||||
Linux supports loading so extensions only if they are non-statically compiled. If you need to use the ffi extension, see [Compile PHP with GNU libc](./build-with-glibc).
|
If you need to use the ffi extension, see [Compile PHP with GNU libc](./build-with-glibc).
|
||||||
2. macOS supports the ffi extension, but errors will occur when some kernels do not contain debugging symbols.
|
2. macOS supports the ffi extension, but errors will occur when some kernels do not contain debugging symbols.
|
||||||
3. Windows x64 supports the ffi extension.
|
3. Windows x64 supports the ffi extension.
|
||||||
|
|
||||||
@@ -147,5 +159,10 @@ Parallel is only supported on PHP 8.0 ZTS and above.
|
|||||||
|
|
||||||
## spx
|
## spx
|
||||||
|
|
||||||
1. The [SPX extension](https://github.com/NoiseByNorthwest/php-spx) only supports NTS mode.
|
1. SPX does not support Windows, and the official repository does not support static compilation. static-php-cli uses a [modified version](https://github.com/static-php/php-spx).
|
||||||
2. SPX does not support Windows, and the official repository does not support static compilation. static-php-cli uses a [modified version](https://github.com/static-php/php-spx).
|
|
||||||
|
## mimalloc
|
||||||
|
|
||||||
|
1. This is not technically an extension, but a library.
|
||||||
|
2. Building with `--with-libs="mimalloc"` on Linux or macOS will override the default allocator.
|
||||||
|
3. This is experimental for now, but is recommended in threaded environments.
|
||||||
|
|||||||
@@ -21,19 +21,30 @@ The following is the architecture support situation, where :gear: represents sup
|
|||||||
| Windows | :gear: :computer: | |
|
| Windows | :gear: :computer: | |
|
||||||
| FreeBSD | :computer: | :computer: |
|
| FreeBSD | :computer: | :computer: |
|
||||||
|
|
||||||
Among them, Linux is currently only tested on Ubuntu, Debian, and Alpine distributions,
|
Current supported PHP versions for compilation:
|
||||||
and other distributions have not been tested, which cannot guarantee successful compilation.
|
|
||||||
For untested distributions, local compilation can be done using methods such as Docker to avoid environmental issues.
|
|
||||||
|
|
||||||
There are two architectures for macOS: `x86_64` and `Arm`, but binaries compiled on one architecture cannot be directly used on the other architecture.
|
> :warning: Partial support, there may be issues with new beta versions and old versions.
|
||||||
Rosetta 2 cannot guarantee that programs compiled with `Arm` architecture can fully run on `x86_64` environment.
|
>
|
||||||
|
> :heavy_check_mark: Supported
|
||||||
|
>
|
||||||
|
> :x: Not supported
|
||||||
|
|
||||||
Windows currently only supports the x86_64 architecture, and does not support 32-bit x86 or arm64 architecture.
|
| PHP Version | Status | Comment |
|
||||||
|
|-------------|--------------------|-------------------------------------------------------------------------------------------------------------------------|
|
||||||
|
| 7.2 | :x: | |
|
||||||
|
| 7.3 | :x: | phpmicro and many extensions do not support 7.3, 7.4 versions |
|
||||||
|
| 7.4 | :x: | phpmicro and many extensions do not support 7.3, 7.4 versions |
|
||||||
|
| 8.0 | :warning: | PHP official has stopped maintaining 8.0, we no longer handle 8.0 related backport support |
|
||||||
|
| 8.1 | :warning: | PHP official only provides security updates for 8.1, we no longer handle 8.1 related backport support after 8.5 release |
|
||||||
|
| 8.2 | :heavy_check_mark: | |
|
||||||
|
| 8.3 | :heavy_check_mark: | |
|
||||||
|
| 8.4 | :heavy_check_mark: | |
|
||||||
|
| 8.5 (beta) | :warning: | PHP 8.5 is currently in beta stage |
|
||||||
|
|
||||||
## Supported PHP Version
|
> This table shows the support status of static-php-cli for building corresponding versions, not the PHP official support status for that version.
|
||||||
|
|
||||||
Currently, static php cli supports PHP versions 8.1 to 8.4, and theoretically supports PHP 8.0 and earlier versions.
|
## PHP Support Versions
|
||||||
Simply select the earlier version when downloading.
|
|
||||||
However, due to some extensions and special components that have stopped supporting earlier versions of PHP,
|
Currently, static-php-cli supports PHP versions 8.2 ~ 8.5, and theoretically supports PHP 8.1 and earlier versions, just select the earlier version when downloading.
|
||||||
static-php-cli will not explicitly support earlier versions.
|
However, due to some extensions and special components that have stopped supporting earlier versions of PHP, static-php-cli will not explicitly support earlier versions.
|
||||||
We recommend that you compile the latest PHP version possible for a better experience.
|
We recommend that you compile the latest PHP version possible for a better experience.
|
||||||
|
|||||||
@@ -1,3 +1,7 @@
|
|||||||
|
---
|
||||||
|
outline: 'deep'
|
||||||
|
---
|
||||||
|
|
||||||
# Build (Linux, macOS, FreeBSD)
|
# Build (Linux, macOS, FreeBSD)
|
||||||
|
|
||||||
This section covers the build process for Linux, macOS, and FreeBSD. If you want to build on Windows,
|
This section covers the build process for Linux, macOS, and FreeBSD. If you want to build on Windows,
|
||||||
@@ -133,7 +137,48 @@ and then install the latest version of PHP and tokenizer, XML, and phar extensio
|
|||||||
Older versions of Debian may have an older (<= 7.4) version of PHP installed by default, it is recommended to upgrade Debian first.
|
Older versions of Debian may have an older (<= 7.4) version of PHP installed by default, it is recommended to upgrade Debian first.
|
||||||
:::
|
:::
|
||||||
|
|
||||||
## Command - download
|
## Build with craft (recommended)
|
||||||
|
|
||||||
|
Using `bin/spc craft`, you can use a configuration file and a command to automatically check the environment, download source code, build dependency libraries, build PHP and extensions, etc.
|
||||||
|
|
||||||
|
You need to write a `craft.yml` file and save it in the current working directory. `craft.yml` can be generated by [command generator](./cli-generator) or written manually.
|
||||||
|
|
||||||
|
For manual writing, please refer to the comments in [craft.yml configuration](../develop/craft-yml.md) to write it.
|
||||||
|
Let's assume that you compile an extension combination and choose PHP 8.4, outputting `cli` and `fpm`:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# path/to/craft.yml
|
||||||
|
php-version: 8.4
|
||||||
|
extensions: bcmath,posix,phar,zlib,openssl,curl,fileinfo,tokenizer
|
||||||
|
sapi:
|
||||||
|
- cli
|
||||||
|
- fpm
|
||||||
|
```
|
||||||
|
|
||||||
|
Then use the `bin/spc craft` command to compile:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
bin/spc craft --debug
|
||||||
|
```
|
||||||
|
|
||||||
|
If the build is successful, you will see the `buildroot/bin` directory in the current directory, which contains the compiled PHP binary file, or the corresponding SAPI.
|
||||||
|
|
||||||
|
- cli: The build result is `buildroot/bin/php.exe` on Windows and `buildroot/bin/php` on other platforms.
|
||||||
|
- fpm: The build result is `buildroot/bin/php-fpm`.
|
||||||
|
- micro: The build result is `buildroot/bin/micro.sfx`. If you need to further package it with PHP code, please refer to [Packaging micro binary](./manual-build#command-micro-combine).
|
||||||
|
- embed: See [Using embed](./manual-build#embed-usage).
|
||||||
|
- frankenphp: The build result is `buildroot/bin/frankenphp`.
|
||||||
|
|
||||||
|
If the build fails, you can use the `--debug` parameter to view detailed error information,
|
||||||
|
or use the `--with-clean` to clear the old compilation results and recompile.
|
||||||
|
|
||||||
|
If the build still fails to use the above method, please submit an issue and attach your `craft.yml` and `./log` archive.
|
||||||
|
|
||||||
|
## Step-by-step build command
|
||||||
|
|
||||||
|
If you have customized requirements, or the need to download and compile PHP and dependent libraries separately, you can use the `bin/spc` command to execute step by step.
|
||||||
|
|
||||||
|
### Command download - Download dependency packages
|
||||||
|
|
||||||
Use the command `bin/spc download` to download the source code required for compilation,
|
Use the command `bin/spc download` to download the source code required for compilation,
|
||||||
including php-src and the source code of various dependent libraries.
|
including php-src and the source code of various dependent libraries.
|
||||||
@@ -197,8 +242,8 @@ Also, it is available when downloading with the `--for-extensions` option.
|
|||||||
|
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Specifying to download a beta version of PHP8.3
|
# Specifying to download a alpha version of PHP 8.5
|
||||||
bin/spc download --all -U "php-src:https://downloads.php.net/~eric/php-8.3.0beta1.tar.gz"
|
bin/spc download --all -U "php-src:https://downloads.php.net/~edorian/php-8.5.0alpha2.tar.xz"
|
||||||
|
|
||||||
# Specifying to download an older version of the curl library
|
# Specifying to download an older version of the curl library
|
||||||
bin/spc download --all -U "curl:https://curl.se/download/curl-7.88.1.tar.gz"
|
bin/spc download --all -U "curl:https://curl.se/download/curl-7.88.1.tar.gz"
|
||||||
@@ -217,7 +262,7 @@ bin/spc download --for-extensions=redis -G "php-src:master:https://github.com/ph
|
|||||||
bin/spc download --for-extensions=swoole -G "swoole:master:https://github.com/swoole/swoole-src.git"
|
bin/spc download --for-extensions=swoole -G "swoole:master:https://github.com/swoole/swoole-src.git"
|
||||||
```
|
```
|
||||||
|
|
||||||
## Command - doctor
|
### Command - doctor
|
||||||
|
|
||||||
If you can run `bin/spc` normally but cannot compile static PHP or dependent libraries normally,
|
If you can run `bin/spc` normally but cannot compile static PHP or dependent libraries normally,
|
||||||
you can run `bin/spc doctor` first to check whether the system itself lacks dependencies.
|
you can run `bin/spc doctor` first to check whether the system itself lacks dependencies.
|
||||||
@@ -230,13 +275,13 @@ bin/spc doctor
|
|||||||
bin/spc doctor --auto-fix
|
bin/spc doctor --auto-fix
|
||||||
```
|
```
|
||||||
|
|
||||||
## Command - build
|
### Command - build
|
||||||
|
|
||||||
Use the build command to start building the static php binary.
|
Use the build command to start building the static php binary.
|
||||||
Before executing the `bin/spc build` command, be sure to use the `download` command to download sources.
|
Before executing the `bin/spc build` command, be sure to use the `download` command to download sources.
|
||||||
It is recommended to use `doctor` to check the environment.
|
It is recommended to use `doctor` to check the environment.
|
||||||
|
|
||||||
### Basic build
|
#### Basic build
|
||||||
|
|
||||||
You need to go to [Extension List](./extensions) or [Command Generator](./cli-generator) to select the extension you want to add,
|
You need to go to [Extension List](./extensions) or [Command Generator](./cli-generator) to select the extension you want to add,
|
||||||
and then use the command `bin/spc build` to compile.
|
and then use the command `bin/spc build` to compile.
|
||||||
@@ -244,8 +289,10 @@ You need to specify a compilation target, choose from the following parameters:
|
|||||||
|
|
||||||
- `--build-cli`: Build a cli sapi (command line interface, which can execute PHP code on the command line)
|
- `--build-cli`: Build a cli sapi (command line interface, which can execute PHP code on the command line)
|
||||||
- `--build-fpm`: Build a fpm sapi (php-fpm, used in conjunction with other traditional fpm architecture software such as nginx)
|
- `--build-fpm`: Build a fpm sapi (php-fpm, used in conjunction with other traditional fpm architecture software such as nginx)
|
||||||
|
- `--build-cgi`: Build a cgi sapi (cgi, rarely used)
|
||||||
- `--build-micro`: Build a micro sapi (used to build a standalone executable binary containing PHP code)
|
- `--build-micro`: Build a micro sapi (used to build a standalone executable binary containing PHP code)
|
||||||
- `--build-embed`: Build an embed sapi (used to embed into other C language programs)
|
- `--build-embed`: Build an embed sapi (used to embed into other C language programs)
|
||||||
|
- `--build-frankenphp`: Build a [FrankenPHP](https://github.com/php/frankenphp) executable
|
||||||
- `--build-all`: build all above sapi
|
- `--build-all`: build all above sapi
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
@@ -283,16 +330,7 @@ bin/spc build bcmath,curl,openssl,ftp,posix,pcntl --build-cli
|
|||||||
```
|
```
|
||||||
:::
|
:::
|
||||||
|
|
||||||
### Debug
|
#### Build Options
|
||||||
|
|
||||||
If you encounter problems during the compilation process, or want to view each executing shell command,
|
|
||||||
you can use `--debug` to enable debug mode and view all terminal logs:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
bin/spc build mysqlnd,pdo_mysql --build-all --debug
|
|
||||||
```
|
|
||||||
|
|
||||||
### Build Options
|
|
||||||
|
|
||||||
During the compilation process, in some special cases,
|
During the compilation process, in some special cases,
|
||||||
the compiler and the content of the compilation directory need to be intervened.
|
the compiler and the content of the compilation directory need to be intervened.
|
||||||
@@ -302,7 +340,7 @@ You can try to use the following commands:
|
|||||||
- `--cxx=XXX`: Specifies the execution command of the C++ language compiler (Linux defaults to `g++`, macOS defaults to `clang++`)
|
- `--cxx=XXX`: Specifies the execution command of the C++ language compiler (Linux defaults to `g++`, macOS defaults to `clang++`)
|
||||||
- `--with-clean`: clean up old make files before compiling PHP
|
- `--with-clean`: clean up old make files before compiling PHP
|
||||||
- `--enable-zts`: Make compiled PHP thread-safe version (default is NTS version)
|
- `--enable-zts`: Make compiled PHP thread-safe version (default is NTS version)
|
||||||
- `--no-strip`: Do not run `strip` after compiling the PHP library to trim the binary file to reduce its size (the macOS binary file without trim can use dynamically linked third-party extensions)
|
- `--no-strip`: Do not run `strip` after compiling the PHP library to trim the binary file to reduce its size
|
||||||
- `--with-libs=XXX,YYY`: Compile the specified dependent library before compiling PHP, and activate some extended optional functions (such as libavif of the gd library, etc.)
|
- `--with-libs=XXX,YYY`: Compile the specified dependent library before compiling PHP, and activate some extended optional functions (such as libavif of the gd library, etc.)
|
||||||
- `--with-config-file-path=XXX`: Set the path in which to look for `php.ini` (Check [here](../faq/index.html#what-is-the-path-of-php-ini) for default paths)
|
- `--with-config-file-path=XXX`: Set the path in which to look for `php.ini` (Check [here](../faq/index.html#what-is-the-path-of-php-ini) for default paths)
|
||||||
- `--with-config-file-scan-dir=XXX`: Set the directory to scan for `.ini` files after reading `php.ini` (Check [here](../faq/index.html#what-is-the-path-of-php-ini) for default paths)
|
- `--with-config-file-scan-dir=XXX`: Set the directory to scan for `.ini` files after reading `php.ini` (Check [here](../faq/index.html#what-is-the-path-of-php-ini) for default paths)
|
||||||
@@ -314,6 +352,7 @@ You can try to use the following commands:
|
|||||||
- `--with-suggested-exts`: Add `ext-suggests` as dependencies when compiling
|
- `--with-suggested-exts`: Add `ext-suggests` as dependencies when compiling
|
||||||
- `--with-suggested-libs`: Add `lib-suggests` as dependencies when compiling
|
- `--with-suggested-libs`: Add `lib-suggests` as dependencies when compiling
|
||||||
- `--with-upx-pack`: Use UPX to reduce the size of the binary file after compilation (you need to use `bin/spc install-pkg upx` to install upx first)
|
- `--with-upx-pack`: Use UPX to reduce the size of the binary file after compilation (you need to use `bin/spc install-pkg upx` to install upx first)
|
||||||
|
- `--build-shared=XXX,YYY`: compile the specified extension into a shared library (the default is to compile into a static library)
|
||||||
|
|
||||||
For hardcoding INI options, it works for cli, micro, embed sapi. Here is a simple example where we preset a larger `memory_limit` and disable the `system` function:
|
For hardcoding INI options, it works for cli, micro, embed sapi. Here is a simple example where we preset a larger `memory_limit` and disable the `system` function:
|
||||||
|
|
||||||
@@ -321,6 +360,15 @@ For hardcoding INI options, it works for cli, micro, embed sapi. Here is a simpl
|
|||||||
bin/spc build bcmath,pcntl,posix --build-all -I "memory_limit=4G" -I "disable_functions=system"
|
bin/spc build bcmath,pcntl,posix --build-all -I "memory_limit=4G" -I "disable_functions=system"
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## Debug
|
||||||
|
|
||||||
|
If you encounter problems during the compilation process, or want to view each executing shell command,
|
||||||
|
you can use `--debug` to enable debug mode and view all terminal logs:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
bin/spc build mysqlnd,pdo_mysql --build-all --debug
|
||||||
|
```
|
||||||
|
|
||||||
## Command - micro:combine
|
## Command - micro:combine
|
||||||
|
|
||||||
Use the `micro:combine` command to build the compiled `micro.sfx` and your code (`.php` or `.phar` file) into an executable binary.
|
Use the `micro:combine` command to build the compiled `micro.sfx` and your code (`.php` or `.phar` file) into an executable binary.
|
||||||
@@ -464,6 +512,8 @@ When `bin/spc doctor` automatically repairs the Windows environment, tools such
|
|||||||
Here is an example of installing the tool:
|
Here is an example of installing the tool:
|
||||||
|
|
||||||
- Download and install UPX (Linux and Windows only): `bin/spc install-pkg upx`
|
- Download and install UPX (Linux and Windows only): `bin/spc install-pkg upx`
|
||||||
|
- Download and install nasm (Windows only): `bin/spc install-pkg nasm`
|
||||||
|
- Download and install go-xcaddy: `bin/spc install-pkg go-xcaddy`
|
||||||
|
|
||||||
## Command - del-download
|
## Command - del-download
|
||||||
|
|
||||||
@@ -499,22 +549,24 @@ otherwise it will be executed repeatedly in other events.
|
|||||||
|
|
||||||
The following are the supported `patch_point` event names and corresponding locations:
|
The following are the supported `patch_point` event names and corresponding locations:
|
||||||
|
|
||||||
| Event name | Event description |
|
| Event name | Event description |
|
||||||
|------------------------------|----------------------------------------------------------------------------------------------------|
|
|---------------------------------|----------------------------------------------------------------------------------------------------|
|
||||||
| before-libs-extract | Triggered before the dependent libraries extracted |
|
| before-libs-extract | Triggered before the dependent libraries extracted |
|
||||||
| after-libs-extract | Triggered after the compiled dependent libraries extracted |
|
| after-libs-extract | Triggered after the compiled dependent libraries extracted |
|
||||||
| before-php-extract | Triggered before PHP source code extracted |
|
| before-php-extract | Triggered before PHP source code extracted |
|
||||||
| after-php-extract | Triggered after PHP source code extracted |
|
| after-php-extract | Triggered after PHP source code extracted |
|
||||||
| before-micro-extract | Triggered before phpmicro extract |
|
| before-micro-extract | Triggered before phpmicro extract |
|
||||||
| after-micro-extract | Triggered after phpmicro extracted |
|
| after-micro-extract | Triggered after phpmicro extracted |
|
||||||
| before-exts-extract | Triggered before the extension (to be compiled) extracted to the PHP source directory |
|
| before-exts-extract | Triggered before the extension (to be compiled) extracted to the PHP source directory |
|
||||||
| after-exts-extract | Triggered after the extension extracted to the PHP source directory |
|
| after-exts-extract | Triggered after the extension extracted to the PHP source directory |
|
||||||
| before-library[*name*]-build | Triggered before the library named `name` is compiled (such as `before-library[postgresql]-build`) |
|
| before-library[*name*]-build | Triggered before the library named `name` is compiled (such as `before-library[postgresql]-build`) |
|
||||||
| after-library[*name*]-build | Triggered after the library named `name` is compiled |
|
| after-library[*name*]-build | Triggered after the library named `name` is compiled |
|
||||||
| before-php-buildconf | Triggered before compiling PHP command `./buildconf` |
|
| after-shared-ext[*name*]-build | Triggered after the shared extension named `name` is compiled |
|
||||||
| before-php-configure | Triggered before compiling PHP command `./configure` |
|
| before-shared-ext[*name*]-build | Triggered before the shared extension named `name` is compiled |
|
||||||
| before-php-make | Triggered before compiling PHP command `make` |
|
| before-php-buildconf | Triggered before compiling PHP command `./buildconf` |
|
||||||
| before-sanity-check | Triggered after compiling PHP but before running extended checks |
|
| before-php-configure | Triggered before compiling PHP command `./configure` |
|
||||||
|
| before-php-make | Triggered before compiling PHP command `make` |
|
||||||
|
| before-sanity-check | Triggered after compiling PHP but before running extended checks |
|
||||||
|
|
||||||
The following is a simple example of temporarily modifying the PHP source code.
|
The following is a simple example of temporarily modifying the PHP source code.
|
||||||
Enable the CLI function to search for the `php.ini` configuration in the current working directory:
|
Enable the CLI function to search for the `php.ini` configuration in the current working directory:
|
||||||
|
|||||||
125
docs/en/index.md
125
docs/en/index.md
@@ -3,11 +3,14 @@
|
|||||||
layout: home
|
layout: home
|
||||||
|
|
||||||
hero:
|
hero:
|
||||||
name: "static-php-cli"
|
name: "Static PHP"
|
||||||
tagline: "Build standalone PHP binary on Linux, macOS, FreeBSD, Windows, with PHP project together, with popular extensions included."
|
tagline: "Build standalone PHP binary on Linux, macOS, FreeBSD, Windows, with PHP project together, with popular extensions included."
|
||||||
|
image:
|
||||||
|
src: /images/static-php_nobg.png
|
||||||
|
alt: Static PHP CLI Logo
|
||||||
actions:
|
actions:
|
||||||
- theme: brand
|
- theme: brand
|
||||||
text: Guide
|
text: Get Started
|
||||||
link: ./guide/
|
link: ./guide/
|
||||||
|
|
||||||
features:
|
features:
|
||||||
@@ -19,3 +22,121 @@ features:
|
|||||||
details: static-php-cli comes with dependency management and supports installation of different types of PHP extensions.
|
details: static-php-cli comes with dependency management and supports installation of different types of PHP extensions.
|
||||||
---
|
---
|
||||||
|
|
||||||
|
<script setup>
|
||||||
|
import {VPSponsors} from "vitepress/theme";
|
||||||
|
import Contributors from '../.vitepress/components/Contributors.vue';
|
||||||
|
|
||||||
|
const sponsors = [
|
||||||
|
{ name: 'Beyond Code', img: '/images/beyondcode-seeklogo.png', url: 'https://beyondco.de/' },
|
||||||
|
{ name: 'NativePHP', img: '/images/nativephp-logo.svg', url: 'https://nativephp.com/' },
|
||||||
|
];
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<div class="sponsors-section">
|
||||||
|
<div class="sponsors-header">
|
||||||
|
<h2>Special Sponsors</h2>
|
||||||
|
<p class="sponsors-description">
|
||||||
|
Thank you to our amazing sponsors for supporting this project!
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<VPSponsors :data="sponsors"/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<style scoped>
|
||||||
|
.sponsors-section {
|
||||||
|
margin: 48px auto;
|
||||||
|
padding: 32px 24px;
|
||||||
|
max-width: 1152px;
|
||||||
|
background: linear-gradient(135deg, var(--vp-c-bg-soft) 0%, var(--vp-c-bg) 100%);
|
||||||
|
border-radius: 16px;
|
||||||
|
border: 1px solid var(--vp-c-divider);
|
||||||
|
box-shadow: 0 4px 16px rgba(0, 0, 0, 0.05);
|
||||||
|
transition: all 0.3s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
.sponsors-section:hover {
|
||||||
|
box-shadow: 0 8px 24px rgba(0, 0, 0, 0.1);
|
||||||
|
transform: translateY(-2px);
|
||||||
|
}
|
||||||
|
|
||||||
|
.sponsors-header {
|
||||||
|
text-align: center;
|
||||||
|
margin-bottom: 24px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.sponsors-header h2 {
|
||||||
|
font-size: 1.5rem;
|
||||||
|
font-weight: 700;
|
||||||
|
margin: 0 0 8px 0;
|
||||||
|
background: linear-gradient(120deg, var(--vp-c-brand-1), var(--vp-c-brand-2));
|
||||||
|
-webkit-background-clip: text;
|
||||||
|
-webkit-text-fill-color: transparent;
|
||||||
|
background-clip: text;
|
||||||
|
}
|
||||||
|
|
||||||
|
.sponsors-description {
|
||||||
|
font-size: 0.95rem;
|
||||||
|
color: var(--vp-c-text-2);
|
||||||
|
margin: 0;
|
||||||
|
line-height: 1.5;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width: 768px) {
|
||||||
|
.sponsors-section {
|
||||||
|
margin: 32px 16px;
|
||||||
|
padding: 24px 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.sponsors-header h2 {
|
||||||
|
font-size: 1.25rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.sponsors-description {
|
||||||
|
font-size: 0.9rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Hero logo styling */
|
||||||
|
:deep(.VPImage.image-src) {
|
||||||
|
border-radius: 20px;
|
||||||
|
background: linear-gradient(135deg, var(--vp-c-bg-soft) 0%, var(--vp-c-default-soft) 100%);
|
||||||
|
padding: 40px;
|
||||||
|
box-shadow: 0 8px 32px rgba(0, 0, 0, 0.1);
|
||||||
|
transition: all 0.3s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep(.VPImage.image-src:hover) {
|
||||||
|
transform: translateY(-4px);
|
||||||
|
box-shadow: 0 12px 40px rgba(0, 0, 0, 0.15);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Dark mode adjustments for logo */
|
||||||
|
.dark :deep(.VPImage.image-src) {
|
||||||
|
background: linear-gradient(135deg, rgba(255, 255, 255, 0.05) 0%, rgba(255, 255, 255, 0.02) 100%);
|
||||||
|
box-shadow: 0 8px 32px rgba(0, 0, 0, 0.5);
|
||||||
|
opacity: 0.9;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dark :deep(.VPImage.image-src:hover) {
|
||||||
|
opacity: 1;
|
||||||
|
box-shadow: 0 12px 40px rgba(0, 0, 0, 0.7);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Additional styling for the logo image itself */
|
||||||
|
:deep(.VPImage.image-src img) {
|
||||||
|
max-height: 280px;
|
||||||
|
width: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width: 768px) {
|
||||||
|
:deep(.VPImage.image-src) {
|
||||||
|
padding: 24px;
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep(.VPImage.image-src img) {
|
||||||
|
max-height: 200px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<Contributors />
|
||||||
|
|||||||
126
docs/index.md
126
docs/index.md
@@ -3,8 +3,11 @@
|
|||||||
layout: home
|
layout: home
|
||||||
|
|
||||||
hero:
|
hero:
|
||||||
name: "static-php-cli"
|
name: "Static PHP"
|
||||||
tagline: "Build standalone PHP binary on Linux, macOS, FreeBSD, Windows, with PHP project together, with popular extensions included."
|
tagline: "Build standalone PHP binary on Linux, macOS, FreeBSD, Windows, with PHP project together, with popular extensions included."
|
||||||
|
image:
|
||||||
|
src: /images/static-php_nobg.png
|
||||||
|
alt: Static PHP CLI Logo
|
||||||
actions:
|
actions:
|
||||||
- theme: brand
|
- theme: brand
|
||||||
text: Get Started
|
text: Get Started
|
||||||
@@ -21,3 +24,124 @@ features:
|
|||||||
- title: Dependency Management
|
- title: Dependency Management
|
||||||
details: static-php-cli comes with dependency management and supports installation of different types of PHP extensions.
|
details: static-php-cli comes with dependency management and supports installation of different types of PHP extensions.
|
||||||
---
|
---
|
||||||
|
|
||||||
|
<script setup>
|
||||||
|
import {VPSponsors} from "vitepress/theme";
|
||||||
|
import Contributors from './.vitepress/components/Contributors.vue';
|
||||||
|
|
||||||
|
const sponsors = [
|
||||||
|
{ name: 'Beyond Code', img: '/images/beyondcode-seeklogo.png', url: 'https://beyondco.de/' },
|
||||||
|
{ name: 'NativePHP', img: '/images/nativephp-logo.svg', url: 'https://nativephp.com/' },
|
||||||
|
];
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<div class="sponsors-section">
|
||||||
|
<div class="sponsors-header">
|
||||||
|
<h2>Special Sponsors</h2>
|
||||||
|
<p class="sponsors-description">
|
||||||
|
Thank you to our amazing sponsors for supporting this project!
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<VPSponsors :data="sponsors"/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<style scoped>
|
||||||
|
.sponsors-section {
|
||||||
|
margin: 48px auto;
|
||||||
|
padding: 32px 24px;
|
||||||
|
max-width: 1152px;
|
||||||
|
background: linear-gradient(135deg, var(--vp-c-bg-soft) 0%, var(--vp-c-bg) 100%);
|
||||||
|
border-radius: 16px;
|
||||||
|
border: 1px solid var(--vp-c-divider);
|
||||||
|
box-shadow: 0 4px 16px rgba(0, 0, 0, 0.05);
|
||||||
|
transition: all 0.3s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
.sponsors-section:hover {
|
||||||
|
box-shadow: 0 8px 24px rgba(0, 0, 0, 0.1);
|
||||||
|
transform: translateY(-2px);
|
||||||
|
}
|
||||||
|
|
||||||
|
.sponsors-header {
|
||||||
|
text-align: center;
|
||||||
|
margin-bottom: 24px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.sponsors-header h2 {
|
||||||
|
font-size: 1.5rem;
|
||||||
|
font-weight: 700;
|
||||||
|
margin: 0 0 8px 0;
|
||||||
|
background: linear-gradient(120deg, var(--vp-c-brand-1), var(--vp-c-brand-2));
|
||||||
|
-webkit-background-clip: text;
|
||||||
|
-webkit-text-fill-color: transparent;
|
||||||
|
background-clip: text;
|
||||||
|
}
|
||||||
|
|
||||||
|
.sponsors-description {
|
||||||
|
font-size: 0.95rem;
|
||||||
|
color: var(--vp-c-text-2);
|
||||||
|
margin: 0;
|
||||||
|
line-height: 1.5;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width: 768px) {
|
||||||
|
.sponsors-section {
|
||||||
|
margin: 32px 16px;
|
||||||
|
padding: 24px 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.sponsors-header h2 {
|
||||||
|
font-size: 1.25rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.sponsors-description {
|
||||||
|
font-size: 0.9rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Hero logo styling */
|
||||||
|
:deep(.VPImage.image-src) {
|
||||||
|
border-radius: 20px;
|
||||||
|
background: linear-gradient(135deg, var(--vp-c-bg-soft) 0%, var(--vp-c-default-soft) 100%);
|
||||||
|
padding: 40px;
|
||||||
|
box-shadow: 0 8px 32px rgba(0, 0, 0, 0.1);
|
||||||
|
transition: all 0.3s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep(.VPImage.image-src:hover) {
|
||||||
|
transform: translateY(-4px);
|
||||||
|
box-shadow: 0 12px 40px rgba(0, 0, 0, 0.15);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Dark mode adjustments for logo */
|
||||||
|
.dark :deep(.VPImage.image-src) {
|
||||||
|
background: linear-gradient(135deg, rgba(255, 255, 255, 0.05) 0%, rgba(255, 255, 255, 0.02) 100%);
|
||||||
|
box-shadow: 0 8px 32px rgba(0, 0, 0, 0.5);
|
||||||
|
opacity: 0.9;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dark :deep(.VPImage.image-src:hover) {
|
||||||
|
opacity: 1;
|
||||||
|
box-shadow: 0 12px 40px rgba(0, 0, 0, 0.7);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Additional styling for the logo image itself */
|
||||||
|
:deep(.VPImage.image-src img) {
|
||||||
|
max-height: 280px;
|
||||||
|
width: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width: 768px) {
|
||||||
|
:deep(.VPImage.image-src) {
|
||||||
|
padding: 24px;
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep(.VPImage.image-src img) {
|
||||||
|
max-height: 200px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<Contributors />
|
||||||
|
|
||||||
|
|||||||
BIN
docs/public/images/beyondcode-seeklogo.png
Normal file
BIN
docs/public/images/beyondcode-seeklogo.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 29 KiB |
6
docs/public/images/nativephp-logo.svg
Normal file
6
docs/public/images/nativephp-logo.svg
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 764 100">
|
||||||
|
<path fill="#505b93" d="M29.5,98.4H0V1.2h29.5V98.4z"/>
|
||||||
|
<path fill="#00aaa6" d="M96.7,98.4H67.2V1.2h29.5V98.4z"/>
|
||||||
|
<path fill="#272d48" d="M96.7,98.4H29.5V1.2L96.7,98.4z"/>
|
||||||
|
<path fill="#272d48" d="M102.6,54.5c0-6.2,1.3-11.8,4.1-16.7c2.7-5,6.7-8.8,11.9-11.6c5.2-2.8,11.4-4.2,18.6-4.2c1.1,0,2.8,0.1,5.2,0.3 c4.9,0.4,9.1,1.3,12.5,2.8c3.4,1.5,6.4,3.4,9.1,5.9v-7.2h25.8v74.7h-25.8v-7.2c-2.5,2.6-5.6,4.6-9.4,6.1c-3.8,1.5-7.9,2.4-12.1,2.6 c-0.9,0.1-2.3,0.1-4.1,0.1c-7.2,0-13.4-1.4-18.8-4.1c-5.4-2.7-9.5-6.6-12.4-11.5c-2.9-4.9-4.3-10.5-4.3-16.6V54.5z M128.4,63.9 c0,9.2,5.9,13.8,17.7,13.8c11.8,0,17.7-4.6,17.7-13.8v-5.6c0-9.3-5.9-14-17.7-14c-11.8,0-17.7,4.7-17.7,14V63.9z M208.3,98.4V47h-12.8V23.7l12.8-0.2V1.2h25.9l0.1,22.4h18.3V47h-18.4v51.4 M287.3,98.4h-25.9V23.6h25.9V98.4z M351,98.4H325l-31-74.8H320L338,68l18-44.5h25.9L351,98.4z M454.9,87.6c-4.1,4.2-8.8,7.3-14.1,9.3c-5.3,2-11.8,2.9-19.5,2.9c-8,0-15.1-1.4-21.3-4.2 c-6.2-2.8-11.1-6.7-14.7-11.6c-3.5-5-5.3-10.6-5.3-17V54.6c0-6.5,1.7-12.2,5.2-17.1c3.4-4.9,8.2-8.7,14.2-11.3c6-2.7,12.7-4,20-4 c8,0,15,1.5,21.2,4.3c6.1,2.9,10.9,7,14.4,12.4c3.4,5.4,5.2,11.6,5.2,18.7c0,1.7-0.2,4.2-0.7,7.7l-54.2,0.1v2.1 c0,4.1,1.5,7.3,4.4,9.4c2.9,2.2,6.9,3.2,11.8,3.2c4.6,0,8.5-0.6,11.8-1.8c3.2-1.2,6.4-3.5,9.4-6.8L454.9,87.6z M434.4,51.4 c0-3.1-1.4-5.5-4.2-7.1c-2.8-1.6-6.4-2.4-10.8-2.4s-7.9,0.8-10.5,2.4c-2.6,1.6-3.8,4-3.8,7.1H434.4z M466,98.4V1.2h56c9.9,0,17.8,1.9,23.7,5.6c5.9,3.7,10,8.2,12.2,13.3c2.3,5.1,3.4,10.1,3.4,15 c0,4.8-1.2,9.7-3.5,14.7c-2.3,5-6.4,9.2-12.2,12.8c-5.8,3.6-13.7,5.4-23.7,5.4h-30.2v30.5H466z M522,44.6c9,0,13.6-3.3,13.6-9.9 c0-6.9-4.6-10.3-13.7-10.3h-30.1v20.2H522z M593,98.4h-25.8V1.2H593v38h43.9v-38h25.8v97.2h-25.8V59.9H593V98.4z M668.6,98.4V1.2h56c9.9,0,17.8,1.9,23.7,5.6c5.9,3.7,10,8.2,12.2,13.3c2.3,5.1,3.4,10.1,3.4,15 c0,4.8-1.2,9.7-3.5,14.7c-2.3,5-6.4,9.2-12.2,12.8c-5.8,3.6-13.7,5.4-23.7,5.4h-30.2v30.5H668.6z M724.6,44.6c9,0,13.6-3.3,13.6-9.9 c0-6.9-4.6-10.3-13.7-10.3h-30.1v20.2H724.6z M291.1,20.2h-33.5V0h33.5V20.2z"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 2.0 KiB |
BIN
docs/public/images/static-php_nobg.png
Normal file
BIN
docs/public/images/static-php_nobg.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 965 KiB |
@@ -4,45 +4,48 @@
|
|||||||
|
|
||||||
## 贡献方法
|
## 贡献方法
|
||||||
|
|
||||||
如果你有代码或文档想要贡献,需要先了解以下内容。
|
如果你有代码或文档要贡献,以下是你需要首先了解的内容。
|
||||||
|
|
||||||
1. 你要贡献什么类型的代码?(新扩展、修复 Bug、安全问题、项目框架优化、文档)
|
1. 你要贡献什么类型的代码?(新扩展、修复 Bug、安全问题、项目框架优化、文档)
|
||||||
2. 如果你贡献了新文件或新片段,你的代码是否经过 `php-cs-fixer` 和 `phpstan` 的检查?
|
2. 如果你贡献了新文件或新片段,你的代码是否经过 `php-cs-fixer` 和 `phpstan` 的检查?
|
||||||
3. 在贡献代码前是否充分阅读了 [开发指南](../develop/)?
|
3. 在贡献代码前是否充分阅读了 [开发指南](../develop/)?
|
||||||
|
|
||||||
如果你可以回答以上问题,并已经对代码做出了修改,可以及时在项目 GitHub 仓库发起 Pull Request。待代码审查完毕后,可根据建议修改代码,或直接合并到主分支。
|
如果你能回答上述问题并对代码进行了修改,可以及时在项目 GitHub 仓库发起 Pull Request。
|
||||||
|
代码审查完成后,可以根据建议修改代码,或直接合并到主分支。
|
||||||
|
|
||||||
## 贡献类型
|
## 贡献类型
|
||||||
|
|
||||||
本项目主要用途是编译静态链接的 PHP 二进制,基于 `symfony/console` 编写了命令行处理功能。在开发之前,如果你对它不够熟悉,
|
本项目的主要目的是编译静态链接的 PHP 二进制文件,命令行处理功能基于 `symfony/console` 编写。
|
||||||
可以先查看 [symfony/console 文档](https://symfony.com/doc/current/components/console.html)。
|
在开发之前,如果你对它不够熟悉,请先查看 [symfony/console 文档](https://symfony.com/doc/current/components/console.html)。
|
||||||
|
|
||||||
### 安全问题
|
### 安全更新
|
||||||
|
|
||||||
因为本项目基本上是属于本地运行的 PHP 项目,一般来说不会存在远程攻击行为。但如果你发现了此类问题,请**不要**在 GitHub 仓库提交 PR 或 Issue,
|
因为本项目基本上是一个本地运行的 PHP 项目,一般来说不会有远程攻击。
|
||||||
你需要通过 [邮件](mailto:admin@zhamao.me) 的方式联系项目维护者(crazywhalecc)。
|
但如果你发现此类问题,请**不要**在 GitHub 仓库提交 PR 或 Issue,
|
||||||
|
你需要通过 [邮件](mailto:admin@zhamao.me) 联系项目维护者(crazywhalecc)。
|
||||||
|
|
||||||
### 修复 Bug
|
### 修复 Bug
|
||||||
|
|
||||||
修复 Bug 一般不涉及项目结构和框架的修改,所以如果你可以定位到错误代码并直接修复它,请直接提交 PR。
|
修复 Bug 一般不涉及项目结构和框架的修改,所以如果你能定位到错误代码并直接修复它,请直接提交 PR。
|
||||||
|
|
||||||
### 新扩展
|
### 新扩展
|
||||||
|
|
||||||
对于添加一个新扩展来说,你需要先了解一些本项目的基本结构,以及如何根据现有的逻辑添加新扩展。在本页的下一章节将会详细介绍。
|
对于添加新扩展,你需要了解项目的一些基本结构以及如何根据现有逻辑添加新扩展。
|
||||||
|
这将在本页的下一节中详细介绍。
|
||||||
总的来说,你需要:
|
总的来说,你需要:
|
||||||
|
|
||||||
1. 评估扩展是否可以内联编译到 PHP 中。
|
1. 评估扩展是否可以内联编译到 PHP 中。
|
||||||
2. 评估扩展的依赖库(如果有)是否可以静态编译。
|
2. 评估扩展的依赖库(如果有)是否可以静态编译。
|
||||||
3. 写出扩展的依赖库在不同平台编译命令。
|
3. 编写不同平台的库编译命令。
|
||||||
4. 验证扩展及其依赖库能否与现有扩展和依赖库兼容。
|
4. 验证扩展及其依赖项与现有扩展和依赖项兼容。
|
||||||
5. 验证扩展在 `cli`、`micro`、`fpm`、`embed` 几种 SAPI 中均正常工作。
|
5. 验证扩展在 `cli`、`micro`、`fpm`、`embed` SAPIs 中正常工作。
|
||||||
6. 编写文档,加入你的扩展。
|
6. 编写文档并添加你的扩展。
|
||||||
|
|
||||||
### 项目框架优化
|
### 项目框架优化
|
||||||
|
|
||||||
如果你已经熟悉 `symfony/console` 的工作原理,并同时要对项目的框架进行一些修改或优化,请先了解以下事情:
|
如果你已经熟悉 `symfony/console` 的工作原理,并同时要对项目的框架进行一些修改或优化,请先了解以下事情:
|
||||||
|
|
||||||
1. 加入扩展不属于项目框架优化,但如果你在加入新的扩展时发现不得不优化框架,则需先对框架本身进行修改,然后再加入扩展。
|
1. 添加扩展不属于项目框架优化,但如果你在添加新扩展时发现必须优化框架,则需要先修改框架本身,然后再添加扩展。
|
||||||
2. 对于一些大规模逻辑修改(例如涉及 LibraryBase、Extension 对象等的修改)时,建议先提交 Issue 或 Draft PR 进行讨论方案。
|
2. 对于一些大规模逻辑修改(例如涉及 LibraryBase、Extension 对象等的修改),建议先提交 Issue 或 Draft PR 进行讨论。
|
||||||
3. 项目早期为纯中文开发项目,代码中存在一部分中文的注释。国际化项目后你可以提交 PR 将这些注释翻译为英语。
|
3. 在项目早期,它是一个纯私有开发项目,代码中有一些中文注释。项目国际化后,你可以提交 PR 将这些注释翻译为英语。
|
||||||
4. 请不要在代码中提交包含较多无用的代码片段,例如大量未被使用的变量、方法、类、重复写了很多次的代码。
|
4. 请不要在代码中提交更多无用的代码片段,例如大量未使用的变量、方法、类以及多次重写的代码。
|
||||||
|
|||||||
7
docs/zh/develop/craft-yml.md
Normal file
7
docs/zh/develop/craft-yml.md
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
---
|
||||||
|
aside: false
|
||||||
|
---
|
||||||
|
|
||||||
|
# craft.yml 配置
|
||||||
|
|
||||||
|
<!--@include: ../../deps-craft-yml.md-->
|
||||||
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
开发本项目需要安装部署 PHP 环境,以及一些 PHP 项目常用的扩展和 Composer。
|
开发本项目需要安装部署 PHP 环境,以及一些 PHP 项目常用的扩展和 Composer。
|
||||||
|
|
||||||
项目的开发环境和运行环境几乎完全一致,你可以参照 **指南-本地构建** 部分安装系统 PHP 或使用本项目预构建的静态 PHP 作为环境,这里不再赘述。
|
项目的开发环境和运行环境几乎完全一致。你可以参照 **手动构建** 部分安装系统 PHP 或使用本项目预构建的静态 PHP 作为环境。这里不再赘述。
|
||||||
|
|
||||||
抛开用途,本项目本身其实就是一个 `php-cli` 程序,你可以将它当作一个正常的 PHP 项目进行编辑和开发,同时你需要了解不同系统的 Shell 命令行。
|
抛开用途,本项目本身其实就是一个 `php-cli` 程序,你可以将它当作一个正常的 PHP 项目进行编辑和开发,同时你需要了解不同系统的 Shell 命令行。
|
||||||
|
|
||||||
@@ -18,10 +18,10 @@
|
|||||||
curl,dom,filter,mbstring,openssl,pcntl,phar,posix,sodium,tokenizer,xml,xmlwriter
|
curl,dom,filter,mbstring,openssl,pcntl,phar,posix,sodium,tokenizer,xml,xmlwriter
|
||||||
```
|
```
|
||||||
|
|
||||||
static-php-cli 项目本身不需要这么多扩展,但在开发过程中,你会用到 Composer、PHPUnit 等工具,它们需要这些扩展。
|
static-php-cli 项目本身不需要这么多扩展,但在开发过程中,你会用到 Composer 和 PHPUnit 等工具,它们需要这些扩展。
|
||||||
|
|
||||||
> 对于 static-php-cli 自身构建的 micro 自执行二进制,仅需要 `pcntl,posix,mbstring,tokenizer,phar`。
|
> 对于 static-php-cli 自身构建的 micro 自执行二进制,仅需要 `pcntl,posix,mbstring,tokenizer,phar`。
|
||||||
|
|
||||||
## 开始开发
|
## 开始开发
|
||||||
|
|
||||||
继续向下查看项目结构的文档,你可以从中了解 `static-php-cli` 是如何运作的。
|
继续向下查看项目结构文档,你可以学习 `static-php-cli` 是如何工作的。
|
||||||
|
|||||||
@@ -30,6 +30,7 @@ static-php-cli 的下载资源模块是一个主要的功能,它包含了所
|
|||||||
这里最主要的字段是 `type`,目前它支持的类型有:
|
这里最主要的字段是 `type`,目前它支持的类型有:
|
||||||
|
|
||||||
- `url`: 直接使用 URL 下载,例如:`https://download.libsodium.org/libsodium/releases/libsodium-1.0.18.tar.gz`。
|
- `url`: 直接使用 URL 下载,例如:`https://download.libsodium.org/libsodium/releases/libsodium-1.0.18.tar.gz`。
|
||||||
|
- `pie`: 使用 PIE(PHP Installer for Extensions)标准从 Packagist 下载 PHP 扩展。
|
||||||
- `ghrel`: 使用 GitHub Release API 下载,即从 GitHub 项目发布的最新版本中上传的附件下载。
|
- `ghrel`: 使用 GitHub Release API 下载,即从 GitHub 项目发布的最新版本中上传的附件下载。
|
||||||
- `ghtar`: 使用 GitHub Release API 下载,与 `ghrel` 不同的是,`ghtar` 是从项目的最新 Release 中找 `source code (tar.gz)` 下载的。
|
- `ghtar`: 使用 GitHub Release API 下载,与 `ghrel` 不同的是,`ghtar` 是从项目的最新 Release 中找 `source code (tar.gz)` 下载的。
|
||||||
- `ghtagtar`: 使用 GitHub Release API 下载,与 `ghtar` 相比,`ghtagtar` 可以从 `tags` 列表找最新的,并下载 `tar.gz` 格式的源码(因为有些项目只使用了 `tag` 发布版本)。
|
- `ghtagtar`: 使用 GitHub Release API 下载,与 `ghtar` 相比,`ghtagtar` 可以从 `tags` 列表找最新的,并下载 `tar.gz` 格式的源码(因为有些项目只使用了 `tag` 发布版本)。
|
||||||
@@ -77,6 +78,36 @@ url 类型的资源指的是从 URL 直接下载文件。
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## 下载类型 - pie
|
||||||
|
|
||||||
|
PIE(PHP Installer for Extensions)类型的资源是从 Packagist 下载遵循 PIE 标准的 PHP 扩展。
|
||||||
|
该方法会自动从 Packagist 仓库获取扩展信息,并下载相应的分发文件。
|
||||||
|
|
||||||
|
包含的参数有:
|
||||||
|
|
||||||
|
- `repo`: Packagist 的 vendor/package 名称,如 `vendor/package-name`
|
||||||
|
|
||||||
|
例子(使用 PIE 从 Packagist 下载 PHP 扩展):
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"ext-example": {
|
||||||
|
"type": "pie",
|
||||||
|
"repo": "vendor/example-extension",
|
||||||
|
"path": "php-src/ext/example",
|
||||||
|
"license": {
|
||||||
|
"type": "file",
|
||||||
|
"path": "LICENSE"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
::: tip
|
||||||
|
PIE 下载类型会自动从 Packagist 元数据中检测扩展信息,包括下载 URL、版本和分发类型。
|
||||||
|
扩展必须在其 Packagist 包定义中标记为 `type: php-ext` 或包含 `php-ext` 元数据。
|
||||||
|
:::
|
||||||
|
|
||||||
## 下载类型 - ghrel
|
## 下载类型 - ghrel
|
||||||
|
|
||||||
ghrel 会从 GitHub Release 中上传的 Assets 下载文件。首先使用 GitHub Release API 获取最新版本,然后根据正则匹配方式下载相应的文件。
|
ghrel 会从 GitHub Release 中上传的 Assets 下载文件。首先使用 GitHub Release API 获取最新版本,然后根据正则匹配方式下载相应的文件。
|
||||||
|
|||||||
@@ -4,28 +4,28 @@
|
|||||||
|
|
||||||
## php.ini 的路径是什么?
|
## php.ini 的路径是什么?
|
||||||
|
|
||||||
在 Linux、macOS 和 FreeBSD 上,`php.ini` 的默认路径是 `/usr/local/etc/php/php.ini`。
|
在 Linux、macOS 和 FreeBSD 上,`php.ini` 的路径是 `/usr/local/etc/php/php.ini`。
|
||||||
在 Windows 中,路径是 `C:\windows\php.ini` 或 `php.exe` 所在的当前目录。
|
在 Windows 中,路径是 `C:\windows\php.ini` 或 `php.exe` 所在的当前目录。
|
||||||
可以在 *nix 系统中使用手动构建选项 `--with-config-file-path` 来更改查找 `php.ini` 的目录。
|
可以在 *nix 系统中使用手动构建选项 `--with-config-file-path` 来更改查找 `php.ini` 的目录。
|
||||||
|
|
||||||
此外,在 Linux、macOS 和 FreeBSD 上,`/usr/local/etc/php/conf.d` 目录中的 `*.ini` 文件也会被加载。
|
此外,在 Linux、macOS 和 FreeBSD 上,`/usr/local/etc/php/conf.d` 目录中的 `.ini` 文件也会被加载。
|
||||||
在 Windows 中,该路径默认为空。
|
在 Windows 中,该路径默认为空。
|
||||||
可以使用手动构建选项 `--with-config-file-scan-dir` 更改该目录。
|
可以使用手动构建选项 `--with-config-file-scan-dir` 更改该目录。
|
||||||
|
|
||||||
PHP 默认也会从 [其他标准位置](https://www.php.net/manual/zh/configuration.file.php) 中搜索 `php.ini`。
|
PHP 默认也会从 [其他标准位置](https://www.php.net/manual/zh/configuration.file.php) 中搜索 `php.ini`。
|
||||||
|
|
||||||
## 静态编译的 PHP 可以安装扩展吗
|
## 静态编译的 PHP 可以安装扩展吗?
|
||||||
|
|
||||||
因为传统架构下的 PHP 安装扩展的原理是使用 `.so` 类型的动态链接的库方式安装新扩展,而使用本项目编译的静态链接的 PHP。但是静态链接在不同操作系统有不同的定义。
|
因为传统架构下的 PHP 安装扩展的原理是使用 `.so` 类型的动态链接的库方式安装新扩展,而使用本项目编译的静态链接的 PHP。但是静态链接在不同操作系统有不同的定义。
|
||||||
|
|
||||||
首先对于 Linux 系统来说,静态链接的二进制文件是不会链接系统的动态链接库的,纯静态链接的二进制无法加载动态库,所以无法添加新的扩展。
|
首先,对于 Linux 系统,静态链接的二进制文件不会链接系统的动态链接库。纯静态链接的二进制文件(`-all-static`)无法加载动态库,因此无法添加新扩展。
|
||||||
同时,在纯静态模式下你也不能使用 `ffi` 等扩展加载外部的 `.so` 模块。
|
同时,在纯静态模式下,你也不能使用 `ffi` 等扩展来加载外部 `.so` 模块。
|
||||||
|
|
||||||
你可以通过命令 `ldd buildroot/bin/php` 来查看你在 Linux 下构建的二进制是否为纯静态链接的。
|
你可以使用命令 `ldd buildroot/bin/php` 来检查你在 Linux 下构建的二进制文件是否为纯静态链接。
|
||||||
|
|
||||||
如果你 [构建 GNU libc 兼容的 PHP](../guide/build-with-glibc),你可以使用 `ffi` 扩展加载外部的 `.so` 模块,并且加载具有相同 ABI 的 `.so` 扩展。
|
如果你 [构建基于 GNU libc 的 PHP](../guide/build-with-glibc),你可以使用 `ffi` 扩展来加载外部 `.so` 模块,并加载具有相同 ABI 的 `.so` 扩展。
|
||||||
|
|
||||||
例如,你可以使用以下命令构建一个 glibc 动态链接的静态 PHP 二进制,同时支持 FFI 扩展和加载相同 PHP 版本和相同 TS 类型的 `xdebug.so` 扩展:
|
例如,你可以使用以下命令构建一个与 glibc 动态链接的静态 PHP 二进制文件,支持 FFI 扩展并加载相同 PHP 版本和相同 TS 类型的 `xdebug.so` 扩展:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
bin/spc-gnu-docker download --for-extensions=ffi,xml --with-php=8.4
|
bin/spc-gnu-docker download --for-extensions=ffi,xml --with-php=8.4
|
||||||
@@ -34,20 +34,19 @@ bin/spc-gnu-docker build ffi,xml --build-cli --debug
|
|||||||
buildroot/bin/php -d "zend_extension=/path/to/php{PHP_VER}-{ts/nts}/xdebug.so" --ri xdebug
|
buildroot/bin/php -d "zend_extension=/path/to/php{PHP_VER}-{ts/nts}/xdebug.so" --ri xdebug
|
||||||
```
|
```
|
||||||
|
|
||||||
对于 macOS 平台来说,macOS 下的几乎所有二进制文件都无法真正纯静态链接,几乎所有二进制文件都会链接 macOS 的系统库:`/usr/lib/libresolv.9.dylib` 和 `/usr/lib/libSystem.B.dylib`。
|
对于 macOS 平台,macOS 下的几乎所有二进制文件都无法真正纯静态链接,几乎所有二进制文件都会链接 macOS 系统库:`/usr/lib/libresolv.9.dylib` 和 `/usr/lib/libSystem.B.dylib`。
|
||||||
所以在 macOS 系统下,在特定的编译条件下可以使用静态编译的 php 二进制文件,可使用动态链接的扩展:
|
因此,在 macOS 上,你可以**直接**使用 SPC 构建具有动态链接扩展的静态编译 PHP 二进制文件:
|
||||||
|
|
||||||
1. 使用 `--no-strip` 参数,将不会对二进制文件去除调试符号等信息,以供使用 `Xdebug` 等外部 Zend 扩展。
|
1. 使用 `--build-shared=XXX` 选项构建共享扩展 `xxx.so`。例如:`bin/spc build bcmath,zlib --build-shared=xdebug --build-cli`
|
||||||
2. 如果要编译某些 Zend 扩展,使用 Homebrew、MacPorts、源码编译的形式,在所在的操作系统安装一个普通版本的 PHP。
|
2. 你将获得 `buildroot/modules/xdebug.so` 和 `buildroot/bin/php`。
|
||||||
3. 使用 `phpize && ./configure && make` 命令编译想要使用的扩展。
|
3. `xdebug.so` 文件可用于版本和线程安全相同的 php。
|
||||||
4. 将扩展文件 `xxxx.so` 拷贝到外部,使用静态编译的 PHP 二进制,例如使用 Xdebug 扩展:`cd buildroot/bin/ && ./php -d "zend_extension=/path/to/xdebug.so"`。
|
|
||||||
|
|
||||||
```bash
|
对于 Windows 平台,由于官方构建的扩展(如 `php_yaml.dll`)强制使用了 `php8.dll` 动态库作为链接,静态构建的 PHP 不包含任何系统库以外的动态库,
|
||||||
# 构建静态 php-cli
|
所以 Windows 下无法加载官方构建的动态扩展。 由于 static-php-cli 还暂未支持构建动态扩展,所以目前还没有让 static-php 加载动态扩展的方法。
|
||||||
bin/spc build ffi --build-cli --no-strip
|
|
||||||
```
|
|
||||||
|
|
||||||
## 可以支持 Oracle 数据库扩展吗
|
不过,Windows 可以正常使用 `FFI` 扩展加载其他的 dll 文件并调用。
|
||||||
|
|
||||||
|
## 可以支持 Oracle 数据库扩展吗?
|
||||||
|
|
||||||
部分依赖库闭源的扩展,如 `oci8`、`sourceguardian` 等,它们没有提供纯静态编译的依赖库文件(`.a`),仅提供了动态依赖库文件(`.so`),
|
部分依赖库闭源的扩展,如 `oci8`、`sourceguardian` 等,它们没有提供纯静态编译的依赖库文件(`.a`),仅提供了动态依赖库文件(`.so`),
|
||||||
这些扩展无法使用源码的形式编译到 static-php-cli 中,所以本项目可能永远也不会支持这些扩展。不过,理论上你可以根据上面的问题在 macOS 和 Linux 下接入和使用这类扩展。
|
这些扩展无法使用源码的形式编译到 static-php-cli 中,所以本项目可能永远也不会支持这些扩展。不过,理论上你可以根据上面的问题在 macOS 和 Linux 下接入和使用这类扩展。
|
||||||
@@ -55,41 +54,43 @@ bin/spc build ffi --build-cli --no-strip
|
|||||||
如果你对此类扩展有需求,或者大部分人都对这些闭源扩展使用有需求,
|
如果你对此类扩展有需求,或者大部分人都对这些闭源扩展使用有需求,
|
||||||
可以看看有关 [standalone-php-cli](https://github.com/crazywhalecc/static-php-cli/discussions/58) 的讨论。欢迎留言。
|
可以看看有关 [standalone-php-cli](https://github.com/crazywhalecc/static-php-cli/discussions/58) 的讨论。欢迎留言。
|
||||||
|
|
||||||
## 支持 Windows 吗
|
## 支持 Windows 吗?
|
||||||
|
|
||||||
该项目目前已支持 Windows,但支持的扩展数量较少,Windows 的支持并不完美,主要有以下几个问题:
|
该项目目前支持 Windows,但支持的扩展数量较少。Windows 支持并不完美。主要有以下问题:
|
||||||
|
|
||||||
1. Windows 的编译流程与 *nix 不同,使用的工具链也不同,编译各个扩展的依赖库使用的编译工具也几乎完全不同。
|
1. Windows 的编译过程与 *nix 不同,使用的工具链也不同。用于编译每个扩展依赖库的编译工具也几乎完全不同。
|
||||||
2. Windows 版本的需求也会根据所有使用本项目的人的需求推进,如果有很多人需要,我会尽快支持相关扩展。
|
2. Windows 版本的需求也会根据所有使用本项目的人的需求推进。如果很多人需要,我会尽快支持相关扩展。
|
||||||
|
|
||||||
## 使用 micro 可以保护我的源码吗
|
## 我可以使用 micro 保护我的源代码吗?
|
||||||
|
|
||||||
不可以。micro.sfx 本质上是将 php 和 php 代码结合为一个文件,没有 PHP 代码编译或加密的过程。
|
不可以。micro.sfx 本质上是将 php 和 php 代码合并为一个文件,没有编译或加密 PHP 代码的过程。
|
||||||
首先 php-src 是 PHP 代码的官方解释器,而且现在市面上还没有一个能兼容主流分支的 PHP 编译器。
|
|
||||||
之前我在网上看到有一个项目是 BPC(Binary PHP Compiler?)可以把 PHP 编译为二进制,但是限制也是很多很多。
|
|
||||||
|
|
||||||
加密保护代码的方向和编译也不是一回事,编译过后也可以通过逆向工程等方式拿到代码,真正保护还是通过加壳、加密代码等手段进行。
|
首先,php-src 是 PHP 代码的官方解释器,市场上没有与主流分支兼容的 PHP 编译器。
|
||||||
|
我在网上看到一个名为 BPC(Binary PHP Compiler?)的项目可以将 PHP 编译为二进制,但有很多限制。
|
||||||
|
|
||||||
所以本项目(static-php-cli)、相关项目(lwmbs、swoole-cli)都是提供一个对 php-src 源码的便捷编译工具,
|
加密和保护代码的方向与编译不同。编译后,也可以通过逆向工程等方法获得代码。真正的保护仍然通过打包和加密代码等手段进行。
|
||||||
本项目和相关项目引用的 phpmicro 也仅仅是 PHP 的 sapi 接口封装,而不是 PHP 代码的编译工具。
|
|
||||||
PHP 代码的编译器是完全不同的项目,因此不会考虑额外的情况。如果你对加密感兴趣,可以考虑使用现有的加密技术,如 Swoole Compiler、Source Guardian 等。
|
因此,本项目(static-php-cli)和相关项目(lwmbs、swoole-cli)都提供了 php-src 源代码的便捷编译工具。
|
||||||
|
本项目和相关项目引用的 phpmicro 只是 PHP 的 sapi 接口封装,而不是 PHP 代码的编译工具。
|
||||||
|
PHP 代码的编译器是一个完全不同的项目,因此不考虑额外的情况。
|
||||||
|
如果你对加密感兴趣,可以考虑使用现有的加密技术,如 Swoole Compiler、Source Guardian 等。
|
||||||
|
|
||||||
## 无法使用 ssl
|
## 无法使用 ssl
|
||||||
|
|
||||||
**更新:该问题已在最新版本的 static-php-cli 中修复,现在默认读取系统的证书文件。如果你仍然遇到问题,再尝试下方的解决方案。**
|
**更新:该问题已在最新版本的 static-php-cli 中修复,现在默认读取系统的证书文件。如果你仍然遇到问题,请尝试下面的解决方案。**
|
||||||
|
|
||||||
使用 curl、pgsql 等 请求 HTTPS 网站或建立 SSL 连接时,可能存在 `error:80000002:system library::No such file or directory` 错误,
|
使用 curl、pgsql 等请求 HTTPS 网站或建立 SSL 连接时,可能会出现 `error:80000002:system library::No such file or directory` 错误。
|
||||||
这个错误是由于静态编译的 PHP 未通过 `php.ini` 指定 `openssl.cafile` 导致的。
|
此错误是由于静态编译的 PHP 未通过 `php.ini` 指定 `openssl.cafile` 导致的。
|
||||||
|
|
||||||
你可以在使用 PHP 前指定 `php.ini`,并在 INI 内添加 `openssl.cafile=/path/to/your-cert.pem` 来解决这个问题。
|
你可以通过在使用 PHP 前指定 `php.ini` 并在 INI 中添加 `openssl.cafile=/path/to/your-cert.pem` 来解决此问题。
|
||||||
|
|
||||||
对于 Linux 系统,你可以从 curl 官方网站下载 [cacert.pem](https://curl.se/docs/caextract.html) 文件,也可以使用系统自带的证书文件。
|
对于 Linux 系统,你可以从 curl 官方网站下载 [cacert.pem](https://curl.se/docs/caextract.html) 文件,也可以使用系统自带的证书文件。
|
||||||
有关不同发行版的证书位置,可参考 [Go 标准库](https://go.dev/src/crypto/x509/root_linux.go)。
|
有关不同发行版的证书位置,请参考 [Golang 文档](https://go.dev/src/crypto/x509/root_linux.go)。
|
||||||
|
|
||||||
> INI 配置 `openssl.cafile` 不可以使用 `ini_set()` 函数动态设置,因为 `openssl.cafile` 是一个 `PHP_INI_SYSTEM` 类型的配置,只能在 `php.ini` 文件中设置。
|
> INI 配置 `openssl.cafile` 不能使用 `ini_set()` 函数动态设置,因为 `openssl.cafile` 是 `PHP_INI_SYSTEM` 类型的配置,只能在 `php.ini` 文件中设置。
|
||||||
|
|
||||||
## 为什么不支持旧版本 PHP ?
|
## 为什么不支持旧版本的 PHP?
|
||||||
|
|
||||||
因为旧版本的 PHP 有很多问题,比如安全问题、性能问题、功能问题等。此外,旧版本的 PHP 很多都无法与最新的依赖库兼容,这也是不支持旧版本 PHP 的原因之一。
|
因为旧版本的 PHP 有很多问题,如安全问题、性能问题和功能问题。此外,许多旧版本的 PHP 与最新的依赖库不兼容,这也是不支持旧版本 PHP 的原因之一。
|
||||||
|
|
||||||
你可以使用 static-php-cli 早期编译好的旧版本,如 PHP 8.0,但是不会明确支持早期版本。
|
你可以使用 static-php-cli 早期编译的旧版本,如 PHP 8.0,但不会明确支持早期版本。
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ Action 构建指的是直接使用 GitHub Action 进行编译。
|
|||||||
如果你不想自行编译,可以从本项目现有的 Action 下载 Artifact,也可以从自托管的服务器下载:[进入](https://dl.static-php.dev/static-php-cli/common/)
|
如果你不想自行编译,可以从本项目现有的 Action 下载 Artifact,也可以从自托管的服务器下载:[进入](https://dl.static-php.dev/static-php-cli/common/)
|
||||||
|
|
||||||
> 自托管的二进制也是由 Action 构建而来,[项目仓库地址](https://github.com/static-php/static-php-cli-hosted)。
|
> 自托管的二进制也是由 Action 构建而来,[项目仓库地址](https://github.com/static-php/static-php-cli-hosted)。
|
||||||
|
> 包含的扩展有:bcmath,bz2,calendar,ctype,curl,dom,exif,fileinfo,filter,ftp,gd,gmp,iconv,xml,mbstring,mbregex,mysqlnd,openssl,pcntl,pdo,pdo_mysql,pdo_sqlite,phar,posix,redis,session,simplexml,soap,sockets,sqlite3,tokenizer,xmlwriter,xmlreader,zlib,zip
|
||||||
|
|
||||||
## 构建方法
|
## 构建方法
|
||||||
|
|
||||||
|
|||||||
@@ -51,5 +51,4 @@ glibc 构建为扩展的特性,不属于默认 static-php 的支持范围。
|
|||||||
|
|
||||||
如果你需要不使用 Docker 构建基于 glibc 的二进制,请参考 `bin/spc-gnu-docker` 脚本,手动构建一个类似的环境。
|
如果你需要不使用 Docker 构建基于 glibc 的二进制,请参考 `bin/spc-gnu-docker` 脚本,手动构建一个类似的环境。
|
||||||
|
|
||||||
由于 glibc 二进制不是项目的主要目标,一般情况下我们不会额外测试 glibc 下的各个库和扩展的兼容性。
|
请注意,我们仅支持使用 bin/spc-gnu-docker 构建的 glibc 版本。已在 RHEL 9 和 10 上进行了编译测试并验证其稳定性,但如果您遇到问题,我们可能不会进行修复。
|
||||||
任何特定库如果在 musl-libc 上构建成功,但在 glibc 上构建失败,请提交 issue,我们将会单独解决。
|
|
||||||
|
|||||||
@@ -4,6 +4,8 @@
|
|||||||
|
|
||||||
## curl
|
## curl
|
||||||
|
|
||||||
|
HTTP3 支持默认未启用,需在编译时添加 `--with-libs="nghttp2,nghttp3,ngtcp2"` 以启用 PHP 8.4 及以上版本的 HTTP3 支持。
|
||||||
|
|
||||||
使用 curl 请求 HTTPS 时,可能存在 `error:80000002:system library::No such file or directory` 错误,
|
使用 curl 请求 HTTPS 时,可能存在 `error:80000002:system library::No such file or directory` 错误,
|
||||||
解决办法详见 [FAQ - 无法使用 ssl](../faq/#无法使用-ssl)。
|
解决办法详见 [FAQ - 无法使用 ssl](../faq/#无法使用-ssl)。
|
||||||
|
|
||||||
@@ -41,15 +43,27 @@ swoole-hook-sqlite 不是一个扩展,而是 Swoole 的 Hook 特性。
|
|||||||
swoole-hook-sqlite 与 `pdo_sqlite` 扩展冲突。如需使用 Swoole 和 `pdo_sqlite`,请删除 pdo_sqlite 扩展,启用 `swoole` 和 `swoole-hook-sqlite` 即可。
|
swoole-hook-sqlite 与 `pdo_sqlite` 扩展冲突。如需使用 Swoole 和 `pdo_sqlite`,请删除 pdo_sqlite 扩展,启用 `swoole` 和 `swoole-hook-sqlite` 即可。
|
||||||
该扩展包含了 `pdo_sqlite` 的协程环境的实现。
|
该扩展包含了 `pdo_sqlite` 的协程环境的实现。
|
||||||
|
|
||||||
|
## swoole-hook-odbc
|
||||||
|
|
||||||
|
swoole-hook-odbc 不是一个扩展,而是 Swoole 的 Hook 特性。
|
||||||
|
如果你在编译时添加了 `swoole,swoole-hook-odbc`,你将启用 Swoole 的 `odbc` 扩展的协程模式。
|
||||||
|
|
||||||
|
swoole-hook-odbc 与 `pdo_odbc` 扩展冲突。如需使用 Swoole 和 `pdo_odbc`,请删除 `pdo_odbc` 扩展,启用 `swoole` 和 `swoole-hook-odbc` 即可。
|
||||||
|
该扩展包含了 `pdo_odbc` 的协程环境的实现。
|
||||||
|
|
||||||
## swow
|
## swow
|
||||||
|
|
||||||
1. swow 仅支持 PHP 8.0 ~ 8.4 版本。
|
1. swow 仅支持 PHP 8.0+ 版本。
|
||||||
|
|
||||||
|
## imagick
|
||||||
|
|
||||||
|
1. OpenMP 支持已被禁用,这是维护者推荐的做法,系统软件包也是如此配置。
|
||||||
|
|
||||||
## imap
|
## imap
|
||||||
|
|
||||||
1. 该扩展目前不支持 Kerberos。
|
1. 该扩展目前不支持 Kerberos。
|
||||||
2. 由于底层的 c-client、ext-imap 不是线程安全的。 无法在 `--enable-zts` 构建中使用它。
|
2. 由于底层的 c-client、ext-imap 不是线程安全的。 无法在 `--enable-zts` 构建中使用它。
|
||||||
3. 由于该扩展可能会从未来的 PHP 中删除,因此我们建议您寻找替代实现,例如 [Webklex/php-imap](https://github.com/Webklex/php-imap)。
|
3. 该扩展已在 PHP 8.4 中被移除,因此我们建议您寻找替代实现,例如 [Webklex/php-imap](https://github.com/Webklex/php-imap)。
|
||||||
|
|
||||||
## gd
|
## gd
|
||||||
|
|
||||||
@@ -70,9 +84,9 @@ bin/spc build gd --with-libs=freetype,libjpeg,libavif,libwebp --build-cli
|
|||||||
|
|
||||||
## xdebug
|
## xdebug
|
||||||
|
|
||||||
1. Xdebug 是一个 Zend 扩展,Xdebug 的功能依赖于 PHP 的 Zend 引擎和底层代码,如果要将其静态编译到 PHP 中,可能需要巨量的 patch 代码,这是不可行的。
|
1. Xdebug 只能作为共享扩展进行构建。您需要使用除了 `musl-static` 外的其他 `SPC_TARGET` 构建目标。
|
||||||
2. macOS 平台可以通过在相同平台编译的 PHP 下编译一个 xdebug 扩展,并提取其中的 `xdebug.so` 文件,再在 static-php-cli 中使用 `--no-strip` 参数保留调试符号表,同时加入 `ffi` 扩展。
|
2. 使用 Linux/glibc 或 macOS 时,您可以使用 `--build-shared=xdebug` 将 Xdebug 编译为共享扩展。
|
||||||
编译的 `./php` 二进制可以通过指定 INI 配置并运行,例如`./php -d 'zend_extension=xdebug.so' your-code.php`。
|
编译后的 `./php` 二进制文件可以通过指定 INI 文件进行配置和运行,例如 `./php -d 'zend_extension=/path/to/xdebug.so' your-code.php`。
|
||||||
|
|
||||||
## xml
|
## xml
|
||||||
|
|
||||||
@@ -108,14 +122,15 @@ pgsql 16.2 修复了这个 Bug,现在正常工作了。
|
|||||||
|
|
||||||
## password-argon2
|
## password-argon2
|
||||||
|
|
||||||
1. password-argon2不是一个标准的扩展,它是 `password_hash` 函数的额外算法。
|
1. password-argon2不是一个标准的扩展。`password_hash` 函数的 `PASSWORD_ARGON2ID` 算法需要 libsodium 或 libargon2 才能工作。
|
||||||
2. 在Linux系统,password-argon2 的依赖库 `libargon2` 与 `libsodium` 库冲突。
|
2. 使用 password-argon2 可以为此启用多线程支持。
|
||||||
|
|
||||||
## ffi
|
## ffi
|
||||||
|
|
||||||
1. 因为 Linux 系统的限制,纯静态编译的状态下(spc 默认编译结果为纯静态)无法使用它加载其他 `so` 扩展。Linux 支持加载 so 扩展的前提是非静态编译。如果你需要使用 ffi 扩展,请参见 [编译 GNU libc 的 PHP](./build-with-glibc)。
|
1. 由于 musl libc 静态链接的限制,无法加载动态库,因此无法使用 ffi。
|
||||||
2. macOS 支持 ffi 扩展,但是部分内核下不包含调试符号时会出现错误。
|
如果您需要使用 ffi 扩展,请参阅 [使用 GNU libc 编译 PHP](./build-with-glibc)。
|
||||||
3. Windows 支持 ffi 扩展。
|
2. macOS 支持 ffi 扩展,但某些内核不包含调试符号时会出现错误。
|
||||||
|
3. Windows x64 支持 ffi 扩展。
|
||||||
|
|
||||||
## xhprof
|
## xhprof
|
||||||
|
|
||||||
@@ -134,5 +149,10 @@ parallel 扩展只支持 PHP 8.0 及以上版本,并只支持 ZTS 构建(`--
|
|||||||
|
|
||||||
## spx
|
## spx
|
||||||
|
|
||||||
1. [SPX 扩展](https://github.com/NoiseByNorthwest/php-spx) 只支持非线程模式。
|
1. SPX 目前不支持 Windows,且官方仓库也不支持静态编译,static-php-cli 使用了 [修改版本](https://github.com/static-php/php-spx)。
|
||||||
2. SPX 目前不支持 Windows,且官方仓库也不支持静态编译,static-php-cli 使用了 [修改版本](https://github.com/static-php/php-spx)。
|
|
||||||
|
## mimalloc
|
||||||
|
|
||||||
|
1. 从技术上讲,这不是扩展,而是一个库。
|
||||||
|
2. 在 Linux 或 macOS 上使用 `--with-libs="mimalloc"` 进行构建将覆盖默认分配器。
|
||||||
|
3. 目前,这还处于实验阶段,但建议在线程环境中使用。
|
||||||
|
|||||||
@@ -4,8 +4,8 @@ static-php-cli 是一个用于构建静态编译的 PHP 二进制的工具,目
|
|||||||
|
|
||||||
在指南章节中,你将了解到如何使用 static-php-cli 构建独立的 php 程序。
|
在指南章节中,你将了解到如何使用 static-php-cli 构建独立的 php 程序。
|
||||||
|
|
||||||
- [Action 构建](./action-build)
|
|
||||||
- [本地构建](./manual-build)
|
- [本地构建](./manual-build)
|
||||||
|
- [Action 构建](./action-build)
|
||||||
- [扩展列表](./extensions)
|
- [扩展列表](./extensions)
|
||||||
|
|
||||||
## 编译环境
|
## 编译环境
|
||||||
@@ -19,16 +19,30 @@ static-php-cli 是一个用于构建静态编译的 PHP 二进制的工具,目
|
|||||||
| Windows | :gear: :computer: | |
|
| Windows | :gear: :computer: | |
|
||||||
| FreeBSD | :computer: | :computer: |
|
| FreeBSD | :computer: | :computer: |
|
||||||
|
|
||||||
其中,Linux 目前仅在 Ubuntu、Debian、Alpine 发行版测试通过,其他发行版未进行测试,不能保证编译成功。
|
当前支持编译的 PHP 版本:
|
||||||
对于未经过测试的发行版,可以使用 Docker 等方式本地编译,避免环境导致的问题。
|
|
||||||
|
|
||||||
macOS 下支持 x86_64 和 Arm 两种架构,但在其中一个架构上编译的二进制无法直接在另一个架构上使用。
|
> :warning: 部分支持,对于新的测试版和旧版本可能存在问题。
|
||||||
Rosetta 2 不能保证 Arm 架构编译的程序可以完全运行在 x86_64 环境下。
|
>
|
||||||
|
> :heavy_check_mark: 支持
|
||||||
|
>
|
||||||
|
> :x: 不支持
|
||||||
|
|
||||||
Windows 目前只支持 x86_64 架构,不支持 32 位 x86、不支持 arm64 架构。
|
| PHP Version | Status | Comment |
|
||||||
|
|-------------|--------------------|---------------------------------------------------------|
|
||||||
|
| 7.2 | :x: | |
|
||||||
|
| 7.3 | :x: | phpmicro 和许多扩展不支持 7.3、7.4 版本 |
|
||||||
|
| 7.4 | :x: | phpmicro 和许多扩展不支持 7.3、7.4 版本 |
|
||||||
|
| 8.0 | :warning: | PHP 官方已停止 8.0 的维护,我们不再处理 8.0 相关的 backport 支持 |
|
||||||
|
| 8.1 | :warning: | PHP 官方仅对 8.1 提供安全更新,在 8.5 发布后我们不再处理 8.1 相关的 backport 支持 |
|
||||||
|
| 8.2 | :heavy_check_mark: | |
|
||||||
|
| 8.3 | :heavy_check_mark: | |
|
||||||
|
| 8.4 | :heavy_check_mark: | |
|
||||||
|
| 8.5 (beta) | :warning: | PHP 8.5 目前处于 beta 阶段 |
|
||||||
|
|
||||||
|
> 这个表格的支持状态是 static-php-cli 对构建对应版本的支持情况,不是 PHP 官方对该版本的支持情况。
|
||||||
|
|
||||||
## PHP 支持版本
|
## PHP 支持版本
|
||||||
|
|
||||||
目前,static-php-cli 对 PHP 8.1 ~ 8.4 版本是支持的,对于 PHP 8.0 及更早版本理论上支持,只需下载时选择早期版本即可。
|
目前,static-php-cli 对 PHP 8.2 ~ 8.5 版本是支持的,对于 PHP 8.1 及更早版本理论上支持,只需下载时选择早期版本即可。
|
||||||
但由于部分扩展和特殊组件已对早期版本的 PHP 停止了支持,所以 static-php-cli 不会明确支持早期版本。
|
但由于部分扩展和特殊组件已对早期版本的 PHP 停止了支持,所以 static-php-cli 不会明确支持早期版本。
|
||||||
我们推荐你编译尽可能新的 PHP 版本,以获得更好的体验。
|
我们推荐你编译尽可能新的 PHP 版本,以获得更好的体验。
|
||||||
|
|||||||
@@ -1,3 +1,7 @@
|
|||||||
|
---
|
||||||
|
outline: 'deep'
|
||||||
|
---
|
||||||
|
|
||||||
# 本地构建(Linux、macOS、FreeBSD)
|
# 本地构建(Linux、macOS、FreeBSD)
|
||||||
|
|
||||||
本章节为 Linux、macOS、FreeBSD 的构建过程,如果你要在 Windows 上构建,请到 [在 Windows 上构建](./build-on-windows)。
|
本章节为 Linux、macOS、FreeBSD 的构建过程,如果你要在 Windows 上构建,请到 [在 Windows 上构建](./build-on-windows)。
|
||||||
@@ -112,7 +116,46 @@ sudo apt install php-cli composer php-tokenizer
|
|||||||
较老版本的 Debian 默认安装的可能为旧版本(<= 8.3)版本的 PHP,建议先升级 Debian 或使用 Docker 或自带的静态二进制环境。
|
较老版本的 Debian 默认安装的可能为旧版本(<= 8.3)版本的 PHP,建议先升级 Debian 或使用 Docker 或自带的静态二进制环境。
|
||||||
:::
|
:::
|
||||||
|
|
||||||
## 命令 download - 下载依赖包
|
## 使用 craft 构建(推荐)
|
||||||
|
|
||||||
|
使用 `bin/spc craft` 可以使用一个配置文件,一个命令实现自动检查环境、下载源代码、构建依赖库、构建 PHP 及扩展等。
|
||||||
|
|
||||||
|
你需要编写一个 `craft.yml` 文件,存放在当前工作目录下。`craft.yml` 可以由 [命令生成器](./cli-generator) 生成,或者手动编写。
|
||||||
|
|
||||||
|
手动编写可参考 [craft.yml 配置](../develop/craft-yml.md) 中的注释来编写。我们下面假设你编译一个扩展组合,并选用 PHP 8.4,输出 `cli` 和 `fpm`:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# path/to/craft.yml
|
||||||
|
php-version: 8.4
|
||||||
|
extensions: bcmath,posix,phar,zlib,openssl,curl,fileinfo,tokenizer
|
||||||
|
sapi:
|
||||||
|
- cli
|
||||||
|
- fpm
|
||||||
|
```
|
||||||
|
|
||||||
|
然后使用 `bin/spc craft` 命令来编译:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
bin/spc craft --debug
|
||||||
|
```
|
||||||
|
|
||||||
|
如果构建成功,你会在当前目录下看到 `buildroot/bin` 目录,里面包含了编译好的 PHP 二进制文件,或相应的 SAPI。
|
||||||
|
|
||||||
|
- cli: Windows 下构建结果为 `buildroot/bin/php.exe`,其他平台为 `buildroot/bin/php`。
|
||||||
|
- fpm: 构建结果为 `buildroot/bin/php-fpm`。
|
||||||
|
- micro: 构建结果为 `buildroot/bin/micro.sfx`,如需进一步与 PHP 代码打包,请查看 [打包 micro 二进制](./manual-build#命令-micro-combine-打包-micro-二进制)。
|
||||||
|
- embed: 参见 [embed 使用](./manual-build#embed-使用)。
|
||||||
|
- frankenphp: 构建结果为 `buildroot/bin/frankenphp`。
|
||||||
|
|
||||||
|
如果中途构建出错,你可以使用 `--debug` 参数查看详细的错误信息,或者使用 `--with-clean` 参数清除旧的编译结果,重新编译。
|
||||||
|
|
||||||
|
如使用以上方式仍构建失败,请提交一个 issue,附上你的 `craft.yml` 文件、`log/` 目录的压缩包。
|
||||||
|
|
||||||
|
## 分步构建命令
|
||||||
|
|
||||||
|
如果你有定制化需求,或分开下载、编译 PHP 和依赖库的需求,可以使用 `bin/spc` 命令分步执行。
|
||||||
|
|
||||||
|
### 命令 download - 下载依赖包
|
||||||
|
|
||||||
使用命令 `bin/spc download` 可以下载编译需要的源代码,包括 php-src 以及依赖的各种库的源码。
|
使用命令 `bin/spc download` 可以下载编译需要的源代码,包括 php-src 以及依赖的各种库的源码。
|
||||||
|
|
||||||
@@ -166,8 +209,8 @@ bin/spc download --from-zip=/path/to/your/download.zip
|
|||||||
让下载器强制使用你指定的链接下载此 source 的包。使用方法为 `{source-name}:{url}` 即可,可同时重写多个库的下载地址。在使用 `--for-extensions` 选项下载时同样可用。
|
让下载器强制使用你指定的链接下载此 source 的包。使用方法为 `{source-name}:{url}` 即可,可同时重写多个库的下载地址。在使用 `--for-extensions` 选项下载时同样可用。
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# 例如:指定下载测试版的 PHP8.3
|
# 例如:指定下载 Alpha 版的 PHP8.5
|
||||||
bin/spc download --all -U "php-src:https://downloads.php.net/~eric/php-8.3.0beta1.tar.gz"
|
bin/spc download --all -U "php-src:https://downloads.php.net/~edorian/php-8.5.0alpha2.tar.xz"
|
||||||
|
|
||||||
# 指定下载旧版本的 curl 库
|
# 指定下载旧版本的 curl 库
|
||||||
bin/spc download --all -U "curl:https://curl.se/download/curl-7.88.1.tar.gz"
|
bin/spc download --all -U "curl:https://curl.se/download/curl-7.88.1.tar.gz"
|
||||||
@@ -184,7 +227,7 @@ bin/spc download --for-extensions=redis,phar -G "php-src:master:https://github.c
|
|||||||
bin/spc download --for-extensions=swoole -G "swoole:master:https://github.com/swoole/swoole-src.git"
|
bin/spc download --for-extensions=swoole -G "swoole:master:https://github.com/swoole/swoole-src.git"
|
||||||
```
|
```
|
||||||
|
|
||||||
## 命令 doctor - 环境检查
|
### 命令 doctor - 环境检查
|
||||||
|
|
||||||
如果你可以正常运行 `bin/spc` 但无法正常编译静态的 PHP 或依赖库,可以先运行 `bin/spc doctor` 检查系统自身是否缺少依赖。
|
如果你可以正常运行 `bin/spc` 但无法正常编译静态的 PHP 或依赖库,可以先运行 `bin/spc doctor` 检查系统自身是否缺少依赖。
|
||||||
|
|
||||||
@@ -196,18 +239,20 @@ bin/spc doctor
|
|||||||
bin/spc doctor --auto-fix
|
bin/spc doctor --auto-fix
|
||||||
```
|
```
|
||||||
|
|
||||||
## 命令 build - 编译 PHP
|
### 命令 build - 编译 PHP
|
||||||
|
|
||||||
使用 build 命令可以开始构建静态 php 二进制,在执行 `bin/spc build` 命令前,务必先使用 `download` 命令下载资源,建议使用 `doctor` 检查环境。
|
使用 build 命令可以开始构建静态 php 二进制,在执行 `bin/spc build` 命令前,务必先使用 `download` 命令下载资源,建议使用 `doctor` 检查环境。
|
||||||
|
|
||||||
### 基本用法
|
#### 基本用法
|
||||||
|
|
||||||
你需要先到 [扩展列表](./extensions) 或 [命令生成器](./cli-generator) 选择你要加入的扩展,然后使用命令 `bin/spc build` 进行编译。你需要指定一个编译目标,从如下参数中选择:
|
你需要先到 [扩展列表](./extensions) 或 [命令生成器](./cli-generator) 选择你要加入的扩展,然后使用命令 `bin/spc build` 进行编译。你需要指定一个编译目标,从如下参数中选择:
|
||||||
|
|
||||||
- `--build-cli`: 构建一个 cli sapi(命令行界面,可在命令行执行 PHP 代码)
|
- `--build-cli`: 构建一个 cli sapi(命令行界面,可在命令行执行 PHP 代码)
|
||||||
- `--build-fpm`: 构建一个 fpm sapi(php-fpm,用于和其他传统的 fpm 架构的软件如 nginx 配合使用)
|
- `--build-fpm`: 构建一个 fpm sapi(php-fpm,用于和其他传统的 fpm 架构的软件如 nginx 配合使用)
|
||||||
|
- `--build-cgi`: 构建一个 cgi sapi(cgi,可用于传统的 cgi 架构的软件如 apache 配合使用)
|
||||||
- `--build-micro`: 构建一个 micro sapi(用于构建一个包含 PHP 代码的独立可执行二进制)
|
- `--build-micro`: 构建一个 micro sapi(用于构建一个包含 PHP 代码的独立可执行二进制)
|
||||||
- `--build-embed`: 构建一个 embed sapi(用于嵌入到其他 C 语言程序中)
|
- `--build-embed`: 构建一个 embed sapi(用于嵌入到其他 C 语言程序中)
|
||||||
|
- `--build-frankenphp`: 构建一个 [frankenphp](https://github.com/php/frankenphp) 二进制
|
||||||
- `--build-all`: 构建以上所有 sapi
|
- `--build-all`: 构建以上所有 sapi
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
@@ -244,15 +289,7 @@ bin/spc build bcmath,curl,openssl,ftp,posix,pcntl --build-cli
|
|||||||
```
|
```
|
||||||
:::
|
:::
|
||||||
|
|
||||||
### 调试
|
#### 编译运行选项
|
||||||
|
|
||||||
如果你在编译过程中遇到了问题,或者想查看每个执行的 shell 命令,可以使用 `--debug` 开启 debug 模式,查看所有终端日志:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
bin/spc build mysqlnd,pdo_mysql --build-all --debug
|
|
||||||
```
|
|
||||||
|
|
||||||
### 编译运行选项
|
|
||||||
|
|
||||||
在编译过程中,有些特殊情况需要对编译器、编译目录的内容进行干预,可以尝试使用以下命令:
|
在编译过程中,有些特殊情况需要对编译器、编译目录的内容进行干预,可以尝试使用以下命令:
|
||||||
|
|
||||||
@@ -260,7 +297,7 @@ bin/spc build mysqlnd,pdo_mysql --build-all --debug
|
|||||||
- `--cxx=XXX`: 指定 C++ 语言编译器的执行命令(Linux 默认 `g++`,macOS 默认 `clang++`)
|
- `--cxx=XXX`: 指定 C++ 语言编译器的执行命令(Linux 默认 `g++`,macOS 默认 `clang++`)
|
||||||
- `--with-clean`: 编译 PHP 前先清理旧的 make 产生的文件
|
- `--with-clean`: 编译 PHP 前先清理旧的 make 产生的文件
|
||||||
- `--enable-zts`: 让编译的 PHP 为线程安全版本(默认为 NTS 版本)
|
- `--enable-zts`: 让编译的 PHP 为线程安全版本(默认为 NTS 版本)
|
||||||
- `--no-strip`: 编译 PHP 库后不运行 `strip` 裁剪二进制文件缩小体积(不裁剪的 macOS 二进制文件可使用动态链接的第三方扩展)
|
- `--no-strip`: 编译 PHP 库后不运行 `strip` 裁剪二进制文件缩小体积
|
||||||
- `--with-libs=XXX,YYY`: 编译 PHP 前先编译指定的依赖库,激活部分扩展的可选功能(例如 gd 库的 libavif 等)
|
- `--with-libs=XXX,YYY`: 编译 PHP 前先编译指定的依赖库,激活部分扩展的可选功能(例如 gd 库的 libavif 等)
|
||||||
- `--with-config-file-path=XXX`: 查找 `php.ini` 的路径(在 [这里](../faq/index.html#php-ini-的路径是什么) 查看默认路径)
|
- `--with-config-file-path=XXX`: 查找 `php.ini` 的路径(在 [这里](../faq/index.html#php-ini-的路径是什么) 查看默认路径)
|
||||||
- `--with-config-file-scan-dir=XXX`: 读取 `php.ini` 后扫描 `.ini` 文件的目录(在 [这里](../faq/index.html#php-ini-的路径是什么) 查看默认路径)
|
- `--with-config-file-scan-dir=XXX`: 读取 `php.ini` 后扫描 `.ini` 文件的目录(在 [这里](../faq/index.html#php-ini-的路径是什么) 查看默认路径)
|
||||||
@@ -272,6 +309,7 @@ bin/spc build mysqlnd,pdo_mysql --build-all --debug
|
|||||||
- `--with-suggested-exts`: 编译时将 `ext-suggests` 也作为编译依赖加入
|
- `--with-suggested-exts`: 编译时将 `ext-suggests` 也作为编译依赖加入
|
||||||
- `--with-suggested-libs`: 编译时将 `lib-suggests` 也作为编译依赖加入
|
- `--with-suggested-libs`: 编译时将 `lib-suggests` 也作为编译依赖加入
|
||||||
- `--with-upx-pack`: 编译后使用 UPX 减小二进制文件体积(需先使用 `bin/spc install-pkg upx` 安装 upx)
|
- `--with-upx-pack`: 编译后使用 UPX 减小二进制文件体积(需先使用 `bin/spc install-pkg upx` 安装 upx)
|
||||||
|
- `--build-shared=XXX,YYY`: 编译时将指定的扩展编译为共享库(默认编译为静态库)
|
||||||
|
|
||||||
硬编码 INI 选项适用于 cli、micro、embed。有关硬编码 INI 选项,下面是一个简单的例子,我们预设一个更大的 `memory_limit`,并且禁用 `system` 函数:
|
硬编码 INI 选项适用于 cli、micro、embed。有关硬编码 INI 选项,下面是一个简单的例子,我们预设一个更大的 `memory_limit`,并且禁用 `system` 函数:
|
||||||
|
|
||||||
@@ -339,6 +377,14 @@ memory_limit=1G
|
|||||||
|
|
||||||
如果要打包 phar,只需要将 `a.php` 替换为打包好的 phar 文件即可。但要注意,phar 下的 micro.sfx 需要额外注意路径问题,见 [Developing - Phar 路径问题](../develop/structure#phar-应用目录问题)
|
如果要打包 phar,只需要将 `a.php` 替换为打包好的 phar 文件即可。但要注意,phar 下的 micro.sfx 需要额外注意路径问题,见 [Developing - Phar 路径问题](../develop/structure#phar-应用目录问题)
|
||||||
|
|
||||||
|
## 调试
|
||||||
|
|
||||||
|
如果你在编译过程中遇到了问题,或者想查看每个执行的 shell 命令,可以使用 `--debug` 开启 debug 模式,查看所有终端日志:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
bin/spc build mysqlnd,pdo_mysql --build-all --debug
|
||||||
|
```
|
||||||
|
|
||||||
## 命令 extract - 手动解压某个库
|
## 命令 extract - 手动解压某个库
|
||||||
|
|
||||||
使用命令 `bin/spc extract` 可以解包和拷贝编译需要的源代码,包括 php-src 以及依赖的各种库的源码(需要自己指定要解包的库名)。
|
使用命令 `bin/spc extract` 可以解包和拷贝编译需要的源代码,包括 php-src 以及依赖的各种库的源码(需要自己指定要解包的库名)。
|
||||||
@@ -414,6 +460,8 @@ bin/spc dev:sort-config ext
|
|||||||
下面是安装工具的示例:
|
下面是安装工具的示例:
|
||||||
|
|
||||||
- 下载安装 UPX(仅限 Linux 和 Windows): `bin/spc install-pkg upx`
|
- 下载安装 UPX(仅限 Linux 和 Windows): `bin/spc install-pkg upx`
|
||||||
|
- 下载安装 nasm(仅限 Windows): `bin/spc install-pkg nasm`
|
||||||
|
- 下载安装 go-xcaddy: `bin/spc install-pkg go-xcaddy`
|
||||||
|
|
||||||
## 命令 del-download - 删除已下载的资源
|
## 命令 del-download - 删除已下载的资源
|
||||||
|
|
||||||
@@ -452,6 +500,8 @@ bin/spc dev:sort-config ext
|
|||||||
| after-exts-extract | 在要编译的扩展解压到 PHP 源码目录后触发 |
|
| after-exts-extract | 在要编译的扩展解压到 PHP 源码目录后触发 |
|
||||||
| before-library[*name*]-build | 在名称为 `name` 的库编译前触发(如 `before-library[postgresql]-build`) |
|
| before-library[*name*]-build | 在名称为 `name` 的库编译前触发(如 `before-library[postgresql]-build`) |
|
||||||
| after-library[*name*]-build | 在名称为 `name` 的库编译后触发 |
|
| after-library[*name*]-build | 在名称为 `name` 的库编译后触发 |
|
||||||
|
| after-shared-ext[*name*]-build | 在名称为 `name` 的共享扩展编译后触发(如 `after-shared-ext[redis]-build`) |
|
||||||
|
| before-shared-ext[*name*]-build | 在名称为 `name` 的共享扩展编译前触发 |
|
||||||
| before-php-buildconf | 在编译 PHP 命令 `./buildconf` 前触发 |
|
| before-php-buildconf | 在编译 PHP 命令 `./buildconf` 前触发 |
|
||||||
| before-php-configure | 在编译 PHP 命令 `./configure` 前触发 |
|
| before-php-configure | 在编译 PHP 命令 `./configure` 前触发 |
|
||||||
| before-php-make | 在编译 PHP 命令 `make` 前触发 |
|
| before-php-make | 在编译 PHP 命令 `make` 前触发 |
|
||||||
|
|||||||
@@ -10,20 +10,22 @@
|
|||||||
当下载资源时,你可能最终会看到类似 `curl: (56) The requested URL returned error: 403` 的错误,这通常是由于 GitHub 限制导致的。
|
当下载资源时,你可能最终会看到类似 `curl: (56) The requested URL returned error: 403` 的错误,这通常是由于 GitHub 限制导致的。
|
||||||
你可以通过在命令中添加 `--debug` 来验证,会看到类似 `[DEBU] Running command (no output) : curl -sfSL "https://api.github.com/repos/openssl/openssl/releases"` 的输出。
|
你可以通过在命令中添加 `--debug` 来验证,会看到类似 `[DEBU] Running command (no output) : curl -sfSL "https://api.github.com/repos/openssl/openssl/releases"` 的输出。
|
||||||
|
|
||||||
要解决这个问题,可以在 GitHub 上 [创建](https://github.com/settings/token) 一个个人访问令牌,并将其设置为环境变量 `GITHUB_TOKEN=<XXX>`。
|
要解决这个问题,可以在 GitHub 上 [创建](https://github.com/settings/tokens) 一个个人访问令牌,并将其设置为环境变量 `GITHUB_TOKEN=<XXX>`。
|
||||||
|
|
||||||
如果确认地址确实无法正常访问,可以提交 Issue 或 PR 更新地址。
|
如果确认地址确实无法正常访问,可以提交 Issue 或 PR 更新地址或下载类型。
|
||||||
|
|
||||||
## doctor 无法修复
|
## Doctor 无法修复某些问题
|
||||||
|
|
||||||
在绝大部分情况下,doctor 模块都可以对缺失的系统环境进行自动修复和安装,但也存在特殊的环境无法正常使用自动修复功能。
|
在绝大部分情况下,doctor 模块都可以对缺失的系统环境进行自动修复和安装,但也存在特殊的环境无法正常使用自动修复功能。
|
||||||
|
|
||||||
部分项目由于系统局限(如 Windows 下无法自动安装 Visual Studio 等软件),无法使用自动修复功能。
|
由于系统限制(例如,Windows 下无法自动安装 Visual Studio 等软件),自动修复功能无法用于某些项目。
|
||||||
在遇到无法自动修复功能时,如果遇到 `Some check items can not be fixed` 字样,则表明无法自动修复,请根据终端显示的方法提交 Issue 或自行修复环境。
|
在遇到无法自动修复功能时,如果遇到 `Some check items can not be fixed` 字样,则表明无法自动修复。
|
||||||
|
请根据终端显示的方法提交 Issue 或自行修复环境。
|
||||||
|
|
||||||
## 编译错误
|
## 编译错误
|
||||||
|
|
||||||
遇到编译错误时,如果没有开启 `--debug` 日志,请先开启调试日志,然后确定报错的命令。
|
遇到编译错误时,如果没有开启 `--debug` 日志,请先开启调试日志,然后确定报错的命令。
|
||||||
报错的终端输出对于修复编译错误非常重要,请在提交 Issue 时一并将终端日志的最后报错片段(或整个终端日志输出)上传,并且包含使用的 `spc` 命令和参数。
|
报错的终端输出对于修复编译错误非常重要。
|
||||||
|
在提交 Issue 时,请上传终端日志的最后报错片段(或整个终端日志输出),并且包含使用的 `spc` 命令和参数。
|
||||||
|
|
||||||
如果你是重复构建,请参考 [本地构建 - 多次构建](./manual-build#多次构建) 章节,清理构建缓存后再次构建。
|
如果你是重复构建,请参考 [本地构建 - 多次构建](./manual-build#多次构建) 章节。
|
||||||
|
|||||||
138
docs/zh/index.md
138
docs/zh/index.md
@@ -3,18 +3,140 @@
|
|||||||
layout: home
|
layout: home
|
||||||
|
|
||||||
hero:
|
hero:
|
||||||
name: "static-php-cli"
|
name: "Static PHP"
|
||||||
tagline: "在 Linux、macOS、FreeBSD、Windows 上与 PHP 项目一起构建独立的 PHP 二进制文件,并包含流行的扩展。"
|
tagline: "在 Linux、macOS、FreeBSD、Windows 上与 PHP 项目一起构建独立的 PHP 二进制文件,并包含流行的扩展。"
|
||||||
|
image:
|
||||||
|
src: /images/static-php_nobg.png
|
||||||
|
alt: Static PHP CLI Logo
|
||||||
actions:
|
actions:
|
||||||
- theme: brand
|
- theme: brand
|
||||||
text: 指南
|
text: 开始使用
|
||||||
link: ./guide/
|
link: ./guide/
|
||||||
|
|
||||||
features:
|
features:
|
||||||
- title: 静态二进制
|
- title: 静态 CLI 二进制
|
||||||
details: 您可以轻松地编译一个独立的 PHP 二进制文件以供嵌入程序使用。包括 cli、fpm、micro。
|
details: 您可以轻松地编译一个独立的 PHP 二进制文件以供通用使用,包括 CLI、FPM SAPI。
|
||||||
- title: phpmicro 自执行二进制
|
- title: Micro 自解压可执行文件
|
||||||
details: 您可以使用 micro SAPI 编译一个自解压的可执行文件,并将 PHP 代码与二进制文件打包为一个文件。
|
details: 您可以编译一个自解压的可执行文件,并将 PHP 源代码与二进制文件打包在一起。
|
||||||
- title: 依赖管理
|
- title: 依赖管理
|
||||||
details: static-php-cli 附带依赖项管理,支持安装不同类型的 PHP 扩展和不同的依赖库。
|
details: static-php-cli 附带依赖项管理,支持安装不同类型的 PHP 扩展。
|
||||||
---
|
---
|
||||||
|
|
||||||
|
<script setup>
|
||||||
|
import {VPSponsors} from "vitepress/theme";
|
||||||
|
import Contributors from '../.vitepress/components/Contributors.vue';
|
||||||
|
|
||||||
|
const sponsors = [
|
||||||
|
{ name: 'Beyond Code', img: '/images/beyondcode-seeklogo.png', url: 'https://beyondco.de/' },
|
||||||
|
{ name: 'NativePHP', img: '/images/nativephp-logo.svg', url: 'https://nativephp.com/' },
|
||||||
|
];
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<div class="sponsors-section">
|
||||||
|
<div class="sponsors-header">
|
||||||
|
<h2>特别赞助商</h2>
|
||||||
|
<p class="sponsors-description">
|
||||||
|
感谢我们出色的赞助商对本项目的支持!
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<VPSponsors :data="sponsors"/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<style scoped>
|
||||||
|
.sponsors-section {
|
||||||
|
margin: 48px auto;
|
||||||
|
padding: 32px 24px;
|
||||||
|
max-width: 1152px;
|
||||||
|
background: linear-gradient(135deg, var(--vp-c-bg-soft) 0%, var(--vp-c-bg) 100%);
|
||||||
|
border-radius: 16px;
|
||||||
|
border: 1px solid var(--vp-c-divider);
|
||||||
|
box-shadow: 0 4px 16px rgba(0, 0, 0, 0.05);
|
||||||
|
transition: all 0.3s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
.sponsors-section:hover {
|
||||||
|
box-shadow: 0 8px 24px rgba(0, 0, 0, 0.1);
|
||||||
|
transform: translateY(-2px);
|
||||||
|
}
|
||||||
|
|
||||||
|
.sponsors-header {
|
||||||
|
text-align: center;
|
||||||
|
margin-bottom: 24px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.sponsors-header h2 {
|
||||||
|
font-size: 1.5rem;
|
||||||
|
font-weight: 700;
|
||||||
|
margin: 0 0 8px 0;
|
||||||
|
background: linear-gradient(120deg, var(--vp-c-brand-1), var(--vp-c-brand-2));
|
||||||
|
-webkit-background-clip: text;
|
||||||
|
-webkit-text-fill-color: transparent;
|
||||||
|
background-clip: text;
|
||||||
|
}
|
||||||
|
|
||||||
|
.sponsors-description {
|
||||||
|
font-size: 0.95rem;
|
||||||
|
color: var(--vp-c-text-2);
|
||||||
|
margin: 0;
|
||||||
|
line-height: 1.5;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width: 768px) {
|
||||||
|
.sponsors-section {
|
||||||
|
margin: 32px 16px;
|
||||||
|
padding: 24px 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.sponsors-header h2 {
|
||||||
|
font-size: 1.25rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.sponsors-description {
|
||||||
|
font-size: 0.9rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Hero logo styling */
|
||||||
|
:deep(.VPImage.image-src) {
|
||||||
|
border-radius: 20px;
|
||||||
|
background: linear-gradient(135deg, var(--vp-c-bg-soft) 0%, var(--vp-c-default-soft) 100%);
|
||||||
|
padding: 40px;
|
||||||
|
box-shadow: 0 8px 32px rgba(0, 0, 0, 0.1);
|
||||||
|
transition: all 0.3s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep(.VPImage.image-src:hover) {
|
||||||
|
transform: translateY(-4px);
|
||||||
|
box-shadow: 0 12px 40px rgba(0, 0, 0, 0.15);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Dark mode adjustments for logo */
|
||||||
|
.dark :deep(.VPImage.image-src) {
|
||||||
|
background: linear-gradient(135deg, rgba(255, 255, 255, 0.05) 0%, rgba(255, 255, 255, 0.02) 100%);
|
||||||
|
box-shadow: 0 8px 32px rgba(0, 0, 0, 0.5);
|
||||||
|
opacity: 0.9;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dark :deep(.VPImage.image-src:hover) {
|
||||||
|
opacity: 1;
|
||||||
|
box-shadow: 0 12px 40px rgba(0, 0, 0, 0.7);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Additional styling for the logo image itself */
|
||||||
|
:deep(.VPImage.image-src img) {
|
||||||
|
max-height: 280px;
|
||||||
|
width: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width: 768px) {
|
||||||
|
:deep(.VPImage.image-src) {
|
||||||
|
padding: 24px;
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep(.VPImage.image-src img) {
|
||||||
|
max-height: 200px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<Contributors />
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
"docs:preview": "vitepress preview docs"
|
"docs:preview": "vitepress preview docs"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"vitepress": "^1.0.0-rc.35",
|
"vitepress": "^2.0.0-alpha.5",
|
||||||
"vue": "^3.2.47"
|
"vue": "^3.2.47"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,6 +8,8 @@ parameters:
|
|||||||
- '#class Fiber#'
|
- '#class Fiber#'
|
||||||
- '#Attribute class JetBrains\\PhpStorm\\ArrayShape does not exist#'
|
- '#Attribute class JetBrains\\PhpStorm\\ArrayShape does not exist#'
|
||||||
- '#Function Swoole\\Coroutine\\run not found.#'
|
- '#Function Swoole\\Coroutine\\run not found.#'
|
||||||
|
- '#Static call to instance method ZM\\Logger\\ConsoleColor#'
|
||||||
|
- '#Constant GNU_ARCH not found#'
|
||||||
dynamicConstantNames:
|
dynamicConstantNames:
|
||||||
- PHP_OS_FAMILY
|
- PHP_OS_FAMILY
|
||||||
excludePaths:
|
excludePaths:
|
||||||
|
|||||||
@@ -2,4 +2,8 @@
|
|||||||
<phpunit
|
<phpunit
|
||||||
bootstrap="tests/bootstrap.php"
|
bootstrap="tests/bootstrap.php"
|
||||||
>
|
>
|
||||||
</phpunit>
|
<php>
|
||||||
|
<env name="SPC_IGNORE_BAD_HASH" value="yes" force="true" />
|
||||||
|
<env name="SPC_SKIP_TOOLCHAIN_CHECK" value="yes" force="true" />
|
||||||
|
</php>
|
||||||
|
</phpunit>
|
||||||
|
|||||||
@@ -6,8 +6,10 @@ namespace SPC;
|
|||||||
|
|
||||||
use SPC\command\BuildLibsCommand;
|
use SPC\command\BuildLibsCommand;
|
||||||
use SPC\command\BuildPHPCommand;
|
use SPC\command\BuildPHPCommand;
|
||||||
|
use SPC\command\CraftCommand;
|
||||||
use SPC\command\DeleteDownloadCommand;
|
use SPC\command\DeleteDownloadCommand;
|
||||||
use SPC\command\dev\AllExtCommand;
|
use SPC\command\dev\AllExtCommand;
|
||||||
|
use SPC\command\dev\EnvCommand;
|
||||||
use SPC\command\dev\ExtVerCommand;
|
use SPC\command\dev\ExtVerCommand;
|
||||||
use SPC\command\dev\GenerateExtDepDocsCommand;
|
use SPC\command\dev\GenerateExtDepDocsCommand;
|
||||||
use SPC\command\dev\GenerateExtDocCommand;
|
use SPC\command\dev\GenerateExtDocCommand;
|
||||||
@@ -32,7 +34,7 @@ use Symfony\Component\Console\Application;
|
|||||||
*/
|
*/
|
||||||
final class ConsoleApplication extends Application
|
final class ConsoleApplication extends Application
|
||||||
{
|
{
|
||||||
public const VERSION = '2.5.0';
|
public const string VERSION = '2.8.2';
|
||||||
|
|
||||||
public function __construct()
|
public function __construct()
|
||||||
{
|
{
|
||||||
@@ -43,6 +45,8 @@ final class ConsoleApplication extends Application
|
|||||||
|
|
||||||
$this->addCommands(
|
$this->addCommands(
|
||||||
[
|
[
|
||||||
|
// Craft command
|
||||||
|
new CraftCommand(),
|
||||||
// Common commands
|
// Common commands
|
||||||
new BuildPHPCommand(),
|
new BuildPHPCommand(),
|
||||||
new BuildLibsCommand(),
|
new BuildLibsCommand(),
|
||||||
@@ -67,6 +71,7 @@ final class ConsoleApplication extends Application
|
|||||||
new GenerateExtDepDocsCommand(),
|
new GenerateExtDepDocsCommand(),
|
||||||
new GenerateLibDepDocsCommand(),
|
new GenerateLibDepDocsCommand(),
|
||||||
new PackLibCommand(),
|
new PackLibCommand(),
|
||||||
|
new EnvCommand(),
|
||||||
]
|
]
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,15 +4,16 @@ declare(strict_types=1);
|
|||||||
|
|
||||||
namespace SPC\builder;
|
namespace SPC\builder;
|
||||||
|
|
||||||
use SPC\exception\ExceptionHandler;
|
use SPC\exception\BuildFailureException;
|
||||||
use SPC\exception\FileSystemException;
|
|
||||||
use SPC\exception\InterruptException;
|
use SPC\exception\InterruptException;
|
||||||
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\LockFile;
|
||||||
|
use SPC\store\pkg\GoXcaddy;
|
||||||
use SPC\store\SourceManager;
|
use SPC\store\SourceManager;
|
||||||
use SPC\util\CustomExt;
|
use SPC\store\SourcePatcher;
|
||||||
|
use SPC\util\AttributeMapper;
|
||||||
|
|
||||||
abstract class BuilderBase
|
abstract class BuilderBase
|
||||||
{
|
{
|
||||||
@@ -43,33 +44,30 @@ abstract class BuilderBase
|
|||||||
/**
|
/**
|
||||||
* Convert libraries to class
|
* 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 RuntimeException
|
|
||||||
* @throws WrongUsageException
|
|
||||||
* @internal
|
* @internal
|
||||||
*/
|
*/
|
||||||
abstract public function proveLibs(array $sorted_libraries);
|
abstract public function proveLibs(array $sorted_libraries);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set-Up libraries
|
* Set-Up libraries
|
||||||
*
|
|
||||||
* @throws FileSystemException
|
|
||||||
* @throws RuntimeException
|
|
||||||
* @throws WrongUsageException
|
|
||||||
*/
|
*/
|
||||||
public function setupLibs(): void
|
public function setupLibs(): void
|
||||||
{
|
{
|
||||||
// build all libs
|
// build all libs
|
||||||
foreach ($this->libs as $lib) {
|
foreach ($this->libs as $lib) {
|
||||||
$starttime = microtime(true);
|
$starttime = microtime(true);
|
||||||
match ($lib->setup($this->getOption('rebuild', false))) {
|
$status = $lib->setup($this->getOption('rebuild', false));
|
||||||
|
match ($status) {
|
||||||
LIB_STATUS_OK => logger()->info('lib [' . $lib::NAME . '] setup success, took ' . round(microtime(true) - $starttime, 2) . ' s'),
|
LIB_STATUS_OK => logger()->info('lib [' . $lib::NAME . '] setup success, took ' . round(microtime(true) - $starttime, 2) . ' s'),
|
||||||
LIB_STATUS_ALREADY => logger()->notice('lib [' . $lib::NAME . '] already built'),
|
LIB_STATUS_ALREADY => logger()->notice('lib [' . $lib::NAME . '] already built'),
|
||||||
LIB_STATUS_BUILD_FAILED => logger()->error('lib [' . $lib::NAME . '] build failed'),
|
|
||||||
LIB_STATUS_INSTALL_FAILED => logger()->error('lib [' . $lib::NAME . '] install failed'),
|
LIB_STATUS_INSTALL_FAILED => logger()->error('lib [' . $lib::NAME . '] install failed'),
|
||||||
default => logger()->warning('lib [' . $lib::NAME . '] build status unknown'),
|
default => logger()->warning('lib [' . $lib::NAME . '] build status unknown'),
|
||||||
};
|
};
|
||||||
|
if (in_array($status, [LIB_STATUS_BUILD_FAILED, LIB_STATUS_INSTALL_FAILED])) {
|
||||||
|
throw new BuildFailureException('Library [' . $lib::NAME . '] setup failed.');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -122,33 +120,12 @@ abstract class BuilderBase
|
|||||||
*
|
*
|
||||||
* @return Extension[]
|
* @return Extension[]
|
||||||
*/
|
*/
|
||||||
public function getExts(): array
|
public function getExts(bool $including_shared = true): array
|
||||||
{
|
{
|
||||||
return $this->exts;
|
if ($including_shared) {
|
||||||
}
|
return $this->exts;
|
||||||
|
|
||||||
/**
|
|
||||||
* Check if there is a cpp extensions or libraries.
|
|
||||||
*
|
|
||||||
* @throws FileSystemException
|
|
||||||
* @throws WrongUsageException
|
|
||||||
*/
|
|
||||||
public function hasCpp(): bool
|
|
||||||
{
|
|
||||||
// judge cpp-extension
|
|
||||||
$exts = array_keys($this->getExts());
|
|
||||||
foreach ($exts as $ext) {
|
|
||||||
if (Config::getExt($ext, 'cpp-extension', false) === true) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
$libs = array_keys($this->getLibs());
|
return array_filter($this->exts, fn ($ext) => $ext->isBuildStatic());
|
||||||
foreach ($libs as $lib) {
|
|
||||||
if (Config::getLib($lib, 'cpp-library', false) === true) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -164,29 +141,49 @@ abstract class BuilderBase
|
|||||||
/**
|
/**
|
||||||
* Verify the list of "ext" extensions for validity and declare an Extension object to check the dependencies of the extensions.
|
* Verify the list of "ext" extensions for validity and declare an Extension object to check the dependencies of the extensions.
|
||||||
*
|
*
|
||||||
* @throws FileSystemException
|
|
||||||
* @throws RuntimeException
|
|
||||||
* @throws \ReflectionException
|
|
||||||
* @throws \Throwable|WrongUsageException
|
|
||||||
* @internal
|
* @internal
|
||||||
*/
|
*/
|
||||||
public function proveExts(array $extensions, bool $skip_check_deps = false): void
|
public function proveExts(array $static_extensions, array $shared_extensions = [], bool $skip_check_deps = false, bool $skip_extract = false): void
|
||||||
{
|
{
|
||||||
CustomExt::loadCustomExt();
|
// judge ext
|
||||||
$this->emitPatchPoint('before-php-extract');
|
foreach ($static_extensions as $ext) {
|
||||||
SourceManager::initSource(sources: ['php-src']);
|
// if extension does not support static build, throw exception
|
||||||
$this->emitPatchPoint('after-php-extract');
|
if (!in_array('static', Config::getExtTarget($ext))) {
|
||||||
if ($this->getPHPVersionID() >= 80000) {
|
throw new WrongUsageException('Extension [' . $ext . '] does not support static build!');
|
||||||
$this->emitPatchPoint('before-micro-extract');
|
}
|
||||||
SourceManager::initSource(sources: ['micro']);
|
|
||||||
$this->emitPatchPoint('after-micro-extract');
|
|
||||||
}
|
}
|
||||||
$this->emitPatchPoint('before-exts-extract');
|
foreach ($shared_extensions as $ext) {
|
||||||
SourceManager::initSource(exts: $extensions);
|
// if extension does not support shared build, throw exception
|
||||||
$this->emitPatchPoint('after-exts-extract');
|
if (!in_array('shared', Config::getExtTarget($ext)) && !in_array($ext, $shared_extensions)) {
|
||||||
foreach ($extensions as $extension) {
|
throw new WrongUsageException('Extension [' . $ext . '] does not support shared build!');
|
||||||
$class = CustomExt::getExtClass($extension);
|
}
|
||||||
|
}
|
||||||
|
if (!$skip_extract) {
|
||||||
|
$this->emitPatchPoint('before-php-extract');
|
||||||
|
SourceManager::initSource(sources: ['php-src'], source_only: true);
|
||||||
|
$this->emitPatchPoint('after-php-extract');
|
||||||
|
if ($this->getPHPVersionID() >= 80000) {
|
||||||
|
$this->emitPatchPoint('before-micro-extract');
|
||||||
|
SourceManager::initSource(sources: ['micro'], source_only: true);
|
||||||
|
$this->emitPatchPoint('after-micro-extract');
|
||||||
|
}
|
||||||
|
$this->emitPatchPoint('before-exts-extract');
|
||||||
|
SourceManager::initSource(exts: [...$static_extensions, ...$shared_extensions]);
|
||||||
|
$this->emitPatchPoint('after-exts-extract');
|
||||||
|
// patch micro
|
||||||
|
SourcePatcher::patchMicro();
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach ([...$static_extensions, ...$shared_extensions] as $extension) {
|
||||||
|
$class = AttributeMapper::getExtensionClassByName($extension) ?? Extension::class;
|
||||||
|
/** @var Extension $ext */
|
||||||
$ext = new $class($extension, $this);
|
$ext = new $class($extension, $this);
|
||||||
|
if (in_array($extension, $static_extensions)) {
|
||||||
|
$ext->setBuildStatic();
|
||||||
|
}
|
||||||
|
if (in_array($extension, $shared_extensions)) {
|
||||||
|
$ext->setBuildShared();
|
||||||
|
}
|
||||||
$this->addExt($ext);
|
$this->addExt($ext);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -194,10 +191,10 @@ abstract class BuilderBase
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach ($this->exts as $ext) {
|
foreach ($this->getExts() as $ext) {
|
||||||
$ext->checkDependency();
|
$ext->checkDependency();
|
||||||
}
|
}
|
||||||
$this->ext_list = $extensions;
|
$this->ext_list = [...$static_extensions, ...$shared_extensions];
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -207,19 +204,65 @@ abstract class BuilderBase
|
|||||||
*/
|
*/
|
||||||
abstract public function buildPHP(int $build_target = BUILD_TARGET_NONE);
|
abstract public function buildPHP(int $build_target = BUILD_TARGET_NONE);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test PHP
|
||||||
|
*/
|
||||||
|
abstract public function testPHP(int $build_target = BUILD_TARGET_NONE);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Build shared extensions.
|
||||||
|
*/
|
||||||
|
public function buildSharedExts(): void
|
||||||
|
{
|
||||||
|
$lines = file(BUILD_BIN_PATH . '/php-config');
|
||||||
|
$extension_dir_line = null;
|
||||||
|
foreach ($lines as $key => $value) {
|
||||||
|
if (str_starts_with($value, 'extension_dir=')) {
|
||||||
|
$lines[$key] = 'extension_dir="' . BUILD_MODULES_PATH . '"' . PHP_EOL;
|
||||||
|
$extension_dir_line = $value;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
file_put_contents(BUILD_BIN_PATH . '/php-config', implode('', $lines));
|
||||||
|
FileSystem::replaceFileStr(BUILD_LIB_PATH . '/php/build/phpize.m4', 'test "[$]$1" = "no" && $1=yes', '# test "[$]$1" = "no" && $1=yes');
|
||||||
|
FileSystem::createDir(BUILD_MODULES_PATH);
|
||||||
|
try {
|
||||||
|
foreach ($this->getExts() as $ext) {
|
||||||
|
if (!$ext->isBuildShared()) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
$ext->buildShared();
|
||||||
|
}
|
||||||
|
} finally {
|
||||||
|
FileSystem::replaceFileLineContainsString(BUILD_BIN_PATH . '/php-config', 'extension_dir=', $extension_dir_line);
|
||||||
|
}
|
||||||
|
FileSystem::replaceFileLineContainsString(BUILD_BIN_PATH . '/php-config', 'extension_dir=', $extension_dir_line);
|
||||||
|
FileSystem::replaceFileStr(BUILD_LIB_PATH . '/php/build/phpize.m4', '# test "[$]$1" = "no" && $1=yes', 'test "[$]$1" = "no" && $1=yes');
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Generate extension enable arguments for configure.
|
* Generate extension enable arguments for configure.
|
||||||
* e.g. --enable-mbstring
|
* e.g. --enable-mbstring
|
||||||
*
|
|
||||||
* @throws FileSystemException
|
|
||||||
* @throws WrongUsageException
|
|
||||||
*/
|
*/
|
||||||
public function makeExtensionArgs(): string
|
public function makeStaticExtensionArgs(): string
|
||||||
{
|
{
|
||||||
$ret = [];
|
$ret = [];
|
||||||
foreach ($this->exts as $ext) {
|
foreach ($this->getExts() as $ext) {
|
||||||
logger()->info($ext->getName() . ' is using ' . $ext->getConfigureArg());
|
$arg = null;
|
||||||
$ret[] = trim($ext->getConfigureArg());
|
if ($ext->isBuildShared() && !$ext->isBuildStatic()) {
|
||||||
|
if (
|
||||||
|
(Config::getExt($ext->getName(), 'type') === 'builtin' &&
|
||||||
|
!file_exists(SOURCE_PATH . '/php-src/ext/' . $ext->getName() . '/config.m4')) ||
|
||||||
|
Config::getExt($ext->getName(), 'build-with-php') === true
|
||||||
|
) {
|
||||||
|
$arg = $ext->getConfigureArg(true);
|
||||||
|
} else {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$arg ??= $ext->getConfigureArg();
|
||||||
|
logger()->info($ext->getName() . ' is using ' . $arg);
|
||||||
|
$ret[] = trim($arg);
|
||||||
}
|
}
|
||||||
logger()->debug('Using configure: ' . implode(' ', $ret));
|
logger()->debug('Using configure: ' . implode(' ', $ret));
|
||||||
return implode(' ', $ret);
|
return implode(' ', $ret);
|
||||||
@@ -235,9 +278,6 @@ abstract class BuilderBase
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Get PHP Version ID from php-src/main/php_version.h
|
* Get PHP Version ID from php-src/main/php_version.h
|
||||||
*
|
|
||||||
* @throws RuntimeException
|
|
||||||
* @throws WrongUsageException
|
|
||||||
*/
|
*/
|
||||||
public function getPHPVersionID(): int
|
public function getPHPVersionID(): int
|
||||||
{
|
{
|
||||||
@@ -250,20 +290,25 @@ abstract class BuilderBase
|
|||||||
return intval($match[1]);
|
return intval($match[1]);
|
||||||
}
|
}
|
||||||
|
|
||||||
throw new RuntimeException('PHP version file format is malformed, please remove it and download again');
|
throw new WrongUsageException('PHP version file format is malformed, please remove "./source/php-src" dir and download/extract again');
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getPHPVersion(): string
|
public function getPHPVersion(bool $exception_on_failure = true): string
|
||||||
{
|
{
|
||||||
if (!file_exists(SOURCE_PATH . '/php-src/main/php_version.h')) {
|
if (!file_exists(SOURCE_PATH . '/php-src/main/php_version.h')) {
|
||||||
|
if (!$exception_on_failure) {
|
||||||
|
return 'unknown';
|
||||||
|
}
|
||||||
throw new WrongUsageException('PHP source files are not available, you need to download them first');
|
throw new WrongUsageException('PHP source files are not available, you need to download them first');
|
||||||
}
|
}
|
||||||
$file = file_get_contents(SOURCE_PATH . '/php-src/main/php_version.h');
|
$file = file_get_contents(SOURCE_PATH . '/php-src/main/php_version.h');
|
||||||
if (preg_match('/PHP_VERSION "(.*)"/', $file, $match) !== 0) {
|
if (preg_match('/PHP_VERSION "(.*)"/', $file, $match) !== 0) {
|
||||||
return $match[1];
|
return $match[1];
|
||||||
}
|
}
|
||||||
|
if (!$exception_on_failure) {
|
||||||
throw new RuntimeException('PHP version file format is malformed, please remove it and download again');
|
return 'unknown';
|
||||||
|
}
|
||||||
|
throw new WrongUsageException('PHP version file format is malformed, please remove it and download again');
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -274,17 +319,13 @@ abstract class BuilderBase
|
|||||||
public function getPHPVersionFromArchive(?string $file = null): false|string
|
public function getPHPVersionFromArchive(?string $file = null): false|string
|
||||||
{
|
{
|
||||||
if ($file === null) {
|
if ($file === null) {
|
||||||
$lock = file_exists(DOWNLOAD_PATH . '/.lock.json') ? file_get_contents(DOWNLOAD_PATH . '/.lock.json') : false;
|
$lock = LockFile::get('php-src');
|
||||||
if ($lock === false) {
|
if ($lock === null) {
|
||||||
return false;
|
|
||||||
}
|
|
||||||
$lock = json_decode($lock, true);
|
|
||||||
$file = $lock['php-src']['filename'] ?? null;
|
|
||||||
if ($file === null) {
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
$file = LockFile::getLockFullPath($lock);
|
||||||
}
|
}
|
||||||
if (preg_match('/php-(\d+\.\d+\.\d+(?:RC\d+)?)\.tar\.(?:gz|bz2|xz)/', $file, $match)) {
|
if (preg_match('/php-(\d+\.\d+\.\d+(?:RC\d+|alpha\d+|beta\d+)?)\.tar\.(?:gz|bz2|xz)/', $file, $match)) {
|
||||||
return $match[1];
|
return $match[1];
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
@@ -328,6 +369,12 @@ abstract class BuilderBase
|
|||||||
if (($type & BUILD_TARGET_EMBED) === BUILD_TARGET_EMBED) {
|
if (($type & BUILD_TARGET_EMBED) === BUILD_TARGET_EMBED) {
|
||||||
$ls[] = 'embed';
|
$ls[] = 'embed';
|
||||||
}
|
}
|
||||||
|
if (($type & BUILD_TARGET_FRANKENPHP) === BUILD_TARGET_FRANKENPHP) {
|
||||||
|
$ls[] = 'frankenphp';
|
||||||
|
}
|
||||||
|
if (($type & BUILD_TARGET_CGI) === BUILD_TARGET_CGI) {
|
||||||
|
$ls[] = 'cgi';
|
||||||
|
}
|
||||||
return implode(', ', $ls);
|
return implode(', ', $ls);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -396,7 +443,7 @@ abstract class BuilderBase
|
|||||||
foreach ($this->libs as $lib) {
|
foreach ($this->libs as $lib) {
|
||||||
$lib->validate();
|
$lib->validate();
|
||||||
}
|
}
|
||||||
foreach ($this->exts as $ext) {
|
foreach ($this->getExts() as $ext) {
|
||||||
$ext->validate();
|
$ext->validate();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -411,7 +458,7 @@ abstract class BuilderBase
|
|||||||
foreach ($patches as $patch) {
|
foreach ($patches as $patch) {
|
||||||
try {
|
try {
|
||||||
if (!file_exists($patch)) {
|
if (!file_exists($patch)) {
|
||||||
throw new RuntimeException("Additional patch script file {$patch} not found!");
|
throw new WrongUsageException("Additional patch script file {$patch} not found!");
|
||||||
}
|
}
|
||||||
logger()->debug('Running additional patch script: ' . $patch);
|
logger()->debug('Running additional patch script: ' . $patch);
|
||||||
require $patch;
|
require $patch;
|
||||||
@@ -424,16 +471,33 @@ abstract class BuilderBase
|
|||||||
exit($e->getCode());
|
exit($e->getCode());
|
||||||
} catch (\Throwable $e) {
|
} catch (\Throwable $e) {
|
||||||
logger()->critical('Patch script ' . $patch . ' failed to run.');
|
logger()->critical('Patch script ' . $patch . ' failed to run.');
|
||||||
if ($this->getOption('debug')) {
|
|
||||||
ExceptionHandler::getInstance()->handle($e);
|
|
||||||
} else {
|
|
||||||
logger()->critical('Please check with --debug option to see more details.');
|
|
||||||
}
|
|
||||||
throw $e;
|
throw $e;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function checkBeforeBuildPHP(int $rule): void
|
||||||
|
{
|
||||||
|
if (($rule & BUILD_TARGET_FRANKENPHP) === BUILD_TARGET_FRANKENPHP) {
|
||||||
|
if (!$this->getOption('enable-zts')) {
|
||||||
|
throw new WrongUsageException('FrankenPHP SAPI requires ZTS enabled PHP, build with `--enable-zts`!');
|
||||||
|
}
|
||||||
|
// frankenphp doesn't support windows, BSD is currently not supported by static-php-cli
|
||||||
|
if (!in_array(PHP_OS_FAMILY, ['Linux', 'Darwin'])) {
|
||||||
|
throw new WrongUsageException('FrankenPHP SAPI is only available on Linux and macOS!');
|
||||||
|
}
|
||||||
|
// frankenphp needs package go-xcaddy installed
|
||||||
|
if (!GoXcaddy::isInstalled()) {
|
||||||
|
global $argv;
|
||||||
|
throw new WrongUsageException("FrankenPHP SAPI requires the go-xcaddy package, please install it first: {$argv[0]} install-pkg go-xcaddy");
|
||||||
|
}
|
||||||
|
// frankenphp needs libxml2 lib on macos, see: https://github.com/php/frankenphp/blob/main/frankenphp.go#L17
|
||||||
|
if (PHP_OS_FAMILY === 'Darwin' && !$this->getLib('libxml2')) {
|
||||||
|
throw new WrongUsageException('FrankenPHP SAPI for macOS requires libxml2 library, please include the `xml` extension in your build.');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Generate micro extension test php code.
|
* Generate micro extension test php code.
|
||||||
*/
|
*/
|
||||||
@@ -441,7 +505,7 @@ abstract class BuilderBase
|
|||||||
{
|
{
|
||||||
$php = "<?php\n\necho '[micro-test-start]' . PHP_EOL;\n";
|
$php = "<?php\n\necho '[micro-test-start]' . PHP_EOL;\n";
|
||||||
|
|
||||||
foreach ($this->getExts() as $ext) {
|
foreach ($this->getExts(false) as $ext) {
|
||||||
$ext_name = $ext->getDistName();
|
$ext_name = $ext->getDistName();
|
||||||
if (!empty($ext_name)) {
|
if (!empty($ext_name)) {
|
||||||
$php .= "echo 'Running micro with {$ext_name} test' . PHP_EOL;\n";
|
$php .= "echo 'Running micro with {$ext_name} test' . PHP_EOL;\n";
|
||||||
|
|||||||
@@ -8,8 +8,7 @@ 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\builder\windows\WindowsBuilder;
|
||||||
use SPC\exception\FileSystemException;
|
use SPC\exception\ExceptionHandler;
|
||||||
use SPC\exception\RuntimeException;
|
|
||||||
use SPC\exception\WrongUsageException;
|
use SPC\exception\WrongUsageException;
|
||||||
use Symfony\Component\Console\Input\InputInterface;
|
use Symfony\Component\Console\Input\InputInterface;
|
||||||
|
|
||||||
@@ -20,11 +19,6 @@ class BuilderProvider
|
|||||||
{
|
{
|
||||||
private static ?BuilderBase $builder = null;
|
private static ?BuilderBase $builder = null;
|
||||||
|
|
||||||
/**
|
|
||||||
* @throws FileSystemException
|
|
||||||
* @throws RuntimeException
|
|
||||||
* @throws WrongUsageException
|
|
||||||
*/
|
|
||||||
public static function makeBuilderByInput(InputInterface $input): BuilderBase
|
public static function makeBuilderByInput(InputInterface $input): BuilderBase
|
||||||
{
|
{
|
||||||
ini_set('memory_limit', '4G');
|
ini_set('memory_limit', '4G');
|
||||||
@@ -36,12 +30,13 @@ class BuilderProvider
|
|||||||
'BSD' => new BSDBuilder($input->getOptions()),
|
'BSD' => new BSDBuilder($input->getOptions()),
|
||||||
default => throw new WrongUsageException('Current OS "' . PHP_OS_FAMILY . '" is not supported yet'),
|
default => throw new WrongUsageException('Current OS "' . PHP_OS_FAMILY . '" is not supported yet'),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// bind the builder to ExceptionHandler
|
||||||
|
ExceptionHandler::bindBuilder(self::$builder);
|
||||||
|
|
||||||
return self::$builder;
|
return self::$builder;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @throws WrongUsageException
|
|
||||||
*/
|
|
||||||
public static function getBuilder(): BuilderBase
|
public static function getBuilder(): BuilderBase
|
||||||
{
|
{
|
||||||
if (self::$builder === null) {
|
if (self::$builder === null) {
|
||||||
|
|||||||
@@ -4,71 +4,86 @@ declare(strict_types=1);
|
|||||||
|
|
||||||
namespace SPC\builder;
|
namespace SPC\builder;
|
||||||
|
|
||||||
use SPC\exception\FileSystemException;
|
use SPC\builder\unix\UnixBuilderBase;
|
||||||
use SPC\exception\RuntimeException;
|
use SPC\exception\EnvironmentException;
|
||||||
|
use SPC\exception\SPCException;
|
||||||
|
use SPC\exception\ValidationException;
|
||||||
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\util\SPCConfigUtil;
|
||||||
|
use SPC\util\SPCTarget;
|
||||||
|
|
||||||
class Extension
|
class Extension
|
||||||
{
|
{
|
||||||
protected array $dependencies = [];
|
protected array $dependencies = [];
|
||||||
|
|
||||||
/**
|
protected bool $build_shared = false;
|
||||||
* @throws FileSystemException
|
|
||||||
* @throws RuntimeException
|
protected bool $build_static = false;
|
||||||
* @throws WrongUsageException
|
|
||||||
*/
|
protected string $source_dir;
|
||||||
|
|
||||||
public function __construct(protected string $name, protected BuilderBase $builder)
|
public function __construct(protected string $name, protected BuilderBase $builder)
|
||||||
{
|
{
|
||||||
$ext_type = Config::getExt($this->name, 'type');
|
$ext_type = Config::getExt($this->name, 'type');
|
||||||
$unix_only = Config::getExt($this->name, 'unix-only', false);
|
$unix_only = Config::getExt($this->name, 'unix-only', false);
|
||||||
$windows_only = Config::getExt($this->name, 'windows-only', false);
|
$windows_only = Config::getExt($this->name, 'windows-only', false);
|
||||||
if (PHP_OS_FAMILY !== 'Windows' && $windows_only) {
|
if (PHP_OS_FAMILY !== 'Windows' && $windows_only) {
|
||||||
throw new RuntimeException("{$ext_type} extension {$name} is not supported on Linux and macOS platform");
|
throw new EnvironmentException("{$ext_type} extension {$name} is not supported on Linux and macOS platform");
|
||||||
}
|
}
|
||||||
if (PHP_OS_FAMILY === 'Windows' && $unix_only) {
|
if (PHP_OS_FAMILY === 'Windows' && $unix_only) {
|
||||||
throw new RuntimeException("{$ext_type} extension {$name} is not supported on Windows platform");
|
throw new EnvironmentException("{$ext_type} extension {$name} is not supported on Windows platform");
|
||||||
}
|
}
|
||||||
|
// set source_dir for builtin
|
||||||
|
if ($ext_type === 'builtin') {
|
||||||
|
$this->source_dir = SOURCE_PATH . '/php-src/ext/' . $this->name;
|
||||||
|
} elseif ($ext_type === 'external') {
|
||||||
|
$source = Config::getExt($this->name, 'source');
|
||||||
|
if ($source === null) {
|
||||||
|
throw new ValidationException("{$ext_type} extension {$name} source not found", validation_module: "Extension [{$name}] loader");
|
||||||
|
}
|
||||||
|
$source_path = Config::getSource($source)['path'] ?? null;
|
||||||
|
$source_path = $source_path === null ? SOURCE_PATH . '/' . $source : SOURCE_PATH . '/' . $source_path;
|
||||||
|
$this->source_dir = $source_path;
|
||||||
|
} else {
|
||||||
|
$this->source_dir = SOURCE_PATH . '/php-src';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getFrameworks(): array
|
||||||
|
{
|
||||||
|
return Config::getExt($this->getName(), 'frameworks', []);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取开启该扩展的 PHP 编译添加的参数
|
* 获取开启该扩展的 PHP 编译添加的参数
|
||||||
*
|
|
||||||
* @throws FileSystemException
|
|
||||||
* @throws WrongUsageException
|
|
||||||
*/
|
*/
|
||||||
public function getConfigureArg(): string
|
public function getConfigureArg(bool $shared = false): string
|
||||||
{
|
{
|
||||||
$arg = $this->getEnableArg();
|
return match (PHP_OS_FAMILY) {
|
||||||
switch (PHP_OS_FAMILY) {
|
'Windows' => $this->getWindowsConfigureArg($shared),
|
||||||
case 'Windows':
|
'Darwin',
|
||||||
$arg .= $this->getWindowsConfigureArg();
|
'Linux',
|
||||||
break;
|
'BSD' => $this->getUnixConfigureArg($shared),
|
||||||
case 'Darwin':
|
default => throw new WrongUsageException(PHP_OS_FAMILY . ' build is not supported yet'),
|
||||||
case 'Linux':
|
};
|
||||||
case 'BSD':
|
|
||||||
$arg .= $this->getUnixConfigureArg();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return $arg;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 根据 ext 的 arg-type 获取对应开启的参数,一般都是 --enable-xxx 和 --with-xxx
|
* 根据 ext 的 arg-type 获取对应开启的参数,一般都是 --enable-xxx 和 --with-xxx
|
||||||
*
|
|
||||||
* @throws FileSystemException
|
|
||||||
* @throws WrongUsageException
|
|
||||||
*/
|
*/
|
||||||
public function getEnableArg(): string
|
public function getEnableArg(bool $shared = false): string
|
||||||
{
|
{
|
||||||
|
$escapedPath = str_replace("'", '', escapeshellarg(BUILD_ROOT_PATH)) !== BUILD_ROOT_PATH || str_contains(BUILD_ROOT_PATH, ' ') ? escapeshellarg(BUILD_ROOT_PATH) : BUILD_ROOT_PATH;
|
||||||
$_name = str_replace('_', '-', $this->name);
|
$_name = str_replace('_', '-', $this->name);
|
||||||
return match ($arg_type = Config::getExt($this->name, 'arg-type', 'enable')) {
|
return match ($arg_type = Config::getExt($this->name, 'arg-type', 'enable')) {
|
||||||
'enable' => '--enable-' . $_name . ' ',
|
'enable' => '--enable-' . $_name . ($shared ? '=shared' : '') . ' ',
|
||||||
'with' => '--with-' . $_name . ' ',
|
'enable-path' => '--enable-' . $_name . '=' . ($shared ? 'shared,' : '') . $escapedPath . ' ',
|
||||||
'with-prefix' => '--with-' . $_name . '="' . BUILD_ROOT_PATH . '" ',
|
'with' => '--with-' . $_name . ($shared ? '=shared' : '') . ' ',
|
||||||
|
'with-path' => '--with-' . $_name . '=' . ($shared ? 'shared,' : '') . $escapedPath . ' ',
|
||||||
'none', 'custom' => '',
|
'none', 'custom' => '',
|
||||||
default => throw new WrongUsageException("argType does not accept {$arg_type}, use [enable/with/with-prefix] ."),
|
default => throw new WrongUsageException("argType does not accept {$arg_type}, use [enable/with/with-path] ."),
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -86,10 +101,6 @@ class Extension
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* 检查下依赖就行了,作用是导入依赖给 Extension 对象,今后可以对库依赖进行选择性处理
|
* 检查下依赖就行了,作用是导入依赖给 Extension 对象,今后可以对库依赖进行选择性处理
|
||||||
*
|
|
||||||
* @throws RuntimeException
|
|
||||||
* @throws FileSystemException
|
|
||||||
* @throws WrongUsageException
|
|
||||||
*/
|
*/
|
||||||
public function checkDependency(): static
|
public function checkDependency(): static
|
||||||
{
|
{
|
||||||
@@ -126,15 +137,15 @@ class Extension
|
|||||||
return $this->name;
|
return $this->name;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getWindowsConfigureArg(): string
|
public function getWindowsConfigureArg(bool $shared = false): string
|
||||||
{
|
{
|
||||||
return '';
|
return $this->getEnableArg();
|
||||||
// Windows is not supported yet
|
// Windows is not supported yet
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getUnixConfigureArg(): string
|
public function getUnixConfigureArg(bool $shared = false): string
|
||||||
{
|
{
|
||||||
return '';
|
return $this->getEnableArg($shared);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -157,6 +168,14 @@ class Extension
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Patch code before ./configure.bat for Windows
|
||||||
|
*/
|
||||||
|
public function patchBeforeWindowsConfigure(): bool
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Patch code before make
|
* Patch code before make
|
||||||
* If you need to patch some code, overwrite this
|
* If you need to patch some code, overwrite this
|
||||||
@@ -164,20 +183,135 @@ class Extension
|
|||||||
*/
|
*/
|
||||||
public function patchBeforeMake(): bool
|
public function patchBeforeMake(): bool
|
||||||
{
|
{
|
||||||
|
if (SPCTarget::getTargetOS() === 'Linux' && $this->isBuildShared() && ($objs = getenv('SPC_EXTRA_RUNTIME_OBJECTS'))) {
|
||||||
|
FileSystem::replaceFileRegex(
|
||||||
|
SOURCE_PATH . '/php-src/Makefile',
|
||||||
|
"/^(shared_objects_{$this->getName()}\\s*=.*)$/m",
|
||||||
|
"$1 {$objs}",
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @throws RuntimeException
|
* Patch code before shared extension phpize
|
||||||
|
* If you need to patch some code, overwrite this
|
||||||
|
* return true if you patched something, false if not
|
||||||
*/
|
*/
|
||||||
|
public function patchBeforeSharedPhpize(): bool
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Patch code before shared extension ./configure
|
||||||
|
* If you need to patch some code, overwrite this
|
||||||
|
* return true if you patched something, false if not
|
||||||
|
*/
|
||||||
|
public function patchBeforeSharedConfigure(): bool
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Patch code before shared extension make
|
||||||
|
* If you need to patch some code, overwrite this
|
||||||
|
* return true if you patched something, false if not
|
||||||
|
*/
|
||||||
|
public function patchBeforeSharedMake(): bool
|
||||||
|
{
|
||||||
|
$config = (new SPCConfigUtil($this->builder))->getExtensionConfig($this);
|
||||||
|
[$staticLibs, $sharedLibs] = $this->splitLibsIntoStaticAndShared($config['libs']);
|
||||||
|
$lstdcpp = str_contains($sharedLibs, '-l:libstdc++.a') ? '-l:libstdc++.a' : null;
|
||||||
|
$lstdcpp ??= str_contains($sharedLibs, '-lstdc++') ? '-lstdc++' : '';
|
||||||
|
|
||||||
|
$makefileContent = file_get_contents($this->source_dir . '/Makefile');
|
||||||
|
if (preg_match('/^(.*_SHARED_LIBADD\s*=\s*)(.*)$/m', $makefileContent, $matches)) {
|
||||||
|
$prefix = $matches[1];
|
||||||
|
$currentLibs = trim($matches[2]);
|
||||||
|
$newLibs = trim("{$currentLibs} {$staticLibs} {$lstdcpp}");
|
||||||
|
$deduplicatedLibs = deduplicate_flags($newLibs);
|
||||||
|
|
||||||
|
FileSystem::replaceFileRegex(
|
||||||
|
$this->source_dir . '/Makefile',
|
||||||
|
'/^(.*_SHARED_LIBADD\s*=.*)$/m',
|
||||||
|
$prefix . $deduplicatedLibs
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($objs = getenv('SPC_EXTRA_RUNTIME_OBJECTS')) {
|
||||||
|
FileSystem::replaceFileRegex(
|
||||||
|
$this->source_dir . '/Makefile',
|
||||||
|
"/^(shared_objects_{$this->getName()}\\s*=.*)$/m",
|
||||||
|
"$1 {$objs}",
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return string
|
||||||
|
* returns a command line string with all required shared extensions to load
|
||||||
|
* i.e.; pdo_pgsql would return:
|
||||||
|
*
|
||||||
|
* `-d "extension=pgsql" -d "extension=pdo_pgsql"`
|
||||||
|
*/
|
||||||
|
public function getSharedExtensionLoadString(): string
|
||||||
|
{
|
||||||
|
$loaded = [];
|
||||||
|
$order = [];
|
||||||
|
|
||||||
|
$resolve = function ($extension) use (&$resolve, &$loaded, &$order) {
|
||||||
|
if (!$extension instanceof Extension) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (isset($loaded[$extension->getName()])) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
$loaded[$extension->getName()] = true;
|
||||||
|
|
||||||
|
foreach ($extension->dependencies as $dependency) {
|
||||||
|
$resolve($dependency);
|
||||||
|
}
|
||||||
|
|
||||||
|
$order[] = $extension;
|
||||||
|
};
|
||||||
|
|
||||||
|
$resolve($this);
|
||||||
|
|
||||||
|
$ret = '';
|
||||||
|
foreach ($order as $ext) {
|
||||||
|
if ($ext instanceof self && $ext->isBuildShared()) {
|
||||||
|
if (Config::getExt($ext->getName(), 'type', false) === 'addon') {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (Config::getExt($ext->getName(), 'zend-extension', false) === true) {
|
||||||
|
$ret .= " -d \"zend_extension={$ext->getName()}\"";
|
||||||
|
} else {
|
||||||
|
$ret .= " -d \"extension={$ext->getName()}\"";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($ret !== '') {
|
||||||
|
$ret = ' -d "extension_dir=' . BUILD_MODULES_PATH . '"' . $ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $ret;
|
||||||
|
}
|
||||||
|
|
||||||
public function runCliCheckUnix(): void
|
public function runCliCheckUnix(): void
|
||||||
{
|
{
|
||||||
// Run compile check if build target is cli
|
// Run compile check if build target is cli
|
||||||
// If you need to run some check, overwrite this or add your assert in src/globals/ext-tests/{extension_name}.php
|
// If you need to run some check, overwrite this or add your assert in src/globals/ext-tests/{extension_name}.php
|
||||||
// If check failed, throw RuntimeException
|
$sharedExtensions = $this->getSharedExtensionLoadString();
|
||||||
[$ret] = shell()->execWithResult(BUILD_ROOT_PATH . '/bin/php -n --ri "' . $this->getDistName() . '"', false);
|
[$ret] = shell()->execWithResult(BUILD_BIN_PATH . '/php -n' . $sharedExtensions . ' --ri "' . $this->getDistName() . '"');
|
||||||
if ($ret !== 0) {
|
if ($ret !== 0) {
|
||||||
throw new RuntimeException('extension ' . $this->getName() . ' failed compile check: php-cli returned ' . $ret);
|
throw new ValidationException(
|
||||||
|
"extension {$this->getName()} failed compile check: php-cli returned {$ret}",
|
||||||
|
validation_module: 'Extension ' . $this->getName() . ' sanity check'
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (file_exists(ROOT_DIR . '/src/globals/ext-tests/' . $this->getName() . '.php')) {
|
if (file_exists(ROOT_DIR . '/src/globals/ext-tests/' . $this->getName() . '.php')) {
|
||||||
@@ -188,27 +322,23 @@ class Extension
|
|||||||
file_get_contents(ROOT_DIR . '/src/globals/ext-tests/' . $this->getName() . '.php')
|
file_get_contents(ROOT_DIR . '/src/globals/ext-tests/' . $this->getName() . '.php')
|
||||||
);
|
);
|
||||||
|
|
||||||
[$ret, $out] = shell()->execWithResult(BUILD_ROOT_PATH . '/bin/php -n -r "' . trim($test) . '"');
|
[$ret, $out] = shell()->execWithResult(BUILD_BIN_PATH . '/php -n' . $sharedExtensions . ' -r "' . trim($test) . '"');
|
||||||
if ($ret !== 0) {
|
if ($ret !== 0) {
|
||||||
if ($this->builder->getOption('debug')) {
|
throw new ValidationException(
|
||||||
var_dump($out);
|
"extension {$this->getName()} failed sanity check. Code: {$ret}, output: " . implode("\n", $out),
|
||||||
}
|
validation_module: 'Extension ' . $this->getName() . ' function check'
|
||||||
throw new RuntimeException('extension ' . $this->getName() . ' failed sanity check');
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @throws RuntimeException
|
|
||||||
*/
|
|
||||||
public function runCliCheckWindows(): void
|
public function runCliCheckWindows(): void
|
||||||
{
|
{
|
||||||
// Run compile check if build target is cli
|
// Run compile check if build target is cli
|
||||||
// If you need to run some check, overwrite this or add your assert in src/globals/ext-tests/{extension_name}.php
|
// If you need to run some check, overwrite this or add your assert in src/globals/ext-tests/{extension_name}.php
|
||||||
// If check failed, throw RuntimeException
|
[$ret] = cmd()->execWithResult(BUILD_BIN_PATH . '/php.exe -n --ri "' . $this->getDistName() . '"', false);
|
||||||
[$ret] = cmd()->execWithResult(BUILD_ROOT_PATH . '/bin/php.exe -n --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 ValidationException("extension {$this->getName()} failed compile check: php-cli returned {$ret}", validation_module: "Extension {$this->getName()} sanity check");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (file_exists(FileSystem::convertPath(ROOT_DIR . '/src/globals/ext-tests/' . $this->getName() . '.php'))) {
|
if (file_exists(FileSystem::convertPath(ROOT_DIR . '/src/globals/ext-tests/' . $this->getName() . '.php'))) {
|
||||||
@@ -221,7 +351,10 @@ class Extension
|
|||||||
|
|
||||||
[$ret] = cmd()->execWithResult(BUILD_ROOT_PATH . '/bin/php.exe -n -r "' . trim($test) . '"');
|
[$ret] = cmd()->execWithResult(BUILD_ROOT_PATH . '/bin/php.exe -n -r "' . trim($test) . '"');
|
||||||
if ($ret !== 0) {
|
if ($ret !== 0) {
|
||||||
throw new RuntimeException('extension ' . $this->getName() . ' failed sanity check');
|
throw new ValidationException(
|
||||||
|
"extension {$this->getName()} failed function check",
|
||||||
|
validation_module: "Extension {$this->getName()} function check"
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -231,6 +364,109 @@ class Extension
|
|||||||
// do nothing, just throw wrong usage exception if not valid
|
// do nothing, just throw wrong usage exception if not valid
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Build shared extension
|
||||||
|
*/
|
||||||
|
public function buildShared(array $visited = []): void
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
if (Config::getExt($this->getName(), 'type') === 'builtin' || Config::getExt($this->getName(), 'build-with-php') === true) {
|
||||||
|
if (file_exists(BUILD_MODULES_PATH . '/' . $this->getName() . '.so')) {
|
||||||
|
logger()->info('Shared extension [' . $this->getName() . '] was already built by php-src/configure (' . $this->getName() . '.so)');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (Config::getExt($this->getName(), 'build-with-php') === true) {
|
||||||
|
logger()->warning('Shared extension [' . $this->getName() . '] did not build with php-src/configure (' . $this->getName() . '.so)');
|
||||||
|
logger()->warning('Try deleting your build and source folders and running `spc build`` again.');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (file_exists(BUILD_MODULES_PATH . '/' . $this->getName() . '.so')) {
|
||||||
|
logger()->info('Shared extension [' . $this->getName() . '] was already built, skipping (' . $this->getName() . '.so)');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if ((string) Config::getExt($this->getName(), 'type') === 'addon') {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
logger()->info('Building extension [' . $this->getName() . '] as shared extension (' . $this->getName() . '.so)');
|
||||||
|
foreach ($this->dependencies as $dependency) {
|
||||||
|
if (!$dependency instanceof Extension) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (!$dependency->isBuildStatic() && !in_array($dependency->getName(), $visited)) {
|
||||||
|
logger()->info('extension ' . $this->getName() . ' requires extension ' . $dependency->getName());
|
||||||
|
$dependency->buildShared([...$visited, $this->getName()]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$this->builder->emitPatchPoint('before-shared-ext[' . $this->getName() . ']-build');
|
||||||
|
match (PHP_OS_FAMILY) {
|
||||||
|
'Darwin', 'Linux' => $this->buildUnixShared(),
|
||||||
|
default => throw new WrongUsageException(PHP_OS_FAMILY . ' build shared extensions is not supported yet'),
|
||||||
|
};
|
||||||
|
$this->builder->emitPatchPoint('after-shared-ext[' . $this->getName() . ']-build');
|
||||||
|
} catch (SPCException $e) {
|
||||||
|
$e->bindExtensionInfo(['extension_name' => $this->getName()]);
|
||||||
|
throw $e;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Build shared extension for Unix
|
||||||
|
*/
|
||||||
|
public function buildUnixShared(): void
|
||||||
|
{
|
||||||
|
$env = $this->getSharedExtensionEnv();
|
||||||
|
if ($this->patchBeforeSharedPhpize()) {
|
||||||
|
logger()->info("Extension [{$this->getName()}] patched before shared phpize");
|
||||||
|
}
|
||||||
|
|
||||||
|
// prepare configure args
|
||||||
|
shell()->cd($this->source_dir)
|
||||||
|
->setEnv($env)
|
||||||
|
->appendEnv($this->getExtraEnv())
|
||||||
|
->exec(BUILD_BIN_PATH . '/phpize');
|
||||||
|
|
||||||
|
if ($this->patchBeforeSharedConfigure()) {
|
||||||
|
logger()->info("Extension [{$this->getName()}] patched before shared configure");
|
||||||
|
}
|
||||||
|
|
||||||
|
$phpvars = getenv('SPC_EXTRA_PHP_VARS') ?: '';
|
||||||
|
|
||||||
|
shell()->cd($this->source_dir)
|
||||||
|
->setEnv($env)
|
||||||
|
->appendEnv($this->getExtraEnv())
|
||||||
|
->exec(
|
||||||
|
'./configure ' . $this->getUnixConfigureArg(true) .
|
||||||
|
' --with-php-config=' . BUILD_BIN_PATH . '/php-config ' .
|
||||||
|
"--enable-shared --disable-static {$phpvars}"
|
||||||
|
);
|
||||||
|
|
||||||
|
if ($this->patchBeforeSharedMake()) {
|
||||||
|
logger()->info("Extension [{$this->getName()}] patched before shared make");
|
||||||
|
}
|
||||||
|
|
||||||
|
shell()->cd($this->source_dir)
|
||||||
|
->setEnv($env)
|
||||||
|
->appendEnv($this->getExtraEnv())
|
||||||
|
->exec('make clean')
|
||||||
|
->exec('make -j' . $this->builder->concurrency)
|
||||||
|
->exec('make install');
|
||||||
|
|
||||||
|
// process *.so file
|
||||||
|
$soFile = BUILD_MODULES_PATH . '/' . $this->getName() . '.so';
|
||||||
|
$soDest = $soFile;
|
||||||
|
preg_match('/-release\s+(\S*)/', getenv('SPC_CMD_VAR_PHP_MAKE_EXTRA_LDFLAGS'), $matches);
|
||||||
|
if (!empty($matches[1])) {
|
||||||
|
$soDest = str_replace('.so', '-' . $matches[1] . '.so', $soFile);
|
||||||
|
}
|
||||||
|
if (!file_exists($soFile)) {
|
||||||
|
throw new ValidationException("extension {$this->getName()} build failed: {$soFile} not found", validation_module: "Extension {$this->getName()} build");
|
||||||
|
}
|
||||||
|
/** @var UnixBuilderBase $builder */
|
||||||
|
$builder = $this->builder;
|
||||||
|
$builder->deployBinary($soFile, $soDest, false);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get current extension version
|
* Get current extension version
|
||||||
*
|
*
|
||||||
@@ -241,39 +477,38 @@ class Extension
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
public function setBuildStatic(): void
|
||||||
* @throws RuntimeException
|
|
||||||
*/
|
|
||||||
protected function addLibraryDependency(string $name, bool $optional = false): void
|
|
||||||
{
|
{
|
||||||
$depLib = $this->builder->getLib($name);
|
if (!in_array('static', Config::getExtTarget($this->name))) {
|
||||||
if (!$depLib) {
|
throw new WrongUsageException("Extension [{$this->name}] does not support static build!");
|
||||||
if (!$optional) {
|
|
||||||
throw new RuntimeException("extension {$this->name} requires library {$name}");
|
|
||||||
}
|
|
||||||
logger()->info("enabling {$this->name} without library {$name}");
|
|
||||||
} else {
|
|
||||||
$this->dependencies[] = $depLib;
|
|
||||||
}
|
}
|
||||||
|
$this->build_static = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setBuildShared(): void
|
||||||
|
{
|
||||||
|
if (!in_array('shared', Config::getExtTarget($this->name))) {
|
||||||
|
throw new WrongUsageException("Extension [{$this->name}] does not support shared build!");
|
||||||
|
}
|
||||||
|
$this->build_shared = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function isBuildShared(): bool
|
||||||
|
{
|
||||||
|
return $this->build_shared;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function isBuildStatic(): bool
|
||||||
|
{
|
||||||
|
return $this->build_static;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @throws RuntimeException
|
* Get the library dependencies that current extension depends on.
|
||||||
|
*
|
||||||
|
* @param bool $recursive Whether it includes dependencies recursively
|
||||||
*/
|
*/
|
||||||
protected function addExtensionDependency(string $name, bool $optional = false): void
|
public function getLibraryDependencies(bool $recursive = false): array
|
||||||
{
|
|
||||||
$depExt = $this->builder->getExt($name);
|
|
||||||
if (!$depExt) {
|
|
||||||
if (!$optional) {
|
|
||||||
throw new RuntimeException("{$this->name} requires extension {$name}");
|
|
||||||
}
|
|
||||||
logger()->info("enabling {$this->name} without extension {$name}");
|
|
||||||
} else {
|
|
||||||
$this->dependencies[] = $depExt;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private function getLibraryDependencies(bool $recursive = false): array
|
|
||||||
{
|
{
|
||||||
$ret = array_filter($this->dependencies, fn ($x) => $x instanceof LibraryBase);
|
$ret = array_filter($this->dependencies, fn ($x) => $x instanceof LibraryBase);
|
||||||
if (!$recursive) {
|
if (!$recursive) {
|
||||||
@@ -287,12 +522,12 @@ class Extension
|
|||||||
$added = 0;
|
$added = 0;
|
||||||
foreach ($ret as $depName => $dep) {
|
foreach ($ret as $depName => $dep) {
|
||||||
foreach ($dep->getDependencies(true) as $depdepName => $depdep) {
|
foreach ($dep->getDependencies(true) as $depdepName => $depdep) {
|
||||||
if (!in_array($depdepName, array_keys($deps), true)) {
|
if (!array_key_exists($depdepName, $deps)) {
|
||||||
$deps[$depdepName] = $depdep;
|
$deps[$depdepName] = $depdep;
|
||||||
++$added;
|
++$added;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!in_array($depName, array_keys($deps), true)) {
|
if (!array_key_exists($depName, $deps)) {
|
||||||
$deps[$depName] = $dep;
|
$deps[$depName] = $dep;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -300,4 +535,82 @@ class Extension
|
|||||||
|
|
||||||
return $deps;
|
return $deps;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the environment variables a shared extension needs to be built.
|
||||||
|
* CFLAGS, CXXFLAGS, LDFLAGS and so on.
|
||||||
|
*/
|
||||||
|
protected function getSharedExtensionEnv(): array
|
||||||
|
{
|
||||||
|
$config = (new SPCConfigUtil($this->builder, ['no_php' => true]))->getExtensionConfig($this);
|
||||||
|
[$staticLibs, $sharedLibs] = $this->splitLibsIntoStaticAndShared($config['libs']);
|
||||||
|
$preStatic = PHP_OS_FAMILY === 'Darwin' ? '' : '-Wl,--start-group ';
|
||||||
|
$postStatic = PHP_OS_FAMILY === 'Darwin' ? '' : ' -Wl,--end-group ';
|
||||||
|
return [
|
||||||
|
'CFLAGS' => $config['cflags'],
|
||||||
|
'CXXFLAGS' => $config['cflags'],
|
||||||
|
'LDFLAGS' => $config['ldflags'],
|
||||||
|
'EXTRA_LDFLAGS' => getenv('SPC_CMD_VAR_PHP_MAKE_EXTRA_LDFLAGS'),
|
||||||
|
'LIBS' => clean_spaces("{$preStatic} {$staticLibs} {$postStatic} {$sharedLibs}"),
|
||||||
|
'LD_LIBRARY_PATH' => BUILD_LIB_PATH,
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function addLibraryDependency(string $name, bool $optional = false): void
|
||||||
|
{
|
||||||
|
$depLib = $this->builder->getLib($name);
|
||||||
|
if (!$depLib) {
|
||||||
|
if (!$optional) {
|
||||||
|
throw new WrongUsageException("extension {$this->name} requires library {$name}");
|
||||||
|
}
|
||||||
|
logger()->info("enabling {$this->name} without library {$name}");
|
||||||
|
} else {
|
||||||
|
$this->dependencies[$name] = $depLib;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function addExtensionDependency(string $name, bool $optional = false): void
|
||||||
|
{
|
||||||
|
$depExt = $this->builder->getExt($name);
|
||||||
|
if (!$depExt) {
|
||||||
|
if (!$optional) {
|
||||||
|
throw new WrongUsageException("{$this->name} requires extension {$name} which is not included");
|
||||||
|
}
|
||||||
|
logger()->info("enabling {$this->name} without extension {$name}");
|
||||||
|
} else {
|
||||||
|
$this->dependencies[$name] = $depExt;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function getExtraEnv(): array
|
||||||
|
{
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Splits a given string of library flags into static and shared libraries.
|
||||||
|
*
|
||||||
|
* @param string $allLibs A space-separated string of library flags (e.g., -lxyz).
|
||||||
|
* @return array an array containing two elements: the first is a space-separated string
|
||||||
|
* of static library flags, and the second is a space-separated string
|
||||||
|
* of shared library flags
|
||||||
|
*/
|
||||||
|
protected function splitLibsIntoStaticAndShared(string $allLibs): array
|
||||||
|
{
|
||||||
|
$staticLibString = '';
|
||||||
|
$sharedLibString = '';
|
||||||
|
$libs = explode(' ', $allLibs);
|
||||||
|
foreach ($libs as $lib) {
|
||||||
|
$staticLib = BUILD_LIB_PATH . '/lib' . str_replace('-l', '', $lib) . '.a';
|
||||||
|
if (str_starts_with($lib, BUILD_LIB_PATH . '/lib') && str_ends_with($lib, '.a')) {
|
||||||
|
$staticLib = $lib;
|
||||||
|
}
|
||||||
|
if ($lib === '-lphp' || !file_exists($staticLib)) {
|
||||||
|
$sharedLibString .= " {$lib}";
|
||||||
|
} else {
|
||||||
|
$staticLibString .= " {$lib}";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return [trim($staticLibString), trim($sharedLibString)];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,15 +4,20 @@ declare(strict_types=1);
|
|||||||
|
|
||||||
namespace SPC\builder;
|
namespace SPC\builder;
|
||||||
|
|
||||||
use SPC\exception\FileSystemException;
|
use SPC\exception\SPCException;
|
||||||
use SPC\exception\RuntimeException;
|
use SPC\exception\SPCInternalException;
|
||||||
use SPC\exception\WrongUsageException;
|
use SPC\exception\WrongUsageException;
|
||||||
use SPC\store\Config;
|
use SPC\store\Config;
|
||||||
|
use SPC\store\Downloader;
|
||||||
use SPC\store\FileSystem;
|
use SPC\store\FileSystem;
|
||||||
|
use SPC\store\LockFile;
|
||||||
use SPC\store\SourceManager;
|
use SPC\store\SourceManager;
|
||||||
|
use SPC\util\GlobalValueTrait;
|
||||||
|
|
||||||
abstract class LibraryBase
|
abstract class LibraryBase
|
||||||
{
|
{
|
||||||
|
use GlobalValueTrait;
|
||||||
|
|
||||||
/** @var string */
|
/** @var string */
|
||||||
public const NAME = 'unknown';
|
public const NAME = 'unknown';
|
||||||
|
|
||||||
@@ -22,31 +27,25 @@ abstract class LibraryBase
|
|||||||
|
|
||||||
protected bool $patched = false;
|
protected bool $patched = false;
|
||||||
|
|
||||||
/**
|
|
||||||
* @throws RuntimeException
|
|
||||||
*/
|
|
||||||
public function __construct(?string $source_dir = null)
|
public function __construct(?string $source_dir = null)
|
||||||
{
|
{
|
||||||
if (static::NAME === 'unknown') {
|
if (static::NAME === 'unknown') {
|
||||||
throw new RuntimeException('no unknown!!!!!');
|
throw new SPCInternalException('Please set the NAME constant in ' . static::class);
|
||||||
}
|
}
|
||||||
$this->source_dir = $source_dir ?? (SOURCE_PATH . '/' . static::NAME);
|
$this->source_dir = $source_dir ?? (SOURCE_PATH . DIRECTORY_SEPARATOR . Config::getLib(static::NAME, 'source'));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Try to install or build this library.
|
* Try to install or build this library.
|
||||||
* @param bool $force If true, force install or build
|
* @param bool $force If true, force install or build
|
||||||
* @throws FileSystemException
|
|
||||||
* @throws RuntimeException
|
|
||||||
* @throws WrongUsageException
|
|
||||||
*/
|
*/
|
||||||
public function setup(bool $force = false): int
|
public function setup(bool $force = false): int
|
||||||
{
|
{
|
||||||
$lock = json_decode(FileSystem::readFile(DOWNLOAD_PATH . '/.lock.json'), true) ?? [];
|
|
||||||
$source = Config::getLib(static::NAME, 'source');
|
$source = Config::getLib(static::NAME, 'source');
|
||||||
// if source is locked as pre-built, we just tryInstall it
|
// if source is locked as pre-built, we just tryInstall it
|
||||||
if (isset($lock[$source]) && ($lock[$source]['lock_as'] ?? SPC_LOCK_SOURCE) === SPC_LOCK_PRE_BUILT) {
|
$pre_built_name = Downloader::getPreBuiltLockName($source);
|
||||||
return $this->tryInstall($lock[$source]['filename'], $force);
|
if (($lock = LockFile::get($pre_built_name)) && $lock['lock_as'] === SPC_DOWNLOAD_PRE_BUILT) {
|
||||||
|
return $this->tryInstall($lock, $force);
|
||||||
}
|
}
|
||||||
return $this->tryBuild($force);
|
return $this->tryBuild($force);
|
||||||
}
|
}
|
||||||
@@ -102,10 +101,6 @@ abstract class LibraryBase
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Calculate dependencies for current library.
|
* Calculate dependencies for current library.
|
||||||
*
|
|
||||||
* @throws RuntimeException
|
|
||||||
* @throws FileSystemException
|
|
||||||
* @throws WrongUsageException
|
|
||||||
*/
|
*/
|
||||||
public function calcDependency(): void
|
public function calcDependency(): void
|
||||||
{
|
{
|
||||||
@@ -126,9 +121,6 @@ abstract class LibraryBase
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Get config static libs.
|
* Get config static libs.
|
||||||
*
|
|
||||||
* @throws FileSystemException
|
|
||||||
* @throws WrongUsageException
|
|
||||||
*/
|
*/
|
||||||
public function getStaticLibs(): array
|
public function getStaticLibs(): array
|
||||||
{
|
{
|
||||||
@@ -137,9 +129,6 @@ abstract class LibraryBase
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Get config headers.
|
* Get config headers.
|
||||||
*
|
|
||||||
* @throws FileSystemException
|
|
||||||
* @throws WrongUsageException
|
|
||||||
*/
|
*/
|
||||||
public function getHeaders(): array
|
public function getHeaders(): array
|
||||||
{
|
{
|
||||||
@@ -148,50 +137,30 @@ abstract class LibraryBase
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Get binary files.
|
* Get binary files.
|
||||||
*
|
|
||||||
* @throws FileSystemException
|
|
||||||
* @throws WrongUsageException
|
|
||||||
*/
|
*/
|
||||||
public function getBinaryFiles(): array
|
public function getBinaryFiles(): array
|
||||||
{
|
{
|
||||||
return Config::getLib(static::NAME, 'bin', []);
|
return Config::getLib(static::NAME, 'bin', []);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
public function tryInstall(array $lock, bool $force_install = false): int
|
||||||
* @throws WrongUsageException
|
|
||||||
* @throws FileSystemException
|
|
||||||
*/
|
|
||||||
public function tryInstall(string $install_file, bool $force_install = false): int
|
|
||||||
{
|
{
|
||||||
|
$install_file = $lock['filename'];
|
||||||
if ($force_install) {
|
if ($force_install) {
|
||||||
logger()->info('Installing required library [' . static::NAME . '] from pre-built binaries');
|
logger()->info('Installing required library [' . static::NAME . '] from pre-built binaries');
|
||||||
|
|
||||||
// Extract files
|
// Extract files
|
||||||
try {
|
try {
|
||||||
FileSystem::extractPackage($install_file, DOWNLOAD_PATH . '/' . $install_file, BUILD_ROOT_PATH);
|
FileSystem::extractPackage($install_file, $lock['source_type'], DOWNLOAD_PATH . '/' . $install_file, BUILD_ROOT_PATH);
|
||||||
$this->install();
|
$this->install();
|
||||||
return LIB_STATUS_OK;
|
return LIB_STATUS_OK;
|
||||||
} catch (FileSystemException|RuntimeException $e) {
|
} catch (SPCException $e) {
|
||||||
logger()->error('Failed to extract pre-built library [' . static::NAME . ']: ' . $e->getMessage());
|
logger()->error('Failed to extract pre-built library [' . static::NAME . ']: ' . $e->getMessage());
|
||||||
return LIB_STATUS_INSTALL_FAILED;
|
return LIB_STATUS_INSTALL_FAILED;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
foreach ($this->getStaticLibs() as $name) {
|
if (!$this->isLibraryInstalled()) {
|
||||||
if (!file_exists(BUILD_LIB_PATH . "/{$name}")) {
|
return $this->tryInstall($lock, true);
|
||||||
$this->tryInstall($install_file, true);
|
|
||||||
return LIB_STATUS_OK;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
foreach ($this->getHeaders() as $name) {
|
|
||||||
if (!file_exists(BUILD_INCLUDE_PATH . "/{$name}")) {
|
|
||||||
$this->tryInstall($install_file, true);
|
|
||||||
return LIB_STATUS_OK;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// pkg-config is treated specially. If it is pkg-config, check if the pkg-config binary exists
|
|
||||||
if (static::NAME === 'pkg-config' && !file_exists(BUILD_ROOT_PATH . '/bin/pkg-config')) {
|
|
||||||
$this->tryInstall($install_file, true);
|
|
||||||
return LIB_STATUS_OK;
|
|
||||||
}
|
}
|
||||||
return LIB_STATUS_ALREADY;
|
return LIB_STATUS_ALREADY;
|
||||||
}
|
}
|
||||||
@@ -202,10 +171,6 @@ abstract class LibraryBase
|
|||||||
* BUILD_STATUS_OK if build success
|
* BUILD_STATUS_OK if build success
|
||||||
* BUILD_STATUS_ALREADY if already built
|
* BUILD_STATUS_ALREADY if already built
|
||||||
* BUILD_STATUS_FAILED if build failed
|
* BUILD_STATUS_FAILED if build failed
|
||||||
*
|
|
||||||
* @throws RuntimeException
|
|
||||||
* @throws FileSystemException
|
|
||||||
* @throws WrongUsageException
|
|
||||||
*/
|
*/
|
||||||
public function tryBuild(bool $force_build = false): int
|
public function tryBuild(bool $force_build = false): int
|
||||||
{
|
{
|
||||||
@@ -219,43 +184,23 @@ abstract class LibraryBase
|
|||||||
|
|
||||||
// extract first if not exists
|
// extract first if not exists
|
||||||
if (!is_dir($this->source_dir)) {
|
if (!is_dir($this->source_dir)) {
|
||||||
$this->getBuilder()->emitPatchPoint('before-library[ ' . static::NAME . ']-extract');
|
$this->getBuilder()->emitPatchPoint('before-library[' . static::NAME . ']-extract');
|
||||||
SourceManager::initSource(libs: [static::NAME]);
|
SourceManager::initSource(libs: [static::NAME], source_only: true);
|
||||||
$this->getBuilder()->emitPatchPoint('after-library[ ' . static::NAME . ']-extract');
|
$this->getBuilder()->emitPatchPoint('after-library[' . static::NAME . ']-extract');
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!$this->patched && $this->patchBeforeBuild()) {
|
if (!$this->patched && $this->patchBeforeBuild()) {
|
||||||
file_put_contents($this->source_dir . '/.spc.patched', 'PATCHED!!!');
|
file_put_contents($this->source_dir . '/.spc.patched', 'PATCHED!!!');
|
||||||
}
|
}
|
||||||
$this->getBuilder()->emitPatchPoint('before-library[ ' . static::NAME . ']-build');
|
$this->getBuilder()->emitPatchPoint('before-library[' . static::NAME . ']-build');
|
||||||
$this->build();
|
$this->build();
|
||||||
$this->installLicense();
|
$this->installLicense();
|
||||||
$this->getBuilder()->emitPatchPoint('after-library[ ' . static::NAME . ']-build');
|
$this->getBuilder()->emitPatchPoint('after-library[' . static::NAME . ']-build');
|
||||||
return LIB_STATUS_OK;
|
return LIB_STATUS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
// check if these libraries exist, if not, invoke compilation and return the result status
|
if (!$this->isLibraryInstalled()) {
|
||||||
foreach ($this->getStaticLibs() as $name) {
|
return $this->tryBuild(true);
|
||||||
if (!file_exists(BUILD_LIB_PATH . "/{$name}")) {
|
|
||||||
$this->tryBuild(true);
|
|
||||||
return LIB_STATUS_OK;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// header files the same
|
|
||||||
foreach ($this->getHeaders() as $name) {
|
|
||||||
if (!file_exists(BUILD_INCLUDE_PATH . "/{$name}")) {
|
|
||||||
$this->tryBuild(true);
|
|
||||||
return LIB_STATUS_OK;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// current library is package and binary file is not exists
|
|
||||||
if (Config::getLib(static::NAME, 'type', 'lib') === 'package') {
|
|
||||||
foreach ($this->getBinaryFiles() as $name) {
|
|
||||||
if (!file_exists(BUILD_BIN_PATH . "/{$name}")) {
|
|
||||||
$this->tryBuild(true);
|
|
||||||
return LIB_STATUS_OK;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
// if all the files exist at this point, skip the compilation process
|
// if all the files exist at this point, skip the compilation process
|
||||||
return LIB_STATUS_ALREADY;
|
return LIB_STATUS_ALREADY;
|
||||||
@@ -316,6 +261,16 @@ abstract class LibraryBase
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Patch code before windows configure.bat
|
||||||
|
* If you need to patch some code, overwrite this
|
||||||
|
* return true if you patched something, false if not
|
||||||
|
*/
|
||||||
|
public function patchBeforeWindowsConfigure(): bool
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Patch code before make
|
* Patch code before make
|
||||||
* If you need to patch some code, overwrite this
|
* If you need to patch some code, overwrite this
|
||||||
@@ -326,22 +281,47 @@ abstract class LibraryBase
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Patch php-config after embed was built
|
||||||
|
* Example: imap requires -lcrypt
|
||||||
|
*/
|
||||||
|
public function patchPhpConfig(): bool
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Build this library.
|
* Build this library.
|
||||||
*
|
|
||||||
* @throws RuntimeException
|
|
||||||
*/
|
*/
|
||||||
abstract protected function build();
|
abstract protected function build();
|
||||||
|
|
||||||
protected function install(): void
|
protected function install(): void
|
||||||
{
|
{
|
||||||
// do something after extracting pre-built files, default do nothing. overwrite this method to do something
|
// replace placeholders if BUILD_ROOT_PATH/.spc-extract-placeholder.json exists
|
||||||
|
$replace_item_file = BUILD_ROOT_PATH . '/.spc-extract-placeholder.json';
|
||||||
|
if (!file_exists($replace_item_file)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
$replace_items = json_decode(file_get_contents($replace_item_file), true);
|
||||||
|
if (!is_array($replace_items)) {
|
||||||
|
throw new SPCInternalException("Invalid placeholder file: {$replace_item_file}");
|
||||||
|
}
|
||||||
|
$placeholders = get_pack_replace();
|
||||||
|
// replace placeholders in BUILD_ROOT_PATH
|
||||||
|
foreach ($replace_items as $item) {
|
||||||
|
$filepath = BUILD_ROOT_PATH . "/{$item}";
|
||||||
|
FileSystem::replaceFileStr(
|
||||||
|
$filepath,
|
||||||
|
array_values($placeholders),
|
||||||
|
array_keys($placeholders),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
// remove placeholder file
|
||||||
|
unlink($replace_item_file);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Add lib dependency
|
* Add lib dependency
|
||||||
*
|
|
||||||
* @throws RuntimeException
|
|
||||||
*/
|
*/
|
||||||
protected function addLibraryDependency(string $name, bool $optional = false): void
|
protected function addLibraryDependency(string $name, bool $optional = false): void
|
||||||
{
|
{
|
||||||
@@ -351,7 +331,7 @@ abstract class LibraryBase
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (!$optional) {
|
if (!$optional) {
|
||||||
throw new RuntimeException(static::NAME . " requires library {$name}");
|
throw new WrongUsageException(static::NAME . " requires library {$name} but it is not included");
|
||||||
}
|
}
|
||||||
logger()->debug('enabling ' . static::NAME . " without {$name}");
|
logger()->debug('enabling ' . static::NAME . " without {$name}");
|
||||||
}
|
}
|
||||||
@@ -366,20 +346,54 @@ abstract class LibraryBase
|
|||||||
*/
|
*/
|
||||||
protected function installLicense(): void
|
protected function installLicense(): void
|
||||||
{
|
{
|
||||||
FileSystem::createDir(BUILD_ROOT_PATH . '/source-licenses/' . $this->getName());
|
|
||||||
$source = Config::getLib($this->getName(), 'source');
|
$source = Config::getLib($this->getName(), 'source');
|
||||||
|
FileSystem::createDir(BUILD_ROOT_PATH . "/source-licenses/{$source}");
|
||||||
$license_files = Config::getSource($source)['license'] ?? [];
|
$license_files = Config::getSource($source)['license'] ?? [];
|
||||||
if (is_assoc_array($license_files)) {
|
if (is_assoc_array($license_files)) {
|
||||||
$license_files = [$license_files];
|
$license_files = [$license_files];
|
||||||
}
|
}
|
||||||
foreach ($license_files as $index => $license) {
|
foreach ($license_files as $index => $license) {
|
||||||
if ($license['type'] === 'text') {
|
if ($license['type'] === 'text') {
|
||||||
FileSystem::writeFile(BUILD_ROOT_PATH . '/source-licenses/' . $this->getName() . "/{$index}.txt", $license['text']);
|
FileSystem::writeFile(BUILD_ROOT_PATH . "/source-licenses/{$source}/{$index}.txt", $license['text']);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if ($license['type'] === 'file') {
|
if ($license['type'] === 'file') {
|
||||||
copy($this->source_dir . '/' . $license['path'], BUILD_ROOT_PATH . '/source-licenses/' . $this->getName() . "/{$index}.txt");
|
copy($this->source_dir . '/' . $license['path'], BUILD_ROOT_PATH . "/source-licenses/{$source}/{$index}.txt");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected function isLibraryInstalled(): bool
|
||||||
|
{
|
||||||
|
foreach (Config::getLib(static::NAME, 'static-libs', []) as $name) {
|
||||||
|
if (!file_exists(BUILD_LIB_PATH . "/{$name}")) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
foreach (Config::getLib(static::NAME, 'headers', []) as $name) {
|
||||||
|
if (!file_exists(BUILD_INCLUDE_PATH . "/{$name}")) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$pkg_config_path = getenv('PKG_CONFIG_PATH') ?: '';
|
||||||
|
$search_paths = array_filter(explode(is_unix() ? ':' : ';', $pkg_config_path));
|
||||||
|
foreach (Config::getLib(static::NAME, 'pkg-configs', []) as $name) {
|
||||||
|
$found = false;
|
||||||
|
foreach ($search_paths as $path) {
|
||||||
|
if (file_exists($path . "/{$name}.pc")) {
|
||||||
|
$found = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!$found) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
foreach (Config::getLib(static::NAME, 'bin', []) as $name) {
|
||||||
|
if (!file_exists(BUILD_BIN_PATH . "/{$name}")) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,7 +4,18 @@ declare(strict_types=1);
|
|||||||
|
|
||||||
namespace SPC\builder;
|
namespace SPC\builder;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Interface for library implementations
|
||||||
|
*
|
||||||
|
* This interface defines the basic contract that all library classes must implement.
|
||||||
|
* It provides a common way to identify and work with different library types.
|
||||||
|
*/
|
||||||
interface LibraryInterface
|
interface LibraryInterface
|
||||||
{
|
{
|
||||||
|
/**
|
||||||
|
* Get the name of the library
|
||||||
|
*
|
||||||
|
* @return string The library name
|
||||||
|
*/
|
||||||
public function getName(): string;
|
public function getName(): string;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ class amqp extends Extension
|
|||||||
{
|
{
|
||||||
public function patchBeforeMake(): bool
|
public function patchBeforeMake(): bool
|
||||||
{
|
{
|
||||||
|
$patched = parent::patchBeforeMake();
|
||||||
if (PHP_OS_FAMILY === 'Windows') {
|
if (PHP_OS_FAMILY === 'Windows') {
|
||||||
FileSystem::replaceFileRegex(BUILD_INCLUDE_PATH . '\amqp.h', '/^#warning.*/m', '');
|
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_framing.h', '/^#warning.*/m', '');
|
||||||
@@ -20,15 +21,15 @@ class amqp extends Extension
|
|||||||
FileSystem::replaceFileRegex(BUILD_INCLUDE_PATH . '\amqp_tcp_socket.h', '/^#warning.*/m', '');
|
FileSystem::replaceFileRegex(BUILD_INCLUDE_PATH . '\amqp_tcp_socket.h', '/^#warning.*/m', '');
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return $patched;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getUnixConfigureArg(): string
|
public function getUnixConfigureArg(bool $shared = false): string
|
||||||
{
|
{
|
||||||
return '--with-amqp --with-librabbitmq-dir=' . BUILD_ROOT_PATH;
|
return '--with-amqp' . ($shared ? '=shared' : '') . ' --with-librabbitmq-dir=' . BUILD_ROOT_PATH;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getWindowsConfigureArg(): string
|
public function getWindowsConfigureArg($shared = false): string
|
||||||
{
|
{
|
||||||
return '--with-amqp';
|
return '--with-amqp';
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,18 +6,12 @@ namespace SPC\builder\extension;
|
|||||||
|
|
||||||
use SPC\builder\Extension;
|
use SPC\builder\Extension;
|
||||||
use SPC\builder\macos\MacOSBuilder;
|
use SPC\builder\macos\MacOSBuilder;
|
||||||
use SPC\exception\FileSystemException;
|
|
||||||
use SPC\exception\WrongUsageException;
|
|
||||||
use SPC\store\FileSystem;
|
use SPC\store\FileSystem;
|
||||||
use SPC\util\CustomExt;
|
use SPC\util\CustomExt;
|
||||||
|
|
||||||
#[CustomExt('bz2')]
|
#[CustomExt('bz2')]
|
||||||
class bz2 extends Extension
|
class bz2 extends Extension
|
||||||
{
|
{
|
||||||
/**
|
|
||||||
* @throws FileSystemException
|
|
||||||
* @throws WrongUsageException
|
|
||||||
*/
|
|
||||||
public function patchBeforeConfigure(): bool
|
public function patchBeforeConfigure(): bool
|
||||||
{
|
{
|
||||||
$frameworks = $this->builder instanceof MacOSBuilder ? ' ' . $this->builder->getFrameworks(true) . ' ' : '';
|
$frameworks = $this->builder instanceof MacOSBuilder ? ' ' . $this->builder->getFrameworks(true) . ' ' : '';
|
||||||
|
|||||||
17
src/SPC/builder/extension/com_dotnet.php
Normal file
17
src/SPC/builder/extension/com_dotnet.php
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace SPC\builder\extension;
|
||||||
|
|
||||||
|
use SPC\builder\Extension;
|
||||||
|
use SPC\util\CustomExt;
|
||||||
|
|
||||||
|
#[CustomExt('com_dotnet')]
|
||||||
|
class com_dotnet extends Extension
|
||||||
|
{
|
||||||
|
public function getWindowsConfigureArg(bool $shared = false): string
|
||||||
|
{
|
||||||
|
return '--enable-com-dotnet=yes';
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -5,23 +5,21 @@ declare(strict_types=1);
|
|||||||
namespace SPC\builder\extension;
|
namespace SPC\builder\extension;
|
||||||
|
|
||||||
use SPC\builder\Extension;
|
use SPC\builder\Extension;
|
||||||
|
use SPC\builder\linux\LinuxBuilder;
|
||||||
use SPC\builder\macos\MacOSBuilder;
|
use SPC\builder\macos\MacOSBuilder;
|
||||||
use SPC\exception\FileSystemException;
|
use SPC\builder\windows\WindowsBuilder;
|
||||||
use SPC\exception\WrongUsageException;
|
use SPC\exception\PatchException;
|
||||||
use SPC\store\FileSystem;
|
use SPC\store\FileSystem;
|
||||||
use SPC\util\CustomExt;
|
use SPC\util\CustomExt;
|
||||||
|
|
||||||
#[CustomExt('curl')]
|
#[CustomExt('curl')]
|
||||||
class curl extends Extension
|
class curl extends Extension
|
||||||
{
|
{
|
||||||
/**
|
|
||||||
* @throws FileSystemException
|
|
||||||
*/
|
|
||||||
public function patchBeforeBuildconf(): bool
|
public function patchBeforeBuildconf(): bool
|
||||||
{
|
{
|
||||||
logger()->info('patching before-configure for curl checks');
|
logger()->info('patching before-configure for curl checks');
|
||||||
$file1 = "AC_DEFUN([PHP_CHECK_LIBRARY], [\n $3\n])";
|
$file1 = "AC_DEFUN([PHP_CHECK_LIBRARY], [\n $3\n])";
|
||||||
$files = FileSystem::readFile(SOURCE_PATH . '/php-src/ext/curl/config.m4');
|
$files = FileSystem::readFile($this->source_dir . '/config.m4');
|
||||||
$file2 = 'AC_DEFUN([PHP_CHECK_LIBRARY], [
|
$file2 = 'AC_DEFUN([PHP_CHECK_LIBRARY], [
|
||||||
save_old_LDFLAGS=$LDFLAGS
|
save_old_LDFLAGS=$LDFLAGS
|
||||||
ac_stuff="$5"
|
ac_stuff="$5"
|
||||||
@@ -40,18 +38,92 @@ class curl extends Extension
|
|||||||
$4
|
$4
|
||||||
])dnl
|
])dnl
|
||||||
])';
|
])';
|
||||||
file_put_contents(SOURCE_PATH . '/php-src/ext/curl/config.m4', $file1 . "\n" . $files . "\n" . $file2);
|
file_put_contents($this->source_dir . '/config.m4', $file1 . "\n" . $files . "\n" . $file2);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @throws FileSystemException
|
|
||||||
* @throws WrongUsageException
|
|
||||||
*/
|
|
||||||
public function patchBeforeConfigure(): bool
|
public function patchBeforeConfigure(): bool
|
||||||
{
|
{
|
||||||
$frameworks = $this->builder instanceof MacOSBuilder ? ' ' . $this->builder->getFrameworks(true) . ' ' : '';
|
$frameworks = $this->builder instanceof MacOSBuilder ? ' ' . $this->builder->getFrameworks(true) . ' ' : '';
|
||||||
FileSystem::replaceFileRegex(SOURCE_PATH . '/php-src/configure', '/-lcurl/', $this->getLibFilesString() . $frameworks);
|
FileSystem::replaceFileRegex(SOURCE_PATH . '/php-src/configure', '/-lcurl/', $this->getLibFilesString() . $frameworks);
|
||||||
|
$this->patchBeforeSharedConfigure();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function patchBeforeMake(): bool
|
||||||
|
{
|
||||||
|
$patched = parent::patchBeforeMake();
|
||||||
|
$extra_libs = getenv('SPC_EXTRA_LIBS') ?: '';
|
||||||
|
if ($this->builder instanceof WindowsBuilder && !str_contains($extra_libs, 'secur32.lib')) {
|
||||||
|
$extra_libs .= ' secur32.lib';
|
||||||
|
putenv('SPC_EXTRA_LIBS=' . trim($extra_libs));
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return $patched;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function patchBeforeSharedConfigure(): bool
|
||||||
|
{
|
||||||
|
$file = $this->source_dir . '/config.m4';
|
||||||
|
$content = FileSystem::readFile($file);
|
||||||
|
|
||||||
|
// Inject patch before it
|
||||||
|
$patch = ' save_LIBS="$LIBS"
|
||||||
|
LIBS="$LIBS $CURL_LIBS"
|
||||||
|
';
|
||||||
|
// Check if already patched
|
||||||
|
if (str_contains($content, $patch)) {
|
||||||
|
return false; // Already patched
|
||||||
|
}
|
||||||
|
|
||||||
|
// Match the line containing PHP_CHECK_LIBRARY for curl
|
||||||
|
$pattern = '/(PHP_CHECK_LIBRARY\(\[curl],\s*\[curl_easy_perform],)/';
|
||||||
|
|
||||||
|
// Restore LIBS after the check — append this just after the macro block
|
||||||
|
$restore = '
|
||||||
|
LIBS="$save_LIBS"';
|
||||||
|
|
||||||
|
// Apply patch
|
||||||
|
$patched = preg_replace_callback($pattern, function ($matches) use ($patch) {
|
||||||
|
return $patch . $matches[1];
|
||||||
|
}, $content, 1);
|
||||||
|
|
||||||
|
// Inject restore after the matching PHP_CHECK_LIBRARY block
|
||||||
|
$patched = preg_replace(
|
||||||
|
'/(PHP_CHECK_LIBRARY\(\[curl],\s*\[curl_easy_perform],.*?\)\n)/s',
|
||||||
|
"$1{$restore}\n",
|
||||||
|
$patched,
|
||||||
|
1
|
||||||
|
);
|
||||||
|
|
||||||
|
if ($patched === null) {
|
||||||
|
throw new PatchException('shared extension curl patcher', 'Failed to patch config.m4 due to a regex error');
|
||||||
|
}
|
||||||
|
|
||||||
|
FileSystem::writeFile($file, $patched);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function buildUnixShared(): void
|
||||||
|
{
|
||||||
|
if (!$this->builder instanceof LinuxBuilder) {
|
||||||
|
parent::buildUnixShared();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
FileSystem::replaceFileStr(
|
||||||
|
$this->source_dir . '/config.m4',
|
||||||
|
['$ext_dir/phar.1', '$ext_dir/phar.phar.1'],
|
||||||
|
['${ext_dir}phar.1', '${ext_dir}phar.phar.1']
|
||||||
|
);
|
||||||
|
try {
|
||||||
|
parent::buildUnixShared();
|
||||||
|
} finally {
|
||||||
|
FileSystem::replaceFileStr(
|
||||||
|
$this->source_dir . '/config.m4',
|
||||||
|
['${ext_dir}phar.1', '${ext_dir}phar.phar.1'],
|
||||||
|
['$ext_dir/phar.1', '$ext_dir/phar.phar.1']
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,13 +10,13 @@ use SPC\util\CustomExt;
|
|||||||
#[CustomExt('dba')]
|
#[CustomExt('dba')]
|
||||||
class dba extends Extension
|
class dba extends Extension
|
||||||
{
|
{
|
||||||
public function getUnixConfigureArg(): string
|
public function getUnixConfigureArg(bool $shared = false): string
|
||||||
{
|
{
|
||||||
$qdbm = $this->builder->getLib('qdbm') ? (' --with-qdbm=' . BUILD_ROOT_PATH) : '';
|
$qdbm = $this->builder->getLib('qdbm') ? (' --with-qdbm=' . BUILD_ROOT_PATH) : '';
|
||||||
return '--enable-dba' . $qdbm;
|
return '--enable-dba' . ($shared ? '=shared' : '') . $qdbm;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getWindowsConfigureArg(): string
|
public function getWindowsConfigureArg(bool $shared = false): string
|
||||||
{
|
{
|
||||||
$qdbm = $this->builder->getLib('qdbm') ? ' --with-qdbm' : '';
|
$qdbm = $this->builder->getLib('qdbm') ? ' --with-qdbm' : '';
|
||||||
return '--with-dba' . $qdbm;
|
return '--with-dba' . $qdbm;
|
||||||
|
|||||||
31
src/SPC/builder/extension/dom.php
Normal file
31
src/SPC/builder/extension/dom.php
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace SPC\builder\extension;
|
||||||
|
|
||||||
|
use SPC\builder\Extension;
|
||||||
|
use SPC\store\FileSystem;
|
||||||
|
use SPC\util\CustomExt;
|
||||||
|
|
||||||
|
#[CustomExt('dom')]
|
||||||
|
class dom extends Extension
|
||||||
|
{
|
||||||
|
public function getUnixConfigureArg(bool $shared = false): string
|
||||||
|
{
|
||||||
|
$arg = '--enable-dom' . ($shared ? '=shared' : '');
|
||||||
|
$arg .= ' --with-libxml="' . BUILD_ROOT_PATH . '"';
|
||||||
|
return $arg;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function patchBeforeBuildconf(): bool
|
||||||
|
{
|
||||||
|
FileSystem::replaceFileStr(SOURCE_PATH . '/php-src/win32/build/config.w32', 'dllmain.c ', '');
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getWindowsConfigureArg($shared = false): string
|
||||||
|
{
|
||||||
|
return '--with-dom';
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -10,7 +10,7 @@ use SPC\util\CustomExt;
|
|||||||
#[CustomExt('enchant')]
|
#[CustomExt('enchant')]
|
||||||
class enchant extends Extension
|
class enchant extends Extension
|
||||||
{
|
{
|
||||||
public function getUnixConfigureArg(): string
|
public function getUnixConfigureArg(bool $shared = false): string
|
||||||
{
|
{
|
||||||
$glibs = [
|
$glibs = [
|
||||||
'/Users/jerry/project/git-project/static-php-cli/buildroot/lib/libgio-2.0.a',
|
'/Users/jerry/project/git-project/static-php-cli/buildroot/lib/libgio-2.0.a',
|
||||||
|
|||||||
27
src/SPC/builder/extension/ev.php
Normal file
27
src/SPC/builder/extension/ev.php
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace SPC\builder\extension;
|
||||||
|
|
||||||
|
use SPC\builder\Extension;
|
||||||
|
use SPC\store\FileSystem;
|
||||||
|
use SPC\util\CustomExt;
|
||||||
|
|
||||||
|
#[CustomExt('ev')]
|
||||||
|
class ev extends Extension
|
||||||
|
{
|
||||||
|
public function patchBeforeBuildconf(): bool
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* replace EXTENSION('ev', php_ev_sources, true, ' /DZEND_ENABLE_STATIC_TSRMLS_CACHE=1');
|
||||||
|
* to EXTENSION('ev', php_ev_sources, PHP_EV_SHARED, ' /DZEND_ENABLE_STATIC_TSRMLS_CACHE=1');
|
||||||
|
*/
|
||||||
|
FileSystem::replaceFileLineContainsString(
|
||||||
|
$this->source_dir . '/config.w32',
|
||||||
|
'EXTENSION(\'ev\'',
|
||||||
|
" EXTENSION('ev', php_ev_sources, PHP_EV_SHARED, ' /DZEND_ENABLE_STATIC_TSRMLS_CACHE=1');"
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -6,14 +6,13 @@ namespace SPC\builder\extension;
|
|||||||
|
|
||||||
use SPC\builder\Extension;
|
use SPC\builder\Extension;
|
||||||
use SPC\builder\macos\MacOSBuilder;
|
use SPC\builder\macos\MacOSBuilder;
|
||||||
use SPC\exception\FileSystemException;
|
|
||||||
use SPC\store\FileSystem;
|
use SPC\store\FileSystem;
|
||||||
use SPC\util\CustomExt;
|
use SPC\util\CustomExt;
|
||||||
|
|
||||||
#[CustomExt('event')]
|
#[CustomExt('event')]
|
||||||
class event extends Extension
|
class event extends Extension
|
||||||
{
|
{
|
||||||
public function getUnixConfigureArg(): string
|
public function getUnixConfigureArg(bool $shared = false): string
|
||||||
{
|
{
|
||||||
$arg = '--with-event-core --with-event-extra --with-event-libevent-dir=' . BUILD_ROOT_PATH;
|
$arg = '--with-event-core --with-event-extra --with-event-libevent-dir=' . BUILD_ROOT_PATH;
|
||||||
if ($this->builder->getLib('openssl')) {
|
if ($this->builder->getLib('openssl')) {
|
||||||
@@ -27,24 +26,20 @@ class event extends Extension
|
|||||||
return $arg;
|
return $arg;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @throws FileSystemException
|
|
||||||
*/
|
|
||||||
public function patchBeforeConfigure(): bool
|
public function patchBeforeConfigure(): bool
|
||||||
{
|
{
|
||||||
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
|
public function patchBeforeMake(): bool
|
||||||
{
|
{
|
||||||
|
$patched = parent::patchBeforeMake();
|
||||||
// Prevent event extension compile error on macOS
|
// Prevent event extension compile error on macOS
|
||||||
if ($this->builder instanceof MacOSBuilder) {
|
if ($this->builder instanceof MacOSBuilder) {
|
||||||
FileSystem::replaceFileRegex(SOURCE_PATH . '/php-src/main/php_config.h', '/^#define HAVE_OPENPTY 1$/m', '');
|
FileSystem::replaceFileRegex(SOURCE_PATH . '/php-src/main/php_config.h', '/^#define HAVE_OPENPTY 1$/m', '');
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
return true;
|
return $patched;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,12 +10,12 @@ use SPC\util\CustomExt;
|
|||||||
#[CustomExt('ffi')]
|
#[CustomExt('ffi')]
|
||||||
class ffi extends Extension
|
class ffi extends Extension
|
||||||
{
|
{
|
||||||
public function getUnixConfigureArg(): string
|
public function getUnixConfigureArg(bool $shared = false): string
|
||||||
{
|
{
|
||||||
return '--with-ffi --enable-zend-signals';
|
return '--with-ffi' . ($shared ? '=shared' : '') . ' --enable-zend-signals';
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getWindowsConfigureArg(): string
|
public function getWindowsConfigureArg(bool $shared = false): string
|
||||||
{
|
{
|
||||||
return '--with-ffi';
|
return '--with-ffi';
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,9 +10,9 @@ use SPC\util\CustomExt;
|
|||||||
#[CustomExt('gd')]
|
#[CustomExt('gd')]
|
||||||
class gd extends Extension
|
class gd extends Extension
|
||||||
{
|
{
|
||||||
public function getUnixConfigureArg(): string
|
public function getUnixConfigureArg(bool $shared = false): string
|
||||||
{
|
{
|
||||||
$arg = '--enable-gd';
|
$arg = '--enable-gd' . ($shared ? '=shared' : '');
|
||||||
$arg .= $this->builder->getLib('freetype') ? ' --with-freetype' : '';
|
$arg .= $this->builder->getLib('freetype') ? ' --with-freetype' : '';
|
||||||
$arg .= $this->builder->getLib('libjpeg') ? ' --with-jpeg' : '';
|
$arg .= $this->builder->getLib('libjpeg') ? ' --with-jpeg' : '';
|
||||||
$arg .= $this->builder->getLib('libwebp') ? ' --with-webp' : '';
|
$arg .= $this->builder->getLib('libwebp') ? ' --with-webp' : '';
|
||||||
|
|||||||
@@ -6,29 +6,24 @@ namespace SPC\builder\extension;
|
|||||||
|
|
||||||
use SPC\builder\Extension;
|
use SPC\builder\Extension;
|
||||||
use SPC\builder\macos\MacOSBuilder;
|
use SPC\builder\macos\MacOSBuilder;
|
||||||
use SPC\exception\FileSystemException;
|
|
||||||
use SPC\exception\WrongUsageException;
|
|
||||||
use SPC\store\FileSystem;
|
use SPC\store\FileSystem;
|
||||||
use SPC\util\CustomExt;
|
use SPC\util\CustomExt;
|
||||||
|
|
||||||
#[CustomExt('gettext')]
|
#[CustomExt('gettext')]
|
||||||
class gettext extends Extension
|
class gettext extends Extension
|
||||||
{
|
{
|
||||||
/**
|
|
||||||
* @throws FileSystemException
|
|
||||||
*/
|
|
||||||
public function patchBeforeBuildconf(): bool
|
public function patchBeforeBuildconf(): bool
|
||||||
{
|
{
|
||||||
if ($this->builder instanceof MacOSBuilder) {
|
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');
|
FileSystem::replaceFileStr(
|
||||||
|
SOURCE_PATH . '/php-src/ext/gettext/config.m4',
|
||||||
|
['AC_CHECK_LIB($GETTEXT_CHECK_IN_LIB', 'AC_CHECK_LIB([$GETTEXT_CHECK_IN_LIB'],
|
||||||
|
['AC_CHECK_LIB(intl', 'AC_CHECK_LIB([intl'] // new php versions use a bracket
|
||||||
|
);
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @throws WrongUsageException
|
|
||||||
* @throws FileSystemException
|
|
||||||
*/
|
|
||||||
public function patchBeforeConfigure(): bool
|
public function patchBeforeConfigure(): bool
|
||||||
{
|
{
|
||||||
if ($this->builder instanceof MacOSBuilder) {
|
if ($this->builder instanceof MacOSBuilder) {
|
||||||
|
|||||||
@@ -5,16 +5,12 @@ declare(strict_types=1);
|
|||||||
namespace SPC\builder\extension;
|
namespace SPC\builder\extension;
|
||||||
|
|
||||||
use SPC\builder\Extension;
|
use SPC\builder\Extension;
|
||||||
use SPC\exception\RuntimeException;
|
|
||||||
use SPC\store\FileSystem;
|
use SPC\store\FileSystem;
|
||||||
use SPC\util\CustomExt;
|
use SPC\util\CustomExt;
|
||||||
|
|
||||||
#[CustomExt('glfw')]
|
#[CustomExt('glfw')]
|
||||||
class glfw extends Extension
|
class glfw extends Extension
|
||||||
{
|
{
|
||||||
/**
|
|
||||||
* @throws RuntimeException
|
|
||||||
*/
|
|
||||||
public function patchBeforeBuildconf(): bool
|
public function patchBeforeBuildconf(): bool
|
||||||
{
|
{
|
||||||
if (file_exists(SOURCE_PATH . '/php-src/ext/glfw')) {
|
if (file_exists(SOURCE_PATH . '/php-src/ext/glfw')) {
|
||||||
@@ -30,12 +26,12 @@ class glfw extends Extension
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getUnixConfigureArg(): string
|
public function getUnixConfigureArg(bool $shared = false): string
|
||||||
{
|
{
|
||||||
return '--enable-glfw --with-glfw-dir=' . BUILD_ROOT_PATH;
|
return '--enable-glfw --with-glfw-dir=' . BUILD_ROOT_PATH;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getWindowsConfigureArg(): string
|
public function getWindowsConfigureArg(bool $shared = false): string
|
||||||
{
|
{
|
||||||
return '--enable-glfw=static';
|
return '--enable-glfw=static';
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,47 +5,58 @@ 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\builder\windows\WindowsBuilder;
|
use SPC\builder\windows\WindowsBuilder;
|
||||||
|
use SPC\exception\ValidationException;
|
||||||
use SPC\store\FileSystem;
|
use SPC\store\FileSystem;
|
||||||
use SPC\util\CustomExt;
|
use SPC\util\CustomExt;
|
||||||
use SPC\util\GlobalEnvManager;
|
use SPC\util\GlobalEnvManager;
|
||||||
|
use SPC\util\SPCConfigUtil;
|
||||||
|
use SPC\util\SPCTarget;
|
||||||
|
|
||||||
#[CustomExt('grpc')]
|
#[CustomExt('grpc')]
|
||||||
class grpc extends Extension
|
class grpc extends Extension
|
||||||
{
|
{
|
||||||
public function patchBeforeBuildconf(): bool
|
public function patchBeforeBuildconf(): bool
|
||||||
{
|
{
|
||||||
// soft link to the grpc source code
|
|
||||||
if ($this->builder instanceof WindowsBuilder) {
|
if ($this->builder instanceof WindowsBuilder) {
|
||||||
// not support windows yet
|
throw new ValidationException('grpc extension does not support windows yet');
|
||||||
throw new \RuntimeException('grpc extension does not support windows yet');
|
|
||||||
}
|
}
|
||||||
if (!is_link(SOURCE_PATH . '/php-src/ext/grpc')) {
|
FileSystem::replaceFileStr(
|
||||||
if (is_dir($this->builder->getLib('grpc')->getSourceDir() . '/src/php/ext/grpc')) {
|
$this->source_dir . '/src/php/ext/grpc/call.c',
|
||||||
shell()->exec('ln -s ' . $this->builder->getLib('grpc')->getSourceDir() . '/src/php/ext/grpc ' . SOURCE_PATH . '/php-src/ext/grpc');
|
'zend_exception_get_default(TSRMLS_C),',
|
||||||
} elseif (is_dir(BUILD_ROOT_PATH . '/grpc_php_ext_src')) {
|
'zend_ce_exception,',
|
||||||
shell()->exec('ln -s ' . BUILD_ROOT_PATH . '/grpc_php_ext_src ' . SOURCE_PATH . '/php-src/ext/grpc');
|
);
|
||||||
} else {
|
if (SPCTarget::getTargetOS() === 'Darwin') {
|
||||||
throw new \RuntimeException('Cannot find grpc source code');
|
FileSystem::replaceFileRegex(
|
||||||
}
|
$this->source_dir . '/config.m4',
|
||||||
$macos = $this->builder instanceof MacOSBuilder ? "\n" . ' LDFLAGS="$LDFLAGS -framework CoreFoundation"' : '';
|
'/GRPC_LIBDIR=.*$/m',
|
||||||
FileSystem::replaceFileRegex(SOURCE_PATH . '/php-src/ext/grpc/config.m4', '/GRPC_LIBDIR=.*$/m', 'GRPC_LIBDIR=' . BUILD_LIB_PATH . $macos);
|
'GRPC_LIBDIR=' . BUILD_LIB_PATH . "\n" . 'LDFLAGS="$LDFLAGS -framework CoreFoundation"'
|
||||||
FileSystem::replaceFileRegex(SOURCE_PATH . '/php-src/ext/grpc/config.m4', '/SEARCH_PATH=.*$/m', 'SEARCH_PATH="' . BUILD_ROOT_PATH . '"');
|
);
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
return false;
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function patchBeforeConfigure(): bool
|
||||||
|
{
|
||||||
|
$util = new SPCConfigUtil($this->builder, ['libs_only_deps' => true]);
|
||||||
|
$config = $util->getExtensionConfig($this);
|
||||||
|
$libs = $config['libs'];
|
||||||
|
FileSystem::replaceFileStr(SOURCE_PATH . '/php-src/configure', '-lgrpc', $libs);
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function patchBeforeMake(): bool
|
public function patchBeforeMake(): bool
|
||||||
{
|
{
|
||||||
|
parent::patchBeforeMake();
|
||||||
// add -Wno-strict-prototypes
|
// add -Wno-strict-prototypes
|
||||||
GlobalEnvManager::putenv('SPC_CMD_VAR_PHP_MAKE_EXTRA_CFLAGS=' . getenv('SPC_CMD_VAR_PHP_MAKE_EXTRA_CFLAGS') . ' -Wno-strict-prototypes');
|
GlobalEnvManager::putenv('SPC_CMD_VAR_PHP_MAKE_EXTRA_CFLAGS=' . getenv('SPC_CMD_VAR_PHP_MAKE_EXTRA_CFLAGS') . ' -Wno-strict-prototypes');
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getUnixConfigureArg(): string
|
protected function getSharedExtensionEnv(): array
|
||||||
{
|
{
|
||||||
return '--enable-grpc=' . BUILD_ROOT_PATH . '/grpc GRPC_LIB_SUBDIR=' . BUILD_LIB_PATH;
|
$env = parent::getSharedExtensionEnv();
|
||||||
|
$env['CPPFLAGS'] = $env['CXXFLAGS'] . ' -Wno-attributes';
|
||||||
|
return $env;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,25 +5,28 @@ declare(strict_types=1);
|
|||||||
namespace SPC\builder\extension;
|
namespace SPC\builder\extension;
|
||||||
|
|
||||||
use SPC\builder\Extension;
|
use SPC\builder\Extension;
|
||||||
use SPC\builder\linux\LinuxBuilder;
|
use SPC\toolchain\ToolchainManager;
|
||||||
|
use SPC\toolchain\ZigToolchain;
|
||||||
use SPC\util\CustomExt;
|
use SPC\util\CustomExt;
|
||||||
|
|
||||||
#[CustomExt('imagick')]
|
#[CustomExt('imagick')]
|
||||||
class imagick extends Extension
|
class imagick extends Extension
|
||||||
{
|
{
|
||||||
public function patchBeforeMake(): bool
|
public function getUnixConfigureArg(bool $shared = false): string
|
||||||
{
|
{
|
||||||
// imagick may call omp_pause_all which requires -lgomp
|
$disable_omp = ' ac_cv_func_omp_pause_resource_all=no';
|
||||||
$extra_libs = getenv('SPC_EXTRA_LIBS') ?: '';
|
return '--with-imagick=' . ($shared ? 'shared,' : '') . BUILD_ROOT_PATH . $disable_omp;
|
||||||
if ($this->builder instanceof LinuxBuilder) {
|
|
||||||
$extra_libs .= (empty($extra_libs) ? '' : ' ') . '-lgomp ';
|
|
||||||
}
|
|
||||||
f_putenv('SPC_EXTRA_LIBS=' . $extra_libs);
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getUnixConfigureArg(): string
|
protected function splitLibsIntoStaticAndShared(string $allLibs): array
|
||||||
{
|
{
|
||||||
return '--with-imagick=' . BUILD_ROOT_PATH;
|
[$static, $shared] = parent::splitLibsIntoStaticAndShared($allLibs);
|
||||||
|
if (ToolchainManager::getToolchainClass() !== ZigToolchain::class &&
|
||||||
|
(str_contains(getenv('PATH'), 'rh/devtoolset') || str_contains(getenv('PATH'), 'rh/gcc-toolset'))
|
||||||
|
) {
|
||||||
|
$static .= ' -l:libstdc++.a';
|
||||||
|
$shared = str_replace('-lstdc++', '', $shared);
|
||||||
|
}
|
||||||
|
return [clean_spaces($static), clean_spaces($shared)];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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\linux\SystemUtil;
|
||||||
use SPC\exception\WrongUsageException;
|
use SPC\exception\WrongUsageException;
|
||||||
use SPC\store\FileSystem;
|
use SPC\store\FileSystem;
|
||||||
use SPC\util\CustomExt;
|
use SPC\util\CustomExt;
|
||||||
@@ -23,9 +24,6 @@ class imap extends Extension
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @throws WrongUsageException
|
|
||||||
*/
|
|
||||||
public function validate(): void
|
public function validate(): void
|
||||||
{
|
{
|
||||||
if ($this->builder->getOption('enable-zts')) {
|
if ($this->builder->getOption('enable-zts')) {
|
||||||
@@ -33,7 +31,7 @@ class imap extends Extension
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getUnixConfigureArg(): string
|
public function getUnixConfigureArg(bool $shared = false): 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) {
|
||||||
@@ -41,4 +39,15 @@ class imap extends Extension
|
|||||||
}
|
}
|
||||||
return $arg;
|
return $arg;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function patchBeforeMake(): bool
|
||||||
|
{
|
||||||
|
$patched = parent::patchBeforeMake();
|
||||||
|
if (PHP_OS_FAMILY !== 'Linux' || SystemUtil::isMuslDist()) {
|
||||||
|
return $patched;
|
||||||
|
}
|
||||||
|
$extra_libs = trim((getenv('SPC_EXTRA_LIBS') ?: '') . ' -lcrypt');
|
||||||
|
f_putenv('SPC_EXTRA_LIBS=' . $extra_libs);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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\windows\WindowsBuilder;
|
||||||
use SPC\store\FileSystem;
|
use SPC\store\FileSystem;
|
||||||
use SPC\util\CustomExt;
|
use SPC\util\CustomExt;
|
||||||
|
|
||||||
@@ -13,14 +14,19 @@ class intl extends Extension
|
|||||||
{
|
{
|
||||||
public function patchBeforeBuildconf(): bool
|
public function patchBeforeBuildconf(): bool
|
||||||
{
|
{
|
||||||
// TODO: remove the following line when https://github.com/php/php-src/pull/14002 will be released
|
if ($this->builder instanceof WindowsBuilder) {
|
||||||
FileSystem::replaceFileStr(SOURCE_PATH . '/php-src/ext/intl/config.m4', 'PHP_CXX_COMPILE_STDCXX(11', 'PHP_CXX_COMPILE_STDCXX(17');
|
FileSystem::replaceFileStr(
|
||||||
// Also need to use clang++ -std=c++17 to force override the default C++ standard
|
SOURCE_PATH . '/php-src/ext/intl/config.w32',
|
||||||
if (is_string($env = getenv('CXX')) && !str_contains($env, 'std=c++17')) {
|
'EXTENSION("intl", "php_intl.c intl_convert.c intl_convertcpp.cpp intl_error.c ", true,',
|
||||||
f_putenv('CXX=' . $env . ' -std=c++17');
|
'EXTENSION("intl", "php_intl.c intl_convert.c intl_convertcpp.cpp intl_error.c ", PHP_INTL_SHARED,'
|
||||||
} else {
|
);
|
||||||
f_putenv('CXX=clang++ -std=c++17');
|
return true;
|
||||||
}
|
}
|
||||||
return true;
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function patchBeforeSharedPhpize(): bool
|
||||||
|
{
|
||||||
|
return $this->patchBeforeBuildconf();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
22
src/SPC/builder/extension/lz4.php
Normal file
22
src/SPC/builder/extension/lz4.php
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace SPC\builder\extension;
|
||||||
|
|
||||||
|
use SPC\builder\Extension;
|
||||||
|
use SPC\util\CustomExt;
|
||||||
|
|
||||||
|
#[CustomExt('lz4')]
|
||||||
|
class lz4 extends Extension
|
||||||
|
{
|
||||||
|
public function getUnixConfigureArg(bool $shared = false): string
|
||||||
|
{
|
||||||
|
return '--enable-lz4' . ($shared ? '=shared' : '') . ' --with-lz4-includedir=' . BUILD_ROOT_PATH;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getWindowsConfigureArg(bool $shared = false): string
|
||||||
|
{
|
||||||
|
return '--enable-lz4';
|
||||||
|
}
|
||||||
|
}
|
||||||
25
src/SPC/builder/extension/maxminddb.php
Normal file
25
src/SPC/builder/extension/maxminddb.php
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace SPC\builder\extension;
|
||||||
|
|
||||||
|
use SPC\builder\Extension;
|
||||||
|
use SPC\store\FileSystem;
|
||||||
|
use SPC\util\CustomExt;
|
||||||
|
|
||||||
|
#[CustomExt('maxminddb')]
|
||||||
|
class maxminddb extends Extension
|
||||||
|
{
|
||||||
|
public function patchBeforeBuildconf(): bool
|
||||||
|
{
|
||||||
|
if (!is_dir(SOURCE_PATH . '/php-src/ext/maxminddb')) {
|
||||||
|
$original = $this->source_dir;
|
||||||
|
FileSystem::copyDir($original . '/ext', SOURCE_PATH . '/php-src/ext/maxminddb');
|
||||||
|
$this->source_dir = SOURCE_PATH . '/php-src/ext/maxminddb';
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
$this->source_dir = SOURCE_PATH . '/php-src/ext/maxminddb';
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -5,7 +5,7 @@ declare(strict_types=1);
|
|||||||
namespace SPC\builder\extension;
|
namespace SPC\builder\extension;
|
||||||
|
|
||||||
use SPC\builder\Extension;
|
use SPC\builder\Extension;
|
||||||
use SPC\exception\RuntimeException;
|
use SPC\exception\ValidationException;
|
||||||
use SPC\util\CustomExt;
|
use SPC\util\CustomExt;
|
||||||
|
|
||||||
#[CustomExt('mbregex')]
|
#[CustomExt('mbregex')]
|
||||||
@@ -16,19 +16,15 @@ class mbregex extends Extension
|
|||||||
return 'mbstring';
|
return 'mbstring';
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getConfigureArg(): string
|
|
||||||
{
|
|
||||||
return '';
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 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 runCliCheckUnix(): void
|
public function runCliCheckUnix(): void
|
||||||
{
|
{
|
||||||
[$ret] = shell()->execWithResult(BUILD_ROOT_PATH . '/bin/php -n --ri "mbstring" | grep regex', false);
|
$sharedext = $this->builder->getExt('mbstring')->isBuildShared() ? '-d "extension_dir=' . BUILD_MODULES_PATH . '" -d "extension=mbstring"' : '';
|
||||||
|
[$ret] = shell()->execWithResult(BUILD_ROOT_PATH . '/bin/php -n' . $sharedext . ' --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 ValidationException("Extension {$this->getName()} failed compile check: compiled php-cli mbstring extension does not contain regex !");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -36,11 +32,11 @@ class mbregex extends Extension
|
|||||||
{
|
{
|
||||||
[$ret, $out] = cmd()->execWithResult(BUILD_ROOT_PATH . '/bin/php -n --ri "mbstring"', false);
|
[$ret, $out] = cmd()->execWithResult(BUILD_ROOT_PATH . '/bin/php -n --ri "mbstring"', false);
|
||||||
if ($ret !== 0) {
|
if ($ret !== 0) {
|
||||||
throw new RuntimeException('extension ' . $this->getName() . ' failed compile check: compiled php-cli does not contain mbstring !');
|
throw new ValidationException("extension {$this->getName()} failed compile check: compiled php-cli does not contain mbstring !");
|
||||||
}
|
}
|
||||||
$out = implode("\n", $out);
|
$out = implode("\n", $out);
|
||||||
if (!str_contains($out, 'regex')) {
|
if (!str_contains($out, 'regex')) {
|
||||||
throw new RuntimeException('extension ' . $this->getName() . ' failed compile check: compiled php-cli mbstring extension does not contain regex !');
|
throw new ValidationException("extension {$this->getName()} failed compile check: compiled php-cli mbstring extension does not contain regex !");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,9 +10,20 @@ use SPC\util\CustomExt;
|
|||||||
#[CustomExt('mbstring')]
|
#[CustomExt('mbstring')]
|
||||||
class mbstring extends Extension
|
class mbstring extends Extension
|
||||||
{
|
{
|
||||||
public function getConfigureArg(): string
|
public function getConfigureArg(bool $shared = false): string
|
||||||
{
|
{
|
||||||
$arg = '--enable-mbstring';
|
$arg = '--enable-mbstring' . ($shared ? '=shared' : '');
|
||||||
|
if ($this->builder->getExt('mbregex') === null) {
|
||||||
|
$arg .= ' --disable-mbregex';
|
||||||
|
} else {
|
||||||
|
$arg .= ' --enable-mbregex';
|
||||||
|
}
|
||||||
|
return $arg;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getUnixConfigureArg(bool $shared = false): string
|
||||||
|
{
|
||||||
|
$arg = '--enable-mbstring' . ($shared ? '=shared' : '');
|
||||||
if ($this->builder->getExt('mbregex') === null) {
|
if ($this->builder->getExt('mbregex') === null) {
|
||||||
$arg .= ' --disable-mbregex';
|
$arg .= ' --disable-mbregex';
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -5,23 +5,22 @@ declare(strict_types=1);
|
|||||||
namespace SPC\builder\extension;
|
namespace SPC\builder\extension;
|
||||||
|
|
||||||
use SPC\builder\Extension;
|
use SPC\builder\Extension;
|
||||||
use SPC\exception\FileSystemException;
|
|
||||||
use SPC\store\FileSystem;
|
use SPC\store\FileSystem;
|
||||||
use SPC\util\CustomExt;
|
use SPC\util\CustomExt;
|
||||||
|
|
||||||
#[CustomExt('memcache')]
|
#[CustomExt('memcache')]
|
||||||
class memcache extends Extension
|
class memcache extends Extension
|
||||||
{
|
{
|
||||||
public function getUnixConfigureArg(): string
|
public function getUnixConfigureArg(bool $shared = false): string
|
||||||
{
|
{
|
||||||
return '--enable-memcache --with-zlib-dir=' . BUILD_ROOT_PATH;
|
return '--enable-memcache' . ($shared ? '=shared' : '') . ' --with-zlib-dir=' . BUILD_ROOT_PATH;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @throws FileSystemException
|
|
||||||
*/
|
|
||||||
public function patchBeforeBuildconf(): bool
|
public function patchBeforeBuildconf(): bool
|
||||||
{
|
{
|
||||||
|
if (!$this->isBuildStatic()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
FileSystem::replaceFileStr(
|
FileSystem::replaceFileStr(
|
||||||
SOURCE_PATH . '/php-src/ext/memcache/config9.m4',
|
SOURCE_PATH . '/php-src/ext/memcache/config9.m4',
|
||||||
'if test -d $abs_srcdir/src ; then',
|
'if test -d $abs_srcdir/src ; then',
|
||||||
@@ -47,4 +46,27 @@ EOF
|
|||||||
);
|
);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function patchBeforeSharedConfigure(): bool
|
||||||
|
{
|
||||||
|
if (!$this->isBuildShared()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
FileSystem::replaceFileStr(
|
||||||
|
SOURCE_PATH . '/php-src/ext/memcache/config9.m4',
|
||||||
|
'if test -d $abs_srcdir/main ; then',
|
||||||
|
'if test -d $abs_srcdir/src ; then',
|
||||||
|
);
|
||||||
|
FileSystem::replaceFileStr(
|
||||||
|
SOURCE_PATH . '/php-src/ext/memcache/config9.m4',
|
||||||
|
'export CPPFLAGS="$CPPFLAGS $INCLUDES -I$abs_srcdir/main"',
|
||||||
|
'export CPPFLAGS="$CPPFLAGS $INCLUDES"',
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function getExtraEnv(): array
|
||||||
|
{
|
||||||
|
return ['CFLAGS' => '-std=c17'];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,10 +10,17 @@ use SPC\util\CustomExt;
|
|||||||
#[CustomExt('memcached')]
|
#[CustomExt('memcached')]
|
||||||
class memcached extends Extension
|
class memcached extends Extension
|
||||||
{
|
{
|
||||||
public function getUnixConfigureArg(): string
|
public function getUnixConfigureArg(bool $shared = false): string
|
||||||
{
|
{
|
||||||
$rootdir = BUILD_ROOT_PATH;
|
return '--enable-memcached' . ($shared ? '=shared' : '') . ' ' .
|
||||||
$zlib_dir = $this->builder->getPHPVersionID() >= 80400 ? '' : "--with-zlib-dir={$rootdir}";
|
'--with-zlib-dir=' . BUILD_ROOT_PATH . ' ' .
|
||||||
return "--enable-memcached {$zlib_dir} --with-libmemcached-dir={$rootdir} --disable-memcached-sasl --enable-memcached-json";
|
'--with-libmemcached-dir=' . BUILD_ROOT_PATH . ' ' .
|
||||||
|
'--disable-memcached-sasl ' .
|
||||||
|
'--enable-memcached-json ' .
|
||||||
|
($this->builder->getLib('zstd') ? '--with-zstd ' : '') .
|
||||||
|
($this->builder->getExt('igbinary') ? '--enable-memcached-igbinary ' : '') .
|
||||||
|
($this->builder->getExt('session') ? '--enable-memcached-session ' : '') .
|
||||||
|
($this->builder->getExt('msgpack') ? '--enable-memcached-msgpack ' : '') .
|
||||||
|
'--with-system-fastlz';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,11 +10,11 @@ use SPC\util\CustomExt;
|
|||||||
#[CustomExt('mongodb')]
|
#[CustomExt('mongodb')]
|
||||||
class mongodb extends Extension
|
class mongodb extends Extension
|
||||||
{
|
{
|
||||||
public function getUnixConfigureArg(): string
|
public function getUnixConfigureArg(bool $shared = false): string
|
||||||
{
|
{
|
||||||
$arg = ' --enable-mongodb ';
|
$arg = ' --enable-mongodb' . ($shared ? '=shared' : '') . ' ';
|
||||||
$arg .= ' --with-mongodb-system-libs=no --with-mongodb-client-side-encryption=no ';
|
$arg .= ' --with-mongodb-system-libs=no --with-mongodb-client-side-encryption=no ';
|
||||||
$arg .= ' --with-mongodb-sasl=no ';
|
$arg .= ' --with-mongodb-sasl=no ';
|
||||||
if ($this->builder->getLib('openssl')) {
|
if ($this->builder->getLib('openssl')) {
|
||||||
$arg .= '--with-mongodb-ssl=openssl';
|
$arg .= '--with-mongodb-ssl=openssl';
|
||||||
}
|
}
|
||||||
@@ -22,6 +22,11 @@ class mongodb extends Extension
|
|||||||
$arg .= $this->builder->getLib('zstd') ? ' --with-mongodb-zstd=yes ' : ' --with-mongodb-zstd=no ';
|
$arg .= $this->builder->getLib('zstd') ? ' --with-mongodb-zstd=yes ' : ' --with-mongodb-zstd=no ';
|
||||||
// $arg .= $this->builder->getLib('snappy') ? ' --with-mongodb-snappy=yes ' : ' --with-mongodb-snappy=no ';
|
// $arg .= $this->builder->getLib('snappy') ? ' --with-mongodb-snappy=yes ' : ' --with-mongodb-snappy=no ';
|
||||||
$arg .= $this->builder->getLib('zlib') ? ' --with-mongodb-zlib=yes ' : ' --with-mongodb-zlib=bundled ';
|
$arg .= $this->builder->getLib('zlib') ? ' --with-mongodb-zlib=yes ' : ' --with-mongodb-zlib=bundled ';
|
||||||
return $arg;
|
return clean_spaces($arg);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getExtraEnv(): array
|
||||||
|
{
|
||||||
|
return ['CFLAGS' => '-std=c17'];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
22
src/SPC/builder/extension/mysqlnd_ed25519.php
Normal file
22
src/SPC/builder/extension/mysqlnd_ed25519.php
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace SPC\builder\extension;
|
||||||
|
|
||||||
|
use SPC\builder\Extension;
|
||||||
|
use SPC\util\CustomExt;
|
||||||
|
|
||||||
|
#[CustomExt('mysqlnd_ed25519')]
|
||||||
|
class mysqlnd_ed25519 extends Extension
|
||||||
|
{
|
||||||
|
public function getConfigureArg(bool $shared = false): string
|
||||||
|
{
|
||||||
|
return '--with-mysqlnd_ed25519' . ($shared ? '=shared' : '');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getUnixConfigureArg(bool $shared = false): string
|
||||||
|
{
|
||||||
|
return $this->getConfigureArg();
|
||||||
|
}
|
||||||
|
}
|
||||||
22
src/SPC/builder/extension/mysqlnd_parsec.php
Normal file
22
src/SPC/builder/extension/mysqlnd_parsec.php
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace SPC\builder\extension;
|
||||||
|
|
||||||
|
use SPC\builder\Extension;
|
||||||
|
use SPC\util\CustomExt;
|
||||||
|
|
||||||
|
#[CustomExt('mysqlnd_parsec')]
|
||||||
|
class mysqlnd_parsec extends Extension
|
||||||
|
{
|
||||||
|
public function getConfigureArg(bool $shared = false): string
|
||||||
|
{
|
||||||
|
return '--enable-mysqlnd_parsec' . ($shared ? '=shared' : '');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getUnixConfigureArg(bool $shared = false): string
|
||||||
|
{
|
||||||
|
return $this->getConfigureArg();
|
||||||
|
}
|
||||||
|
}
|
||||||
17
src/SPC/builder/extension/odbc.php
Normal file
17
src/SPC/builder/extension/odbc.php
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace SPC\builder\extension;
|
||||||
|
|
||||||
|
use SPC\builder\Extension;
|
||||||
|
use SPC\util\CustomExt;
|
||||||
|
|
||||||
|
#[CustomExt('odbc')]
|
||||||
|
class odbc extends Extension
|
||||||
|
{
|
||||||
|
public function getUnixConfigureArg(bool $shared = false): string
|
||||||
|
{
|
||||||
|
return '--with-unixODBC=' . ($shared ? 'shared,' : '') . BUILD_ROOT_PATH;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -5,18 +5,14 @@ declare(strict_types=1);
|
|||||||
namespace SPC\builder\extension;
|
namespace SPC\builder\extension;
|
||||||
|
|
||||||
use SPC\builder\Extension;
|
use SPC\builder\Extension;
|
||||||
use SPC\exception\RuntimeException;
|
|
||||||
use SPC\exception\WrongUsageException;
|
use SPC\exception\WrongUsageException;
|
||||||
use SPC\store\SourcePatcher;
|
use SPC\store\SourcePatcher;
|
||||||
use SPC\util\CustomExt;
|
use SPC\util\CustomExt;
|
||||||
|
use SPC\util\SPCTarget;
|
||||||
|
|
||||||
#[CustomExt('opcache')]
|
#[CustomExt('opcache')]
|
||||||
class opcache extends Extension
|
class opcache extends Extension
|
||||||
{
|
{
|
||||||
/**
|
|
||||||
* @throws WrongUsageException
|
|
||||||
* @throws RuntimeException
|
|
||||||
*/
|
|
||||||
public function validate(): void
|
public function validate(): void
|
||||||
{
|
{
|
||||||
if ($this->builder->getPHPVersionID() < 80000 && getenv('SPC_SKIP_PHP_VERSION_CHECK') !== 'yes') {
|
if ($this->builder->getPHPVersionID() < 80000 && getenv('SPC_SKIP_PHP_VERSION_CHECK') !== 'yes') {
|
||||||
@@ -26,25 +22,43 @@ class opcache extends Extension
|
|||||||
|
|
||||||
public function patchBeforeBuildconf(): bool
|
public function patchBeforeBuildconf(): bool
|
||||||
{
|
{
|
||||||
|
$version = $this->builder->getPHPVersion();
|
||||||
if (file_exists(SOURCE_PATH . '/php-src/.opcache_patched')) {
|
if (file_exists(SOURCE_PATH . '/php-src/.opcache_patched')) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
// if 8.2.0 <= PHP_VERSION < 8.2.23, we need to patch from legacy patch file
|
// if 8.2.0 <= PHP_VERSION < 8.2.23, we need to patch from legacy patch file
|
||||||
if (version_compare($this->builder->getPHPVersion(), '8.2.0', '>=') && version_compare($this->builder->getPHPVersion(), '8.2.23', '<')) {
|
if (version_compare($version, '8.2.0', '>=') && version_compare($version, '8.2.23', '<')) {
|
||||||
SourcePatcher::patchFile('spc_fix_static_opcache_before_80222.patch', SOURCE_PATH . '/php-src');
|
SourcePatcher::patchFile('spc_fix_static_opcache_before_80222.patch', SOURCE_PATH . '/php-src');
|
||||||
}
|
}
|
||||||
// if 8.3.0 <= PHP_VERSION < 8.3.11, we need to patch from legacy patch file
|
// if 8.3.0 <= PHP_VERSION < 8.3.11, we need to patch from legacy patch file
|
||||||
elseif (version_compare($this->builder->getPHPVersion(), '8.3.0', '>=') && version_compare($this->builder->getPHPVersion(), '8.3.11', '<')) {
|
elseif (version_compare($version, '8.3.0', '>=') && version_compare($version, '8.3.11', '<')) {
|
||||||
SourcePatcher::patchFile('spc_fix_static_opcache_before_80310.patch', SOURCE_PATH . '/php-src');
|
SourcePatcher::patchFile('spc_fix_static_opcache_before_80310.patch', SOURCE_PATH . '/php-src');
|
||||||
} else {
|
}
|
||||||
|
// if 8.3.12 <= PHP_VERSION < 8.5.0-dev, we need to patch from legacy patch file
|
||||||
|
elseif (version_compare($version, '8.5.0-dev', '<')) {
|
||||||
SourcePatcher::patchMicro(items: ['static_opcache']);
|
SourcePatcher::patchMicro(items: ['static_opcache']);
|
||||||
}
|
}
|
||||||
|
// PHP 8.5.0-dev and later supports static opcache without patching
|
||||||
|
else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
return file_put_contents(SOURCE_PATH . '/php-src/.opcache_patched', '1') !== false;
|
return file_put_contents(SOURCE_PATH . '/php-src/.opcache_patched', '1') !== false;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getUnixConfigureArg(): string
|
public function getUnixConfigureArg(bool $shared = false): string
|
||||||
{
|
{
|
||||||
return '--enable-opcache';
|
$phpVersionID = $this->builder->getPHPVersionID();
|
||||||
|
$opcache_jit = ' --enable-opcache-jit';
|
||||||
|
if ((SPCTarget::getTargetOS() === 'Linux' &&
|
||||||
|
SPCTarget::getLibc() === 'musl' &&
|
||||||
|
$this->builder->getOption('enable-zts') &&
|
||||||
|
arch2gnu(php_uname('m')) === 'x86_64' &&
|
||||||
|
$phpVersionID < 80500) ||
|
||||||
|
$this->builder->getOption('disable-opcache-jit')
|
||||||
|
) {
|
||||||
|
$opcache_jit = ' --disable-opcache-jit';
|
||||||
|
}
|
||||||
|
return '--enable-opcache' . ($shared ? '=shared' : '') . $opcache_jit;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getDistName(): string
|
public function getDistName(): string
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ class openssl extends Extension
|
|||||||
{
|
{
|
||||||
public function patchBeforeMake(): bool
|
public function patchBeforeMake(): bool
|
||||||
{
|
{
|
||||||
|
$patched = parent::patchBeforeMake();
|
||||||
// patch openssl3 with php8.0 bug
|
// patch openssl3 with php8.0 bug
|
||||||
if ($this->builder->getPHPVersionID() < 80100) {
|
if ($this->builder->getPHPVersionID() < 80100) {
|
||||||
$openssl_c = file_get_contents(SOURCE_PATH . '/php-src/ext/openssl/openssl.c');
|
$openssl_c = file_get_contents(SOURCE_PATH . '/php-src/ext/openssl/openssl.c');
|
||||||
@@ -20,12 +21,25 @@ class openssl extends Extension
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return $patched;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getUnixConfigureArg(): string
|
public function getUnixConfigureArg(bool $shared = false): string
|
||||||
{
|
{
|
||||||
$openssl_dir = $this->builder->getPHPVersionID() >= 80400 ? '' : ' --with-openssl-dir=' . BUILD_ROOT_PATH;
|
$openssl_dir = $this->builder->getPHPVersionID() >= 80400 ? '' : ' --with-openssl-dir=' . BUILD_ROOT_PATH;
|
||||||
return '--with-openssl=' . BUILD_ROOT_PATH . $openssl_dir;
|
$args = '--with-openssl=' . ($shared ? 'shared,' : '') . BUILD_ROOT_PATH . $openssl_dir;
|
||||||
|
if ($this->builder->getPHPVersionID() >= 80500 || ($this->builder->getPHPVersionID() >= 80400 && !$this->builder->getOption('enable-zts'))) {
|
||||||
|
$args .= ' --with-openssl-argon2 OPENSSL_LIBS="-lz"';
|
||||||
|
}
|
||||||
|
return $args;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getWindowsConfigureArg(bool $shared = false): string
|
||||||
|
{
|
||||||
|
$args = '--with-openssl';
|
||||||
|
if ($this->builder->getPHPVersionID() >= 80500 || ($this->builder->getPHPVersionID() >= 80400 && !$this->builder->getOption('enable-zts'))) {
|
||||||
|
$args .= ' --with-openssl-argon2';
|
||||||
|
}
|
||||||
|
return $args;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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\exception\ValidationException;
|
||||||
use SPC\store\FileSystem;
|
use SPC\store\FileSystem;
|
||||||
use SPC\util\CustomExt;
|
use SPC\util\CustomExt;
|
||||||
use SPC\util\GlobalEnvManager;
|
use SPC\util\GlobalEnvManager;
|
||||||
@@ -15,7 +16,7 @@ class opentelemetry extends Extension
|
|||||||
public function validate(): void
|
public function validate(): void
|
||||||
{
|
{
|
||||||
if ($this->builder->getPHPVersionID() < 80000 && getenv('SPC_SKIP_PHP_VERSION_CHECK') !== 'yes') {
|
if ($this->builder->getPHPVersionID() < 80000 && getenv('SPC_SKIP_PHP_VERSION_CHECK') !== 'yes') {
|
||||||
throw new \RuntimeException('The opentelemetry extension requires PHP 8.0 or later');
|
throw new ValidationException('The opentelemetry extension requires PHP 8.0 or later');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -34,6 +35,7 @@ class opentelemetry extends Extension
|
|||||||
|
|
||||||
public function patchBeforeMake(): bool
|
public function patchBeforeMake(): bool
|
||||||
{
|
{
|
||||||
|
parent::patchBeforeMake();
|
||||||
// add -Wno-strict-prototypes
|
// add -Wno-strict-prototypes
|
||||||
GlobalEnvManager::putenv('SPC_CMD_VAR_PHP_MAKE_EXTRA_CFLAGS=' . getenv('SPC_CMD_VAR_PHP_MAKE_EXTRA_CFLAGS') . ' -Wno-strict-prototypes');
|
GlobalEnvManager::putenv('SPC_CMD_VAR_PHP_MAKE_EXTRA_CFLAGS=' . getenv('SPC_CMD_VAR_PHP_MAKE_EXTRA_CFLAGS') . ' -Wno-strict-prototypes');
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ declare(strict_types=1);
|
|||||||
namespace SPC\builder\extension;
|
namespace SPC\builder\extension;
|
||||||
|
|
||||||
use SPC\builder\Extension;
|
use SPC\builder\Extension;
|
||||||
use SPC\exception\RuntimeException;
|
use SPC\exception\ValidationException;
|
||||||
use SPC\util\CustomExt;
|
use SPC\util\CustomExt;
|
||||||
|
|
||||||
#[CustomExt('password-argon2')]
|
#[CustomExt('password-argon2')]
|
||||||
@@ -20,7 +20,17 @@ class password_argon2 extends Extension
|
|||||||
{
|
{
|
||||||
[$ret] = shell()->execWithResult(BUILD_ROOT_PATH . '/bin/php -n -r "assert(defined(\'PASSWORD_ARGON2I\'));"');
|
[$ret] = shell()->execWithResult(BUILD_ROOT_PATH . '/bin/php -n -r "assert(defined(\'PASSWORD_ARGON2I\'));"');
|
||||||
if ($ret !== 0) {
|
if ($ret !== 0) {
|
||||||
throw new RuntimeException('extension ' . $this->getName() . ' failed sanity check');
|
throw new ValidationException('extension ' . $this->getName() . ' failed sanity check', validation_module: 'password_argon2 function check');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function getConfigureArg(bool $shared = false): string
|
||||||
|
{
|
||||||
|
if ($this->builder->getLib('openssl') !== null) {
|
||||||
|
if ($this->builder->getPHPVersionID() >= 80500 || ($this->builder->getPHPVersionID() >= 80400 && !$this->builder->getOption('enable-zts'))) {
|
||||||
|
return '--without-password-argon2'; // use --with-openssl-argon2 in openssl extension instead
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return '--with-password-argon2';
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
29
src/SPC/builder/extension/pdo_odbc.php
Normal file
29
src/SPC/builder/extension/pdo_odbc.php
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace SPC\builder\extension;
|
||||||
|
|
||||||
|
use SPC\builder\Extension;
|
||||||
|
use SPC\store\FileSystem;
|
||||||
|
use SPC\util\CustomExt;
|
||||||
|
|
||||||
|
#[CustomExt('pdo_odbc')]
|
||||||
|
class pdo_odbc extends Extension
|
||||||
|
{
|
||||||
|
public function patchBeforeBuildconf(): bool
|
||||||
|
{
|
||||||
|
FileSystem::replaceFileStr(SOURCE_PATH . '/php-src/ext/pdo_odbc/config.m4', 'PDO_ODBC_LDFLAGS="$pdo_odbc_def_ldflags', 'PDO_ODBC_LDFLAGS="-liconv $pdo_odbc_def_ldflags');
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getUnixConfigureArg(bool $shared = false): string
|
||||||
|
{
|
||||||
|
return '--with-pdo-odbc=' . ($shared ? 'shared,' : '') . 'unixODBC,' . BUILD_ROOT_PATH;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getWindowsConfigureArg(bool $shared = false): string
|
||||||
|
{
|
||||||
|
return '--with-pdo-odbc';
|
||||||
|
}
|
||||||
|
}
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user