# Wasmer OS distro packaging notes

* Wasmer is written in Rust. To build Wasmer, where possible, do not
  directly invoke `cargo`, but use the supplied `Makefile`

* Wasmer provides several compilers and the `Makefile` autodetects
  when compilers can be compiled and/or installed. Set the environment
  variables `ENABLE_{CRANELIFT,LLVM,SINGLEPASS}=1` to force compiler
  to be build or to fail trying, e.g:

  ```sh
  $ ENABLE_LLVM=1 make build-wasmer
  ```

* `make install` respects `DESTDIR`, but `prefix` must be configured
  with `WASMER_INSTALL_PREFIX`. Note that `DESTDIR` must include
  `WASMER_INSTALL_PREFIX`, e.g.:

  ```sh
  export WASMER_INSTALL_PREFIX=/usr
  make
  DESTDIR=/tmp/staging/usr make install
  ```

* In case you must build/install directly with `cargo`, make sure to
  enable at least one compiler feature, like e.g. `--features
  cranelift`,

  * Beware that compiling with `cargo build --workspace --features …`
    will not enable features on the subcrates in the workspace and
    result in a headless Wasmer binary that can not compile Wasm files
    directly.

* For reproducible builds, set `WASMER_REPRODUCIBLE_BUILD=1` in the
  build environment. This strips the build timestamp from
  `wasmer --version -v` by omitting the verbose `commit-date:` line,
  which is useful for distribution packaging.

* If you split the package into several subpackages, beware that the
  `create-exe` command of the `wasmer` CLI requires `libwasmer.a` to
  be installed at `$WASMER_INSTALL_PREFIX/lib/libwasmer.a`. Suggestions for splitting:

  * The `wasmer-headless` CLI contains a subset of the `wasmer`'s functionalities
    and should only be packaged when splitting — it must be built
    explicitly with:
    
    ```sh
    $ make build-wasmer-headless-minimal install-wasmer-headless-minimal
    ```
  * `libwasmer`, containing `libwasmer.so*`,
  * `libwasmer-dev`, containing the header files and a `.pc` file,
  * `libwasmer-static`, containing `libwasmer.a`.

The Wasmer distro packaging story is still in its infancy, so feedback is very welcome.

## Miscellaneous: binfmt_misc

Wasmer can be registered as a binfmt interpreter for wasm binaries.
An example systemd [.service](./scripts/wasmer-binfmt.service.example) is included here.
Please consider statically linking the wasmer binary so that this capability is also available in mount namespaces.
