Langcraft
The LLVM target for Minecraft you've never wanted
Langcraft is a code generator targeting Minecraft Data Packs. It can currently run a fairly substantial set of bitcode files without issue. The project has a built-in command interpreter for debugging that supports breakpoints (ish) and inspecting register/memory values. All generated datapacks can be run in a real Minecraft Java Edition 1.16+ world in under 5 minutes.
(See also Wasmcraft2 for the spiritual successor to this project, which is faster and more reliable)
Usage
cargo run -- --arg1 --arg2 ./path/to/llvm/bitcode.bc
Valid arguments are:
--help
: Display usage and available options--out=path/to/dir/
: Specify the directory the datapack files should be placed in (default is./out
)--run
: Run the command interpreter on the generated code--trace-bbs
: Insert a print command at the beginning of each LLVM basic block
To use the generated datapack in Minecraft:
- Copy the entire output folder (
./out
by default) to thedatapacks/
directory of a Minecraft world (using a superflat void world is recommended) - Run
/function setup:setup
. This only has to be done the first time a Langcraft datapack is used in a world. - Run
/function rust:run
- If the datapack is modified while the world is open, run
/reload
and then go back to step 3.
Rust code must be built as follows:
- Release mode
panic=abort
#![no_std]
#![no_main]
- Have a
main
function with#[no_mangle]
- Use
i686-unknown-linux
rust_interp
is a Rust project already configured to generate the proper bitcode. The interpreter
binary target as shown in the demo can be built with:
sh compile_rust.sh
And the file to use will be:
rust_interp/target/i686-unknown-linux-gnu/release/deps/interpreter-SOMEHEXSTRING.bc
Any other language capable of generating LLVM bitcode can be used, as long as it can be built for a bare-metal 32-bit target. For a clang example see compile_c.sh
.
Note that the latest nightly versions of rustc now use LLVM 11, which Langcraft cannot parse (yet). You can set an earlier version to use for a directory with:
rustup override set nightly-2020-08-23
Demo
A video of a Langcraft-compiled interpreter can be seen here.
License
Licensed under either of
- MIT License
- Apache License, Version 2.0