qemu build failure, hxtool is a bash script, not a /bin/sh script

Bug #1347555 reported by Felix von Leitner
6
This bug affects 1 person
Affects Status Importance Assigned to Milestone
QEMU
Won't Fix
Undecided
Unassigned

Bug Description

hxtool (part of the early build process) is a bash script. Running it with /bin/sh yields a syntax error on line 10:

 10 STEXI*|ETEXI*|SQMP*|EQMP*) flag=$(($flag^1))

$(( expr )) is a bash extension, not part of /bin/sh.

Note that replacing the sh in the first line in hxtool with /bin/bash does not help, because the script is run manually from the Makefile with sh:

154 $(call quiet-command,sh $(SRC_PATH)/scripts/hxtool -h < $< > $@," GEN $@")

The fix is to change those lines to

154 $(call quiet-command,bash $(SRC_PATH)/scripts/hxtool -h < $< > $@," GEN $@")

(there are five or so).

Revision history for this message
Eric Blake (eblake) wrote : Re: [Qemu-devel] [Bug 1347555] [NEW] qemu build failure, hxtool is a bash script, not a /bin/sh script

On 07/23/2014 04:21 AM, Felix von Leitner wrote:
> Public bug reported:
>
> hxtool (part of the early build process) is a bash script. Running it
> with /bin/sh yields a syntax error on line 10:
>
> 10 STEXI*|ETEXI*|SQMP*|EQMP*) flag=$(($flag^1))
>
> $(( expr )) is a bash extension, not part of /bin/sh.

Wrong. $(( expr )) is mandated by POSIX. What system are you on where
/bin/sh is not POSIX? (Solaris is the only platform where /bin/sh does
not try to be POSIX-compliant, but who uses that for qemu?)

What is the actual syntax error you are seeing? Is this a bug in dash
on your distribution? I can't get dash to fail for me on Fedora:

$ dash -c 'f=1; f=$(($f^1)); echo $f'
0
$ dash -n scripts/hxtool; echo $?
0

--
Eric Blake eblake redhat com +1-919-301-3266
Libvirt virtualization library http://libvirt.org

Revision history for this message
Felix von Leitner (felix-launchpad) wrote :

I actually have bash installed as /bin/sh and /bin/bash.
But I also have heirloom sh installed, which installs itself as /sbin/sh, and that happened to be first in my $PATH.

Since the makefiles use "sh script" to run the scripts, that called the heirloom sh.

http://heirloom.sourceforge.net/sh.html

It is, it turns out, derived from OpenSolaris. So there you go :-)

When I delete /sbin/sh, qemu builds.

Revision history for this message
Eric Blake (eblake) wrote : Re: [Qemu-devel] [Bug 1347555] Re: qemu build failure, hxtool is a bash script, not a /bin/sh script

On 07/23/2014 10:13 AM, Felix von Leitner wrote:
> I actually have bash installed as /bin/sh and /bin/bash.
> But I also have heirloom sh installed, which installs itself as /sbin/sh, and that happened to be first in my $PATH.
>
> Since the makefiles use "sh script" to run the scripts, that called the
> heirloom sh.
>
> http://heirloom.sourceforge.net/sh.html
>
> It is, it turns out, derived from OpenSolaris. So there you go :-)
>
> When I delete /sbin/sh, qemu builds.

Then the bug is not in qemu, but in your environment. Installing
known-broken heirloom where it can be found first on a PATH search for
sh is just asking for problems, not just with qemu, but with all SORTS
of programs that expect POSIX semantics from a Linux /bin/sh.

Rather than change the Makefile to invoke the script with bash, we could
instead bend over backwards to rewrite the script in a way that works
with non-POSIX shells (as in, flag=`expr $flag ^ 1`), but that feels
backwards to me. Until someone is actively worried about porting qemu
to a true Solaris environment, rather than just an heirloom-as-/bin/sh
Linux environment, I don't think it's worth the effort.

--
Eric Blake eblake redhat com +1-919-301-3266
Libvirt virtualization library http://libvirt.org

Revision history for this message
Peter Maydell (pmaydell) wrote :

On 23 July 2014 17:31, Eric Blake <email address hidden> wrote:
> Rather than change the Makefile to invoke the script with bash, we could
> instead bend over backwards to rewrite the script in a way that works
> with non-POSIX shells (as in, flag=`expr $flag ^ 1`), but that feels
> backwards to me. Until someone is actively worried about porting qemu
> to a true Solaris environment, rather than just an heirloom-as-/bin/sh
> Linux environment, I don't think it's worth the effort.

My view on this has always been "we shouldn't assume bash,
but we can assume POSIX shell semantics". (And also that
we should assume /bin/sh is a POSIX shell, because it's the
21st century, and Solaris should just get with it :-))

thanks
-- PMM

Revision history for this message
Felix von Leitner (felix-launchpad) wrote :

It turns out that expr does not support ^ (at least according to the man page). :-)

Still, you could do expr -$flag + 1 to do the same thing.

Is the ruckus just about this one place where $(( )) is used or are there other non-Bourne-shell constructs?

Revision history for this message
Thomas Huth (th-huth) wrote :

Closing this ticket, as it was rather a problem with the non-posix-compliant shell and not the QEMU build system.

Changed in qemu:
status: New → Won't Fix
To post a comment you must log in.
This report contains Public information  
Everyone can see this information.

Other bug subscribers

Remote bug watches

Bug watches keep track of this bug in other bug trackers.