# rosie-sys Overview
This crate builds or links the `librosie` library for the [**Rosie**](https://rosie-lang.org/about/) matching engine and the [**Rosie Pattern Language**](https://gitlab.com/rosie-pattern-language/rosie/-/blob/master/README.md)\(`rpl`\).
The majority of users wishing to use Rosie in Rust should probably use the [rosie crate](https://github.com/luketpeterson/rosie-rs).
# Building vs. Linking librosie
This crate can either build `librosie` from source or link to an existing library.
## Building from source
To build librosie, specify the `build_static_librosie` feature in the `[dependencies]` section of your `Cargo.toml`:
`rosie-sys = { features = ["build_static_librosie"] }`
### Building rosie as a C / FFI dependency
If you're using this crate to build the dependency for another `C` (non-Rust) project, you can access the rosie header files
from your Cargo build script using the `DEP_ROSIE_INCLUDE` environment variable. Also, the location of the built `librosie` library
will be specified by the `DEP_ROSIE_LIB` environment var.
### Installation & Deployment
Rosie depends on a `rosie_home` directory, containing support files including the Standard Pattern Library. This crate produces
the needed files, which can be obtained from the build `out` directory, or from the location specified by the `ROSIE_HOME`
environment variable, accessible to a Cargo build script.
When deploying an app that uses Rosie, you must ensure that these files are installed somewhere on the target machine. The
cannonical location on unix-like systems is: `/usr/local/lib/rosie/` although you may install them elsewhere. For example,
they may be placed inside your app directory or within a Mac OS X `.app` bundle directory.
If the files are installed in a non-standard location, you must initialize Rosie with the path, by calling [rosie_home_init].
Alternatively, if you are using the high-level `rosie` crate, call `Rosie::set_rosie_home_path()`.
## Linking to a shared rosie library
To link against a shared librosie, already installed on the system, add the following to the `[dependencies]` section of your `Cargo.toml`:
`rosie-sys = { features = ["link_shared_librosie"] }`
### Obtaining Rosie outside Cargo
Complete info on obtaining and building Rosie is [here](https://gitlab.com/rosie-pattern-language/rosie#local-installation).
However, Rosie may also be available through your package-manager of choice. For example, if your OS supports it, you may run one of the following:
* `dnf install rosie`
* `brew install rosie`
Or if you would prefer to install Rosie via the Makefile, [Look Here](https://rosie-lang.org/blog/2020/05/03/new-build.html).
**NOTE**: This crate has been tested aganst `librosie` version **1.3.0**, although it may be compatible with other versions.
# Updating the Rosie source inside this crate
Many files within this crate are copied from either the main [Rosie source](https://gitlab.com/rosie-pattern-language/rosie)
or the build products.
Here is the script for refreshing the source files. This assumes the `rosie-sys` project is checked out as a peer of the
`rosie` main project, and that the rosie project has been built sucessfully, which pulls the submodules and creates the
`rosie_home` output files.
```sh
cp -r rosie/src/librosie rosie-sys/src/librosie
cp -r rosie/src/rpeg/compiler rosie-sys/rpeg/compiler
cp -r rosie/src/rpeg/include rosie-sys/rpeg/include
cp -r rosie/src/rpeg/runtime rosie-sys/rpeg/runtime
cp -r rosie/submodules/lua-cjson rosie-sys/src/lua-cjson
cp rosie/build/lib/rosie/CHANGELOG rosie-sys/src/rosie_home/CHANGELOG
cp rosie/build/lib/rosie/CONTRIBUTORS rosie-sys/src/rosie_home/CONTRIBUTORS
cp rosie/build/lib/rosie/LICENSE rosie-sys/src/rosie_home/LICENSE
cp rosie/build/lib/rosie/README rosie-sys/src/rosie_home/README
cp rosie/build/lib/rosie/VERSION rosie-sys/src/rosie_home/VERSION
cp -r rosie/build/lib/rosie/lib rosie-sys/src/rosie_home/lib
cp -r rosie/build/lib/rosie/rpl rosie-sys/src/rosie_home/rpl
```
**NOTE** The lua-cjson files have some changes to squish a few warnings, that are not propagated upstream. Since it's
unlikely to change, perhaps skip taking lua-cjson from upstream.