--with-system-et : a problem with krb5-1.4.3

Ken Raeburn raeburn at MIT.EDU
Mon Jan 23 19:36:52 EST 2006


We do assume that the system com_err code is "sufficiently"  
compatible with ours, and no, we don't have the meaning of that  
codified, much less carefully tested.  Basically, if it doesn't work,  
then you have to use our version.


On Jan 23, 2006, at 18:21, Bernard Leak wrote:
> Dear List,
>                   a problem (of sorts) with krb5-1.4.3 has been  
> exposed by
> a recent attempt to build it (with GCC-4.0.2, though that may not
> be very relevant).  The problem is that
> struct et_list
> (an intentionally opaque type) is not actually declared
> in *your* copy of com_err.h (src/util/et/com_err.h) .  Several  
> functions
> are declared as passing around pointers to such a struct.

Uh, what functions are declared that way?  In my source tree, all I  
see is stuff in src/util/et, and if you're using the system com_err  
code, that shouldn't get compiled.  "struct et_list" is defined in  
src/util/et/error_table.h, and should only be used by files including  
that header.

> (b) Second point: this problem is NOT in my copy of
> /usr/include/et/com_err.h, which has just such a declaration (and
> partial definition).  Yet I ran into the problem anyway!  After some
> sloshing around, I observed that nothing resembling
> -I/usr/include/et appears anywhere in the actual compiler
> invocations, and then that src/configure never actually checks
> where (or whether) com_err.h can be found.

Yeah, our checks are kind of weak; like I indicated, we kind of  
assume that you know that your system version is "good enough".  I  
don't know what system puts com_err.h into /usr/include/et.  (And,  
since I don't see you mentioning what system you're using, I still  
don't. :-))

> Considerations:
> (a) if --with-system-et is specified, it must be possible to find
>      com_err.h with the supplied search path (and not internally).
>      If necessary, have --with-system-et-libs and --with-system-et- 
> includes
>      to find each of them separately.

Yeah, it might be nice... but at some point the vast pile of --with- 
foo-libs options gets to be too much, and the right answer becomes  
"just tweak CPPFLAGS/LDFLAGS".  The --with-foo-libs stuff, turning  
into -L options, also gives a false sense that you really could just  
get package foo from one place, and package bar from another, but  
really, you're adding both places (in some unknown order) to the list  
of places searched for packages foo and bar, and maybe only one of  
them in directories that only need one, etc.  So if you have a couple  
versions of header foo or library quux installed in different places,  
especially if there are dependencies between them and other things  
you need to pull in, having these multiple options can cause serious  
problems that you don't tend to think about.  The ordering issues are  
clear when CPPFLAGS and LDFLAGS are specified.

> (b) ... and if so, the path for locating com_err.h must appear BEFORE
>       -I src/util/et/ .

If --with-system-et is given, then src/util/et should not be in the  
include path at all.

>   On the other hand, one certainly doesn't want
>       to search usr/include before ALL local paths (surely?).
>       Some really weird person might have put com_err.h immediately
>       inside /usr/include !  Pending international agreement that  
> this is
>       a war crime carrying a summary death penalty, it needs to be
>       accommodated.  (O, for a compiler which DOES make demons fly
>       out of some people's noses...)

No, in fact, I'd say the include path should be (1) build-tree and  
source-tree directories (but not including directories for packages  
for which system versions will be used), (2) configure-time specified  
directories, and then (3) /usr/include.

> Conclusion:
> It's time, I think, to use a macro for the actual header specification
> and force it through with a global header (you don't have one at
> present, which is perhaps a mistake) or (what seems to be your
> preferred option) add another to your vast bestiary of -D defines.

Actually the generated header include/krb5/autoconf.h is our  
preferred option, and it's included in a lot of source files (usually  
indirectly); we just haven't made switching things over to it a  
priority.

> That way, you can use simply "com_err.h" (as at present)
> for a locally-built 'et', and use an absolute path, such as
> </usr/include/et/com_err.h>, for the system copy.

I could see going with <et/com_err.h> ... but maybe this is something  
to consider....

>   This involves
> walking the inclusion path to find it - what fun! - if it isn't
> explicitly specified as an 'include' option.  One brute-force
> possibility; assume /usr/include/et/com_err.h UNLESS over-
> ridden by --with-system-et-includes=<somewhere else>

Actually, I was under the impression that /usr/include/com_err.h or / 
usr/include/krb5/com_err.h were pretty common.  I see my Red Hat  
system puts it in /usr/include/et, and my Debian box has both /usr/ 
include/com_err.h and /usr/include/et/com_err.h (one a symlink to the  
other).  My NetBSD 2.0 system has /usr/include/krb5/com_err.h, and my  
Solaris 10 machine doesn't seem to have it at all.

Ken



More information about the Kerberos mailing list