automake
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Mixing BUILT_SOURCES, double quote include and separation of source


From: Ralf Wildenhues
Subject: Re: Mixing BUILT_SOURCES, double quote include and separation of source and binary directory
Date: Wed, 30 Mar 2005 18:56:23 +0200
User-agent: Mutt/1.4.1i

* Simon Perreault wrote on Wed, Mar 30, 2005 at 06:13:19PM CEST:
> On March 30, 2005 10:44, Ralf Wildenhues wrote:
> > > #include "../include/inc.h"
> >
> > which is not portable, by the way (but I can see if you don't care about
> > that part of the world).
> 
> Why do you say that? That code is being ported from Microsoft's compiler, and 
> I guess that if it works there and here then it ought to be portable.

IIRC some older compilers on Windows did not understand `/'.
Plus, I would consider using `..' and `include' in the actual path to be
bad style (not directory entries in general -- it's good to have
 ../include/foolib/foo1.h and use #include "foolib/foo1.h").

> > If you put this rule in several directories, it might lead to race
> > conditions with parallel make.  (Your example suggests you might be
> > doing this.)
> 
> Do you mean that if many make jobs try to make the same directory at the same 
> time it will fail? I don't think so, since creating a directory is atomic and 
> mkdir -p shouldn't fail if the directory is already created. But if mkdir is 
> broken and fails because the directory was created between the time it 
> checked for its existence and the time it tried to create it, then mkdir is 
> broken and should be fixed. Anyway, that's off topic.

Well, using $(mkdir_p) fixes the `mkdir -p' part.  But your header
creation might
- not be atomic, e.g.  echo line1 > $@; echo line2 > $@
- not be allowed to be executed in parallel
(I *really* don't know whether parallel make works on cygwin.  But
redirection into a file held open by another process fails there.)

> > - change the rule above to create a symlink to the current directory
> >   or a central directory, for that matter
> >   (be sure to look at $(LN_S) semantics in the Autoconf docs!).
> >   Have `make clean' remove the links.
> 
> Sorry, I don't understand your solution. Does that mean I should modify all 
> the files including the built headers so that they point to the central 
> directory?

No, why?  Automake puts `-I.' in AM_CPPFLAGS.  After you ensure that
 ../include/built.h exists, you have in Makefile.am

BUILT_SOURCES = built.h
built.h: ../include/built.h
        rm -f $@ && $(LN_S) ../include/built.h $@

or easier, you have in the Makefile.am one level higher up:

BUILT_SOURCES = include/built.h
include/built.h:
        $(mkdir_p) include
        touch $@
        for srcdir in $(some_dirs); do \
          cd $$srcdir && { rm -f built.h; $(LN_S) ../include/built.h .; }; \
        done

I'd probably extend that rule so that its output has modification times
updated only when necessary (look at `move-if-change').  Plus update
CLEANFILES and/or clean-local.

> If so, then I can't do that since the code I'm working on has to 
> keep working on another build system.

SCons?  :)

> If not, then can you explain a bit more?

HTH,
Ralf




reply via email to

[Prev in Thread] Current Thread [Next in Thread]