Skip to content

Commit 1de9073

Browse files
authored
simplify build-static script (#1968)
* simplify build-static script * we don't require go anymore, since spc will install it * bring back eof newline * move to frankenphp-os-arch again * shell fmt * Add FrankenPHP Caddy modules to build script
1 parent 36062a0 commit 1de9073

1 file changed

Lines changed: 27 additions & 159 deletions

File tree

build-static.sh

Lines changed: 27 additions & 159 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ if ! type "git" >/dev/null 2>&1; then
88
exit 1
99
fi
1010

11+
CURRENT_DIR=$(pwd)
12+
1113
arch="$(uname -m)"
1214
os="$(uname -s | tr '[:upper:]' '[:lower:]')"
1315

@@ -76,25 +78,6 @@ fi
7678
defaultExtensions="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"
7779
defaultExtensionLibs="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-
9881
if [ -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
11699
fi
117100

118-
bin="frankenphp-${os}-${arch}"
119-
120101
if [ -n "${CLEAN}" ]; then
121102
rm -Rf dist/
122103
go clean -cache
@@ -194,158 +175,45 @@ if [ -n "${MIMALLOC}" ]; then
194175
fi
195176
fi
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
298179
if [ -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}"
301181
fi
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"
305187
fi
306188

307-
XCADDY_DEBUG=0
189+
export SPC_DEFAULT_C_FLAGS="-fPIC -O2"
308190
if [ -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"
322194
fi
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

347215
if [ -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
349217
fi
350218

351219
if [ -n "${CURRENT_REF}" ]; then

0 commit comments

Comments
 (0)