This is the mail archive of the mailing list for the Cygwin XFree86 project.

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: libtool created import libs broken? was RE: DDD 3.3.8 (i686-pc-cygwin) gets `Segmentation fault

Brian Ford wrote:
Charles Wilson,

Could you look at the problem discovered in the thread below and give us a
comment?  Thanks.

There are a couple of problems.

1) OOB, DDD uses libtool-1.4.2 -- which has very minimal support for cygwin. It works (barely) -- and it takes a whole chapter in the autobook to explain the differences from "normal" unix shared lib creation. The new 1.5+ procedure (with binutils/gcc autoimport, autoexport, and .dll.a naming convention support) is much more unix-like. Although ltmodules don't seem to work very well, except in toy cases. :-(

2) Old libtool, when it finds a .la file (which specifies the DLL name and the static lib name, AND the import lib name) doesn't appear to handle the implib properly -- it thinks that it does not exist, and attempts to recreate it from scratch using the export table from the DLL. But it uses old, buggy, obsolete, unmaintained, code to do so.

Now, there are only four libraries in your link list that have .la files: expat, fontconfig, freetype, and Xm. And whaddaya know -- those are precisely the libs that cause problems in your link command.

QuickNDirty answer: hide those four .la files and re-run configure.

Long answer: update to the most recent autotools (relibtoolize). However....

bash-2.05b$ autoreconf --install --force

These are just warnings, so I think this part worked fine.  I guess the
ddd people should clean these up?

Yes, they should -- when they are ready to move to autoconf-2.5x, automake-1.7.x, and libtool-1.5+. But as you can see, there are incompatibilities between autoconf-2.13 and -2.5x. Basically, you CAN write a file that works with both -- but 2.13 was much more forgiving than 2.5x, so most existing's need to be brought up to 'spec' in order to work with 2.5x.

And the _easiest_ way to do THAT is to make changes to the that are NOT backwards compatible with 2.13! So, it's possible to allow both versions to work with your, but much harder than just upgrading in a non-backwards-compatible way.

So most projects (like gcc/binutils until recently) have taken a wait-and-see approach to autoconf-2.5x. Which leaves us poor cygwin folks, who NEED libtool-1.5 for decent DLL support, out in the cold -- because libtool-1.5 requires automake-1.7.x which requires autoconf-2.5x...

(And, even though it is conceivable to use ac-2.5x with old-style automake-1.4p6, the cygwin wrapper system doesn't let you do that. So, if you re-autoconf with ac-2.5x, you'll also need to re-automake with am-1.[67].x -- which brings its own share of possible incompatibilities in the's. And you'll want to add -no-undefined to the libXXXXX_LDFLAGS setting for any libraries that DDD builds) warning: AC_CANONICAL_HOST invoked multiple times
autoconf/specific.m4:363: AC_CYGWIN is expanded from... the top level
autoheader: WARNING: Using auxiliary files such as `acconfig.h',
autoheader: WARNING: and `', to define templates for
autoheader: WARNING: is deprecated and discouraged.
autoheader: WARNING: Using the third argument of `AC_DEFINE' and
autoheader: WARNING: `AC_DEFINE_UNQUOTED' allows to define a template
autoheader: WARNING: `acconfig.h':
autoheader:             [Define if a function `main' is needed.])
autoheader: WARNING: More sophisticated templates can also be produced, see
autoheader: WARNING: documentation.

Yep, you're gonna have to take care of this stuff by hand. I believe that support for etc will be going away in autoconf-2.60, but that's **just** a guess. And anyway, 2.60 isn't expected for at least several months (and 2.59 won't go 'poof' then, anyway)

Here is where we should have stopped, although I don't know how to do
that with autoreconf.  The following are errors from subdirectories that
use older (circa 2.13) autoconf scripts.  autoreconf does not support
mixed versions, I guess?

No, not at all. That's why Zack Weinberg (Nathaniel Nerode?) over on the gcc list are updating gcc's (and friends')'s by hand, one directory at a time.

Bringing the autotool infrastructure up to snuff for a large project, like DDD, is a significant challenge. And it's not a job that anyone really wants to do -- so if you've the itch, the only person who will scratch it is you. You'll need to do all this work yourself, and then send your patches back to the DDD developers as a fait accompli, and HOPE that they are ready to 'take the plunge', accept your patch, and **force all of their developers to switch to using the new autotools**.

It's that last bit that causes trouble. And until they accept the patches and take the plunge, you'll have to maintain your changes out-of-baseline. And keep reapplying-and-reautotooling each time you update to a new version of DDD.

One thing to keep in mind: when doing this, it helps to keep your patches in separate 'piles'. I usually keep a 'pre-autotool' set, which are the changes to,'s, acinclude.m4's, etc. Then, there's the 'post-autotool' set, which are the changes to those files which are automagically updated by re-running autoconf/automake/libtoolize (I usually include a 'bootstrap' script as part of my 'pre-autotool' pile-o-patches [*]). Then, there's the 'code' set (changes to actual code), and the 'cygwin-packinging' set (stuff that goes in <srcdir>/CYGWIN-PATCHES/ like cyg-specific README, .hint, postinstall script, etc -- that the upstream maintainers would NEVER be interested in.)

[*] When actually releasing the cygwin package, there are two ways to do this. The first way is to combine all four piles into one mondo patch, and ship it as "the" patch for the package. (patchutils is your friend). The downside is, often these patches are > 3M uncompressed, thanks to the MASSIVE changes to the configure script, the's, etc -- IOW, the 'post-autotool' pile-o-patches. The second way is to only ship the pre-autotool, code, and cygwin-packaging piles as the 'mondo' patch, and then adapt cygwin's generic-packaging-script to run bootstrap as part of it's prep() phase. This way, the patch is much smaller -- AND it's easier for you to maintain. The downside is that (a) if anybody else wants to build your version of the package, they must have the autotools installed, (b) building is slow, because you have to run bootstrap each time [twice! -- again during mkpatch() for reasons I won't go into here -- if you're interested, I can send one of my old packages where I had to do this, and you can see how I did it and why. None of my current packages on sourceware need to do this anymore...yay me.]

It's a royal pain...but there's no other choice, if (a) your-fav-pkg won't compile properly on cygwin without modern autotool support, (b) the upstream maintainers are unable/unwilling/properly-cautious to 'take the plunge' and refuse to integrate your patches for a few release cycles. error: possibly undefined macro: AC_PROG_CC_GNU
     If this token and others are legitimate, please use m4_pattern_allow.
     See the Autoconf documentation. error: possibly undefined macro: AC_PROG_CC_G error: do not use LIBOBJS directly, use AC_LIBOBJ (see
section `AC_LIBOBJ vs LIBOBJS' error: possibly undefined macro: AC_PROG_CC_WORKS
autoreconf: /usr/autotool/devel/bin/autoconf failed with exit status: 1

So, if this hasn't left your tree broken, I think it would test what I wanted. You should now have libtool 1.5 for the main ddd tree. I think it would fix this.

But if the subtrees are configured separately AND the subtrees use libtool, then each subtree will create its own libtool during its own sub-configure step -- and you're back to the mixed-version problem again. Blech.

New in 1.5: 2002-04-14; CVS version 1.4e, Libtool team:
* Support auto-import patch to binutils on cygwin for much improved dll



Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]