-
Notifications
You must be signed in to change notification settings - Fork 1.2k
Installation: Windows (using MSYS2)
MSYS is currently the recommended way to get Pango and the whole GTK stack, so you probably won't get more up-to-date libraries any other way. It is possible but difficult to compile Cairo on Windows, and the Installation: Windows wiki does have less steps but the files are at a fixed, older version
Follow the instructions here - Installation: Windows#1-installing-node-gyp
- Get the latest 64 bit MSYS2 installer from here
- In the MSYS2 shell, install cairo and its dependencies with pacman:
pacman -S mingw64/mingw-w64-x86_64-cairo
and the tools that will be needed to create .lib files for the Visual Studio linker:
pacman -S mingw64/mingw-w64-x86_64-binutils mingw64/mingw-w64-x86_64-tools
- Now you just need to generate .lib files for the DLLs you need to link to. To do that:
/mingw64_shell.bat # gives you a MinGW64 shell
gendef /mingw64/bin/libcairo-2.dll
dlltool -d libcairo-2.def -l /mingw64/lib/libcairo-2.lib
gendef /mingw64/bin/libpng16-16.dll
dlltool -d libpng16-16.def -l /mingw64/lib/libpng16-16.lib
rm libcairo-2.def libpng16-16.def
-
Inside
binding.gyp
from node-canvas's root, the paths to the lib files are hard-coded on the Windows platform. You will have to edit it. ChangeGTK_ROOT
to beC:/msys64/mingw64
, and changepng.lib
to belibpng16-16.lib
andcairo.lib
tolibcairo-2.lib
and then runnode-gyp rebuild
. -
The final step just involves copying all of the DLLs in
/mingw64/bin
into Canvas'sbuild/Release
folder. There are a lot of them, around 20MB worth. You could use Dependency Walker to figure out which ones are really needed, or you can copy them all. After that you're all done!
By hand-editing the binding.gyp
you can get all of the features of node-canvas - full Pango, FreeType and JPEG support even with libjpeg-turbo for super fast compression. You just have to generate the .lib
files as shown above and edit the GYP file's paths, also don't forget to set the with_<lib>
to true at the very top.
Node script (just type node, and paste it in REPL):
var dir='c:/msys64/mingw64'
var printdir='/c/msys64/mingw64'
function findandmakelibscommands(libnames)
{
var libs=libnames.split("|")
var re=new RegExp( "^(lib|)("+libs.join('|')+")[\\d\\b\\-\\.]+dll$" );
var dlls=require('fs').readdirSync(dir+'/bin').filter(function(a){ return a.match(re)})
var lines=dlls.map(function(file){
var dllfile=printdir+'/bin/'+file;
var libfile=printdir+'/lib/'+file.replace(/dll$/,'lib');
var deffile=file.replace(/dll$/,'def');
return 'gendef '+dllfile+'\r\n'+
'dlltool -d '+deffile+' -l '+libfile+' \r\n'+
'rm '+deffile+'\r\n'
}).join('\r\n')
var newlibs=dlls.map(function(file){
return " '-l<(GTK_Root)/lib/"+file.replace(/dll$/,'lib')+"'";
}).join(',\r\n')
console.log('\r\n'+lines+'\r\n\r\n new lib lines: \r\n'+newlibs+'\r\n\r\n')
}
findandmakelibscommands("cairo|png|pangocairo|pango|freetype|glib|gobject") // canvas
findandmakelibscommands("rsvg|gio|gdk_pixbuf|intl") // rsvg
the result is:
open C:\msys64\mingw64.exe and paste it
> findandmakelibscommands("cairo|png|pangocairo|pango|freetype|glib|gobject") // canvas
gendef /c/msys64/mingw64/bin/libcairo-2.dll
dlltool -d libcairo-2.def -l /c/msys64/mingw64/lib/libcairo-2.lib
rm libcairo-2.def
gendef /c/msys64/mingw64/bin/libfreetype-6.dll
dlltool -d libfreetype-6.def -l /c/msys64/mingw64/lib/libfreetype-6.lib
rm libfreetype-6.def
gendef /c/msys64/mingw64/bin/libglib-2.0-0.dll
dlltool -d libglib-2.0-0.def -l /c/msys64/mingw64/lib/libglib-2.0-0.lib
rm libglib-2.0-0.def
gendef /c/msys64/mingw64/bin/libgobject-2.0-0.dll
dlltool -d libgobject-2.0-0.def -l /c/msys64/mingw64/lib/libgobject-2.0-0.lib
rm libgobject-2.0-0.def
gendef /c/msys64/mingw64/bin/libpango-1.0-0.dll
dlltool -d libpango-1.0-0.def -l /c/msys64/mingw64/lib/libpango-1.0-0.lib
rm libpango-1.0-0.def
gendef /c/msys64/mingw64/bin/libpangocairo-1.0-0.dll
dlltool -d libpangocairo-1.0-0.def -l /c/msys64/mingw64/lib/libpangocairo-1.0-0.lib
rm libpangocairo-1.0-0.def
gendef /c/msys64/mingw64/bin/libpng16-16.dll
dlltool -d libpng16-16.def -l /c/msys64/mingw64/lib/libpng16-16.lib
rm libpng16-16.def
new lib lines:
'-l<(GTK_Root)/lib/libcairo-2.lib',
'-l<(GTK_Root)/lib/libfreetype-6.lib',
'-l<(GTK_Root)/lib/libglib-2.0-0.lib',
'-l<(GTK_Root)/lib/libgobject-2.0-0.lib',
'-l<(GTK_Root)/lib/libpango-1.0-0.lib',
'-l<(GTK_Root)/lib/libpangocairo-1.0-0.lib',
'-l<(GTK_Root)/lib/libpng16-16.lib'
> findandmakelibscommands("rsvg|gio|gdk_pixbuf|intl") // rsvg
gendef /c/msys64/mingw64/bin/libgdk_pixbuf-2.0-0.dll
dlltool -d libgdk_pixbuf-2.0-0.def -l /c/msys64/mingw64/lib/libgdk_pixbuf-2.0-0.lib
rm libgdk_pixbuf-2.0-0.def
gendef /c/msys64/mingw64/bin/libgio-2.0-0.dll
dlltool -d libgio-2.0-0.def -l /c/msys64/mingw64/lib/libgio-2.0-0.lib
rm libgio-2.0-0.def
gendef /c/msys64/mingw64/bin/libintl-8.dll
dlltool -d libintl-8.def -l /c/msys64/mingw64/lib/libintl-8.lib
rm libintl-8.def
gendef /c/msys64/mingw64/bin/librsvg-2-2.dll
dlltool -d librsvg-2-2.def -l /c/msys64/mingw64/lib/librsvg-2-2.lib
rm librsvg-2-2.def
new lib lines:
'-l<(GTK_Root)/lib/libgdk_pixbuf-2.0-0.lib',
'-l<(GTK_Root)/lib/libgio-2.0-0.lib',
'-l<(GTK_Root)/lib/libintl-8.lib',
'-l<(GTK_Root)/lib/librsvg-2-2.lib'