gmake/make dependency problem

Harti Brandt hartmut.brandt at dlr.de
Tue Sep 20 02:42:06 PDT 2005


Hi Harlan,

On Tue, 20 Sep 2005, Harlan Stenn wrote:

HS>I guess it depends on your definition of a "source" file.

That's fairly easy: what's left of the ':' is the target, what's right of
it is the source. This is just the terminology make is using.

HS>I think of a Makefile in terms of "target" and "dependency" files.
HS>
HS>Automake makes it easy to build a package in the source tree (in which
HS>case the "source" file is in the same directory as the object files) or
HS>in a separate build/object tree.

'Source' in make-speak is not the same as source code for the program 
you're going to compile. Posix make as such has no support for compiling 
in separate build/object trees.

HS>
HS>Under gmake the behavior is consistent.
HS>
HS>Under (at least FreeBSD's) (p)make, the behavior is not consistent.

That just depends on what one thinks is consistent. It works either way 
around. Just look at how easy you can build FreeBSD under /usr/obj - you 
don't need any cd commands in Makefiles usually.

HS>The example I face is no different that a system that uses lex and yacc
HS>(in the case where the distribution provides generated .c and .h files).

This is not the problem. The problem is, that you don't have a clear cut 
between the source and the build directory. With BSD make files you never 
write into the source directory. Your Makefile tries to do this, when it 
updates ntpd-opts.c. This seems not too lucky too me. The ntpd-opts.c file 
is a build-file, not a source file and so it should reside in the build 
directory. If you want to distribute it, then copy or link it from the 
source directory to the build directory if the one in the source directory 
is up-to-date, if not just build a new one in the build directory. (this 
probably requires some thinking to get it right). The build process should 
never try to write to the source directory except when the user 
explicitely asks it to do so.

HS>Does a POSIX spec cover this case?

As I said POSIX make does not directly support .PATH or VPATH. If you work 
in another directory you need to specify the path on both target and 
source sides of the rules.

A simple fix in your case is specifying files on the target side of rules 
with the prefix to the source directory and relying on VPATH to find 
source files. This is in fact easy - I build my own Makefiles this way. A 
better fix is not to make the build process write to the source directory 
altogether.

While it would surely be possible to make BSD make work like GNU/Sun make,
this would be a huge undertaking with regard to testing.

harti


More information about the freebsd-questions mailing list