Skip to content

Commit 4780ec7

Browse files
committed
prebuild with gha
1 parent 2e9ea73 commit 4780ec7

16 files changed

Lines changed: 517 additions & 1 deletion

.github/workflows/prebuild.yaml

Lines changed: 161 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,161 @@
1+
name: Make Prebuilds
2+
on: [push]
3+
# TODO:
4+
# on:
5+
# release:
6+
# types:
7+
# - created
8+
9+
# When a new Node.js version is released, publish a new node-canvas release that
10+
# adds that version to CI and the build? Could do on.push.branches: "master"
11+
# with paths: ".github/workflows/prebuild.yaml", but how do we get the right
12+
# $GITHUB_REF?
13+
14+
env:
15+
CANVAS_VERSION_TO_BUILD: "2.6.1" # no "v" prefix. TODO switch to $GITHUB_REF if we switch to `on: release`
16+
CANVAS_PREBUILT_VERSION: "0.0.1"
17+
18+
jobs:
19+
Linux:
20+
strategy:
21+
matrix:
22+
node: [10, 12, 14]
23+
name: Node.js ${{ matrix.node }} on Linux
24+
runs-on: ubuntu-latest
25+
container:
26+
image: chearon/canvas-prebuilt:7
27+
steps:
28+
- uses: actions/checkout@v2
29+
30+
- uses: actions/setup-node@v1
31+
with:
32+
node-version: ${{ matrix.node }}
33+
34+
- name: Build
35+
env:
36+
OS: ${{ runner.os }}
37+
run: |
38+
npm install -g node-gyp
39+
npm install --ignore-scripts
40+
. prebuild/$OS/preinstall.sh
41+
cp prebuild/$OS/binding.gyp binding.gyp
42+
node-gyp rebuild -j 2
43+
. prebuild/$OS/bundle.sh
44+
45+
- name: Test binary
46+
run: node -e "require('.')"
47+
48+
- name: Make bundle
49+
id: make_bundle
50+
run: |
51+
ASSET_NAME=$(. prebuild/tarball.sh $CANVAS_PREBUILT_VERSION)
52+
echo "::set-output name=asset_name::${ASSET_NAME}"
53+
ls -l
54+
55+
- name: Upload
56+
uses: actions/github-script@0.9.0
57+
with:
58+
script: |
59+
const fs = require("fs");
60+
const assetName = "${{ steps.make_bundle.outputs.asset_name }}";
61+
const tagName = `v${process.env.CANVAS_PREBUILT_VERSION}`;
62+
63+
const releases = await github.repos.listReleases({
64+
owner: process.env.GITHUB_REPOSITORY.split("/")[0],
65+
repo: process.env.GITHUB_REPOSITORY.split("/")[1]
66+
});
67+
const release = releases.data.find(r => r.tag_name === tagName);
68+
69+
for (const asset of release.assets) {
70+
if (asset.name === assetName) {
71+
await github.repos.deleteReleaseAsset({
72+
owner: process.env.GITHUB_REPOSITORY.split("/")[0],
73+
repo: process.env.GITHUB_REPOSITORY.split("/")[1],
74+
asset_id: asset.id
75+
});
76+
break;
77+
}
78+
}
79+
80+
// (This is equivalent to actions/upload-release-asset. We're
81+
// already in a script, so might as well do it here.)
82+
const r = await github.repos.uploadReleaseAsset({
83+
url: release.upload_url,
84+
headers: {
85+
"content-type": "application/x-gzip",
86+
"content-length": `${fs.statSync(assetName).size}`
87+
},
88+
name: assetName,
89+
data: fs.readFileSync(assetName)
90+
});
91+
92+
macOS:
93+
strategy:
94+
matrix:
95+
node: [10, 12, 14]
96+
name: Node.js ${{ matrix.node }} on macOS
97+
runs-on: macos-latest
98+
steps:
99+
- uses: actions/checkout@v2
100+
101+
- uses: actions/setup-node@v1
102+
with:
103+
node-version: ${{ matrix.node }}
104+
105+
- name: Build
106+
env:
107+
OS: ${{ runner.os }}
108+
run: |
109+
npm install -g node-gyp
110+
npm install --ignore-scripts
111+
. prebuild/$OS/preinstall.sh
112+
cp prebuild/$OS/binding.gyp binding.gyp
113+
node-gyp rebuild -j 2
114+
. prebuild/$OS/bundle.sh
115+
116+
- name: Test binary
117+
run: node -e "require('.')"
118+
119+
- name: Make bundle
120+
id: make_bundle
121+
run: |
122+
ASSET_NAME=$(. prebuild/tarball.sh $CANVAS_PREBUILT_VERSION)
123+
echo "::set-output name=asset_name::${ASSET_NAME}"
124+
ls -l
125+
126+
- name: Upload
127+
uses: actions/github-script@0.9.0
128+
with:
129+
script: |
130+
const fs = require("fs");
131+
const assetName = "${{ steps.make_bundle.outputs.asset_name }}";
132+
const tagName = `v${process.env.CANVAS_PREBUILT_VERSION}`;
133+
134+
const releases = await github.repos.listReleases({
135+
owner: process.env.GITHUB_REPOSITORY.split("/")[0],
136+
repo: process.env.GITHUB_REPOSITORY.split("/")[1]
137+
});
138+
const release = releases.data.find(r => r.tag_name === tagName);
139+
140+
for (const asset of release.assets) {
141+
if (asset.name === assetName) {
142+
await github.repos.deleteReleaseAsset({
143+
owner: process.env.GITHUB_REPOSITORY.split("/")[0],
144+
repo: process.env.GITHUB_REPOSITORY.split("/")[1],
145+
asset_id: asset.id
146+
});
147+
break;
148+
}
149+
}
150+
151+
// (This is equivalent to actions/upload-release-asset. We're
152+
// already in a script, so might as well do it here.)
153+
const r = await github.repos.uploadReleaseAsset({
154+
url: release.upload_url,
155+
headers: {
156+
"content-type": "application/x-gzip",
157+
"content-length": `${fs.statSync(assetName).size}`
158+
},
159+
name: assetName,
160+
data: fs.readFileSync(assetName)
161+
});

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@
3535
"binary": {
3636
"module_name": "canvas",
3737
"module_path": "build/Release",
38-
"host": "https://github.com/node-gfx/node-canvas-prebuilt/releases/download/",
38+
"host": "https://github.com/Automattic/node-canvas/releases/download/",
3939
"remote_path": "v{version}",
4040
"package_name": "{module_name}-v{version}-{node_abi}-{platform}-{libc}-{arch}.tar.gz"
4141
},

prebuild/Linux/binding.gyp

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
{
2+
'targets': [
3+
{
4+
'target_name': 'canvas',
5+
'sources': [
6+
'src/backend/Backend.cc',
7+
'src/backend/ImageBackend.cc',
8+
'src/backend/PdfBackend.cc',
9+
'src/backend/SvgBackend.cc',
10+
'src/bmp/BMPParser.cc',
11+
'src/Backends.cc',
12+
'src/Canvas.cc',
13+
'src/CanvasGradient.cc',
14+
'src/CanvasPattern.cc',
15+
'src/CanvasRenderingContext2d.cc',
16+
'src/closure.cc',
17+
'src/color.cc',
18+
'src/Image.cc',
19+
'src/ImageData.cc',
20+
'src/init.cc',
21+
'src/register_font.cc'
22+
],
23+
'defines': [
24+
'HAVE_GIF',
25+
'HAVE_JPEG',
26+
'HAVE_RSVG'
27+
],
28+
'libraries': [
29+
'<!@(pkg-config pixman-1 --libs)',
30+
'<!@(pkg-config cairo --libs)',
31+
'<!@(pkg-config libpng --libs)',
32+
'<!@(pkg-config pangocairo --libs)',
33+
'<!@(pkg-config freetype2 --libs)',
34+
'<!@(pkg-config librsvg-2.0 --libs)',
35+
'-ljpeg',
36+
'-lgif'
37+
],
38+
'include_dirs': [
39+
'<!(node -e "require(\'nan\')")',
40+
'<!@(pkg-config cairo --cflags-only-I | sed s/-I//g)',
41+
'<!@(pkg-config libpng --cflags-only-I | sed s/-I//g)',
42+
'<!@(pkg-config pangocairo --cflags-only-I | sed s/-I//g)',
43+
'<!@(pkg-config freetype2 --cflags-only-I | sed s/-I//g)',
44+
'<!@(pkg-config librsvg-2.0 --cflags-only-I | sed s/-I//g)'
45+
],
46+
'ldflags': [
47+
'-Wl,-rpath \'-Wl,$$ORIGIN\''
48+
],
49+
'cflags!': ['-fno-exceptions'],
50+
'cflags_cc!': ['-fno-exceptions']
51+
}
52+
]
53+
}

prebuild/Linux/bundle.sh

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
copies=$(lddtree.sh -l node-canvas/build/Release/canvas.node | sed -r -e '/^\/lib/d' -e '/canvas.node$/d');
2+
3+
for so in $copies; do
4+
cp $so node-canvas/build/Release
5+
done;

prebuild/Linux/preinstall.sh

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
# apt-get-style dependencies aren't done here since the
2+
# linux build is done on a docker image that has them
3+
4+
git clone git://anongit.gentoo.org/proj/pax-utils.git
5+
cd pax-utils
6+
PATH=$PATH:$PWD
7+
make
8+
cd ..

prebuild/Windows/binding.gyp

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
{
2+
'targets': [
3+
{
4+
'target_name': 'canvas',
5+
'sources': [
6+
'src/backend/Backend.cc',
7+
'src/backend/ImageBackend.cc',
8+
'src/backend/PdfBackend.cc',
9+
'src/backend/SvgBackend.cc',
10+
'src/bmp/BMPParser.cc',
11+
'src/Backends.cc',
12+
'src/Canvas.cc',
13+
'src/CanvasGradient.cc',
14+
'src/CanvasPattern.cc',
15+
'src/CanvasRenderingContext2d.cc',
16+
'src/closure.cc',
17+
'src/color.cc',
18+
'src/Image.cc',
19+
'src/ImageData.cc',
20+
'src/init.cc',
21+
'src/register_font.cc'
22+
],
23+
'defines': [
24+
'HAVE_GIF',
25+
'HAVE_JPEG',
26+
'HAVE_RSVG',
27+
'HAVE_BOOLEAN', # or jmorecfg.h tries to define it
28+
'_USE_MATH_DEFINES' # for M_PI
29+
],
30+
'libraries': [
31+
'C:/msys64/mingw64/lib/libcairo-2.lib',
32+
'C:/msys64/mingw64/lib/libpng16-16.lib',
33+
'C:/msys64/mingw64/lib/libjpeg-8.lib',
34+
'C:/msys64/mingw64/lib/libpango-1.0-0.lib',
35+
'C:/msys64/mingw64/lib/libpangocairo-1.0-0.lib',
36+
'C:/msys64/mingw64/lib/libgobject-2.0-0.lib',
37+
'C:/msys64/mingw64/lib/libglib-2.0-0.lib',
38+
'C:/msys64/mingw64/lib/libturbojpeg.lib',
39+
'C:/msys64/mingw64/lib/libgif-7.lib',
40+
'C:/msys64/mingw64/lib/libfreetype-6.lib',
41+
'C:/msys64/mingw64/lib/librsvg-2-2.lib'
42+
],
43+
'include_dirs': [
44+
'<!(node -e "require(\'nan\')")',
45+
'C:/msys64/mingw64/include',
46+
'C:/msys64/mingw64/include/pango-1.0',
47+
'C:/msys64/mingw64/include/cairo',
48+
'C:/msys64/mingw64/include/libpng16',
49+
'C:/msys64/mingw64/include/glib-2.0',
50+
'C:/msys64/mingw64/lib/glib-2.0/include',
51+
'C:/msys64/mingw64/include/pixman-1',
52+
'C:/msys64/mingw64/include/freetype2',
53+
'C:/msys64/mingw64/include/fontconfig',
54+
'C:/msys64/mingw64/include/librsvg-2.0',
55+
'C:/msys64/mingw64/include/gdk-pixbuf-2.0'
56+
],
57+
'configurations': {
58+
'Debug': {
59+
'msvs_settings': {
60+
'VCCLCompilerTool': {
61+
'WarningLevel': 4,
62+
'ExceptionHandling': 1,
63+
'DisableSpecificWarnings': [4100, 4127, 4201, 4244, 4267, 4506, 4611, 4714, 4512]
64+
}
65+
}
66+
},
67+
'Release': {
68+
'msvs_settings': {
69+
'VCCLCompilerTool': {
70+
'WarningLevel': 4,
71+
'ExceptionHandling': 1,
72+
'DisableSpecificWarnings': [4100, 4127, 4201, 4244, 4267, 4506, 4611, 4714, 4512]
73+
}
74+
}
75+
}
76+
}
77+
}
78+
]
79+
}

prebuild/Windows/bundle.sh

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
# write recurisve dependencies of canvas.node into depends.csv
2+
./depends -c -oc:depends.csv node-canvas/build/Release/canvas.node;
3+
4+
[ -f depends.csv ] || {
5+
echo "error invoking depends.exe";
6+
exit 1;
7+
}
8+
9+
# case-insensitive intersection of 3rd column of depends.csv
10+
# and all files ending in .dll in the mingw64 directory
11+
copies=$(comm -12 \
12+
<(cat depends.csv | cut -d ',' -f2 | sed 's/"//g' | tr '[:upper:]' '[:lower:]' | sort) \
13+
<(find /mingw64/bin -name '*.dll' -printf "%f\n" | tr '[:upper:]' '[:lower:]' | sort) \
14+
);
15+
16+
for dll in $copies; do
17+
cp /mingw64/bin/$dll node-canvas/build/Release
18+
done;
19+
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
@echo off
2+
3+
rem sets up MSYS environment and invokes the script argument in bash
4+
5+
set WD=C:\msys64\usr\bin\
6+
set MSYSTEM=MINGW64
7+
%WD%bash --login -c "cd $(cygpath '%cd%'); ""%~1"" ""%~2"" ""%~3"" ""%~4"" ""%~5"" ""%~6"" ""%~7"" ""%~8"" ""%~9"""
8+

prebuild/Windows/node_version.sh

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
VER=$1
2+
powershell -Command "Install-Product node $VER x64"

prebuild/Windows/preinstall.sh

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
# expects node, VS, and MSYS environments to be set up already. does everything else.
2+
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";
4+
5+
# install cairo and tools to create .lib
6+
7+
pacman --noconfirm -S \
8+
wget \
9+
unzip \
10+
mingw64/mingw-w64-x86_64-binutils \
11+
mingw64/mingw-w64-x86_64-tools \
12+
mingw64/mingw-w64-x86_64-libjpeg-turbo \
13+
mingw64/mingw-w64-x86_64-pango \
14+
mingw64/mingw-w64-x86_64-cairo \
15+
mingw64/mingw-w64-x86_64-giflib \
16+
mingw64/mingw-w64-x86_64-freetype \
17+
mingw64/mingw-w64-x86_64-fontconfig \
18+
mingw64/mingw-w64-x86_64-librsvg
19+
20+
# create .lib files for vc++
21+
22+
echo "generating lib files for the MSYS2 dlls"
23+
for lib in $deps; do
24+
gendef /mingw64/bin/lib$lib.dll > /dev/null 2>&1 || {
25+
echo "could not find lib$lib.dll, have to skip ";
26+
continue;
27+
}
28+
29+
dlltool -d lib$lib.def -l /mingw64/lib/lib$lib.lib > /dev/null 2>&1 || {
30+
echo "could not create dll for lib$lib.dll";
31+
continue;
32+
}
33+
34+
echo "created lib$lib.lib from lib$lib.dll";
35+
36+
rm lib$lib.def
37+
done
38+
39+
# dependency walker will help us figure out which DLLs
40+
# canvas.node directly and indirectly uses
41+
42+
wget -nc http://www.dependencywalker.com/depends22_x64.zip
43+
unzip -u depends22_x64.zip
44+

0 commit comments

Comments
 (0)