Current-Users archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: Fontconfig confusion



On Thu 24 Apr 2008 at 17:21:41 -0500, Jeremy C. Reed wrote:
> > /usr/pkg/bin/vim:
> >     ...
> >     -lfreetype.6 => /usr/pkg/lib/libfreetype.so.6
> >     -lfontconfig.1 => /usr/pkg/lib/libfontconfig.so.1
> >     ...
> >     -lfreetype.9 => /usr/X11R6/lib/libfreetype.so.9
> >     -lfontconfig.1 => /usr/X11R6/lib/libfontconfig.so.1
> 
> Can you objdump -x on vim and its dependencies to track down what uses 
> which? (grep for NEED)

$ objdump -x /usr/pkg/bin/vim|grep NEED
  NEEDED      libgtk-x11-2.0.so.0
  NEEDED      libgdk-x11-2.0.so.0
  NEEDED      libXi.so.6
  NEEDED      libatk-1.0.so.0
  NEEDED      libgdk_pixbuf-2.0.so.0
  NEEDED      libpangocairo-1.0.so.0
  NEEDED      libXrandr.so.2
  NEEDED      libXext.so.6
  NEEDED      libXcursor.so.1
  NEEDED      libXfixes.so.0
  NEEDED      libcairo.so.2
  NEEDED      libpangoft2-1.0.so.0
  NEEDED      libfontconfig.so.1        <---
  NEEDED      libfreetype.so.6          <---
  NEEDED      libz.so.1
  NEEDED      libpango-1.0.so.0
  NEEDED      libm.so.0
  NEEDED      libXrender.so.1
  NEEDED      libgobject-2.0.so.0
  NEEDED      libgmodule-2.0.so.0
  NEEDED      libglib-2.0.so.0
  NEEDED      libintl.so.0
  NEEDED      libXt.so.6
  NEEDED      libcurses.so.6
  NEEDED      libc.so.12
  NEEDED      libX11.so.6
  NEEDED      libSM.so.6
  NEEDED      libICE.so.6

  RPATH       /usr/X11R6/lib:/usr/pkg/lib

These results surprised me a bit, since I had already found out that vim
directly links with -lfontconfig and -lfreetype, probably due to some
.pc file telling that it should. So I was expecting that due to the
explicit X11R6 inclusion in the link search path that those were the
errant references to /usr/X11R6/lib/libfreetype.so.9, but instead it
refers to the correct /usr/pkg/lib/libfreetype.so.6 ...

(Aside: these major numbers seem wrong, how can the base version claim
to be 3 major releases newer than the pkgsrc version?)

However, if the libfontconfig.so.1 that it picks up is the X11R6 one,
that version depends on the X11R6 libfreetype.so.9. Given its RPATH with
X11R6 first, that makes sense. Then Vim itself already brings in the
other libfreetype.

(I could not find any reference to libfreetype.so.9 from any of the
other used libraries)

Then I traced why Vim links directly to libfreetype and libfontconfig,
even though it isn't in the Makefile.

The file auto/config.log determines these values (including both
libraries):

GTK_LIBNAME='-Wl,-R/usr/pkg/lib -R/usr/X11R6/lib -Wl,--rpath
-Wl,/usr/pkg/lib -Wl,-R/usr/X11R6/lib -L/usr/pkg/lib -L/usr/X11R6/lib
-lgtk-x11-2.0 -lgdk-x11-2.0 -lXi -latk-1.0 -lgdk_pixbuf-2.0
-lpangocairo-1.0 -lXrandr -lXext -lXcursor -lXfixes -lcairo
-lpangoft2-1.0 -lfontconfig -lfreetype -lz -lpango-1.0 -lm -lXrender
-lX11 -lgobject-2.0 -lgmodule-2.0 -lglib-2.0 -lintl  '

GTK_LIBS='-Wl,-R/usr/pkg/lib -R/usr/X11R6/lib -Wl,--rpath
-Wl,/usr/pkg/lib -Wl,-R/usr/X11R6/lib -L/usr/pkg/lib -L/usr/X11R6/lib
-lgtk-x11-2.0 -lgdk-x11-2.0 -lXi -latk-1.0 -lgdk_pixbuf-2.0
-lpangocairo-1.0 -lXrandr -lXext -lXcursor -lXfixes -lcairo
-lpangoft2-1.0 -lfontconfig -lfreetype -lz -lpango-1.0 -lm -lXrender
-lX11 -lgobject-2.0 -lgmodule-2.0 -lglib-2.0 -lintl  '

made from

      GTK_LIBS=`$PKG_CONFIG --libs gtk+-2.0`
      GTK_LIBNAME="$GTK_LIBS" plus possibly some later additions

Now I was under the impression that because libgtk-x11-2.0.so.0 already
has

  NEEDED      libfontconfig.so.1
  NEEDED      libfreetype.so.6
     
one doesn't have to specify that to the linker when linking the
application.

I tested that theory, by removing all occurrences of "-lfontconfig
-lfreetype" from the makefiles in Vims building directory, and forced a
relink.

The resulting vim linked, and ran, and ldd showed only 1 fontconfig and
1 freetype.

Looking at the fontconfig files, it seems some recursive inclusion of
libraries is going on, since gtk+-2.0.pc doesn't list libfreetype or
libfontconfig, but it does list gdk-${target}-2.0, and gdk-x11-2.0.pc
lists

Requires: gdk-pixbuf-2.0 pango pangocairo fontconfig xrandr xcursor
xfixes

and pangocairo.pc includes

Libs: -Wl,-R${libdir} -L${libdir} -lpangocairo-1.0 -Wl,-R/usr/pkg/lib
-L/usr/pkg/lib -lfontconfig   -L/usr/pkg/lib -Wl,--rpath -Wl,/usr/pkg/lib 
-lfreetype -lz

-lfreetype is listed in several other .pc files, and I don't expect all
of them to be direct dependencies.

So perhaps a thorough cleanup of .pc files of various packages needs to
be done. Maybe taking in account linking systems where shared libraries
do not pull in their prerequisites automatically (in which case they
must stay in the .pc file, for better or for worse).

Hopefully that will make the rather dense dependency DAG a bit cleaner.

> Later when NetBSD switches to X.org on pkgsrc as its main X11 this problem 
> will be gone. But we should make sure it is correct for now also.

Side remark: I hope that when that happens, precompiled packages will be
available which together are a good match for the native X11 we have
now. I do tend to see X11 as almost-a-part-of-the-base-system.

>   Jeremy C. Reed
-Olaf.
-- 
___ Olaf 'Rhialto' Seibert      -- You author it, and I'll reader it.
\X/ rhialto/at/xs4all.nl        -- Cetero censeo "authored" delendum esse.


Home | Main Index | Thread Index | Old Index