Subject: Re: make(1)'s inbuilt objdir handling
To: None <tech-toolchain@NetBSD.org>
From: Alan Barrett <apb@cequrux.com>
List: tech-toolchain
Date: 06/21/2005 11:24:27
On Tue, 21 Jun 2005, Luke Mewburn wrote:
> To recap, the inbuilt-to-make .OBJDIR rules are:
> 
>     	if MAKEOBJDIRPREFIX is set in the environment		# rule 1
> 		.OBJDIR = ${MAKEOBJDIRPREFIX}/${PWD}
> 	else MAKEOBJDIR is set in the environment		# rule 2
> 			# MAKEOBJDIR may be an expression
> 		.OBJDIR = ${MAKEOBJDIR}
> 	else if -d "obj.${MACHINE}"				# rule 3
> 		.OBJDIR = obj.${MACHINE}
> 	else if -d "obj"					# rule 4
> 		.OBJDIR = obj
> 	else if -d "/usr/obj/${PWD}"				# rule 5
> 		.OBJDIR = /usr/obj/${PWD}
> 	else							# rule 6
> 		.OBJDIR = .CURDIR

Even if nothing else changes, please could the above set of rules
be added to the make(1) man page.

> I personally believe that rules 3 through 5 should be removed from make.

That sounds fine to me.  Those rules can be approximated by
setting MAKEOBJDIR in the environment:

	MAKEOBJDIR=${.CURDIR}/obj.${MACHINE}	# substitute for rule 3
	MAKEOBJDIR=${.CURDIR}/obj		# substitute for rule 4
	MAKEOBJDIR=/usr/obj/${.CURDIR}		# substitute for rule 5

> Of course, a Makefile is still free to override .OBJDIR if it wants to.

Oh, really?  Does the right thing happen if you set .OBJDIR
in the Makefile like this:

	.OBJDIR:=${.CURDIR}/obj.${MACHINE}	# substitute for rule 3
	.OBJDIR:=${.CURDIR}/obj			# substitute for rule 4
	.OBJDIR:=/usr/obj/${.CURDIR}		# substitute for rule 5
	.OBJDIR:=${.CURDIR}			# substitute for rule 6

If so, then presumably bsd.obj.mk could set .OBJDIR to keep the old
semantics even if rules 3, 4 and 5 were removed from make(1) itself.

> This would solve a bunch of complaints users have raised,
> allow us to use our (NetBSD) make for some packages which
> currently use GNU make to avoid the "obj" subdir .OBJDIR frobbery,
> and result in less effort required to modify make(1)'s manual
> page to match reality.

Why can't these packages just set .OBJDIR:=${.CURDIR} in their
makefiles, or set MAKEOBJDIR=${.CURDIR} in the environment?

--apb (Alan Barrett)