|
| 1 | +#! /bin/bash |
| 2 | +# |
| 3 | +# Required Options: |
| 4 | +# -a : arch (mips or arm) |
| 5 | +# -q : qemu path to setup binfmt |
| 6 | +# -b : build webkit |
| 7 | +# -t : test webkit (assumes --build) |
| 8 | +# -f <regexp>: filter to be passed to the run-javascript-tests script |
| 9 | +# Optional Options: |
| 10 | +# -i : enters a terminal |
| 11 | +# Arguments: |
| 12 | +# <path>: path to a local webkit checkout to use in building and testing |
| 13 | +set -Eeuo pipefail |
| 14 | + |
| 15 | +# Command line argument handling |
| 16 | + |
| 17 | +INTERACTIVE=0 |
| 18 | +BUILD=0 |
| 19 | +TEST=0 |
| 20 | +FILTER="" |
| 21 | +ARCH= |
| 22 | +QEMU= |
| 23 | +while getopts ":a:q:ibtf:" opt; do |
| 24 | + case ${opt} in |
| 25 | + a) |
| 26 | + ARCH="$OPTARG" |
| 27 | + ;; |
| 28 | + q) |
| 29 | + QEMU="$OPTARG" |
| 30 | + ;; |
| 31 | + i) |
| 32 | + INTERACTIVE=1 |
| 33 | + ;; |
| 34 | + b) |
| 35 | + BUILD=1 |
| 36 | + ;; |
| 37 | + t) |
| 38 | + TEST=1 |
| 39 | + BUILD=1 |
| 40 | + ;; |
| 41 | + f) |
| 42 | + TEST=1 |
| 43 | + BUILD=1 |
| 44 | + FILTER="$OPTARG" |
| 45 | + ;; |
| 46 | + \?) |
| 47 | + echo "Invalid option: $OPTARG" 1>&2 |
| 48 | + exit |
| 49 | + ;; |
| 50 | + :) |
| 51 | + echo "Invalid option: $OPTARG requires an argument" 1>&2 |
| 52 | + exit |
| 53 | + ;; |
| 54 | + esac |
| 55 | +done |
| 56 | +shift $((OPTIND - 1)) |
| 57 | + |
| 58 | +if [[ $ARCH == '' ]]; then |
| 59 | + echo "Please specify -a <arch>" |
| 60 | + exit |
| 61 | +fi |
| 62 | + |
| 63 | +if [[ $# != 1 ]]; then |
| 64 | + echo "Not enough arguments" |
| 65 | + exit |
| 66 | +fi |
| 67 | +WEBKIT=$1 |
| 68 | + |
| 69 | +if [ ! -d $WEBKIT ]; then |
| 70 | + echo "Directory $WEBKIT does not exist" |
| 71 | + exit |
| 72 | +fi |
| 73 | + |
| 74 | +# Deal with exit |
| 75 | +BINFMT_NAME= |
| 76 | +function finish { |
| 77 | + if [[ $BINFMT_NAME != '' ]]; then |
| 78 | + echo "Cleaning up binfmt support" |
| 79 | + echo -1 > /proc/sys/fs/binfmt_misc/$BINFMT_NAME |
| 80 | + fi |
| 81 | +} |
| 82 | +trap finish EXIT SIGINT |
| 83 | + |
| 84 | +# Output plan |
| 85 | + |
| 86 | +echo "Using WebKit path $WEBKIT" |
| 87 | +echo "Plan:" |
| 88 | +if [[ $BUILD == 1 ]]; then |
| 89 | + echo " * Build;" |
| 90 | +fi |
| 91 | +if [[ $TEST == 1 ]]; then |
| 92 | + echo " * Test;" |
| 93 | + if [[ $FILTER != "" ]]; then |
| 94 | + echo " Using filter: \"$FILTER\"" |
| 95 | + fi |
| 96 | +fi |
| 97 | +if [[ $INTERACTIVE == 1 ]]; then |
| 98 | + echo " * Going into interactive mode;" |
| 99 | +fi |
| 100 | + |
| 101 | +read -n1 -r -p "Press any key to continue or Ctrl-C to exit..." keyign |
| 102 | + |
| 103 | +if [[ $QEMU != '' ]]; then |
| 104 | + echo "Setting up $ARCH binfmt to run interpreter in $QEMU" |
| 105 | + BINFMT_NAME="reprojsc-qemu-$ARCH" |
| 106 | + if [ -f "/proc/sys/fs/binfmt_misc/$BINFMT_NAME" ]; then |
| 107 | + echo -1 > /proc/sys/fs/binfmt_misc/$BINFMT_NAME |
| 108 | + fi |
| 109 | + |
| 110 | + if [[ $ARCH == "mips" ]]; then |
| 111 | + echo ":$BINFMT_NAME:M:0:\\x7f\\x45\\x4c\\x46\\x01\\x01\\x01\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x02\\x00\\x08\\x00:\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\x00\\xfe\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xfe\\xff\\xff\\xff:$QEMU:OC" > /proc/sys/fs/binfmt_misc/register |
| 112 | + elif [[ $ARCH == "arm" ]]; then |
| 113 | + echo ":$BINFMT_NAME:M:0:\\x7f\\x45\\x4c\\x46\\x01\\x01\\x01\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x02\\x00\\x28\\x00:\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\x00\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xfe\\xff\\xff\\xff:$QEMU:OCF" > /proc/sys/fs/binfmt_misc/register |
| 114 | + fi |
| 115 | +fi |
| 116 | + |
| 117 | +out=$(docker run --rm pmatos/jsc32-base:$ARCH /bin/true 2>&1 || true) |
| 118 | +if `echo $out | grep -q "exec format error"`; then |
| 119 | + echo "binfmt/qemu are not setup for $ARCH" |
| 120 | + echo "use -q <qemu-path> to setup qemu using binfmt (make sure qemu-path points to the qemu with the right arch)" |
| 121 | + exit 1 |
| 122 | +fi |
| 123 | + |
| 124 | +did=$(docker run --rm -di -v $WEBKIT:/WebKit pmatos/jsc32-base:$ARCH) |
| 125 | + |
| 126 | +UNAME= |
| 127 | +if [[ "$ARCH" == "arm" ]]; then |
| 128 | + UNAME="armv7l" |
| 129 | +elif [[ "$ARCH" == "mips" ]]; then |
| 130 | + UNAME="mips" |
| 131 | +fi |
| 132 | + |
| 133 | + |
| 134 | +if [[ "$(docker exec $did uname -m)" != "$UNAME" ]]; then |
| 135 | + echo "Something is wrong - incorrect container architecture" |
| 136 | + docker stop $did |
| 137 | + exit |
| 138 | +fi |
| 139 | + |
| 140 | + |
| 141 | +set +e |
| 142 | + |
| 143 | +[[ $BUILD == 1 ]] && docker exec $did /bin/bash -c "cd /WebKit && Tools/Scripts/build-jsc --release --jsc-only --cmakeargs=\"-DENABLE_STATIC_JSC=ON -DCMAKE_VERBOSE_MAKEFILE=ON -DENABLE_JIT=OFF\" $BUILD_JSC_ARGS" |
| 144 | +echo "Build returned $?" |
| 145 | +[[ $TEST == 1 ]] && docker exec $did /bin/bash -c "cd /WebKit && Tools/Scripts/run-javascriptcore-tests --no-build --no-fail-fast --json-output=jsc_results.json --release --memory-limited --no-testmasm --no-testair --no-testb3 --no-testdfg --no-testapi --jsc-only --no-jit-stress-tests $TEST_JSC_ARGS" |
| 146 | +echo "Test returned $?" |
| 147 | +[[ $INTERACTIVE == 1 ]] && docker exec -ti $did /bin/bash |
| 148 | +docker stop $did |
| 149 | + |
0 commit comments