[Buildroot] [PATCH 1/1] Allow imagemagick to find ghostscript fonts.

Yann E. MORIN yann.morin.1998 at free.fr
Tue Feb 9 17:23:36 UTC 2016


Ricardo, All,

On 2016-02-09 02:29 -0200, Ricardo Martincoski spake thusly:
> I don't need this patch for my own personal use, but I took a look into it.

Thank you, this is very much appreciated! :-)

> On Tue, 29 Dec 2015 17:45:04 +0100, Thomas Petazzoni wrote:
> > Could you give a specific example use of imagemagick that triggers this
> > problem, so that we can reproduce the problem on our side and
> > investigate the possible solutions?
> 
> Using this config with the master branch:
> BR2_PACKAGE_IMAGEMAGICK=y  
> BR2_PACKAGE_GHOSTSCRIPT_FONTS=y
> BR2_PACKAGE_FREETYPE=y
> The problem can be triggered by converting any text file to ps
> $ cd /tmp ; echo -e 'text 1\ntext 2' > file.txt ; convert file.txt file.ps

Aha, so that is the root of the problem. Thanks for the explanations.

[--SNIP--]
> The wrong path is the default for debian-based distros
> /usr/share/fonts/type1/gsfonts/ # debian non-x11, default for imagemagick
> /usr/share/fonts/X11/Type1/     # debian x11
> 
> An alternative solution would be to have the fonts installed to this location
> +++ b/package/ghostscript-fonts/ghostscript-fonts.mk
> @@@ -13,1 -13,1 +13,1 @@@ GHOSTSCRIPT_FONTS_LICENSE_FILES = COPYI
> --GHOSTSCRIPT_FONTS_TARGET_DIR = $(TARGET_DIR)/usr/share/fonts/gs
> ++GHOSTSCRIPT_FONTS_TARGET_DIR = $(TARGET_DIR)/usr/share/fonts/type1/gsfonts
> 
> I don't see from
> grep -w '\(gs\|ghostscript-fonts\|GHOSTSCRIPT_FONTS_\)' -R package/
> any explicit use of this path nor hard dependency.
> But changing it can potentially break packages (in runtime!) if them expect
> the fonts to be installed in the current location.

And why not symlink the former to the latter?

> Does anyone know an example of package that would break?
> 
> >> >> Magick: unable to read font `(null)' @ error/annotate.c/RenderFreetype/1153
> >> >> They are non-fatal but could get annoying fast if you are using 'convert'
> 
> The error is non-fatal in a batch conversion.
> But each error means a file failed to be converted.
> The output is not generated for the failed file.

This is a sad decision not to fail in that case... :-(

> >> >> on a lot of files.
> >> >>
> >> >> Signed-off-by: Robert Sohn <grepper at gmail.com>
> >> >> ---
> >> >>  package/imagemagick/imagemagick.mk | 3 ++-
> >> >>  1 file changed, 2 insertions(+), 1 deletion(-)
> >> >>
> >> >> diff --git a/package/imagemagick/imagemagick.mk b/package/imagemagick/imagemagick.mk
> >> >> index 298d0a8..1abb2a8 100644
> >> >> --- a/package/imagemagick/imagemagick.mk
> >> >> +++ b/package/imagemagick/imagemagick.mk
> >> >> @@ -33,7 +33,8 @@ IMAGEMAGICK_CONF_OPTS = \
> >> >>  	--without-dps \
> >> >>  	--without-gslib \
> >> >>  	--without-fpx \
> >> >> -	--without-x
> >> >> +	--without-x \
> >> >> +	--with-gs-font-dir=/usr/share/fonts/gs
> 
> Configuring unconditionally does not seem so bad in this case, IMO.
> The configured path will be added to an XML that will be used at runtime.
> If freetype support is not compiled in or the fonts are not installed,
> /convert/ would fail anyway.

The best would probbly to do something like Thomas suggested:

> >> > ifeq ($(BR2_PACKAGE_GHOSTSCRIPT_FONTS),y)
> >> > IMAGEMAGICK_CONF_OPTS += --with-gs-font-dir=/usr/share/fonts/gs
> >> > endif
> BR2_PACKAGE_FREETYPE is also needed.

    ifeq ($(BR2_PACKAGE_FREETYPE)$(BR2_PACKAGE_GHOSTSCRIPT_FONTS),yy)
    IMAGEMAGICK_CONF_OPTS += --with-gs-font-dir=/usr/share/fonts/gs
    endif

But with the symlink I suggested above, that might not even be
necessary, would it?

> >> > Or maybe we should use $(GHOSTSCRIPT_FONTS_TARGET_DIR) here, instead of 
> >> > duplicating it?
> 
> It seems good practice to me.
> But we can't use GHOSTSCRIPT_FONTS_TARGET_DIR as is, it is prefixed with
> TARGET_DIR. We could create an auxiliary symbol

Then what about:

    package/ghostscript-fonts/ghostscript-fonts.mk;
        GHOSTSCRIPT_FONTS_DIR = /usr/share/fonts/gs
        GHOSTSCRIPT_FONTS_TARGET_DIR = $(TARGET_DIR)/$(GHOSTSCRIPT_FONTS_DIR)

    package/imagemagick/imagemagick.mk:
        ifeq ($(BR2_PACKAGE_FREETYPE)$(BR2_PACKAGE_GHOSTSCRIPT_FONTS),yy)
        IMAGEMAGICK_CONF_OPTS += --with-gs-font-dir=$(GHOSTSCRIPT_FONTS_DIR)
        endif

> >> Hm, the problem is that the issue will remain if ghostscript-fonts are
> >> not installed. I don't know the solution to that.
> >
> >The usual way to set a dependency package is to add a 'select' statement for 
> >that package in Config.in. In this case ghostscript-fonts is not a hard 
> >dependency, because imagemagick is quite functional without it, and its size 
> >is non negligible. Maybe adding a comment to the help text in Config.in would 
> >suffice.
> >
> >What do others think?
> 
> Adding a comment to the Config.in sounds reasonable to me.
> One would need both BR2_PACKAGE_FREETYPE as optional build dependency and
> BR2_PACKAGE_GHOSTSCRIPT_FONTS as optional runtime dependency to get the
> conversion txt -> ps to work.

Well, since it is an *optional* and *runtime* dependency, then there is
rally nothing to do, neither in the Config.in nor in the .mk.

However, if we want to be a little bit user-friendly, we could add a
Config.in opiton in ImageMagick, like:

    config BR2_PACKAGE_IMAGEMAGICK_TXT_PS
        bool "support txt->ps conversion"
        select BR2_PACKAGE_FREETYPE # runtime
        select BR2_PACKAGE_GHOSTSCRIPT_FONTS # runtime

(with the appropriate "depends on" to propagate freetype's and
ghostscript-fonts' own dependencies...

Anyway, thanks a lot Ricardo for the thorough and detailed explanations.
It was really useful. :-)

Regards,
Yann E. MORIN.

-- 
.-----------------.--------------------.------------------.--------------------.
|  Yann E. MORIN  | Real-Time Embedded | /"\ ASCII RIBBON | Erics' conspiracy: |
| +33 662 376 056 | Software  Designer | \ / CAMPAIGN     |  ___               |
| +33 223 225 172 `------------.-------:  X  AGAINST      |  \e/  There is no  |
| http://ymorin.is-a-geek.org/ | _/*\_ | / \ HTML MAIL    |   v   conspiracy.  |
'------------------------------^-------^------------------^--------------------'


More information about the buildroot mailing list