Skip to content

Commit d68fb7a

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 d68fb7a

22 files changed

+342
-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 lddtree

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 $(lddtree -l ${TARGET}/canvas.node|sed -r -e '/canvas.node$/d'); 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 pax-utils

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

+57
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
#!/usr/bin/env sh
2+
3+
LIBS=()
4+
5+
WINDIR=$(cygpath -u -W)
6+
7+
shopt -s nocasematch
8+
function addToLibs() {
9+
local TARGET=${1} && shift
10+
if [[ "$(which "${TARGET}")" == "${WINDIR}"* ]]; then
11+
:
12+
else
13+
for lib in ${LIBS[@]}; do
14+
if [[ "${lib}" == "${TARGET}" ]]; then
15+
return
16+
fi
17+
done
18+
echo $TARGET
19+
fi
20+
}
21+
22+
RECURSE_INDEX=0
23+
24+
function getLibsForBinary() {
25+
local TARGET=$1 && shift
26+
27+
local -i count=0
28+
for binLib in $(objdump -p "$(cygpath -u "${TARGET}")" | grep "DLL Name:"| sed -e 's/^\s*DLL\sName:\s*//'); do
29+
if [[ ! -z "$(addToLibs ${binLib})" ]]; then
30+
echo "added ${binLib}"
31+
count=$count+1
32+
LIBS+=("${binLib}")
33+
fi
34+
done
35+
36+
if [[ count -gt 0 ]]; then
37+
local CURRENT_INDEX=${RECURSE_INDEX}
38+
RECURSE_INDEX=${#LIBS[@]}
39+
# recurse if any added from last checked
40+
echo "recurse check after ${count} added"
41+
for lib in ${LIBS[@]:${CURRENT_INDEX}}; do
42+
getLibsForBinary "$(which "${lib}")"
43+
done
44+
fi
45+
}
46+
47+
function copyLibs() {
48+
local TARGET=$1 && shift
49+
local TARGET_PATH=$(cygpath -u "${TARGET}")
50+
for lib in ${LIBS[@]}; do
51+
echo "copy ${lib} to destination"
52+
cp "$(which "${lib}")" "${TARGET_PATH}"
53+
done
54+
}
55+
56+
getLibsForBinary "./source/build/Release/canvas.node"
57+
copyLibs "./source/build/Release"

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)