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 113451 1a53df18c076a7388496b9d78cceb855ce793735
parent 113450 224fe2a12a04c5edb6ec7a1b9d0cad1890f8e66f
child 113452 09fa9bbbfb022192bf757ca92828773a7004ebdd
push id1200
push userryanvm@gmail.com
push dateSat, 17 Nov 2012 18:32:07 +0000
treeherderfx-team@4639da479a93 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersted
bugs807936
milestone19.0a1
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