Subject: Re: obj dir not created (subdir sendmail/cf/cf)
To: None <tlaronde@polynum.com>
From: Jachym Holecek <freza@liberouter.org>
List: tech-toolchain
Date: 06/20/2005 18:26:26
Hello,

> > > -	    awk -f ${.CURDIR}/MAKEDEV.awk ${.CURDIR}/MAKEDEV.tmpl > ${.TARGET}
> > > +	    awk -f ${.CURDIR}/MAKEDEV.awk ${.CURDIR}/MAKEDEV.tmpl \
> > > +		> ${MAKEOBJDIRPREFIX}/${.TARGET}
> > 
> > Wrong. You probably meant ${.OBJDIR} there, which is pointless since
> > the rule's PWD will already be equal .OBJDIR, iff either MAKEOBJDIRPREFIX
> > is set or MAKEOBJDIR is set or ${.CURDIR}/obj[.${MACHINE}] exists. One
> > of these conditions should be satisfied after a 'make obj' pass.
> 
> Well, last time I try to track down how things were supposed to behave,
> I concluded (I may be totally or partially wrong):
> 
> 1) The Makefiles are called from the source dir;

Correct.

> 2) ${.CURDIR} is hence the source dir;

Correct, absolute path to source dir.

> 3) ${.TARGET} is the same as POSIX classical $@ and expands just to
> the given target, no obj stuff being prepended;

${.TARGET} will typically only contain name of the file (basename).

> => so MAKEDEV is generated in the srcdir, when it is supposed---from
> ETC_INSTALL_OBJ---to be generated in .OBJDIR

I didn't look in detail at fragment in question -- the general BSD make
trick however is that ${PWD} will be changed from ${.CURDIR} to ${.OBJDIR}
for the lifetime of rule-commands. So:

foo:
	echo "hello" > ${.TARGET}

May generate ${.CURDIR}/foo or ${.OBJDIR}/foo, depending on whether
the conditions described above were met.

> For one reason I don't remember at the moment, changing MAKEOBJDIRPREFIX
> by .OBJDIR was not giving the correct result (file was not generated in
> the correct place).

MAKEOBJDIRPREFIX will affect .OBJDIR -- iff MAKEOBJDIRPREFIX/${.CURDIR}
exists (and can be cwd'd to). Maybe that was the problem?

	Regards,
		-- Jachym Holecek