Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/tombruijn/rust-elixir-linking-issue-example-project
Test project to create a Rust staticlib, install it as a Erlang NIF in an Elixir project. Will fail for the musl target on Rust 1.21.0 and newer.
https://github.com/tombruijn/rust-elixir-linking-issue-example-project
Last synced: 13 days ago
JSON representation
Test project to create a Rust staticlib, install it as a Erlang NIF in an Elixir project. Will fail for the musl target on Rust 1.21.0 and newer.
- Host: GitHub
- URL: https://github.com/tombruijn/rust-elixir-linking-issue-example-project
- Owner: tombruijn
- Created: 2018-10-09T11:34:59.000Z (about 6 years ago)
- Default Branch: master
- Last Pushed: 2018-10-17T09:06:50.000Z (about 6 years ago)
- Last Synced: 2024-12-12T23:07:57.925Z (19 days ago)
- Language: Elixir
- Homepage:
- Size: 43.9 KB
- Stars: 0
- Watchers: 2
- Forks: 0
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# Rust staticlib linking with Elixir issue example app
## Usage
```sh
./build_and_test
```- ``: The Rust version is the version of the [Rust language](https://rust-lang.org/) to test against. It will automatically install it.
This testing tool will follow the process described in "Build and test process details" below. Afterwards it will open a shell in which the user can do additional debugging, such as:
```sh
./bin/elixir_app stop # Stop application that's currently running
./bin/elixir_app foreground # Run application in foreground
cat lib/elixir_package-0.0.1/install.log # Print install log file with error (if present)
```### Examples
```sh
./build_and_test 1.20.0
# Works, creates a build and complains about a missing install.log file, which is fine./build_and_test 1.21.0
# Fails, starts app but prints the error listed below./build_and_test 1.29.1
# Fails, unrelated error that's already fixed in the latest nightly./build_and_test nightly-2018-10-08
# Fails, starts app but prints the error listed below
```## Unexpected error
This error occurs when linking a staticlib with the `x86_64-unknown-linux-musl` target to an Elixir app.
```
Error loading NIF (host triple: x86_64-pc-linux-musl)
Error: Failed to load NIF library: 'Error loading shared library libgcc_s.so.1: No such file or directory (needed by /app/lib/elixir_package-0.0.1/priv/elixir_package_extension.so)'
```## Testing
### Requirements
Requirements for running this project on a macOS host machine, see "Build and test process details". This project is not optimized for a Linux host machine, but will run the same.
- [Virtualbox](https://www.virtualbox.org/)
- [Vagrant](https://www.vagrantup.com/)### Build and test process details
The following steps describe the automated process this project performs. No manual steps required.
1. Build extension
- Create a virtual machine (controlled through Vagrant) that will act as the build environment.
- You will be prompted for your password the first time to mount a NFS volume on the virtual machine.
- Install Docker on this build machine.
- With cross, cross compile the extension to musl.
- This cannot be done if the host is macOS, which is why we're running this through the virtual build machine.
2. Install the extension as an Erlang [NIF](http://erlang.org/doc/man/erl_nif.html)
- Move built extension to Elixir package (`elixir_app/elixir_package/c_src`)
- Start a Docker image build process that compiles the Elixir app.
- Start the first stage that compiles the app.
- Make an app release with [distillery](https://github.com/bitwalker/distillery).
- Compile the Elixir app.
- Install the Erlang NIF.
- Package the release as a zip.
3. Run the app.
- Create a second stage for the release in which the app is run. This is a slimmer version of the Docker image than the build stage. This does not include the compilation dependencies from the first stage.
- Copy and extract the zip file from the first stage.
- Run the Elixir app release (including the NIF).
- The error will be printed as the `install.log` file is read.
- If this file is not present it will warn it cannot be found. Which is good.### Clean up
**Note**: This testing process will create a new Docker image per build. Be sure to clean them after you're done testing.
```sh
docker rmi alpine-elixir-build-test:build
```