Spaces:
Runtime error
Runtime error
CLOSURE_DIR=closure-compiler | |
CLOSURE=$(CLOSURE_DIR)/compiler.jar | |
NASM_TEST_DIR=./tests/nasm | |
INSTRUCTION_TABLES=src/rust/gen/jit.rs src/rust/gen/jit0f.rs \ | |
src/rust/gen/interpreter.rs src/rust/gen/interpreter0f.rs \ | |
src/rust/gen/analyzer.rs src/rust/gen/analyzer0f.rs \ | |
# Only the dependencies common to both generate_{jit,interpreter}.js | |
GEN_DEPENDENCIES=$(filter-out gen/generate_interpreter.js gen/generate_jit.js gen/generate_analyzer.js, $(wildcard gen/*.js)) | |
JIT_DEPENDENCIES=$(GEN_DEPENDENCIES) gen/generate_jit.js | |
INTERPRETER_DEPENDENCIES=$(GEN_DEPENDENCIES) gen/generate_interpreter.js | |
ANALYZER_DEPENDENCIES=$(GEN_DEPENDENCIES) gen/generate_analyzer.js | |
STRIP_DEBUG_FLAG= | |
ifeq ($(STRIP_DEBUG),true) | |
STRIP_DEBUG_FLAG=--v86-strip-debug | |
endif | |
WASM_OPT ?= false | |
default: build/v86-debug.wasm | |
all: build/v86_all.js build/libv86.js build/libv86.mjs build/v86.wasm | |
all-debug: build/libv86-debug.js build/libv86-debug.mjs build/v86-debug.wasm | |
browser: build/v86_all.js | |
# Used for nodejs builds and in order to profile code. | |
# `debug` gives identifiers a readable name, make sure it doesn't have any side effects. | |
CLOSURE_READABLE=--formatting PRETTY_PRINT --debug | |
CLOSURE_SOURCE_MAP=\ | |
--source_map_format V3\ | |
--create_source_map '%outname%.map' | |
CLOSURE_FLAGS=\ | |
--generate_exports\ | |
--externs src/externs.js\ | |
--warning_level VERBOSE\ | |
--jscomp_error accessControls\ | |
--jscomp_error checkRegExp\ | |
--jscomp_error checkTypes\ | |
--jscomp_error checkVars\ | |
--jscomp_error conformanceViolations\ | |
--jscomp_error const\ | |
--jscomp_error constantProperty\ | |
--jscomp_error deprecated\ | |
--jscomp_error deprecatedAnnotations\ | |
--jscomp_error duplicateMessage\ | |
--jscomp_error es5Strict\ | |
--jscomp_error externsValidation\ | |
--jscomp_error globalThis\ | |
--jscomp_error invalidCasts\ | |
--jscomp_error misplacedTypeAnnotation\ | |
--jscomp_error missingProperties\ | |
--jscomp_error missingReturn\ | |
--jscomp_error msgDescriptions\ | |
--jscomp_error nonStandardJsDocs\ | |
--jscomp_error suspiciousCode\ | |
--jscomp_error strictModuleDepCheck\ | |
--jscomp_error typeInvalidation\ | |
--jscomp_error undefinedVars\ | |
--jscomp_error unknownDefines\ | |
--jscomp_error visibility\ | |
--use_types_for_optimization\ | |
--assume_function_wrapper\ | |
--summary_detail_level 3\ | |
--language_in ECMASCRIPT_2020\ | |
--language_out ECMASCRIPT_2020 | |
CARGO_FLAGS_SAFE=\ | |
--target wasm32-unknown-unknown \ | |
-- \ | |
-C linker=tools/rust-lld-wrapper \ | |
-C link-args="--import-table --global-base=4096 $(STRIP_DEBUG_FLAG)" \ | |
-C link-args="build/softfloat.o" \ | |
-C link-args="build/zstddeclib.o" \ | |
--verbose | |
CARGO_FLAGS=$(CARGO_FLAGS_SAFE) -C target-feature=+bulk-memory -C target-feature=+multivalue -C target-feature=+simd128 | |
CORE_FILES=cjs.js const.js io.js main.js lib.js buffer.js ide.js pci.js floppy.js \ | |
dma.js pit.js vga.js ps2.js rtc.js uart.js \ | |
acpi.js iso9660.js \ | |
state.js ne2k.js sb16.js virtio.js virtio_console.js virtio_net.js virtio_balloon.js \ | |
bus.js log.js cpu.js \ | |
elf.js kernel.js | |
LIB_FILES=9p.js filesystem.js marshall.js | |
BROWSER_FILES=screen.js keyboard.js mouse.js speaker.js serial.js \ | |
network.js starter.js worker_bus.js dummy_screen.js \ | |
inbrowser_network.js fake_network.js wisp_network.js fetch_network.js \ | |
print_stats.js filestorage.js | |
RUST_FILES=$(shell find src/rust/ -name '*.rs') \ | |
src/rust/gen/interpreter.rs src/rust/gen/interpreter0f.rs \ | |
src/rust/gen/jit.rs src/rust/gen/jit0f.rs \ | |
src/rust/gen/analyzer.rs src/rust/gen/analyzer0f.rs | |
CORE_FILES:=$(addprefix src/,$(CORE_FILES)) | |
LIB_FILES:=$(addprefix lib/,$(LIB_FILES)) | |
BROWSER_FILES:=$(addprefix src/browser/,$(BROWSER_FILES)) | |
build/v86_all.js: $(CLOSURE) src/*.js src/browser/*.js lib/*.js | |
mkdir -p build | |
-ls -lh build/v86_all.js | |
java -jar $(CLOSURE) \ | |
--js_output_file build/v86_all.js\ | |
--define=DEBUG=false\ | |
$(CLOSURE_SOURCE_MAP)\ | |
$(CLOSURE_FLAGS)\ | |
--compilation_level ADVANCED\ | |
--js $(CORE_FILES)\ | |
--js $(LIB_FILES)\ | |
--js $(BROWSER_FILES)\ | |
--js src/browser/main.js | |
ls -lh build/v86_all.js | |
build/v86_all_debug.js: $(CLOSURE) src/*.js src/browser/*.js lib/*.js | |
mkdir -p build | |
java -jar $(CLOSURE) \ | |
--js_output_file build/v86_all_debug.js\ | |
--define=DEBUG=true\ | |
$(CLOSURE_SOURCE_MAP)\ | |
$(CLOSURE_FLAGS)\ | |
--compilation_level ADVANCED\ | |
--js $(CORE_FILES)\ | |
--js $(LIB_FILES)\ | |
--js $(BROWSER_FILES)\ | |
--js src/browser/main.js | |
build/libv86.js: $(CLOSURE) src/*.js lib/*.js src/browser/*.js | |
mkdir -p build | |
-ls -lh build/libv86.js | |
java -jar $(CLOSURE) \ | |
--js_output_file build/libv86.js\ | |
--define=DEBUG=false\ | |
$(CLOSURE_FLAGS)\ | |
--compilation_level SIMPLE\ | |
--jscomp_off=missingProperties\ | |
--output_wrapper ';(function(){%output%}).call(this);'\ | |
--js $(CORE_FILES)\ | |
--js $(BROWSER_FILES)\ | |
--js $(LIB_FILES) | |
ls -lh build/libv86.js | |
build/libv86.mjs: $(CLOSURE) src/*.js lib/*.js src/browser/*.js | |
mkdir -p build | |
-ls -lh build/libv86.js | |
java -jar $(CLOSURE) \ | |
--js_output_file build/libv86.mjs\ | |
--define=DEBUG=false\ | |
$(CLOSURE_FLAGS)\ | |
--compilation_level SIMPLE\ | |
--jscomp_off=missingProperties\ | |
--output_wrapper ';let module = {exports:{}}; %output%; export default module.exports.V86; export let {V86, CPU} = module.exports;'\ | |
--js $(CORE_FILES)\ | |
--js $(BROWSER_FILES)\ | |
--js $(LIB_FILES)\ | |
--chunk_output_type=ES_MODULES\ | |
--emit_use_strict=false | |
ls -lh build/libv86.mjs | |
build/libv86-debug.js: $(CLOSURE) src/*.js lib/*.js src/browser/*.js | |
mkdir -p build | |
java -jar $(CLOSURE) \ | |
--js_output_file build/libv86-debug.js\ | |
--define=DEBUG=true\ | |
$(CLOSURE_FLAGS)\ | |
$(CLOSURE_READABLE)\ | |
--compilation_level SIMPLE\ | |
--jscomp_off=missingProperties\ | |
--output_wrapper ';(function(){%output%}).call(this);'\ | |
--js $(CORE_FILES)\ | |
--js $(BROWSER_FILES)\ | |
--js $(LIB_FILES) | |
build/libv86-debug.mjs: $(CLOSURE) src/*.js lib/*.js src/browser/*.js | |
mkdir -p build | |
java -jar $(CLOSURE) \ | |
--js_output_file build/libv86-debug.mjs\ | |
--define=DEBUG=true\ | |
$(CLOSURE_FLAGS)\ | |
--compilation_level SIMPLE\ | |
--jscomp_off=missingProperties\ | |
--output_wrapper ';let module = {exports:{}}; %output%; export default module.exports.V86; export let {V86, CPU} = module.exports;'\ | |
--js $(CORE_FILES)\ | |
--js $(BROWSER_FILES)\ | |
--js $(LIB_FILES)\ | |
--chunk_output_type=ES_MODULES\ | |
--emit_use_strict=false | |
ls -lh build/libv86-debug.mjs | |
src/rust/gen/jit.rs: $(JIT_DEPENDENCIES) | |
./gen/generate_jit.js --output-dir build/ --table jit | |
src/rust/gen/jit0f.rs: $(JIT_DEPENDENCIES) | |
./gen/generate_jit.js --output-dir build/ --table jit0f | |
src/rust/gen/interpreter.rs: $(INTERPRETER_DEPENDENCIES) | |
./gen/generate_interpreter.js --output-dir build/ --table interpreter | |
src/rust/gen/interpreter0f.rs: $(INTERPRETER_DEPENDENCIES) | |
./gen/generate_interpreter.js --output-dir build/ --table interpreter0f | |
src/rust/gen/analyzer.rs: $(ANALYZER_DEPENDENCIES) | |
./gen/generate_analyzer.js --output-dir build/ --table analyzer | |
src/rust/gen/analyzer0f.rs: $(ANALYZER_DEPENDENCIES) | |
./gen/generate_analyzer.js --output-dir build/ --table analyzer0f | |
build/v86.wasm: $(RUST_FILES) build/softfloat.o build/zstddeclib.o Cargo.toml | |
mkdir -p build/ | |
-BLOCK_SIZE=K ls -l build/v86.wasm | |
cargo rustc --release $(CARGO_FLAGS) | |
cp build/wasm32-unknown-unknown/release/v86.wasm build/v86.wasm | |
-$(WASM_OPT) && wasm-opt -O2 --strip-debug build/v86.wasm -o build/v86.wasm | |
BLOCK_SIZE=K ls -l build/v86.wasm | |
build/v86-debug.wasm: $(RUST_FILES) build/softfloat.o build/zstddeclib.o Cargo.toml | |
mkdir -p build/ | |
-BLOCK_SIZE=K ls -l build/v86-debug.wasm | |
cargo rustc $(CARGO_FLAGS) | |
cp build/wasm32-unknown-unknown/debug/v86.wasm build/v86-debug.wasm | |
BLOCK_SIZE=K ls -l build/v86-debug.wasm | |
build/v86-fallback.wasm: $(RUST_FILES) build/softfloat.o build/zstddeclib.o Cargo.toml | |
mkdir -p build/ | |
cargo rustc --release $(CARGO_FLAGS_SAFE) | |
cp build/wasm32-unknown-unknown/release/v86.wasm build/v86-fallback.wasm || true | |
debug-with-profiler: $(RUST_FILES) build/softfloat.o build/zstddeclib.o Cargo.toml | |
mkdir -p build/ | |
cargo rustc --features profiler $(CARGO_FLAGS) | |
cp build/wasm32-unknown-unknown/debug/v86.wasm build/v86-debug.wasm || true | |
with-profiler: $(RUST_FILES) build/softfloat.o build/zstddeclib.o Cargo.toml | |
mkdir -p build/ | |
cargo rustc --release --features profiler $(CARGO_FLAGS) | |
cp build/wasm32-unknown-unknown/release/v86.wasm build/v86.wasm || true | |
watch: | |
cargo watch -x 'rustc $(CARGO_FLAGS)' -s 'cp build/wasm32-unknown-unknown/debug/v86.wasm build/v86-debug.wasm' | |
build/softfloat.o: lib/softfloat/softfloat.c | |
mkdir -p build | |
clang -c -Wall \ | |
--target=wasm32 -O3 -flto -nostdlib -fvisibility=hidden -ffunction-sections -fdata-sections \ | |
-DSOFTFLOAT_FAST_INT64 -DINLINE_LEVEL=5 -DSOFTFLOAT_FAST_DIV32TO16 -DSOFTFLOAT_FAST_DIV64TO32 \ | |
-o build/softfloat.o \ | |
lib/softfloat/softfloat.c | |
build/zstddeclib.o: lib/zstd/zstddeclib.c | |
mkdir -p build | |
clang -c -Wall \ | |
--target=wasm32 -O3 -flto -nostdlib -fvisibility=hidden -ffunction-sections -fdata-sections \ | |
-DZSTDLIB_VISIBILITY="" \ | |
-o build/zstddeclib.o \ | |
lib/zstd/zstddeclib.c | |
clean: | |
-rm build/libv86.js | |
-rm build/libv86.mjs | |
-rm build/libv86-debug.js | |
-rm build/libv86-debug.mjs | |
-rm build/v86_all.js | |
-rm build/v86.wasm | |
-rm build/v86-debug.wasm | |
-rm $(INSTRUCTION_TABLES) | |
-rm build/*.map | |
-rm build/*.wast | |
-rm build/*.o | |
$(MAKE) -C $(NASM_TEST_DIR) clean | |
run: | |
python3 -m http.server 2> /dev/null | |
update_version: | |
set -e ;\ | |
COMMIT=`git log --format="%h" -n 1` ;\ | |
DATE=`git log --date="format:%b %e, %Y %H:%m" --format="%cd" -n 1` ;\ | |
SEARCH='<code>Version: <a id="version" href="https://github.com/copy/v86/commits/[a-f0-9]\+">[a-f0-9]\+</a> ([^(]\+)</code>' ;\ | |
REPLACE='<code>Version: <a id="version" href="https://github.com/copy/v86/commits/'$$COMMIT'">'$$COMMIT'</a> ('$$DATE')</code>' ;\ | |
sed -i "s@$$SEARCH@$$REPLACE@g" index.html ;\ | |
SEARCH='<script src="build/v86_all.js?[a-f0-9]\+"></script>' ;\ | |
REPLACE='<script src="build/v86_all.js?'$$COMMIT'"></script>' ;\ | |
sed -i "s@$$SEARCH@$$REPLACE@g" index.html ;\ | |
grep $$COMMIT index.html | |
$(CLOSURE): | |
mkdir -p $(CLOSURE_DIR) | |
# don't upgrade until https://github.com/google/closure-compiler/issues/3972 is fixed | |
wget -nv -O $(CLOSURE) https://repo1.maven.org/maven2/com/google/javascript/closure-compiler/v20210601/closure-compiler-v20210601.jar | |
build/integration-test-fs/fs.json: images/buildroot-bzimage68.bin | |
mkdir -p build/integration-test-fs/flat | |
cp images/buildroot-bzimage68.bin build/integration-test-fs/bzImage | |
touch build/integration-test-fs/initrd | |
cd build/integration-test-fs && tar cfv fs.tar bzImage initrd | |
./tools/fs2json.py build/integration-test-fs/fs.tar --out build/integration-test-fs/fs.json | |
./tools/copy-to-sha256.py build/integration-test-fs/fs.tar build/integration-test-fs/flat | |
rm build/integration-test-fs/fs.tar build/integration-test-fs/bzImage build/integration-test-fs/initrd | |
tests: build/v86-debug.wasm build/integration-test-fs/fs.json | |
LOG_LEVEL=3 ./tests/full/run.js | |
tests-release: build/libv86.js build/v86.wasm build/integration-test-fs/fs.json | |
TEST_RELEASE_BUILD=1 ./tests/full/run.js | |
nasmtests: build/v86-debug.wasm | |
$(NASM_TEST_DIR)/create_tests.js | |
$(NASM_TEST_DIR)/gen_fixtures.js | |
$(NASM_TEST_DIR)/run.js | |
nasmtests-force-jit: build/v86-debug.wasm | |
$(NASM_TEST_DIR)/create_tests.js | |
$(NASM_TEST_DIR)/gen_fixtures.js | |
$(NASM_TEST_DIR)/run.js --force-jit | |
jitpagingtests: build/v86-debug.wasm | |
$(MAKE) -C tests/jit-paging test-jit | |
./tests/jit-paging/run.js | |
qemutests: build/v86-debug.wasm | |
$(MAKE) -C tests/qemu test-i386 | |
LOG_LEVEL=3 ./tests/qemu/run.js build/qemu-test-result | |
./tests/qemu/run-qemu.js > build/qemu-test-reference | |
diff build/qemu-test-result build/qemu-test-reference | |
qemutests-release: build/libv86.mjs build/v86.wasm | |
$(MAKE) -C tests/qemu test-i386 | |
TEST_RELEASE_BUILD=1 time ./tests/qemu/run.js build/qemu-test-result | |
./tests/qemu/run-qemu.js > build/qemu-test-reference | |
diff build/qemu-test-result build/qemu-test-reference | |
kvm-unit-test: build/v86-debug.wasm | |
(cd tests/kvm-unit-tests && ./configure && make x86/realmode.flat) | |
tests/kvm-unit-tests/run.mjs tests/kvm-unit-tests/x86/realmode.flat | |
kvm-unit-test-release: build/libv86.mjs build/v86.wasm | |
(cd tests/kvm-unit-tests && ./configure && make x86/realmode.flat) | |
TEST_RELEASE_BUILD=1 tests/kvm-unit-tests/run.mjs tests/kvm-unit-tests/x86/realmode.flat | |
expect-tests: build/v86-debug.wasm build/libwabt.cjs | |
make -C tests/expect/tests | |
./tests/expect/run.js | |
devices-test: build/v86-debug.wasm | |
./tests/devices/virtio_9p.js | |
./tests/devices/virtio_console.js | |
./tests/devices/fetch_network.js | |
USE_VIRTIO=1 ./tests/devices/fetch_network.js | |
./tests/devices/wisp_network.js | |
./tests/devices/virtio_balloon.js | |
rust-test: $(RUST_FILES) | |
env RUSTFLAGS="-D warnings" RUST_BACKTRACE=full RUST_TEST_THREADS=1 cargo test -- --nocapture | |
./tests/rust/verify-wasmgen-dummy-output.js | |
rust-test-intensive: | |
QUICKCHECK_TESTS=100000000 make rust-test | |
api-tests: build/v86-debug.wasm | |
./tests/api/clean-shutdown.js | |
./tests/api/state.js | |
./tests/api/reset.js | |
./tests/api/floppy.js | |
./tests/api/cdrom-insert-eject.js | |
./tests/api/serial.js | |
./tests/api/reboot.js | |
./tests/api/pic.js | |
all-tests: eslint kvm-unit-test qemutests qemutests-release jitpagingtests api-tests nasmtests nasmtests-force-jit rust-test tests expect-tests | |
# Skipping: | |
# - devices-test (hangs) | |
eslint: | |
eslint src tests gen lib examples tools | |
rustfmt: $(RUST_FILES) | |
cargo fmt --all -- --check --config fn_single_line=true,control_brace_style=ClosingNextLine | |
build/capstone-x86.min.js: | |
mkdir -p build | |
wget -nv -P build https://github.com/AlexAltea/capstone.js/releases/download/v3.0.5-rc1/capstone-x86.min.js | |
build/libwabt.cjs: | |
mkdir -p build | |
wget -nv -P build https://github.com/WebAssembly/wabt/archive/1.0.6.zip | |
unzip -j -d build/ build/1.0.6.zip wabt-1.0.6/demo/libwabt.js | |
mv build/libwabt.js build/libwabt.cjs | |
rm build/1.0.6.zip | |
build/xterm.js: | |
curl https://cdn.jsdelivr.net/npm/xterm@5.2.1/lib/xterm.min.js > build/xterm.js | |
curl https://cdn.jsdelivr.net/npm/xterm@5.2.1/lib/xterm.js.map > build/xterm.js.map | |
curl https://cdn.jsdelivr.net/npm/xterm@5.2.1/css/xterm.css > build/xterm.css | |
update-package-json-version: | |
git describe --tags --exclude latest | sed 's/-/./' | tr - + | tee build/version | |
jq --arg version "$$(cat build/version)" '.version = $$version' package.json > package.json.tmp | |
mv package.json.tmp package.json | |