automake
[Top][All Lists]
Advanced

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

Re: Built sources always regenerated


From: Braden McDaniel
Subject: Re: Built sources always regenerated
Date: Sat, 31 Dec 2005 14:51:16 -0500

On Sat, 2005-12-31 at 14:22 +0100, Stepan Kasal wrote:
> Hello,
> 
> On Sat, Dec 31, 2005 at 02:51:30AM -0500, Braden McDaniel wrote:
> > but the behavior is the same: the sources are regenerated every time,
> > regardless of whether the antlr grammar has been modified.
> 
> I can imagine several problems:
> 1) there is a prerequisite which is always refreshed and causes this

I can't see how that could be happening. For instance, here's one of the
rules that generates sources from a grammar:

        $(srcdir)/openvrml/Vrml97Parser.hpp 
$(srcdir)/openvrml/Vrml97Parser.cpp: $(srcdir)/openvrml/Vrml97Parser.g 
$(srcdir)/openvrml/Vrml97TokenTypes.txt
                $(ANTLR) -o $(srcdir)/openvrml $(srcdir)/openvrml/Vrml97Parser.g

None of the prerequisites are getting updated. In fact, if I issue the
command:

        $ make -C src/libopenvrml 
../../../src/libopenvrml/openvrml/Vrml97Parser.cpp

I get:

        make: Entering directory 
`/home/braden/src/openvrml/openvrml/build/src/libopenvrml'
        make: `../../../src/libopenvrml/openvrml/Vrml97Parser.cpp' is up to 
date.
        make: Leaving directory 
`/home/braden/src/openvrml/openvrml/build/src/libopenvrml'

And yet if I then just issue "make", the source gets regenerated.

> 2) If you use non-GNU make, it can may not understand that "./foo.c" and
> "foo.c" is the same file.

I am using GNU make 3.80.

> 3) If you work on a networked drive, the target may have time stamp in the
> future, and make decides to refresh it.

Definitely not the issue.

> I cannot guess more without seeing the makefile.  Could you please post
> (an URL to) a self-contained example?  If you are able to cut some parts
> and make the example smaller, that would definitely help.

The problem Makefile.am is here:

        
<http://cvs.sourceforge.net/viewcvs.py/openvrml/openvrml/src/libopenvrml/Makefile.am?rev=1.22&view=auto>

Information for checking out the project from CVS is here:

        <http://sourceforge.net/cvs/?group_id=7151>

The Makefile.am isn't terribly complex; but I imagine I can come up with
a simple example project if necessary.

> > I have some sources that are generated with antlr. I have custom make
> > rules that generate the sources from the antlr grammar. I have tried
> > listing the generated sources in both BUILT_SOURCES and _DEPENDENCIES,
> 
> Overriding *_DEPENDENCIES is dangerous, it is better to let Automake
> compute it.

Yes; when trying that, I checked to see what was "normally" in
*_DEPENDENCIES and I augmented it.

> The BUILT_SOURCES hack is useful sometimes, but it's better to avoid it.

Using BUILT_SOURCES works marginally worse than *_DEPENDENCIES: with
BUILT_SOURCES, the generated sources are regenerated *twice*:

        make[3]: Entering directory 
`/home/braden/src/openvrml/openvrml/build/src/libopenvrml'
        /usr/bin/antlr -o ../../../src/libopenvrml/openvrml 
../../../src/libopenvrml/openvrml/Vrml97Parser.g
        ANTLR Parser Generator   Version 2.7.4   1989-2004 jGuru.com
        /usr/bin/antlr -o ../../../src/libopenvrml/openvrml -glib 
../../../src/libopenvrml/openvrml/Vrml97Parser.g 
../../../src/libopenvrml/openvrml/X3DVrmlParser.g
        ANTLR Parser Generator   Version 2.7.4   1989-2004 jGuru.com
        make  all-am
        make[4]: Entering directory 
`/home/braden/src/openvrml/openvrml/build/src/libopenvrml'
        /usr/bin/antlr -o ../../../src/libopenvrml/openvrml 
../../../src/libopenvrml/openvrml/Vrml97Parser.g
        ANTLR Parser Generator   Version 2.7.4   1989-2004 jGuru.com
        /usr/bin/antlr -o ../../../src/libopenvrml/openvrml -glib 
../../../src/libopenvrml/openvrml/Vrml97Parser.g 
../../../src/libopenvrml/openvrml/X3DVrmlParser.g
        ANTLR Parser Generator   Version 2.7.4   1989-2004 jGuru.com
        make[4]: Leaving directory 
`/home/braden/src/openvrml/openvrml/build/src/libopenvrml'

> Perhaps you could use a suffix rule
> 
> antlr.c:.
>       custom commands
> 
> and then add the antlr grammar file to *_SOURCES:
> 
> myprog_SOURCES = ... foo.antlr ...

I think the particulars of invoking antlr are such that a suffix rule
won't work.

Could the problem be related to the fact that I'm generating the sources
in $(srcdir)? I'm doing that because I want to distribute them: I don't
want users to have to rebuild them.

Note also that my generated sources do not get listed in *_SOURCES. They
are not compiled individually; rather, they are included by
openvrml/browser.cpp.

> Happy hacking in the New Year!

You too!

-- 
Braden McDaniel                           e-mail: <address@hidden>
<http://endoframe.com>                    Jabber: <address@hidden>





reply via email to

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