[Haskell-cafe] Re: Using Gtk2Hs version 0.9.12 on a PPC Mac
Duncan Coutts
duncan.coutts at worc.ox.ac.uk
Sat Jul 28 12:47:43 EDT 2007
On Sat, 2007-07-28 at 17:08 +0200, Thorkil Naur wrote:
> > So what I wonder is how we can make this work reliably. We use the flags
> > that pkg-config tells us to use, I'd rather not add platform-specific
> > hacks if we can get the pkg-config settings fixed. So I presume when you
> > run pkg-config --libs gtk+-2.0 it does not list -L/opt/local/lib, or if
> > it does it lists it after -L/usr/X11R6/lib. Is that the case?
>
> For the GTK+ tutorial helloworld.c program:
>
> > $ pkg-config --libs gtk+-2.0
> > -L/Users/thorkilnaur/tn/install/gtk+-2.10.14/lib -L/opt/local/lib
> -L/usr/X11R6/lib -lgtk-x11-2.0 -lgdk-x11-2.0 -latk-1.0 -lgdk_pixbuf-2.0 -lm
> -lpangocairo-1.0 -lpango-1.0 -lcairo -lSM -lICE -lgobject-2.0 -lgmodule-2.0
> -lglib-2.0 -lintl -liconv -lfreetype -lz -lfontconfig -lpng12 -lXrender -lX11
> > $ gcc -v -Wall -g helloworld.c -o helloworld `pkg-config --cflags gtk+-2.0`
> `pkg-config --libs gtk+-2.0`
> > ...
> Scrutinizing the link arguments output by gcc, it appears that the -Ls and the
> -ls specified on the gcc command have been separated and inserted between
> other -Ls and -ls supplied by gcc. But the order of the -Ls produced by
> pkg-config is retained and, as mentioned, this is the case that works without
> change.
Ok.
> For the Gtk2Hs demo World.hs program, the matter is more complex, especially
> since the link arguments generated by ghc presumably goes via ghc-pkg that I
> have never studied in detail before. But let me venture a guess anyway.
>
> First we look at the gtk package and its dependents:
>
> > $ for p in gtk-0.9.12 glib-0.9.12 cairo-0.9.12; do echo $p: `ghc-pkg field
> $p depends`; done
> > gtk-0.9.12: depends: base-2.0 mtl-1.0 glib-0.9.12 cairo-0.9.12
> > glib-0.9.12: depends: base-2.0
> > cairo-0.9.12: depends: base-2.0 mtl-1.0 glib-0.9.12
> > $
>
> Further:
>
> > $ for p in gtk-0.9.12 glib-0.9.12 cairo-0.9.12; do echo $p: `ghc-pkg field
> $p library-dirs`; done
> > gtk-0.9.12:
> library-dirs: /Users/thorkilnaur/tn/install/gtk+-2.10.14/lib /usr/X11R6/lib /Users/thorkilnaur/tn/install/gtk2hs-0.9.12/lib/gtk2hs
> > glib-0.9.12:
> library-dirs: /opt/local/lib /Users/thorkilnaur/tn/install/gtk2hs-0.9.12/lib/gtk2hs
> > cairo-0.9.12:
> library-dirs: /opt/local/lib /usr/X11R6/lib /Users/thorkilnaur/tn/install/gtk2hs-0.9.12/lib/gtk2hs
> > $
>
> The actual link arguments constructed by ghc when compiling World.hs are:
>
> > $ ghc -v --make World.hs -o helloworld
> > ...
> > Linking helloworld ...
> > *** Linker:
> > gcc -v -o helloworld World.o
> -L/Users/thorkilnaur/tn/install/gtk+-2.10.14/lib -L/usr/X11R6/lib
> -L/Users/thorkilnaur/tn/install/gtk2hs-0.9.12/lib/gtk2hs -L/opt/local/lib
> -L/Users/thorkilnaur/tn/install/ghc-6.6-for-buildbot-20070221_1000/lib/ghc-6.6.20070220
> -lHSgtk -lgtk-x11-2.0 -lgdk-x11-2.0 -latk-1.0 -lgdk_pixbuf-2.0 -lm
> -lpangocairo-1.0 -lpango-1.0 -lcairo -lSM -lICE -lgmodule-2.0 -lfreetype -lz
> -lfontconfig -lpng12 -lXrender -lX11 -lgthread-2.0 -lHScairo -lcairo -lSM
> -lICE -lfreetype -lz -lfontconfig -lpng12 -lXrender -lX11 -lHSglib
> -lgobject-2.0 -lglib-2.0 -lintl -liconv -lHSmtl -lHSbase -lHSbase_cbits
> -lHSrts -lm -u _base_GHCziBase_Izh_static_info -u
> > ...
> > $
>
> The -Ls are:
>
> > -L/Users/thorkilnaur/tn/install/gtk+-2.10.14/lib -L/usr/X11R6/lib
> -L/Users/thorkilnaur/tn/install/gtk2hs-0.9.12/lib/gtk2hs -L/opt/local/lib
> -L/Users/thorkilnaur/tn/install/ghc-6.6-for-buildbot-20070221_1000/lib/ghc-6.6.20070220
>
> My guess is now that ghc constructs this list from the package library-dirs,
> heaping new ones onto the growing list at the end. World.hs refers only
> gtk-0.9.12 which for some reason doesn't refer /opt/local/lib. However, gtk
> depends on glib and glib includes /opt/local/lib before /usr/X11R6/lib, but
> because the latter already appears in the current list, the new one
> (/opt/local/lib) is simply tucked onto the end. And so on, thereby explaining
> why /opt/local/lib ends up appearing after /usr/X11R6/lib.
Yes, that's the culprit.
> I don't know what could be done about this, but certainly, the problem cannot
> be said to be caused by GTK+. Really, the basic problem is this horrendously
> primitive manner which is used on many of our systems of letting the order of
> appearance in certain lists influence the outcome of important processes.
> Plus, of course, the lack of possibility of warning users about this, for
> example by reporting on ambiguous references in case symbols are defined in
> multiple libraries.
Indeed, it's not Gtk+'s fault. It's the fact that we're splitting up the
flags pkg-config tells us about glib, and gtk+, assigning them to the
ghc packages glib and gtk and then reconstructing the link command line
- but in the wrong order.
I'll have to think about this.
Thanks for the detailed investigation Thorkil.
Duncan
More information about the Haskell-Cafe
mailing list