Skip to content

Commit 1c328a7

Browse files
committed
feat(prebuild): support of Alpine binaries
- update dependencies - rework binding.gyp - rework msys bundle for Windows - add bundle for MUSL (Alpine) - rework bundle scripts and ci moved to prebuild
1 parent 379b7a1 commit 1c328a7

22 files changed

+354
-543
lines changed

.github/workflows/prebuild.yaml

+185-231
Large diffs are not rendered by default.

.gitignore

+1-8
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,7 @@
11
build
22
.DS_Store
33
.lock-wscript
4-
test/images/*.png
5-
examples/*.png
6-
examples/*.jpg
7-
testing
8-
out.png
9-
out.pdf
10-
out.svg
11-
.pomo
4+
125
node_modules
136
package-lock.json
147

prebuild/Alpine/preinstall.sh

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
#!/usr/bin/env sh
2+
3+
apk --no-cache add build-base cairo-dev jpeg-dev pango-dev giflib-dev librsvg-dev pixman-dev patchelf

prebuild/Alpine/uninstall.sh

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
#!/usr/bin/env sh
2+
3+
apk --purge del build-base cairo* jpeg* pango* giflib* librsvg* pixman*

prebuild/Debian/bundle.sh

+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
#!/usr/bin/env sh
2+
3+
TARGET=./source/build/Release
4+
5+
for lib in $(ldd "${TARGET}/canvas.node" | grep '=>' | cut -d " " -f 3); do
6+
echo "Copy ${lib}"
7+
cp -L "${lib}" "${TARGET}"
8+
patchelf --force-rpath --set-rpath '$ORIGIN' "${TARGET}/$(basename -- "${lib}")"
9+
done

prebuild/Debian/preinstall.sh

+4
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
#!/usr/bin/env sh
2+
3+
apt-get update
4+
apt-get install -y build-essential libcairo2-dev libjpeg-dev libpango1.0-dev libgif-dev librsvg2-dev libpixman-1-dev patchelf

prebuild/Debian/uninstall.sh

+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
apt-get purge -y build-essential libcairo2* libjpeg* libpango1.0* libgif* librsvg2* libpixman-1*
2+
#apt-get autoremove --purge -y

prebuild/Linux/Dockerfile

-43
This file was deleted.

prebuild/Linux/binding.gyp

-55
This file was deleted.

prebuild/Linux/bundle.sh

-11
This file was deleted.

prebuild/Linux/preinstall.sh

-10
This file was deleted.

prebuild/Windows/binding.gyp

-84
This file was deleted.

prebuild/Windows/bundle.sh

+69
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
#!/usr/bin/env sh
2+
3+
LIBS=()
4+
5+
WINDIR=$(cygpath -u -W)
6+
7+
TARGET=./source/build/Release
8+
9+
# Can be totally replaced with this, but MSYS throw format error if DLL has not .dll extension
10+
#for lib in $(ldd "${TARGET}/canvas.node" | grep '=>' | cut -d " " -f 3); do
11+
# if [[ "${lib}" == "${WINDIR}"* ]]; then
12+
# :
13+
# else
14+
# echo "copy ${lib} to destination"
15+
# cp "${lib}" "${TARGET}"
16+
# fi
17+
#done
18+
19+
shopt -s nocasematch
20+
function addToLibs() {
21+
local lib=${1} && shift
22+
if [[ "$(which "${lib}")" == "${WINDIR}"* ]]; then
23+
:
24+
else
25+
for libItem in ${LIBS[@]}; do
26+
if [[ "${libItem}" == "${lib}" ]]; then
27+
return
28+
fi
29+
done
30+
echo $lib
31+
fi
32+
}
33+
34+
RECURSE_INDEX=0
35+
36+
function getLibsForBinary() {
37+
local binary=$1 && shift
38+
39+
local -i count=0
40+
for binLib in $(objdump -p "$(cygpath -u "${binary}")" | grep "DLL Name:" | sed -e 's/^\s*DLL\sName:\s*//'); do
41+
if [[ ! -z "$(addToLibs ${binLib})" ]]; then
42+
echo "added ${binLib}"
43+
count=$count+1
44+
LIBS+=("${binLib}")
45+
fi
46+
done
47+
48+
if [[ count -gt 0 ]]; then
49+
local currentIndex=${RECURSE_INDEX}
50+
RECURSE_INDEX=${#LIBS[@]}
51+
# recurse if any added from last checked
52+
echo "recurse check after ${count} added"
53+
for lib in ${LIBS[@]:${currentIndex}}; do
54+
getLibsForBinary "$(which "${lib}")"
55+
done
56+
fi
57+
}
58+
59+
function copyLibs() {
60+
local DEST=$1 && shift
61+
local DEST_PATH=$(cygpath -u "${DEST}")
62+
for lib in ${LIBS[@]}; do
63+
echo "copy ${lib} to destination"
64+
cp "$(which "${lib}")" "${DEST_PATH}"
65+
done
66+
}
67+
68+
getLibsForBinary "${TARGET}/canvas.node"
69+
copyLibs "${TARGET}"

prebuild/Windows/preinstall.sh

+20-18
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,36 @@
1+
#!/usr/bin/env sh
12
# expects node, VS, and MSYS environments to be set up already. does everything else.
23

3-
deps="cairo-2 png16-16 jpeg-8 pango-1.0-0 pangocairo-1.0-0 gobject-2.0-0 glib-2.0-0 turbojpeg gif-7 freetype-6 rsvg-2-2 gsf-1-114";
4+
deps="cairo-2 png16-16 jpeg-8 pango-1.0-0 pangocairo-1.0-0 gobject-2.0-0 glib-2.0-0 turbojpeg gif-7 freetype-6 rsvg-2-2";
45

56
# install cairo and tools to create .lib
67

7-
pacman --noconfirm -S \
8-
wget \
9-
unzip \
10-
ucrt64/mingw-w64-ucrt-x86_64-binutils \
11-
ucrt64/mingw-w64-ucrt-x86_64-tools \
12-
ucrt64/mingw-w64-ucrt-x86_64-libjpeg-turbo \
13-
ucrt64/mingw-w64-ucrt-x86_64-pango \
14-
ucrt64/mingw-w64-ucrt-x86_64-cairo \
15-
ucrt64/mingw-w64-ucrt-x86_64-giflib \
16-
ucrt64/mingw-w64-ucrt-x86_64-freetype \
17-
ucrt64/mingw-w64-ucrt-x86_64-fontconfig \
18-
ucrt64/mingw-w64-ucrt-x86_64-librsvg \
19-
ucrt64/mingw-w64-ucrt-x86_64-libxml2 \
20-
ucrt64/mingw-w64-ucrt-x86_64-libgsf
8+
prefix=${MSYSTEM,,}
9+
arch=${MSYSTEM_CARCH}
10+
11+
pacman --noconfirm --needed -S \
12+
${prefix}/mingw-w64-ucrt-${arch}-binutils \
13+
${prefix}/mingw-w64-ucrt-${arch}-tools \
14+
${prefix}/mingw-w64-ucrt-${arch}-libjpeg-turbo \
15+
${prefix}/mingw-w64-ucrt-${arch}-pango \
16+
${prefix}/mingw-w64-ucrt-${arch}-cairo \
17+
${prefix}/mingw-w64-ucrt-${arch}-giflib \
18+
${prefix}/mingw-w64-ucrt-${arch}-harfbuzz \
19+
${prefix}/mingw-w64-ucrt-${arch}-freetype \
20+
${prefix}/mingw-w64-ucrt-${arch}-fontconfig \
21+
${prefix}/mingw-w64-ucrt-${arch}-librsvg \
22+
${prefix}/mingw-w64-ucrt-${arch}-libxml2
2123

2224
# create .lib files for vc++
2325

24-
echo "generating lib files for the MSYS2 UCRT64 dlls"
26+
echo "generating lib files for the MSYS2 dlls"
2527
for lib in $deps; do
26-
gendef /ucrt64/bin/lib$lib.dll > /dev/null 2>&1 || {
28+
gendef /${prefix}/bin/lib$lib.dll > /dev/null 2>&1 || {
2729
echo "could not find lib$lib.dll, have to skip ";
2830
continue;
2931
}
3032

31-
dlltool -d lib$lib.def -l /ucrt64/lib/lib$lib.lib > /dev/null 2>&1 || {
33+
dlltool -d lib$lib.def -l /${prefix}/lib/lib$lib.lib > /dev/null 2>&1 || {
3234
echo "could not create dll for lib$lib.dll";
3335
continue;
3436
}

0 commit comments

Comments
 (0)