Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/SuperTails/langcraft
Compiler from LLVM IR to Minecraft datapacks.
https://github.com/SuperTails/langcraft
compiler llvm minecraft
Last synced: about 1 month ago
JSON representation
Compiler from LLVM IR to Minecraft datapacks.
- Host: GitHub
- URL: https://github.com/SuperTails/langcraft
- Owner: SuperTails
- License: apache-2.0
- Created: 2020-06-27T03:37:44.000Z (over 4 years ago)
- Default Branch: master
- Last Pushed: 2022-06-03T14:44:46.000Z (over 2 years ago)
- Last Synced: 2024-11-05T07:34:26.342Z (about 2 months ago)
- Topics: compiler, llvm, minecraft
- Language: Rust
- Homepage:
- Size: 536 KB
- Stars: 555
- Watchers: 13
- Forks: 8
- Open Issues: 2
-
Metadata Files:
- Readme: README.md
- License: LICENSE_APACHE
Awesome Lists containing this project
- awesome-list - langcraft
README
## Langcraft
### The LLVM target for Minecraft you've never wantedLangcraft is a code generator targeting [Minecraft Data Packs](https://minecraft.gamepedia.com/Data_Pack). 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](https://github.com/SuperTails/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 blockTo use the generated datapack in Minecraft:
1. Copy the entire output folder (`./out` by default) to the `datapacks/` directory of a Minecraft world (using a superflat void world is recommended)
2. Run `/function setup:setup`. This only has to be done the first time a Langcraft datapack is used in a world.
3. Run `/function rust:run`
4. 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](https://youtu.be/Cx0w5Wn9pPU).### License
Licensed under either of
- MIT License
- Apache License, Version 2.0