#!/bin/sh # Copyright 2013 The Native Client Authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. # $FIREFOX must point to the Firefox Nightly build (or some other # build supporting Asm.js). Alternatively, $PATH can be set such that # "firefox" executes the Firefox nightly build. # Some limitations of this framework: # # Spec2k uses a lot of file I/O (stdin/stdout, reading files, writing # files) which doesn't really work in JavaScript. Emscripten deals with # this by providing the --embed-file and --preload-file options to # package input files into a virtual in-memory file system. Using # --embed-file allows input files, stdin, and stdout to work in the # standalone js shell, except that initialization of the file system is # extremely slow and ruins any attempt to get reasonable timings. Using # --preload-file works reasonably fast, but does not work in the # standalone js shell and must be run in the browser, and stdin is not # usable. # # As such, the following Spec2k components do not work due to their use # of stdin: 183.equake, 186.crafty, 188.ammp, 197.parser, 253.perlbmk, # and 254.gap. In addition, 254.gap and 176.gcc do not (yet) work # because Emscripten does not support setjmp. That leaves 9 out of 16 # components that do work. # # The other file I/O related problem is that it is not possible for the # harness to inspect output files (which are only represented # in-memory), so validation is only possible by looking at stdout which # is displayed on the browser page. # # As for getting timings, ideally we would want the JavaScript code to # close the tab/window/browser after it completes. There is # easily-found JavaScript code to do this, but it isn't reliable on # Firefox when closing the last tab. As a result, one has to "babysit" # the tests and manually close the browser as each test completes. This # means that one needs to use the user+system time, not the wall-clock # time, in reporting results. # # For the "train" versus "ref" runs, the run scripts generally copy or # symlink files from the appropriate input directory into the current # directory before running the binary. This approach doesn't work for # Emscripten, where the files need to be prepackaged at build time. The # prepackaging is done by concatenating all the files into one big file, # and embedding offsets and lengths into the JavaScript code. This # means we have to build separate versions for "train" and "ref". To # avoid duplication, the input file preparation is refactored into a new # prepare_input.sh script in each Spec2k component directory. # # The emcc command must be part of $PATH. To build Emscripten, get the # source via "git clone git://github.com/kripken/emscripten.git". There # is a nice tutorial at # https://github.com/kripken/emscripten/wiki/Tutorial . Emscripten # requires Clang+LLVM 3.2, it is convenient to download a prebuilt # package, e.g. # http://llvm.org/releases/3.2/clang+llvm-3.2-x86_64-linux-ubuntu-12.04.tar.gz # # At this writing, Asm.js is only supported in the Firefox nightly # builds. It may be necessary to enable javascript.options.asmjs in # about:config. It is also useful to set dom.max_script_run_time=0 to # disable the "unresponsive script" popups. export FIREFOX=${FIREFOX:-firefox} PORT=8888 python -m SimpleHTTPServer "$PORT" > /dev/null 2>&1 & PID=$! # Build a URL of the form http://localhost/argv0?argv1&argv2&argv3 URL=`echo "$*" | sed -e 's/ /?/' -e 's/ /\&/g' -e "s?^?http://localhost:$PORT/?"` REFTRAIN=`echo $SCRIPTNAME | sed -e 's/.*run\.//' -e 's/\.sh$//'` URL=`echo $URL | sed "s/.emcc.html/.emcc.html.$REFTRAIN.html/"` $FIREFOX "$URL" kill $PID