Re: make(1) and SUBDIR assignments

From: Ruslan Ermilov <ru_at_freebsd.org>
Date: Sun, 25 Jan 2004 23:15:35 +0200
On Sun, Jan 25, 2004 at 04:18:24PM +0100, Jens Schweikhardt wrote:
> hello, world\n
> 
> I'm trying to selectively install binaries in the source tree, i.e. to
> only install bin/dd and bin/df this is what I hoped would work:
> 
> root_at_hal9000:/usr/src # make buildworld      # succeeds
> root_at_hal9000:/usr/src # cd bin
> root_at_hal9000:/usr/src/bin # make install SUBDIR='dd df'
> 
> But it fails:
> 
> ===> dd
> "/usr/share/mk/bsd.subdir.mk", line 60: Inconsistent operator for dd
> "/usr/share/mk/bsd.subdir.mk", line 66: warning: duplicate script for target "dd" ignored
> make: fatal errors encountered -- cannot continue
> *** Error code 1
> 
> Stop in /share/HEAD/src/bin.
> 
> 
> (-CURRENT sources and /usr/share/mk/* as of today). Is this
> 
> 1) a bug somewhere (though nothings seems to be wrong with bsd.subdir.mk)
> 2) me being confused about how SUBDIR is intended to be used
> 3) something else
> 
> Yes, I know I can workaround by
> cd /usr/src/bin/dd; make install
> cd /usr/src/bin/df; make install
> 
> But why do all the src/*/Makefiles assign the list of subdirs to SUBDIR
> and DTRT, but I can't from the outside?
> 
Yes, this looks confusing, but here's what happens here: in make(1),
there are four types of variables, and command-line variables take
precedence over local variables, and you use this feature to override
the SUBDIR assignment inside the src/bin/Makefile.  This works, but
what you don't take into an account is that make(1) also saves all
command-line assignments in environment and makes them available to
its subprocesses, so src/bin/Makefile also gets SUBDIR='dd df', which
conflicts with its <bsd.prog.mk> "dd" target.


Cheers,
-- 
Ruslan Ermilov
FreeBSD committer
ru_at_FreeBSD.org

Received on Sun Jan 25 2004 - 12:14:55 UTC

This archive was generated by hypermail 2.4.0 : Wed May 19 2021 - 11:37:39 UTC