RFC on Makefile.am fixes for (non-portable) linking against libtool modules in KDE

Stephan Kulow coolo at kde.org
Thu Mar 6 09:31:27 GMT 2003


Am Thursday 06 March 2003 04:25 schrieb Benjamin Reed:
> I had brought this up previously pre-kde-3.1 while working on the MacOSX 
> port of KDE, but as Sam Magnuson and I are working to get our patches 
> all figured out, I figured I'd better bring it up again.
> 
> The short version is, libtool libraries built as -module's are not meant 
> to be linked against, but through the magic of the ELF library format 
> and libtool not enforcing this policy, it works 95% of the time anyways. 
>   The big problem with this on MacOSX/Darwin is that Darwin's dynamic 
> loader does *not* allow loading libtool modules (or "bundles", in Darwin 
> terms).
> 
> If it was just a few libraries, it would be easy to work around, but 
> KDE's kdeinit library/binary magic does this, and it's all over the 
> place in the KDE code.
> 
> The current "fix" looks something like this:
> 
> ---(Before:)---
> 
> lib_LTLIBRARIES = foo.la
> bin_PROGRAMS    = foo
> 
> foo_la_SOURCES = foo.cpp
> foo_la_LDFLAGS = $(all_libraries) -module
> 
> foo_SOURCES = dummy.cpp
> foo_LDADD   = foo.la
> 
> ---(After:)---
> 
> lib_LTLIBRARIES = libfoo_main.la foo.la
> bin_PROGRAMS    = foo
> 
> libfoo_main_la_SOURCES = foo.cpp
> libfoo_main_la_LDFLAGS = $(all_libraries)
> 
> foo_la_SOURCES = stub_la.cpp
> foo_la_LIBADD  = libfoo_main.la
> 
> foo_SOURCES = stub.cpp
> foo_LDADD   = libfoo_main.la
> 
> stub_la.cpp: stub.cpp
> 	cat stub.cpp > stub_la.cpp
> 
> ---(stub.cpp:)---
> 
> extern "C" int kdemain(int, char* []);
> 
> int main( int argc, char* argv[] )
> {
>          return kdemain(argc, argv);
> }
> 
> ---(fin)---
> 
> ...and then the "int main" gets turned into "int kdemain" inside 
> whatever defines main.  (foo.cpp in this case)
> 
> As you can see, this way of munging it is perfectly doable, but rather 
> brittle -- people who aren't on platforms like darwin (or, apparently, 
> a.out netbsd) will forget and end up breaking things without knowing.
> 
> What I propose is some kind of automake/am_edit trickery to allow this:
> 
> ---(new Makefile.am)---
> 
> # or kdebin_PROGRAMS maybe?
> kdeinit_PROGRAMS = foo
> 
> # foo.cpp contains an int kdemain()
> foo_SOURCES = foo.cpp
> foo_LDADD = <anything but libfoo_main.la>
> 
> ---(fin)---
> 
> ... it would automatically generate the module and shared library 
> versions of the foo code behind the scenes, with an auto-generated stub.cpp.
> 
> Does this seem feasible?  I don't understand automake or am_edit enough 
> to  do this as is, but if someone's willing to dink with it on IRC for a 
> bit to make this auto-generatable, or point me at the right resources to 
> make my own automake macros (which appears to be quite a black art, I've 
> tried), I'm willing to do all the grunt work of fixing the things that 
> need rearranging in the Makefile.am's in the KDE tree.

The general idea sounds nice, but you'll have to learn perl to get it in.

Greetings, Stephan





More information about the kde-core-devel mailing list