Dependencies, libstorage, and libinnhist

Russ Allbery rra at stanford.edu
Tue Dec 10 15:38:51 UTC 2002


Jeffrey M Vinocur <jeff at litech.org> writes:

> I finally got a chance to pursue this a bit.  I definitely don't know
> how widespread the necessary compiler support is.

It's required by POSIX, I believe (I'll check when I get to work), so it
should be getting more widespread.

> Apparently there is AC_PROG_CC_C_O in autoconf, which would allow us to
> detect the desired functionality and switch use the following in
> Makefile.global.in:

> INPUT_AND_OUTPUT = @INPUT_AND_OUTPUT@

> .c.o:
>         $(CC) $(CFLAGS) $(INPUT_AND_OUTPUT)

> where depending on what autoconf finds, $INPUT_AND_OUTPUT is set to 
> "-c -o $@ $<" normally and "-c $<; mv $(@F) $@".  (Sadly the test only 
> does a #define and not a substitution, so we'd have to replace 
> @INPUT_AND_OUTPUT@ ourselves, but whatever.)

My first reaction on this was that it sounded really promising, but that
it was likely to pose problems for libtool where it isn't this simple.
Then I checked, and libtool already knows how to deal with this itself, so
if we're building with libtool, libtool handles converting -c -o to the
right thing.  Cool.  So if we want to require libtool for building, we
don't have to do any work at all.

If we don't want to require libtool (and I lean in that direction), we can
rip off the test from libtool and use it ourselves for the non-libtool
case and do something like the above when we're not using libtool.

> There's a big caveat, though.  This only works if no two .o files have
> the same basename.  I figure we can rename the things in tests/ with no
> hassle,

No need; that's exactly why all the source files in tests/ end in -t.  :)

> but we have a few other collisions anyway:

> current/inn > find . -name '*.c' | grep -v tests \
>             | xargs -n1 basename \
>             | sort | uniq -c | sort -n \
>             | grep ' [^1]     '
>       2 article.c
>       2 buffer.c
>       2 expire.c
>       2 misc.c
>       2 python.c
>       2 version.c
>       3 perl.c

> I don't know if this is worth pursuing.

The low-hanging fruit is the storage and history APIs, where we've already
had a ton of dependency handling problems because of recursive make, and
where there's nothing really gained from being able to build the
individual subdirectories of storage/ or history/ by themselves.  There
aren't any collisions under storage/ or under history/, so we don't have
to worry about that issue there.  I think it's definitely worth it for
those.

I don't think converting the whole tree is probably worth it right now;
the other dependency problems are occasionally mildly annoying, but aren't
that severe, and we lose more by converting the entire tree since it often
*is* very convenient to be working on something in the nnrpd/ directory of
an otherwise built tree and just do make warnings in that subdirectory to
recompile the stuff one is working on (for example).

-- 
Russ Allbery (rra at stanford.edu)             <http://www.eyrie.org/~eagle/>

    Please send questions to the list rather than mailing me directly.
     <http://www.eyrie.org/~eagle/faqs/questions.html> explains why.


More information about the inn-workers mailing list