Skip to content

Commit 8e6a183

Browse files
authored
refactor: simplify using mimalloc (#1454)
* simplify using mimalloc * fix the duplication issue of mimalloc.o since the linker deduplicates archives automatically, but it's slightly suboptimal. better would be to prevent cgo from duplicating it in the first place. * only set stack size for musl * Update build-static.sh
1 parent 855b3f9 commit 8e6a183

File tree

1 file changed

+16
-79
lines changed

1 file changed

+16
-79
lines changed

build-static.sh

Lines changed: 16 additions & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -181,6 +181,12 @@ else
181181
if ! echo "${PHP_EXTENSION_LIBS}" | grep -q "\bbrotli\b"; then
182182
PHP_EXTENSION_LIBS="${PHP_EXTENSION_LIBS},brotli"
183183
fi
184+
# The mimalloc library must be built if MIMALLOC is true
185+
if [ -n "${MIMALLOC}" ]; then
186+
if ! echo "${PHP_EXTENSION_LIBS}" | grep -q "\bmimalloc\b"; then
187+
PHP_EXTENSION_LIBS="${PHP_EXTENSION_LIBS},mimalloc"
188+
fi
189+
fi
184190

185191
${spcCommand} doctor --auto-fix
186192
# shellcheck disable=SC2086
@@ -248,6 +254,10 @@ if [ "${os}" = "linux" ] && [ "${SPC_LIBC}" = "glibc" ]; then
248254
fi
249255

250256
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)"
257+
if [[ "$CGO_LDFLAGS" == *"${PWD}/buildroot/lib/mimalloc.o"* ]]; then
258+
CGO_LDFLAGS=${CGO_LDFLAGS//${PWD}\/buildroot\/lib\/mimalloc.o/}
259+
CGO_LDFLAGS="${PWD}/buildroot/lib/libmimalloc.a $CGO_LDFLAGS"
260+
fi
251261
if [ "${os}" = "linux" ] && [ "${SPC_LIBC}" = "glibc" ]; then
252262
CGO_LDFLAGS="${CGO_LDFLAGS//-lphp/-Wl,--whole-archive -lphp -Wl,--no-whole-archive}"
253263
# shellcheck disable=SC2046
@@ -260,83 +270,6 @@ LIBPHP_VERSION="$(./buildroot/bin/php-config --version)"
260270

261271
cd ../
262272

263-
if [ "${os}" = "linux" ]; then
264-
if [ -n "${MIMALLOC}" ]; then
265-
# Replace musl's mallocng by mimalloc
266-
# The default musl allocator is slow, especially when used by multi-threaded apps,
267-
# and triggers weird bugs
268-
# Adapted from https://www.tweag.io/blog/2023-08-10-rust-static-link-with-mimalloc/
269-
270-
echo 'The USE_MIMALLOC environment variable is EXPERIMENTAL.'
271-
echo 'This option can be removed or its behavior modified at any time.'
272-
273-
if [ ! -f "mimalloc/out/libmimalloc.a" ]; then
274-
if [ -d "mimalloc" ]; then
275-
cd mimalloc/
276-
git reset --hard
277-
git clean -xdf
278-
git fetch --tags
279-
else
280-
git clone https://github.com/microsoft/mimalloc.git
281-
cd mimalloc/
282-
fi
283-
284-
# mimalloc version must be compatible with version used in tweag/rust-alpine-mimalloc
285-
git checkout v3.0.1
286-
287-
curl -fL --retry 5 https://raw.githubusercontent.com/tweag/rust-alpine-mimalloc/1a756444a5c1484d26af9cd39187752728416ba8/mimalloc.diff -o mimalloc.diff
288-
patch -p1 <mimalloc.diff
289-
290-
mkdir -p out/
291-
cd out/
292-
if [ -n "${DEBUG_SYMBOLS}" ]; then
293-
cmake \
294-
-DCMAKE_BUILD_TYPE=Debug \
295-
-DMI_BUILD_SHARED=OFF \
296-
-DMI_BUILD_OBJECT=OFF \
297-
-DMI_BUILD_TESTS=OFF \
298-
../
299-
else
300-
cmake \
301-
-DCMAKE_BUILD_TYPE=Release \
302-
-DMI_BUILD_SHARED=OFF \
303-
-DMI_BUILD_OBJECT=OFF \
304-
-DMI_BUILD_TESTS=OFF \
305-
../
306-
fi
307-
make -j"$(nproc || true)"
308-
309-
cd ../../
310-
fi
311-
312-
if [ -n "${DEBUG_SYMBOLS}" ]; then
313-
libmimalloc_path=mimalloc/out/libmimalloc-debug.a
314-
else
315-
libmimalloc_path=mimalloc/out/libmimalloc.a
316-
fi
317-
318-
# Patch musl library to use mimalloc
319-
for libc_path in "/usr/local/musl/lib/libc.a" "/usr/local/musl/$(uname -m)-linux-musl/lib/libc.a" "/usr/lib/libc.a"; do
320-
if [ ! -f "${libc_path}" ] || [ -f "${libc_path}.unpatched" ]; then
321-
continue
322-
fi
323-
324-
{
325-
echo "CREATE libc.a"
326-
echo "ADDLIB ${libc_path}"
327-
echo "DELETE aligned_alloc.lo calloc.lo donate.lo free.lo libc_calloc.lo lite_malloc.lo malloc.lo malloc_usable_size.lo memalign.lo posix_memalign.lo realloc.lo reallocarray.lo valloc.lo"
328-
echo "ADDLIB ${libmimalloc_path}"
329-
echo "SAVE"
330-
} | ar -M
331-
mv "${libc_path}" "${libc_path}.unpatched"
332-
mv libc.a "${libc_path}"
333-
done
334-
fi
335-
336-
# Increase the default stack size to prevents issues with code including many files such as Symfony containers
337-
extraExtldflags="-Wl,-z,stack-size=0x80000"
338-
fi
339-
340273
if [ -z "${DEBUG_SYMBOLS}" ]; then
341274
extraLdflags="-w -s"
342275
fi
@@ -358,12 +291,16 @@ if [ -n "${DEBUG_SYMBOLS}" ]; then
358291
XCADDY_DEBUG=1
359292
fi
360293

294+
if [ "${SPC_LIBC}" = "musl" ]; then
295+
muslStackSizeFix="-Wl,-z,stack-size=0x80000"
296+
fi
297+
361298
go env
362299
cd caddy/
363300
if [ -z "${SPC_LIBC}" ] || [ "${SPC_LIBC}" = "musl" ]; then
364-
xcaddyGoBuildFlags="-buildmode=pie -tags cgo,netgo,osusergo,static_build,nobadger,nomysql,nopgx -ldflags \"-linkmode=external -extldflags '-static-pie ${extraExtldflags}' ${extraLdflags} -X 'github.com/caddyserver/caddy/v2.CustomVersion=FrankenPHP ${FRANKENPHP_VERSION} PHP ${LIBPHP_VERSION} Caddy'\""
301+
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'\""
365302
elif [ "${SPC_LIBC}" = "glibc" ]; then
366-
xcaddyGoBuildFlags="-buildmode=pie -tags cgo,netgo,osusergo,nobadger,nomysql,nopgx -ldflags \"-linkmode=external -extldflags '-pie ${extraExtldflags}' ${extraLdflags} -X 'github.com/caddyserver/caddy/v2.CustomVersion=FrankenPHP ${FRANKENPHP_VERSION} PHP ${LIBPHP_VERSION} Caddy'\""
303+
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'\""
367304
fi
368305

369306
# shellcheck disable=SC2086

0 commit comments

Comments
 (0)