% language=us runpath=texruns:manuals/libraries % author : Hans Hagen % copyright : ConTeXt Development Team % license : Creative Commons Attribution ShareAlike 4.0 International % reference : pragma-ade.nl | contextgarden.net | texlive (related) distributions % origin : the ConTeXt distribution % % comment : Because this manual is distributed with TeX distributions it comes with a rather % liberal license. We try to adapt these documents to upgrades in the (sub)systems % that they describe. Using parts of the content otherwise can therefore conflict % with existing functionality and we cannot be held responsible for that. Many of % the manuals contain characteristic graphics and personal notes or examples that % make no sense when used out-of-context. % % comment : Some chapters might have been published in TugBoat, the NTG Maps, the ConTeXt % Group journal or otherwise. Thanks to the editors for corrections. Also thanks % to users for testing, feedback and corrections. \usemodule[art-01,abr-02] \definecolor [maincolor] [r=.4] \definecolor [extracolor] [g=.4] \setupbodyfont [11pt] \setuptype [color=maincolor] \setuptyping [color=maincolor] \definefontsynonym [TitlePageMono] [file:lmmonoproplt10-bold*default] \setuphead [color=maincolor] \usesymbols [cc] \setupinteraction [hidden] \loadfontgoodies[lm] \startdocument [metadata:author=Hans Hagen, metadata:title=Libraries in ConTeXt, author=Hans Hagen, affiliation=PRAGMA ADE, location=Hasselt NL, title=Libraries in \ConTeXt, support=www.contextgarden.net, website=www.pragma-ade.nl] \startluasetups[libraries] context.nohyphens() for i=1,640 do context.definedfont { string.formatters["TitlePageMono at %p"](65536*(10+math.random(5))) } context("Libraries ") end context.removeunwantedspaces() \stopluasetups \startMPpage StartPage ; fill Page enlarged 1cm withcolor \MPcolor{extracolor} ; draw textext("\framed[loffset=2pt,roffset=2pt,frame=off,width=\paperwidth,align={normal,paragraph,verytolerant,stretch}]{\luasetup{libraries}}") xysized (PaperWidth,PaperHeight) shifted center Page withcolor .8white ; draw textext.ulft("\definedfont[TitlePageMono]basics") xsized .75PaperWidth shifted lrcorner Page shifted (-1cm,2cm) withcolor \MPcolor{maincolor} ; % draw textext.ulft("\definedfont[TitlePageMono]in context mkiv") % xsized .6PaperWidth % shifted lrcorner Page % shifted (-1cm,6cm) % withcolor \MPcolor{maincolor} ; StopPage ; \stopMPpage \dontcomplain \startsubject[title=Contents] \placelist[section][alternative=a] \stopsubject \startsection[title=Introduction] Since we started developing \LUATEX\ several methods have been explored with regards to external libraries. Now, before we go into details, it must be said that in practice this feature is hardly needed. If someone really needs it, it is likely to be in a setting where one can also write some library interface and compile \LUATEX\ to suit it. So, what we're talking of here is probably not of interest for all of you. In the perspective of \CONTEXT\ a dependency on a library is not what we have in mind when we advocate long term usage (and stability) of a workflow. If you see \TEX\ as an independent component but still depend on its use of libraries you might consider having a backup plan in case a library is no longer maintained, of when it gets replaced by another favourite, as happens. There are several ways to use a library, and we mention a few here. The first one is to use \LUA\ {\em wrapper} libraries that interface to some {\em specific} library. This is what you do when you use \LUA\ as stand alone program. In that case you depend on someone cooking up an efficient and reliable interface. Then you depend on the author or others to provide the binaries. If there is only one target platform you can wonder if you like that additional dependency. Another aspect to keep in mind is that such a wrapper library has to match both the used library and the version of \LUA\ that you use. When we use this method in \LUATEX, one also has also to make sure that the \LUATEX\ binary is compiled in a way that permits loading (this has to do with exposing symbols that need a runtime binding). Because this didn't work out well in practice, already before version 1.0 showed up we explored a flexible way to create libraries suited for \LUATEX. This project was tagged \quotation {\SWIGLIB}. An infrastructure was created and a couple of example library interfaces were provided. However, in practice this never catched on and we don't expect distributions to provide libraries in addition to the main \LUATEX\ binary, but the framework is there for those who want to play with it. Not long after we released \LUATEX\ 1.0, we started experimenting a bit more with so called foreign function interface: \FFI. Originally that interface to external libraries was only available in \LUAJITTEX, but a good and compatible alternative is now also available in the normal engine too. For users it is not that relevant to know how it works, as long as it works. It means that in addition to \SWIGLIB\ we have a method that doesn't demand compilation as it uses normal (public) libraries. A last alternative we mention is to just add the libraries to the \LUATEX\ engine. In fact, this happens: the \METAPOST\ binary has been provided this way for quite a while now. In \LUAMETATEX\ for instance some more math related libraries were added, simply because the overhead is not that large and because it is a way to extend \METAPOST\ beyond what it provided out of the box. Before we proceed, ask yourself this questions: \quotation {Do I really need more libraries?} For instance does it really make sense to use \CURL, \GHOSTSCRIPT\ or \GRAPHICSMAGICK\ libraries while the command line version is (normally) just as efficient and avoids a dependency. This is even more true if you realizes that for instance a fetch or conversion only needs to happen once per run or in fact only when there is some change in the resource. On the other hand, when accessing databases one can avoid the often slower command line calls and save the hassle of intermediate files. Here efficiency wins. Also, when \CONTEXT\ is used in a high performance database backend application a distribution and the used libraries are not updated on a daily basis. Anyway, if the answer to the question, and it can depend on what variant of \CONTEXT\ you use: \MKIV\ or \LMTX, is \quotation {Yes!} then read on. \stopsection \startsection[title=Usage in \MKIV] Although there are (still) some examples of \SWIGLIB\ in \MKIV\ we now assume that the \FFI\ interface is used. Apart from some experiments we currently can use \FFI\ interfaced libraries in: \starttabulate[|l|l|l|l|l|] \FL \BC module \BC library \BC windows \BC unix \NC \NR \ML \NC util-crl \NC curl \NC libcurl \NC libcurl \NC \NR % todo: client and ffi \NC util-sql-imp-ffi \NC mysql \NC libmysql \NC libmysqlclient \NC \NR \NC util-sql-imp-sqlite \NC sqlite \NC sqlite3 \NC sqlite3 \NC \NR %NC font-phb-imp-library \NC harfbuzz \NC libharfbuzz \NC libharfbuzz \NC \NR % old, for testing uniscribe (idris fonts) %NC \NC ghostscript \NC \NC \NC \NR % only a few experiments %NC \NC graphicsmagick \NC \NC \NC \NR % only a few experiments \LL \stoptabulate The profiler that we occasionally use to identify bottlenecks in the engine (for instance when we upgrade \LUA) uses \FFI\ to provide access to the high resolution timers but this is typically different per platform. One problem with libraries, especially on \WINDOWS\ is that the library is found on some system path and it can happen that multiple programs ship the same library but in different versions. You can try to play safe and put libraries in the \TEX\ tree, for instance on my system they are in: \starttyping c:/data/tex-context/tex/texmf-win64/bin/lib/luatex/foo/libfoo.dll \stoptyping You can trace where libraries are looked for with: \starttyping \enabletrackers[resolvers.ffilib] \stoptyping or in \LUA\ with: \starttyping trackers.enable("resolvers.ffilib") \stoptyping The library is first located on one of the valid \TDS\ paths (these are sort of standardized in \TEX\ distributions) and then using the normal \FFI\ loader. \stopsection \startsection[title=Usage in \LMTX] In \CONTEXT\ \LMTX\ we only have so called \quote {optional} libraries. Actually they are just simple interfaces that register themselves in the \type {optional} namespace and that can load the real library at runtime. The approach is rather lightweight in the sense that compilation of the \LUAMETATEX\ binary doesn't depend on additional resources (there is no need to have the libraries on the system or their source code to be present) and that at runtime there is no need to have the libraries present. This sounds similar to delayed loading of \LUA\ wrapper libraries but the difference is that there is no potential \LUA\ version clash and we also still have one single (relatively small) binary. This approach works ok because in practice only very few users need a library and when they do they have to compile the interface anyway. And, as they compile, they can as well add a few lines that are needed to integrate their library to the optional mechanism. If you depend on such extensions, you quite certainly know what you're doing and need to maintain a code base very careful. There are some optional libraries present, like: \starttabulate[|l|l|l|l|l|] \FL \BC module \BC library \BC windows \BC unix \NC \NR \ML \NC libs-imp-curl \NC curl \NC libcurl \NC libcurl \NC \NR \NC libs-imp-mysql \NC mysql \NC libmysql \NC libmysqlclient \NC \NR \NC libs-imp-sqlite \NC sqlite \NC sqlite3 \NC sqlite3 \NC \NR %NC libs-imp-postgress \NC libpg \NC libpg \NC libpg \NC \NR % untested \NC libs-imp-zint \NC libzint \NC libzint \NC libzint \NC \NR \NC libs-imp-mujs \NC libmujs \NC libmujs \NC libmujs \NC \NR \NC libs-imp-kpse \NC kpse \NC kpathsea*w64 \NC libkpathsea \NC \NR % left-over for mkii runner \NC libs-imp-ghostscript \NC ghostscript \NC gswin64 \NC libgs \NC \NR \NC libs-imp-graphicsmagick \NC graphicsmagick \NC several \NC unknown \NC \NR %NC font-phb-imp-internal \NC hb \NC libharfbuzz \NC libharfbuzz \NC \NR % maybe, for idris, testing uniscribe \LL \stoptabulate It is still to be decided how these will be used. An example of a library that can be used out of the box is \ZINT\ for using barcodes: see \type {m-zint.mkxl} for an example of its usage. The \SQL\ libraries have their own manuals and have been around for a while. They have a common encapsulating infrastructure written in \LUA. It is best to keep libraries in a place where you can keep an eye on them being updated, like \starttyping c:/data/tex-context/tex/texmf-win64/bin/lib/luametatex/foo/libfoo.dll \stoptyping You could of course use the ones provided by the system or maybe use symbolic links so that you still keep en eye on changes. The \CONTEXT\ distribution might at some point provide the libraries that we support. \stopsection \startsection[title=Colofon] \starttabulate[|B|p|] \NC author \NC \documentvariable{author}, \documentvariable{affiliation}, \documentvariable{location} \NC \NR \NC version \NC \currentdate \NC \NR \NC website \NC \documentvariable{website} \endash\ \documentvariable{support} \NC \NR \NC comment \NC many thanks to Luigi Scarso for taking care of \FFI\ support in the engines \NC \NR \stoptabulate \stopsection \stopdocument