[RFA/commit] Work around Solaris bourne shell limitation when building the sim

Joel Brobecker
2011-12-18T16:05:37Z

Hello,

Building the sim on a sparc-solaris 2.8 machine fails when configured
with no extra sim hardware:

> for hw in ; do \
> echo "extern const struct hw_descriptor
> dv_${hw}_descriptor[];" ; \
> done >> tmp-hw.h
> echo 'const char version[] = "'"`sed q
> /[...]/../../gdb/version.in`"'";'
> >> version.c-tmp
> /bin/sh: -c: line 1: syntax error near unexpected token `;'
> /bin/sh: -c: line 1: `for hw in ; do \'
> make[3]: *** [hw-config.h] Error 2

The same thing happens with the version of bash that we got from
Sun as well (which is very old: 2.03.0(1)-release).

The problems comes from the fact that both shells are buggy, and
reject the following script:

for hw in ; do
[...]
done

The above is what sim/common/Makefile.in tries to execute when
generating hw-config.h.

In order to allow users to build out of the box on these machines,
this patch works around this bug. It does rely on the fact that
none of the tokens in SIM_HW contain whitespaces. I don't think
that this is going to be a problem in practice.

sim/common/ChangeLog:

* Make-common.in (hw-config.h): Work around bug in Solaris 2.8
system bourne shell.

Tested on sparc-solaris with both /bin/sh and /bin/bash.
Would that be OK?

PS: An alternate approach, which I think might be better (although
this might depend on taste), is to do use config.h and define
macros there depending on which hw capability is being configured
in. Then hw-config.h no longer needs to be generated. It becomes
a regular source file with #ifdef's in them. I didn't do it
because it's probably a significant amount of work, and I am
not convinced that it's that better.

---
sim/common/Make-common.in | 7 +++++--
1 files changed, 5 insertions(+), 2 deletions(-)

diff --git a/sim/common/Make-common.in b/sim/common/Make-common.in
index c12d155..7c76f50 100644
--- a/sim/common/Make-common.in
+++ b/sim/common/Make-common.in
@@ -459,14 +459,17 @@ sim-inline.c: $(srccom)/sim-inline.c
$(SHELL) $(srcdir)/../../move-if-change tmp-$@ $@

# FIXME This is one very simple-minded way of generating the file hw-config.h
+# The use of the "`echo $(SIM_HW)`" in the for loops below is to work around
+# bugs in certain system shells (such as the Solaris 2.8 bourne shell)
+# which break when the for list is empty.
hw-config.h: Makefile.in $(srccom)/Make-common.in config.status Makefile
rm -f tmp-hw.h
echo "/* generated by Makefile */" > tmp-hw.h
- for hw in $(SIM_HW) ; do \
+ for hw in `echo $(SIM_HW)` ; do \
echo "extern const struct hw_descriptor dv_$${hw}_descriptor[];" ; \
done >> tmp-hw.h
echo "const struct hw_descriptor *hw_descriptors[] = {" >> tmp-hw.h
- for hw in $(SIM_HW) ; do \
+ for hw in `echo $(SIM_HW)` ; do \
echo " dv_$${hw}_descriptor," ; \
done >> tmp-hw.h
echo " NULL," >> tmp-hw.h
--
1.7.1