Dave Korn wrote:
> Eric Botcazou wrote:
>> Your .diff contains this
>>
>> + EH_MECHANISM=-gcc
>>
>> so it looks as though the base compiler was SJLJ.
>
> Ah, bingo! Thanks Eric; yes, I have a recent build of an SJLJ Gnat from
> HEAD lying around my PATH ahead of my old 4.3.2-with-ZCX. Getting that out of
> the way should help!
And although it turns out that was the case, it didn't actually solve the
problem. It turns out to be a horribly subtle artifact of this factor:
> switched it over to ZCX, and it worked well
> enough to pass most of the testsuite, including EH. Now I'm changing the
> target pairs on top of that and suddenly it's complaining, which is why I'm
> confused; I thought that bit was stable.
This was driving me mad, I had a perfectly working ZCX compiler but every
time I tried to change anything, it mysteriously switched itself back to SJLJ
for seemingly no reason at all and then failed building target-libada as a
consequence. The thing was down to the particular way in which I was setting
the LIBGNAT_TARGET_PAIRS variable; because of the way Cygwin and MinGW share
most of their port implementation, I was doing this:
LIBGNAT_TARGET_PAIRS = \
[ ... overrides only for mingw ... ]
if ( ... target is cygwin ... )
# blank it out, no cygwin-only overrides yet
LIBGNAT_TARGET_PAIRS =
endif
LIBGNAT_TARGET_PAIRS += \
[ ... common overrides ... ]
And the result of doing it this way was that LIBGNAT_TARGET_PAIRS ended up
with an embedded leading space. This wouldn't have mattered much, except for
one little thing: later, in gcc-interface/Makefile.in, we have ...
ifeq ($(filter-out a-except%,$(LIBGNAT_TARGET_PAIRS)),$(LIBGNAT_TARGET_PAIRS))
LIBGNAT_TARGET_PAIRS += \
a-except.ads<a-except-2005.ads \
a-except.adb<a-except-2005.adb
endif
... and the $(filter-out) function has an implicit $(strip) operation, and as
a result even though the filter-out doesn't remove anything from
LIBGNAT_TARGET_PAIRS (because this is indeed supposed to be a ZCX compiler
we're building and it doesn't yet have any override for a-except.*), the
result doesn't match because the leading blank is missing. And so the
compiler would revert to SJLJ!
Is it just a bug for me to generate LIBGNAT_TARGET_PAIRS in a way that has
superfluous spaces (whether leading, trailing or embedded), or shall I send a
patch to add a $(strip) to the right-hand side of the ifeq comparison? Or
perhaps we should do
LIBGNAT_TARGET_PAIRS:=$(strip $(LIBGNAT_TARGET_PAIRS))
right at the top-level, just after the per-target chunks, to ensure the string
is properly normalised before any further tests and comparisons we might want
to make?
cheers,
DaveK