#rna #bioinformatics #sys #ffi #viennarna

sys librna-sys

Low-level bindings for the ViennaRNA library

5 releases

0.1.4 Mar 3, 2022
0.1.3 Nov 15, 2021
0.1.2 May 24, 2021
0.1.1 May 16, 2021
0.1.0 May 16, 2021

#250 in Science

MIT license

11KB
107 lines

librna-sys

This crate provides low-level Rust bindings to libRNA/RNAlib/ViennaRNA.

Current State

librna-sys is highly experimental and provides unsafe low-level bindings. It's possible that building or linking does not work reliably. This crate was only tested on Linux but macOS should work as well.

Prerequisites

This crate requires the static library (libRNA.a on Linux and macOS) as well as the C header files.

Configuration

Using Environment Variables

librna-sys exposes two environment variables in case ViennaRNA is installed in a custom directory. Use them like this:

export LIBRNA_INCLUDE_DIR=/path/to/headerdirectory # default: /usr/include
export LIBRNA_LIB_DIR=/path/to/librarydirectory # default: /usr/lib

Afterwards the crate can be used as a dependency in Cargo.toml:

[dependencies]
librna-sys = "0.1"

Using pkg-config

If pkg-config is available on your system and ViennaRNA was installed properly

[dependencies]
librna-sys = { version = "0.1" , features = ["auto"] }

may be used instead of setting environment variables.

Usage

Please refer to the original documentation of the C API. In most cases, you probably want to use the official Python bindings.

Use this crate only if some features of the C API are not exposed as Python bindings and you prefer writing unsafe Rust over C for some reason.

Example: Extending ViennaRNA

Note: As of version 2.5.0, ViennaRNA contains support for the base pair distance with pseudoknots.

This example is intended to illustrate how librna-sys could be used to build upon ViennaRNA.

examples/bpdist.rs extends the base pair distance of ViennaRNA to secondary structures with pseudoknots. Building this example by running

cargo build --release --example bpdist #--features auto

produces a dynamic library target/release/examples/libbpdist.so exposing Python bindings. Copy it whereever you want and import it like this:

from libbpdist import bp_distance_pk

structures = [".((..[[[..))..]]].", ".((.[.[[..))..]]]."]
print(bp_distance_pk(structures[0], structures[1]))

Contributions

I'm open to any ideas or advice. At this point, it's not yet clear where this is going but here are a few thoughts:

  • Providing complete safe bindings to ViennaRNA is probably as complex as a complete rewrite in Rust.
  • Perhaps a separate crate could serve as a central collection of safe APIs extending ViennaRNA.

Known Issues

If you encounter an error including generated with LTO version X.0 instead of the expected Y.0, you could either recompile ViennaRNA yourself or downgrade your Rust toolchain. Adjusting some linker-related codegen options might also help but was not thoroughly tested.

Dependencies

~0–1.4MB
~30K SLoC