Project

General

Profile

Feature #15759

Support Rust/Cargo in Gem::Ext::Builder

Added by ianks (Ian Ker-Seymer) about 1 year ago. Updated about 1 year ago.

Status:
Third Party's Issue
Priority:
Normal
Assignee:
-
Target version:
-
[ruby-core:92227]

Description

Over the past few years, Rust has proven to be an incredibly stable and accessible option for those wishing to write native extensions for Ruby. Rust is particularly well-suited for Ruby for a few reasons:

  1. Integration is straight-forward, since it is easy to expose a C compatible API using extern C
  2. Rust is a bit more high-level, and approachable for Ruby developers since it prevents many of the classic C footguns (use-after-free, etc)
  3. The landing page can explain the benefits better than me. Check out https://www.rust-lang.org/ if you aren't fully convinced.

One of the biggest pain points of creating a Gem with a Rust extension is integrating with Gem::Ext::Builder. There are currently a couple of solutions, and the rely on the RakeBulider interface. I have personally used https://github.com/malept/thermite, which is a very good solution, but still requires and external dependency and does not integrate as well as native builders at the moment.

Currently, Gem::Ext::Builder supports four builder types:
ExtConfBuilder,ConfigureBuilder,RakeBuilder, andCmakeBuilder. I propose we add a new builder,CargoBuilder, which will detect acargo.toml` file and build the gem from that. This ease the burden of developing and publishing Rust extensions for Ruby users.

Potential Problems

  1. If the user does not have cargo installed, building the extension will not work.
    This is an issue, but is also an issue for the CmakeBuilder. One way to mitigate this issue would be to make it easier to build static binaries for Rust extensions.

  2. The lack of a standard ruby interface for Rust extensions might cause pain for developers.
    Currently, many folks use https://github.com/steveklabnik/ruby-sys to interface with the C ruby API. It might make sense to make this "officially" supported at some point, but I don't think it has to be done immediately.

Please let me know your thoughts. I would be very excited to see Ruby take this step. I don't think I know enough about the Ruby extension building process or the Rust compilation process to actually implement this, so hopefully we could find a volunteer to step up. Thanks for reading :)

Also available in: Atom PDF