package binaryen

Build not checked
  1. Overview
  2. Docs
OCaml bindings for Binaryen

Install

dune-project
 Dependency

Authors

Maintainers

Sources

binaryen-archive-v0.22.0.tar.gz
md5=26bc06ba2b789f33896531c3dbaf0b56
sha512=f9b914b073838c96f17a178531346f0dff231a1b8f9effdab9060578dd8e5ac539df3b53b60800f72f07ff4070b30cb7bbbf40dccbbea1207f75af9d2b431263

Description

Added to opam-repository:

README

Binaryen.ml

Binaryen.ml CI Workflow

OCaml bindings for Binaryen.

Binaryen is a compiler and toolchain infrastructure for WebAssembly. It makes compilation to WebAssembly pretty darn easy.

Here's Binaryen's hello world test in OCaml form:

open Binaryen

let wasm_mod = Module.create ()

(* Create function type for i32 (i32, i32) *)
let params = Type.create [| Type.int32; Type.int32 |]
let results = Type.int32

(* Get arguments 0 and 1, add them *)
let x = Expression.Local_get.make wasm_mod 0 Type.int32
let y = Expression.Local_get.make wasm_mod 1 Type.int32
let add = Expression.Binary.make wasm_mod Op.add_int32 x y

(* Create the add function *)
(* Note: no additional local variables *)
let adder = Function.add_function wasm_mod "adder" params results [||] add

let _ = Module.print wasm_mod
let _ = Module.dispose wasm_mod

Feature Parity

This project aims to provide full feature parity with the Binaryen C API. It's fairly complete, but a few things still need bindings:

  • SIMD instructions
  • Tags
  • Atomics
  • Query operations on expressions
  • Query operations on functions

None of these are particularly challenging to create bindings for—they just haven't been written yet. If you need anything that's missing, feel free to open a PR.

MacOS C++ Compiler

When including this library in your dune MacOS executables, you'll need to specify -cc clang++ in your (ocamlopt_flags) stanza. This is required because Binaryen will throw errors for itself to catch and using clang++ is the only way to handle them correctly. You can find more info on this ocaml issue.

Your stanza could look something like this:

 (executable
  (name example)
  (public_name example)
  (package example)
+ (ocamlopt_flags -cc clang++)
  (modules example)
  (libraries binaryen))

These flags likely won't work on other operating systems, so you'll probably need to use dune-configurator to vary the flags per platform. You can see an example of this in our tests/.

Static Linking

If you are planning to create portable binaries for Windows, it will try to find Cygwin/MinGW locations in your PATH. To avoid this, you probably want to add this to your (executable) stanzas:

 (executable
  (name example)
  (public_name example)
  (package example)
+ (flags (:standard -ccopt -- -ccopt -static))
  (modules example)
  (libraries binaryen))

These flags might not work on other operating systems (like MacOS), so you'll probably need to use dune-configurator to vary the flags per platform.

Contributing

You'll need Node.js and esy to build this project.

dune will take care of compiling the C stubs, so to build the project you'll only need to run:

esy

This will take a while. Once it's done, you can run the tests:

esy test

Dependencies (5)

  1. libbinaryen >= "112.0.0" & < "113.0.0"
  2. js_of_ocaml-compiler >= "4.1.0" & < "6.0.0"
  3. dune-configurator >= "3.0.0"
  4. dune >= "3.0.0"
  5. ocaml >= "4.12.0"

Dev Dependencies

None

Optional Dependencies

None

Used by

None

Conflicts

None

Build status

Results of building binaryen with each compiler on check.ci.ocaml.org, run of against opam-repository 7cdc698. All results for this package.

Each result links to its build log. To keep crawlers from overloading the site, build logs require a GitHub sign-in (see ocurrent/opam-health-check). On your first log, GitHub asks you to “Authorize opam-health-check”, the OCurrent app that runs these checks; it sees only your public profile, not your repositories. The sign-in lasts 30 days.

This version is not in the latest run; the versions below are.

Version OCaml 4.11 OCaml 4.14 OCaml 5.2 OCaml 5.4 OCaml 5.5
0.43.0 n/a good good good good
0.10.0 good good good good good
  • good Package successfully built
  • partial One of the dependencies failed to build
  • bad Package failed to build
  • n/a Package is not available in this environment
  • internal Internal failure