Init commit template for emscripten Rust
This commit is contained in:
commit
27d8ff1717
9 changed files with 178 additions and 0 deletions
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
/dist/
|
41
Makefile
Normal file
41
Makefile
Normal file
|
@ -0,0 +1,41 @@
|
||||||
|
ifdef RELEASE
|
||||||
|
RUST_BUILD_TYPE := release
|
||||||
|
RUST_EXTRA_FLAGS := --release
|
||||||
|
C_OTHER_FLAGS := -DNDEBUG -O2
|
||||||
|
else
|
||||||
|
RUST_BUILD_TYPE := debug
|
||||||
|
RUST_EXTRA_FLAGS :=
|
||||||
|
C_OTHER_FLAGS := -Og
|
||||||
|
endif
|
||||||
|
|
||||||
|
CC := source ${HOME}/git/emsdk/emsdk_env.sh && emcc
|
||||||
|
CFLAGS := \
|
||||||
|
-Irust_src/include \
|
||||||
|
-sEXPORTED_FUNCTIONS=_main \
|
||||||
|
-sSTACK_SIZE=2097152 \
|
||||||
|
${C_OTHER_FLAGS}
|
||||||
|
# Check https://emscripten.org/docs/tools_reference/emcc.html for more compiler
|
||||||
|
# flags to pass to emcc.
|
||||||
|
|
||||||
|
HEADERS := \
|
||||||
|
rust_src/include/rust_src.h
|
||||||
|
|
||||||
|
all: dist
|
||||||
|
|
||||||
|
rust_src/target/wasm32-unknown-emscripten/${RUST_BUILD_TYPE}/libems_rust_template.a:
|
||||||
|
cd rust_src && cargo build --target=wasm32-unknown-emscripten ${RUST_EXTRA_FLAGS}
|
||||||
|
|
||||||
|
dist: rust_src/target/wasm32-unknown-emscripten/${RUST_BUILD_TYPE}/libems_rust_template.a src/main.c.o
|
||||||
|
@mkdir dist
|
||||||
|
${CC} -o dist/game.html ${CFLAGS} $^
|
||||||
|
ln -s game.html dist/index.html
|
||||||
|
|
||||||
|
.PHONY: clean
|
||||||
|
|
||||||
|
clean:
|
||||||
|
cd rust_src && cargo clean
|
||||||
|
rm -f src/*.c.o
|
||||||
|
rm -rf dist
|
||||||
|
|
||||||
|
%.c.o: %.c ${HEADERS}
|
||||||
|
${CC} -o $@ -c ${CFLAGS} $<
|
8
rust_src/.gitignore
vendored
Normal file
8
rust_src/.gitignore
vendored
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
/target
|
||||||
|
|
||||||
|
|
||||||
|
# Added by cargo
|
||||||
|
#
|
||||||
|
# already existing elements were commented out
|
||||||
|
|
||||||
|
#/target
|
7
rust_src/Cargo.lock
generated
Normal file
7
rust_src/Cargo.lock
generated
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
# This file is automatically @generated by Cargo.
|
||||||
|
# It is not intended for manual editing.
|
||||||
|
version = 3
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "ems_rust_template"
|
||||||
|
version = "0.1.0"
|
15
rust_src/Cargo.toml
Normal file
15
rust_src/Cargo.toml
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
[package]
|
||||||
|
name = "ems_rust_template"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2021"
|
||||||
|
|
||||||
|
[lib]
|
||||||
|
crate-type = ["staticlib"]
|
||||||
|
|
||||||
|
[profile.release]
|
||||||
|
panic = "abort"
|
||||||
|
|
||||||
|
[profile.dev]
|
||||||
|
panic = "abort"
|
||||||
|
|
||||||
|
[dependencies]
|
9
rust_src/include/rust_src.h
Normal file
9
rust_src/include/rust_src.h
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
#ifndef EMSCRIPTEN_RUST_TEMPLATE_RUST_SRC_H_
|
||||||
|
#define EMSCRIPTEN_RUST_TEMPLATE_RUST_SRC_H_
|
||||||
|
|
||||||
|
extern void *get_main_ctx(void);
|
||||||
|
extern void ctx_update(void *ctx);
|
||||||
|
extern void ctx_draw(void *ctx);
|
||||||
|
extern void ctx_resize_event_callback(void *ctx, int width, int height);
|
||||||
|
|
||||||
|
#endif
|
57
rust_src/src/lib.rs
Normal file
57
rust_src/src/lib.rs
Normal file
|
@ -0,0 +1,57 @@
|
||||||
|
use std::ffi;
|
||||||
|
|
||||||
|
#[no_mangle]
|
||||||
|
pub extern "C" fn get_main_ctx() -> *mut ffi::c_void {
|
||||||
|
Context::ems_new()
|
||||||
|
}
|
||||||
|
|
||||||
|
#[no_mangle]
|
||||||
|
pub extern "C" fn ctx_update(ctx: *mut ffi::c_void) {
|
||||||
|
unsafe {
|
||||||
|
let ctx: *mut Context = ctx as *mut Context;
|
||||||
|
(*ctx).update();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[no_mangle]
|
||||||
|
pub extern "C" fn ctx_draw(ctx: *mut ffi::c_void) {
|
||||||
|
unsafe {
|
||||||
|
let ctx: *mut Context = ctx as *mut Context;
|
||||||
|
(*ctx).draw();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[no_mangle]
|
||||||
|
pub extern "C" fn ctx_resize_event_callback(ctx: *mut ffi::c_void, width: ffi::c_int, height: ffi::c_int) {
|
||||||
|
unsafe {
|
||||||
|
let ctx: *mut Context = ctx as *mut Context;
|
||||||
|
(*ctx).resize_event_callback(width, height);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
struct Context {
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Context {
|
||||||
|
pub fn new() -> Self {
|
||||||
|
Self {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn ems_new() -> *mut ffi::c_void {
|
||||||
|
let ctx_box: Box<Context> = Box::new(Context::new());
|
||||||
|
Box::<Context>::leak(ctx_box) as *mut Context as *mut ffi::c_void
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn update(&mut self) {
|
||||||
|
println!("update called.");
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn draw(&mut self) {
|
||||||
|
println!("draw called.");
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn resize_event_callback(&mut self, width: ffi::c_int, height: ffi::c_int) {
|
||||||
|
println!("Resize event: {}, {}", width, height);
|
||||||
|
}
|
||||||
|
}
|
1
src/.gitignore
vendored
Normal file
1
src/.gitignore
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
*.c.o
|
39
src/main.c
Normal file
39
src/main.c
Normal file
|
@ -0,0 +1,39 @@
|
||||||
|
#include <emscripten.h>
|
||||||
|
#include <emscripten/html5.h>
|
||||||
|
|
||||||
|
#include <rust_src.h>
|
||||||
|
|
||||||
|
EM_JS(int, canvas_get_width, (), {
|
||||||
|
return document.getElementById("canvas").clientWidth;
|
||||||
|
});
|
||||||
|
EM_JS(int, canvas_get_height, (), {
|
||||||
|
return document.getElementById("canvas").clientHeight;
|
||||||
|
});
|
||||||
|
|
||||||
|
void *main_init(void) {
|
||||||
|
return get_main_ctx();
|
||||||
|
}
|
||||||
|
|
||||||
|
EM_BOOL resize_event_callback(int event_type, const EmscriptenUiEvent *event, void *ud) {
|
||||||
|
if (event_type == EMSCRIPTEN_EVENT_RESIZE) {
|
||||||
|
ctx_resize_event_callback(ud, canvas_get_width(), canvas_get_height());
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void main_loop_update(void *ud) {
|
||||||
|
ctx_update(ud);
|
||||||
|
ctx_draw(ud);
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(void) {
|
||||||
|
void *ctx = main_init();
|
||||||
|
|
||||||
|
emscripten_set_resize_callback(
|
||||||
|
EMSCRIPTEN_EVENT_TARGET_WINDOW, NULL, false, resize_event_callback);
|
||||||
|
|
||||||
|
// This function never returns.
|
||||||
|
emscripten_set_main_loop_arg(main_loop_update, ctx, 0, 1);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
Loading…
Reference in a new issue