[Buildroot] *Tons* of BR warnings like "package/Makefile.autotools.in:179: warning: overriding commands for target `/home/bjornfor/raid/forks/buildroot/output'"
Bjørn Forsman
bjorn.forsman at gmail.com
Mon Dec 14 09:25:45 UTC 2009
2009/12/13 Peter Korsgaard <jacmet at uclibc.org>:
>>>>>> "Bjørn" == Bjørn Forsman <bjorn.forsman at gmail.com> writes:
>
> Hi,
>
> Bjørn> I finally found the bug. (Thanks a lot for the hint, Peter.)
> Bjørn> BASE_DIR ends up containing the Buildroot output directory *two*
> Bjørn> times (separated by a space). And it happends because I use the
> Bjørn> CDPATH environment variable.
>
> Bjørn> Let me demonstrate:
>
> Bjørn> $ mkdir dir
> Bjørn> $ (CDPATH= cd dir/) # no output
> Bjørn> $ (CDPATH=.:.. cd dir/) # output!
> Bjørn> /tmp/directory/dir
>
> Ahh - I use zsh dir hashes for that kind of stuff instead.
>
> Bjørn> This means that when the top Makefile in BR says:
>
> Bjørn> BASE_DIR := $(shell mkdir -p $(O) && cd $(O) && pwd)
>
> Bjørn> both 'cd' and 'pwd' will print out the same path (when CDPATH is
> Bjørn> non-empty), BASE_DIR will be containing two identical paths. Make freaks
> Bjørn> out and BR fails.
>
> Bjørn> So to fix this issue I thought it would be easy to remove CDPATH from
> Bjørn> the Buildroot environment. But how? I tried:
>
> Bjørn> export CDPATH:=
> Bjørn> unexport CDPATH
>
> Bjørn> in the top Makefile but neither worked.
>
> It does work, but only for stuff running inside the make rules:
>
> cat Makefile
> export CDPATH:=
> all:
> set|grep CDPATH
>
> export CDPATH=.:~
> make
> set|grep CDPATH
> BASH_EXECUTION_STRING='set|grep CDPATH'
> CDPATH=
>
> sed -i 's/export/#export/' Makefile
> make
> set|grep CDPATH
> BASH_EXECUTION_STRING='set|grep CDPATH'
> CDPATH=.:/home/peko
>
> But if you instead have something using $(shell ) it won't work:
>
> cat Makefile
> export CDPATH:=
> DUMMY:=$(shell set|grep CDPATH >&2)
> all:
> set|grep CDPATH
>
> make
> BASH_EXECUTION_STRING='set|grep CDPATH >&2'
> CDPATH=.:/home/peko
> set|grep CDPATH
> BASH_EXECUTION_STRING='set|grep CDPATH'
> CDPATH=
>
> E.G. the export doesn't effect the environment of $(shell ).
>
> So the proper fix is to do:
>
> unset CDPATH:=
> and explicitly work around if for BASE_DIR, E.G.:
>
> BASE_DIR := $(shell mkdir -p $(O) && cd $(O) >/dev/null && pwd)
>
> I'll fix that in git.
I have just git pulled your fix and now it works. Thanks!
> Bjørn> It is also possible to use absolute paths when defining BASE_DIR. But I
> Bjørn> don't know how to do that when the output variable O can be relative or
> Bjørn> absolute:
>
> Bjørn> $ make O=/tmp/output
> Bjørn> $ make O=output
>
> Well, that's the point of the 'cd $(O) >/dev/null && pwd' part (convert
> to absolute path).
Of course, silly me. What I should have said was that because $(O) may
be absolute,
one cannot just do something like this:
cd $(PWD)/$(O) # will not print anything even if CDPATH is set but it
# it only works for $(O) with relative paths
Best regards,
Bjørn Forsman
More information about the buildroot
mailing list