On Tue, Mar 18, 2014 at 09:44:43 -0600, Eric Blake wrote:
On 03/18/2014 09:32 AM, Jiri Denemark wrote:
> On Tue, Mar 18, 2014 at 06:27:48 -0600, Eric Blake wrote:
>> On 03/18/2014 05:00 AM, Jiri Denemark wrote:
>>
>>>> Why don't we just avoid the whole issue by removing use of
abs_srcdir
>>>> and abs_builddir. Can this rule:
>>>>
>>>> $(abs_builddir)/cpu/cpu_map.xml:
>>>> $(AM_V_GEN)ln -s $(abs_srcdir)/cpu/cpu_map.xml $@
>>>>
>>>> be just changed to
>>>>
>>>> cpu/cpu_map.xml:
>>>> $(AM_V_GEN)ln -s $(srcdir)/cpu/cpu_map.xml $@
>>>
>>> That's what I tried first but it does not work at all. I don't
>>> understand why but make thinks cpu/cpu_map.xml target is uptodate even
>>> though the file does not exist in builddir.
>>
>> That would be VPATH rewriting at play. Does $(builddir)/cpu/cpu_map.xml
>> fare any better?
>
> No, that doesn't work either.
>
> ...
>> But maybe that's some food for thought - instead of having a rule that
>> uses a direct file name, perhaps you can instead have a witness rule on
>> a stamp file name, where we write the link ourselves when needed, and
>> then have all dependencies be on the stamp (which will ALWAYS exist only
>> in builddir):
>>
>> cpu/cpu_map.xml.stamp:
>> $(AM_V_GEN)if test -f cpu/cpu_map.xml; then \
>> :; else \
>> ln -s `cd $(srcdir) && pwd`/cpu/cpu_map.xml \
>> cpu/cpu_map.xml; \
>> fi && touch $@
>
> OK, this seems to work. It's uglier and doesn't regenerate the link if
> someone removes it (the *.stamp file would need to be removed too) but
> if that's considered a better way compared to setting abs_*dir, I can
> make a proper patch out of it after testing it in all situations.
Everything we've tried is ugly. At this point, relying on the GNU make
extension of $(shell), and using = instead of ?=, is probably the least
bad solution. So feel free to keep testing the .stamp alternative if
you want, but I'm okay if you check in what you've already tested
instead of sinking more time into it.
Oh, one other thing I thought of:
Why not just name the git version cpu_map.xml.in, and use autoconf's
normal mechanisms to always create the non-.in version in builddir.
True, there's no @foo@ sequences being replaced, but that way, we don't
have to worry about $(abs_srcdir) in the makefile at all; we also don't
have to mess with a .stamp.
OK, I went ahead and pushed the minimal solution, i.e., setting
abs_{src,build}dir = $(shell ...)
After all, having the variables set may save us from similar build
issues should any of the abs variables be useful for other rules.
Jirka