Thread: src/backend/Makefile CDPATH Patch
The attached patch solves an annoying build failure when /bin/sh is a symlink to /bin/bash and CDPATH is set. The problem manifests itself as the following error: $ cd src/backend $ make ../../src/include/parser/parse.h prereqdir=`cd parser/ && pwd` && \ cd ../../src/include/parser/ && rm -f parse.h && \ ln -s $prereqdir/parse.h . ln: ./parser: File exists make: *** [../../src/include/parser/parse.h] Error 1 make: *** Deleting file `../../src/include/parser/parse.h' The above is due to the following: $ export CDPATH=.:/home/jt:/home/jt/src:/home/jt/lib $ echo `cd parser/ && pwd` /home/jt/src/pgsql/src/backend/parser /home/jt/src/pgsql/src/backend/parser Hence, prereqdir is actually getting set to two directory names instead of one which causes ln to fail. If CDPATH is not set (or set differently) or /bin/sh is not /bin/bash, then we get the expected behavior: $ unset CDPATH $ echo `cd parser/ && pwd` /home/jt/src/pgsql/src/backend/parser The the solution used in the patch is as follows: $ export CDPATH=.:/home/jt:/home/jt/src:/home/jt/lib $ echo `cd parser/ >/dev/null && pwd` /home/jt/src/pgsql/src/backend/parser Note that there are many solutions -- I just chose the one that perturbed the Makefile the least. Jason -- Jason Tishler Director, Software Engineering Phone: +1 (732) 264-8770 x235 Dot Hill Systems Corp. Fax: +1 (732) 264-8798 82 Bethany Road, Suite 7 Email: Jason.Tishler@dothill.com Hazlet, NJ 07730 USA WWW: http://www.dothill.com
Attachment
> The above is due to the following: > > $ export CDPATH=.:/home/jt:/home/jt/src:/home/jt/lib > $ echo `cd parser/ && pwd` > /home/jt/src/pgsql/src/backend/parser /home/jt/src/pgsql/src/backend/parser Basically, you are telling me that if there are two matching parser directories, pwd gets set to _both_ of them. Sorry, I don't think we want to work around a bug like that, so we? -- Bruce Momjian | http://candle.pha.pa.us pgman@candle.pha.pa.us | (610) 853-3000 + If your life is a hard drive, | 830 Blythe Avenue + Christ can be your backup. | Drexel Hill, Pennsylvania 19026
Bruce, On Mon, Apr 23, 2001 at 03:25:38PM -0400, Bruce Momjian wrote: > > The above is due to the following: > > > > $ export CDPATH=.:/home/jt:/home/jt/src:/home/jt/lib > > $ echo `cd parser/ && pwd` > > /home/jt/src/pgsql/src/backend/parser /home/jt/src/pgsql/src/backend/parser > > Basically, you are telling me that if there are two matching parser > directories, pwd gets set to _both_ of them. Sorry, I don't think we > want to work around a bug like that, should we? I guess that I was not explicit enough, so I will try again... The extra directory name comes from bash's builtin cd echoing the directory name when a match is found in the user's CDPATH. It is *not* coming from pwd. So, I still content that this is a bug in the Makefile. The construct that is suspect is the following: prereqdir=`cd $(dir $<) && pwd` The above implicitly assumes that the "cd $(dir $<)" part does *not* write to stdout. If it does then, prereqdir will end up as the concatenation of "cd $(dir $<)" and "pwd". Under bash, I get the following: $ prereqdir=`cd parser/ && pwd` $ echo "$prereqdir" /home/jt/src/pgsql/src/backend/parser /home/jt/src/pgsql/src/backend/parser Under sh, I get the following: $ prereqdir=`cd parser/ && pwd` $ echo "$prereqdir" /home/jt/src/pgsql/src/backend/parser Hence, when the PostgreSQL build is run (where sh == bash), the ln command generated by the Makefile: ln -s $prereqdir/parse.h . becomes the following: ln -s /home/jt/src/pgsql/src/backend/parser # *** new line here *** /home/jt/src/pgsql/src/backend/parser/parse.h . which confuses ln and causes the make to fail. Note this problem only occurs on our Red Hat Linux boxes because /bin/sh is a symlink to /bin/bash. We do not have this problem under Cygwin or Solaris. Thanks, Jason -- Jason Tishler Director, Software Engineering Phone: +1 (732) 264-8770 x235 Dot Hill Systems Corp. Fax: +1 (732) 264-8798 82 Bethany Road, Suite 7 Email: Jason.Tishler@dothill.com Hazlet, NJ 07730 USA WWW: http://www.dothill.com
> Bruce, > > On Mon, Apr 23, 2001 at 03:25:38PM -0400, Bruce Momjian wrote: > > > The above is due to the following: > > > > > > $ export CDPATH=.:/home/jt:/home/jt/src:/home/jt/lib > > > $ echo `cd parser/ && pwd` > > > /home/jt/src/pgsql/src/backend/parser /home/jt/src/pgsql/src/backend/parser > > > > Basically, you are telling me that if there are two matching parser > > directories, pwd gets set to _both_ of them. Sorry, I don't think we > > want to work around a bug like that, should we? > > I guess that I was not explicit enough, so I will try again... > > The extra directory name comes from bash's builtin cd echoing the > directory name when a match is found in the user's CDPATH. It is *not* > coming from pwd. Oh, I understand now. Good point. > > So, I still content that this is a bug in the Makefile. The construct > that is suspect is the following: > > prereqdir=`cd $(dir $<) && pwd` Yep, I can see it doing that. -- Bruce Momjian | http://candle.pha.pa.us pgman@candle.pha.pa.us | (610) 853-3000 + If your life is a hard drive, | 830 Blythe Avenue + Christ can be your backup. | Drexel Hill, Pennsylvania 19026
Jason Tishler writes: > The attached patch solves an annoying build failure when /bin/sh is a > symlink to /bin/bash and CDPATH is set. Installed. -- Peter Eisentraut peter_e@gmx.net http://funkturm.homeip.net/~peter
Peter, On Mon, Apr 23, 2001 at 10:39:45PM +0200, Peter Eisentraut wrote: > Jason Tishler writes: > > The attached patch solves an annoying build failure when /bin/sh is a > > symlink to /bin/bash and CDPATH is set. > > Installed. Thanks. Jason -- Jason Tishler Director, Software Engineering Phone: +1 (732) 264-8770 x235 Dot Hill Systems Corp. Fax: +1 (732) 264-8798 82 Bethany Road, Suite 7 Email: Jason.Tishler@dothill.com Hazlet, NJ 07730 USA WWW: http://www.dothill.com
On Mon, Apr 23, 2001 at 03:25:38PM -0400, Bruce Momjian wrote: > > The above is due to the following: > > > > $ export CDPATH=.:/home/jt:/home/jt/src:/home/jt/lib > > $ echo `cd parser/ && pwd` > > /home/jt/src/pgsql/src/backend/parser /home/jt/src/pgsql/src/backend/parser > > Basically, you are telling me that if there are two matching parser > directories, pwd gets set to _both_ of them. Sorry, I don't think we > want to work around a bug like that, so we? No, he's saying that bash is verbose when CDPATH is set, letting you know what directory it's actually cding to when the CDPATH is used. Apparently, this is not the sh behavior, so his patch silences the spurious output from cd. Ross