Add in support for running a cross-shell directly in qemu (bug 807936, r=ted)
authorMarty Rosenberg <mrosenberg@mozilla.com>
Thu, 15 Nov 2012 10:24:07 -0500
changeset 121379 1a53df18c076a7388496b9d78cceb855ce793735
parent 121378 224fe2a12a04c5edb6ec7a1b9d0cad1890f8e66f
child 121380 09fa9bbbfb022192bf757ca92828773a7004ebdd
push id1997
push userakeybl@mozilla.com
push dateMon, 07 Jan 2013 21:25:26 +0000
treeherdermozilla-beta@4baf45cdcf21 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersted
bugs807936
milestone19.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Add in support for running a cross-shell directly in qemu (bug 807936, r=ted)
build/qemu-wrap
js/src/build/qemu-wrap
js/src/configure.in
js/src/jsapi-tests/Makefile.in
js/src/shell/Makefile.in
new file mode 100755
--- /dev/null
+++ b/build/qemu-wrap
@@ -0,0 +1,24 @@
+#!/bin/bash
+# this script creates a wrapper shell script for an executable.  The idea is the actual executable cannot be
+# executed natively (it was cross compiled), but we want to run tests natively.  Running this script
+# as part of the compilation process will move the non-native executable to a new location, and replace it
+# with a script that will run it under qemu.
+while [[ -n $1 ]]; do
+    case $1 in
+        --qemu) QEMU="$2"; shift 2;;
+        --libdir) LIBDIR="$2"; shift 2;;
+        --ld) LD="$2"; shift 2;;
+        *) exe="$1"; shift;;
+    esac
+done
+if [[ -z $LIBDIR ]]; then
+    echo "You need to specify a directory for the cross libraries when you configure the shell"
+    echo "You can do this with --with-cross-lib="
+    exit 1
+fi
+LD=${LD:-$LIBDIR/ld-linux.so.3}
+mv $exe $exe.target
+# Just hardcode the path to the executable.  It'll be pretty obvious if it is doing the wrong thing.
+
+echo $'#!/bin/bash\n' $QEMU -E LD_LIBRARY_PATH="${LIBDIR}" "$LD" "$(readlink -f "$exe.target")" '"$@"' >"$exe"
+chmod +x $exe
\ No newline at end of file
new file mode 100755
--- /dev/null
+++ b/js/src/build/qemu-wrap
@@ -0,0 +1,24 @@
+#!/bin/bash
+# this script creates a wrapper shell script for an executable.  The idea is the actual executable cannot be
+# executed natively (it was cross compiled), but we want to run tests natively.  Running this script
+# as part of the compilation process will move the non-native executable to a new location, and replace it
+# with a script that will run it under qemu.
+while [[ -n $1 ]]; do
+    case $1 in
+        --qemu) QEMU="$2"; shift 2;;
+        --libdir) LIBDIR="$2"; shift 2;;
+        --ld) LD="$2"; shift 2;;
+        *) exe="$1"; shift;;
+    esac
+done
+if [[ -z $LIBDIR ]]; then
+    echo "You need to specify a directory for the cross libraries when you configure the shell"
+    echo "You can do this with --with-cross-lib="
+    exit 1
+fi
+LD=${LD:-$LIBDIR/ld-linux.so.3}
+mv $exe $exe.target
+# Just hardcode the path to the executable.  It'll be pretty obvious if it is doing the wrong thing.
+
+echo $'#!/bin/bash\n' $QEMU -E LD_LIBRARY_PATH="${LIBDIR}" "$LD" "$(readlink -f "$exe.target")" '"$@"' >"$exe"
+chmod +x $exe
\ No newline at end of file
--- a/js/src/configure.in
+++ b/js/src/configure.in
@@ -4133,16 +4133,31 @@ if test "$JS_HAS_CTYPES"; then
 fi
 
 if test "$MOZ_DEBUG" -o "$NS_TRACE_MALLOC"; then
     MOZ_COMPONENTS_VERSION_SCRIPT_LDFLAGS=
 fi
 
 dnl ========================================================
 dnl =
+dnl = Options for generating the shell as a script
+dnl =
+dnl ========================================================
+
+MOZ_ARG_WITH_STRING(qemu-exe,
+[  --with-qemu-exe=path   Use path as an arm emulator on host platforms],
+    QEMU_EXE=$withval)
+AC_SUBST(QEMU_EXE)
+MOZ_ARG_WITH_STRING(cross-lib,
+[  --with-cross-lib=dir   Use dir as the location for arm libraries],
+    CROSS_LIB=$withval,
+    CROSS_LIB=/usr/$target)
+AC_SUBST(CROSS_LIB)
+dnl ========================================================
+dnl =
 dnl = Maintainer debug option (no --enable equivalent)
 dnl =
 dnl ========================================================
 
 AC_SUBST(AR)
 AC_SUBST(AR_FLAGS)
 AC_SUBST(AR_LIST)
 AC_SUBST(AR_EXTRACT)
--- a/js/src/jsapi-tests/Makefile.in
+++ b/js/src/jsapi-tests/Makefile.in
@@ -80,12 +80,16 @@ DEFINES         += -DEXPORT_JS_API
 # Building against js_static requires that we declare mfbt sybols "exported"
 # on its behalf.
 DEFINES         += -DIMPL_MFBT
 
 LIBS      = $(DEPTH)/$(LIB_PREFIX)js_static.$(LIB_SUFFIX) $(NSPR_LIBS) $(MOZ_ZLIB_LIBS)
 
 LOCAL_INCLUDES += -I$(topsrcdir) -I..
 
+ifdef QEMU_EXE
+MOZ_POST_PROGRAM_COMMAND = $(topsrcdir)/build/qemu-wrap --qemu $(QEMU_EXE) --libdir $(CROSS_LIB)
+endif
+
 include $(topsrcdir)/config/rules.mk
 
 check::
 	$(wildcard $(RUN_TEST_PROGRAM)) $(DIST)/bin/jsapi-tests$(BIN_SUFFIX)
--- a/js/src/shell/Makefile.in
+++ b/js/src/shell/Makefile.in
@@ -31,16 +31,20 @@ endif
 LOCAL_INCLUDES += -I$(topsrcdir) -I..
 
 ifeq ($(OS_ARCH),Darwin)
 ifeq ($(TARGET_CPU),x86_64)
 DARWIN_EXE_LDFLAGS += -pagezero_size 10000 -image_base 100000000
 endif
 endif
 
+ifdef QEMU_EXE
+MOZ_POST_PROGRAM_COMMAND = $(topsrcdir)/build/qemu-wrap --qemu $(QEMU_EXE) --libdir $(CROSS_LIB)
+endif
+
 include $(topsrcdir)/config/rules.mk
 
 ifdef MOZ_SHARK
 CFLAGS += -F/System/Library/PrivateFrameworks
 CXXFLAGS += -F/System/Library/PrivateFrameworks
 LDFLAGS += -F/System/Library/PrivateFrameworks -framework CHUD
 endif