I’m sure a lot of users have noticed that each time autoconf is updated, a helluva lot of packages fail to build for a while. This is probably one of the reasons why lots of people dislike autotools in the first place. I would like to let people know that it’s not entirely autoconf’s fault if that happens, and actually, it’s often not autoconf’s fault at all!
I have already written one post about phantom macros due to recent changes but that wasn’t really anybody’s fault in the sense that the semantic of the two macros changed, with warning, between autoconf versions. On the other hand, I also have ranted, mostly on identi.ca, about the way KDE 3, in its latest version, is badly broken by the update. Since the problem with KDE3 is far from being isolated, I’d rant a bit more about it here and try to explain why it’s a bad thing.
First of all let me describe the problem with KDE3 so that you understand I’m not coming up with stuff just to badmouth them. I have already written in the past, ranted and so on, about the fact that KDE3’s build system was not autotools, but it was rather autotools-based. Indeed, the
admin/ subdirectory that is used by almost all the KDE3 packages is a KDE invention; the
configure.in.in files as well. Unfortunately it doesn’t look like the KDE developers learnt anything about it before, and they seem to be doing something very similar with CMake as well. I feel sorry for our KDE team now.
Now, of course there has been reasons why KDE created such a build system that reminds me of Frankenstein: from one side, they needed to wire up support for Qt’s
moc tools; from the other, they wanted the sub-module monolithic setup that is sought after by a limited amount of binary distributions and hated to the guts by almost all the source-based distributions.
I started hating this idea for two separates reasons: the first is that we couldn’t update automake: only 1.9 works, and we’re now at 1.11, the new ones changed enough behaviour that there is no chance the custom code works; the second reason is that the generated configure files were overly long, checking the same things over and over, and in very slow ways (compiling rather than using pkg-config). One of the tests I always found braindead was the check, done by every KDE3-based package, on whether libqt-mt required libjpeg at link time: a workaround for a known broken libqt-mt library!
Now, with autoconf 2.64, the whole build system broke down. Why’s that? Very simple: if you try to rebuild the autotools for kdelibs, like Gentoo does, you end up with a failure because the macro
AH_CHECK_HEADERS is not found. That macro has been renamed in 2.64 to
_AH_CHECK_HEADERS since it’s an internal macro, not something that configure scripts should be using directly. Indeed this macro call is in the KDE-custom
KDE_CHECK_HEADERS that seems to deal with C and C++ language differences in the checks for headers (funnily this wasn’t enough to avoid language mistakes ). This wouldn’t be bad, extending macros is what autoconf is all about; but using internal headers to do that, is really a mistake.
Now, if it was just KDE making this mistake, the problem would be solved already: KDE 4 migrated to CMake, so in the worst case it would fail when the next CMake change is done that breaks their CMake-based build system, and KDE 3 is going away, which will solve the autoconf 2.64 problem altogether. Unfortunately, KDE was not the only project making this mistake; even worse, projects with exactly one package made this mistake, and that’s quite a bit of a problem.
When you have to maintain a build system for a whole set of packages, like KDE has to, mistakes like the one of using internal macros are somewhat to be expected and shouldn’t be considered strange or out of place. When you do that for a single package, then you really should stop from writing build systems, since you’re definitely overcomplicating things without any good reason.
Some of the signs that your build system is overcomplicated:
- it still looks like it was generated by autoscan; you have not removed any of the checks added by that, nor you have added conditionals in the code to act upon those checks;
- you’re doing lots of special conditioning over the host and target definitions; you don’t even try to find the stuff in the system but decide it’s there or it’s not by checking the host; that’s not the autoconf way;
- you replace all the standard autoconf macros with your own, having
NIH_PROG_CCfor instance; you are trying to be smarter than autoconf, but you most likely are not.
Check out XBMC’s build system. It’s autotools based, and it’s absolutely fascinating (and I’m pretty sure in a bad way).
Well, it may not be autotool’s fault in itself (though not making it obvious what is internal and what is not IMO is always a rather big design failure), but that doesn’t change anything for the user’s does it?In theory autotools, pkg-config etc. should make cross-compilation a breeze, yet in my experience they are used wrongly so much they actually make it harder (since they add complexity, making it harder to fix all the bugs people added).In my experience autotools-based stuff has at least as high a probability to fail, and if it does often has a far higher probability of not being fixable unless you are an expert, which makes it a bad thing from my view of it.I guess it would help if there were (GUI-based?) tools to generate autoconf stuff for the simple things so people would at least start from a properly written thing when they start a new project.
Oh I agree that autotools are so misused they are not funny at all!That’s why I started writing the guide, trying to explain by examples. The main problem here is not much that there’s need of “experts”, it’s that very few people know how they should work.The documentation provided with autoconf and automake used to be slightly out of date; they fixed it in the most recent releases, but it’s still overly complex.What bothers me is that I don’t see any post at all in the usual planets about autotools. There are a few CMake posts in Planet KDE for obvious reasons, but even in Planet Gnome and various distributions’ planets, nobody seems to discuss the problems and solution.Most of the time I feel like I’m alone trying to fix the broken autotools so that they provide a good example 🙁