@@ -8,6 +8,8 @@ if ! type "git" >/dev/null 2>&1; then
88 exit 1
99fi
1010
11+ CURRENT_DIR=$( pwd)
12+
1113arch=" $( uname -m) "
1214os=" $( uname -s | tr ' [:upper:]' ' [:lower:]' ) "
1315
7678defaultExtensions=" amqp,apcu,ast,bcmath,brotli,bz2,calendar,ctype,curl,dba,dom,exif,fileinfo,filter,ftp,gd,gmp,gettext,iconv,igbinary,imagick,intl,ldap,lz4,mbregex,mbstring,memcache,memcached,mysqli,mysqlnd,opcache,openssl,password-argon2,parallel,pcntl,pdo,pdo_mysql,pdo_pgsql,pdo_sqlite,pdo_sqlsrv,pgsql,phar,posix,protobuf,readline,redis,session,shmop,simplexml,soap,sockets,sodium,sqlite3,ssh2,sysvmsg,sysvsem,sysvshm,tidy,tokenizer,xlswriter,xml,xmlreader,xmlwriter,xsl,xz,zip,zlib,yaml,zstd"
7779defaultExtensionLibs=" libavif,nghttp2,nghttp3,ngtcp2"
7880
79- md5binary=" md5sum"
80- if [ " ${os} " = " darwin" ]; then
81- os=" mac"
82- md5binary=" md5 -q"
83- fi
84-
85- if [ " ${os} " = " linux" ] && ! type " cmake" > /dev/null 2>&1 ; then
86- echo " The \" cmake\" command must be installed."
87- exit 1
88- fi
89-
90- if [ " ${os} " = " linux" ] && { [[ " ${arch} " =~ " aarch" ]] || [[ " ${arch} " =~ " arm" ]]; }; then
91- fpic=" -fPIC"
92- fpie=" -fPIE"
93- else
94- fpic=" -fpic"
95- fpie=" -fpie"
96- fi
97-
9881if [ -z " ${FRANKENPHP_VERSION} " ]; then
9982 FRANKENPHP_VERSION=" $( git rev-parse --verify HEAD) "
10083 export FRANKENPHP_VERSION
@@ -115,8 +98,6 @@ elif [ -d ".git/" ]; then
11598 fi
11699fi
117100
118- bin=" frankenphp-${os} -${arch} "
119-
120101if [ -n " ${CLEAN} " ]; then
121102 rm -Rf dist/
122103 go clean -cache
@@ -194,158 +175,45 @@ if [ -n "${MIMALLOC}" ]; then
194175 fi
195176fi
196177
197- # Build libphp if necessary
198- cache_key=" ${PHP_VERSION} -${PHP_EXTENSIONS} -${PHP_EXTENSION_LIBS} "
199- if [ -f ../cache_key ] && [ " $( cat ../cache_key) " = " ${cache_key} " ] && [ -f " buildroot/lib/libphp.a" ]; then
200- echo " Hit cache, skipping libphp build."
201- else
202- ${spcCommand} doctor --auto-fix
203- # shellcheck disable=SC2086
204- ${spcCommand} download --with-php=" ${PHP_VERSION} " --shallow-clone --for-extensions=" ${PHP_EXTENSIONS} " --for-libs=" ${PHP_EXTENSION_LIBS} " ${SPC_OPT_DOWNLOAD_ARGS}
205- # shellcheck disable=SC2086
206- ${spcCommand} build --enable-zts --build-embed ${SPC_OPT_BUILD_ARGS} " ${PHP_EXTENSIONS} " --with-libs=" ${PHP_EXTENSION_LIBS} "
207-
208- if [ -n " $CI " ]; then
209- rm -rf ./downloads
210- rm -rf ./source
211- fi
212-
213- echo -n " ${cache_key} " > ../cache_key
214- fi
215-
216- if ! type " go" > /dev/null 2>&1 ; then
217- echo " The \" go\" command must be installed."
218- exit 1
219- fi
220-
221- XCADDY_COMMAND=" xcaddy"
222- if ! type " $XCADDY_COMMAND " > /dev/null 2>&1 ; then
223- go install github.com/caddyserver/xcaddy/cmd/xcaddy@latest
224- XCADDY_COMMAND=" $( go env GOPATH) /bin/xcaddy"
225- fi
226-
227- curlGitHubHeaders=(--header " X-GitHub-Api-Version: 2022-11-28" )
228- if [ " ${GITHUB_TOKEN} " ]; then
229- curlGitHubHeaders+=(--header " Authorization: Bearer ${GITHUB_TOKEN} " )
230- fi
231-
232- # Compile e-dant/watcher as a static library
233- mkdir -p watcher
234- cd watcher
235- curl -f --retry 5 " ${curlGitHubHeaders[@]} " https://api.github.com/repos/e-dant/watcher/releases/latest |
236- grep tarball_url |
237- awk ' { print $2 }' |
238- sed ' s/,$//' |
239- sed ' s/"//g' |
240- xargs curl -fL --retry 5 " ${curlGitHubHeaders[@]} " |
241- tar xz --strip-components 1
242- cd watcher-c
243- if [ -z " ${CC} " ]; then
244- watcherCC=cc
245- else
246- watcherCC=" ${CC} "
247- fi
248- ${watcherCC} -c -o libwatcher-c.o ./src/watcher-c.cpp -I ./include -I ../include -std=c++17 -Wall -Wextra " ${fpic} "
249- ar rcs libwatcher-c.a libwatcher-c.o
250- cp libwatcher-c.a ../../buildroot/lib/libwatcher-c.a
251- mkdir -p ../../buildroot/include/wtr
252- cp -R include/wtr/watcher-c.h ../../buildroot/include/wtr/watcher-c.h
253- cd ../../
254-
255- # See https://github.com/docker-library/php/blob/master/8.3/alpine3.20/zts/Dockerfile#L53-L55
256- CGO_CFLAGS=" -DFRANKENPHP_VERSION=${FRANKENPHP_VERSION} -I${PWD} /buildroot/include/ $( ${spcCommand} spc-config " ${PHP_EXTENSIONS} " --with-libs=" ${PHP_EXTENSION_LIBS} " --includes) "
257- if [ -n " ${DEBUG_SYMBOLS} " ]; then
258- CGO_CFLAGS=" -g ${CGO_CFLAGS} "
259- else
260- CGO_CFLAGS=" -fstack-protector-strong ${fpic} ${fpie} -O2 -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 ${CGO_CFLAGS} "
261- fi
262- export CGO_CFLAGS
263- export CGO_CPPFLAGS=" ${CGO_CFLAGS} "
264-
265- if [ " ${os} " = " mac" ]; then
266- export CGO_LDFLAGS=" -framework CoreFoundation -framework SystemConfiguration"
267- elif [ " ${os} " = " linux" ] && [ -z " ${DEBUG_SYMBOLS} " ]; then
268- CGO_LDFLAGS=" -Wl,-O1 -pie"
269- fi
270- if [ " ${os} " = " linux" ] && [ " ${SPC_LIBC} " = " glibc" ]; then
271- CGO_LDFLAGS=" ${CGO_LDFLAGS} -Wl,--allow-multiple-definition -Wl,--export-dynamic"
272- fi
273-
274- CGO_LDFLAGS=" ${CGO_LDFLAGS} ${PWD} /buildroot/lib/libbrotlicommon.a ${PWD} /buildroot/lib/libbrotlienc.a ${PWD} /buildroot/lib/libbrotlidec.a ${PWD} /buildroot/lib/libwatcher-c.a $( ${spcCommand} spc-config " ${PHP_EXTENSIONS} " --with-libs=" ${PHP_EXTENSION_LIBS} " --libs) "
275- if [[ " $CGO_LDFLAGS " == * " ${PWD} /buildroot/lib/mimalloc.o" * ]]; then
276- CGO_LDFLAGS=${CGO_LDFLAGS// ${PWD} \/ buildroot\/ lib\/ mimalloc.o/ }
277- CGO_LDFLAGS=" ${PWD} /buildroot/lib/libmimalloc.a $CGO_LDFLAGS "
278- fi
279- if [ " ${os} " = " linux" ] && [ " ${SPC_LIBC} " = " glibc" ]; then
280- CGO_LDFLAGS=" ${CGO_LDFLAGS// -lphp/ -Wl,--whole-archive -lphp -Wl,--no-whole-archive} "
281- # shellcheck disable=SC2046
282- ar d " ${PWD} /buildroot/lib/libphp.a" $( ar t " ${PWD} /buildroot/lib/libphp.a" | grep ' \.a$' )
283- fi
284-
285- export CGO_LDFLAGS
286-
287- LIBPHP_VERSION=" $( ./buildroot/bin/php-config --version) "
288-
289- cd ../
290-
291- if [ -z " ${DEBUG_SYMBOLS} " ]; then
292- extraLdflags=" -w -s"
293- fi
294-
295- cd ../
296-
297178# Embed PHP app, if any
298179if [ -n " ${EMBED} " ] && [ -d " ${EMBED} " ]; then
299- tar -cf app.tar -C " ${EMBED} " .
300- ${md5binary} app.tar | awk ' {printf $1}' > app_checksum.txt
180+ SPC_OPT_BUILD_ARGS=" ${SPC_OPT_BUILD_ARGS} --with-frankenphp-app=${EMBED} "
301181fi
302182
303- if [ -z " ${XCADDY_ARGS} " ]; then
304- XCADDY_ARGS=" --with github.com/dunglas/caddy-cbrotli --with github.com/dunglas/mercure/caddy --with github.com/dunglas/vulcain/caddy"
183+ SPC_OPT_INSTALL_ARGS=" go-xcaddy"
184+ if [ -z " ${DEBUG_SYMBOLS} " ] && [ -z " ${NO_COMPRESS} " ]; then
185+ SPC_OPT_BUILD_ARGS=" ${SPC_OPT_BUILD_ARGS} --with-upx-pack"
186+ SPC_OPT_INSTALL_ARGS=" ${SPC_OPT_INSTALL_ARGS} upx"
305187fi
306188
307- XCADDY_DEBUG=0
189+ export SPC_DEFAULT_C_FLAGS= " -fPIC -O2 "
308190if [ -n " ${DEBUG_SYMBOLS} " ]; then
309- XCADDY_DEBUG=1
310- fi
311-
312- if [ " ${SPC_LIBC} " = " musl" ]; then
313- muslStackSizeFix=" -Wl,-z,stack-size=0x80000"
314- fi
315-
316- go env
317- cd caddy/
318- if [ -z " ${SPC_LIBC} " ] || [ " ${SPC_LIBC} " = " musl" ]; then
319- xcaddyGoBuildFlags=" -buildmode=pie -tags cgo,netgo,osusergo,static_build,nobadger,nomysql,nopgx -ldflags \" -linkmode=external -extldflags '-static-pie ${muslStackSizeFix} ' ${extraLdflags} -X 'github.com/caddyserver/caddy/v2.CustomVersion=FrankenPHP ${FRANKENPHP_VERSION} PHP ${LIBPHP_VERSION} Caddy'\" "
320- elif [ " ${SPC_LIBC} " = " glibc" ]; then
321- xcaddyGoBuildFlags=" -buildmode=pie -tags cgo,netgo,osusergo,nobadger,nomysql,nopgx -ldflags \" -linkmode=external -extldflags '-pie' ${extraLdflags} -X 'github.com/caddyserver/caddy/v2.CustomVersion=FrankenPHP ${FRANKENPHP_VERSION} PHP ${LIBPHP_VERSION} Caddy'\" "
191+ SPC_CMD_VAR_PHP_MAKE_EXTRA_CFLAGS=" ${SPC_CMD_VAR_PHP_MAKE_EXTRA_CFLAGS} -fPIE -g"
192+ else
193+ SPC_CMD_VAR_PHP_MAKE_EXTRA_CFLAGS=" ${SPC_CMD_VAR_PHP_MAKE_EXTRA_CFLAGS} -fPIE -fstack-protector-strong -O2 -w -s"
322194fi
195+ export SPC_CMD_VAR_PHP_MAKE_EXTRA_CFLAGS
196+ export SPC_CMD_VAR_FRANKENPHP_XCADDY_MODULES=" --with github.com/dunglas/mercure/caddy --with github.com/dunglas/vulcain/caddy --with github.com/dunglas/caddy-cbrotli"
323197
198+ # Build FrankenPHP
199+ ${spcCommand} doctor --auto-fix
200+ for pkg in ${SPC_OPT_INSTALL_ARGS} ; do
201+ ${spcCommand} install-pkg " ${pkg} "
202+ done
324203# shellcheck disable=SC2086
325- CGO_ENABLED=1 \
326- XCADDY_GO_BUILD_FLAGS=${xcaddyGoBuildFlags} \
327- XCADDY_DEBUG=" ${XCADDY_DEBUG} " \
328- ${XCADDY_COMMAND} build \
329- --output " ../dist/${bin} " \
330- ${XCADDY_ARGS} \
331- --with github.com/dunglas/frankenphp=.. \
332- --with github.com/dunglas/frankenphp/caddy=.
333- cd ..
334-
335- if [ -d " ${EMBED} " ]; then
336- truncate -s 0 app.tar
337- truncate -s 0 app_checksum.txt
338- fi
204+ ${spcCommand} download --with-php=" ${PHP_VERSION} " --for-extensions=" ${PHP_EXTENSIONS} " --for-libs=" ${PHP_EXTENSION_LIBS} " ${SPC_OPT_DOWNLOAD_ARGS}
205+ # shellcheck disable=SC2086
206+ FRANKENPHP_SOURCE_DIR=${CURRENT_DIR} ${spcCommand} build --enable-zts --build-embed --build-frankenphp ${SPC_OPT_BUILD_ARGS} " ${PHP_EXTENSIONS} " --with-libs=" ${PHP_EXTENSION_LIBS} "
339207
340- if type " upx" > /dev/null 2>&1 && [ -z " ${DEBUG_SYMBOLS} " ] && [ -z " ${NO_COMPRESS} " ]; then
341- upx --best " dist/${bin} "
342- fi
208+ cd ../..
343209
344- " dist/${bin} " version
345- " dist/${bin} " build-info
210+ bin=" dist/frankenphp-${os} -${arch} "
211+ cp " dist/static-php-cli/buildroot/bin/frankenphp" " ${bin} "
212+ " ${bin} " version
213+ " ${bin} " build-info
346214
347215if [ -n " ${RELEASE} " ]; then
348- gh release upload " v${FRANKENPHP_VERSION} " " dist/ ${bin} " --repo dunglas/frankenphp --clobber
216+ gh release upload " v${FRANKENPHP_VERSION} " " ${bin} " --repo dunglas/frankenphp --clobber
349217fi
350218
351219if [ -n " ${CURRENT_REF} " ]; then
0 commit comments