make: evaluation of symbolic link with ../ fails

Harti Brandt hartmut.brandt at dlr.de
Mon Nov 5 00:23:39 PST 2007


On Mon, 5 Nov 2007, Julian Stacey wrote:

JS>I found some unexpected behaviour within make on 6.2-RELEASE,
JS>Not sure if it's a bug, or proper behaviour. Comment please ?
JS>
JS>Make seems to be being too clever, evaluating where it
JS>think the CWD (current working directory) is, whereas I think
JS>it should better let the external per line shell discover for itself.
JS>Make fails to realise that because of  symbolic links, it is not
JS>acceptable to shorten
JS>	cd /site/home/jhs/pics/.. ; rdist
JS>to
JS>	cd /site/home/jhs ; rdist
JS>
JS>How I discovered the behaviour:
JS>	I keep my data split in 2: 
JS>		Some small enough to back up to a USB stick, eg:
JS>			/usra/home/jhs/._/txt/	
JS>		& some bulky eg:
JS>			/usra/jhs/xtra/pics
JS>	using symbolic links eg
JS>		/site/home	-> /usra/home
JS>		~/.HOME		-> /site/home/jhs/._
JS>		~/txt		-> .HOME/txt
JS>		~/pics		-> .HOME/pics
JS>		~/._/pics	-> xtra/pics
JS>		~/._/xtra/pics	-> /usra/jhs/xtra/pics
JS>
JS>	Some links are more complex than shown, for reasons
JS>	beyond scope of this posting, but it's all been working fine
JS>	for 8 years & I've had patches to 2.2.8 onward
JS>	kernels to increase the allowed traversal count for sym
JS>	links etc
JS>	http://berklix.com/~jhs/src/bsd/fixes/FreeBSD/src/gen/sys/sys/param.h.REL=ALL.diff
JS>
JS>It's been fine while I manually ran:
JS>	cd ; rdist `hostname -s`
JS>	cd ~/xtra/LN  ; rdist xtra	# LN -> /usra/jhs/xtra
JS>The make behaviour was noticed when I embeded those lines in a Makefile.
JS>
JS>Here's some to try yourself:
JS># Warning cant use eg ~/pics/../Distfile
JS>bug1:
JS>	-cd ~/txt/.. && pwd
JS>	@#	/usr/home/jhs
JS>	-cd ~/txt/.. && /bin/pwd
JS>	@#	/usra/home/jhs
JS>	-cd ~/txt && cd .. && /bin/pwd
JS>	@#	/usra/home/jhs
JS>	-cd ~/._/txt/.. && /bin/pwd
JS>	@#	/usra/home/jhs/._
JS>bug2:
JS>	cd ~/pics && pwd
JS>	@#	/usr/home/jhs/pics
JS>	cd ~/pics/.. && pwd
JS>	@#	/usr/home/jhs
JS>	cd ~/pics && /bin/pwd
JS>	@#	/usra/jhs/xtra/pics
JS>	cd ~/pics/.. && /bin/pwd
JS>	@#	/usra/home/jhs
JS>
JS>See from results marked @#, make is evaluating eg
JS>	cd ~/txt/.. ; rdist
JS>as if it's equivalent to 
JS>	cd ~; rdist
JS>& it's Not equivalent,
JS>if I do eg:
JS>	cd ~/pics/.. ; rdist 
JS>rdist6 runs using the Distfile in my ~/Distfile, rather than different
JS>/usra/jhs/xtra/Distfile.
JS>
JS>I can cludge round this make behaviour, eg by in Makefile avoiding the ../ in
JS>	cd ~/xtra/pics/.. && rdist -f /usra/jhs/xtra/Distfile pics
JS>but seems make is trying to be too clever, & failing, & make would be better
JS>if it did less.
JS>
JS>(BTW, to avoid distracting answers: I know make invokes a seperate
JS>shell per line, that's not the issue, also not the issue is /usr/obj/
JS>or which external interactive shell I use).

Are you sure that this is not a problem with /bin/sh? Make always execs a 
shell if it finds special symbols like ';' in the line. It does not 
interprete the cd.

What shell are you using (I mean in which shell did you do the successful 
tests above)? Try something like:

.SHELL: name="sh" path="/path/to/your/shell"

in the Makefile (given that you're not using a c-shell). If it works then 
the problem is in /bin/sh.

harti


More information about the freebsd-hackers mailing list