error-chain icon indicating copy to clipboard operation
error-chain copied to clipboard

no_std support

Open tarcieri opened this issue 7 years ago • 15 comments

It would be neat if this crate worked with #![no_std]. The main thing it's using seems to be Box, which could use collections in a no_std context.

If there's interest in gating the std stuff it uses on a cargo feature, I might be interested in submitting a PR.

tarcieri avatar Apr 03 '17 18:04 tarcieri

Yeah, sure! I guess it would mean disabling the error chain, and maybe the backtrace.

Yamakaky avatar Apr 03 '17 18:04 Yamakaky

Bump of this. I'd like to see a backtrace-less no_std option too.

lucab avatar May 31 '17 08:05 lucab

I'm going to take a crack at this

tarcieri avatar Jun 02 '17 02:06 tarcieri

Okay, hit a snag: error-chain heavily depends on std::error, but it is not available in core.

Unless anyone knows of a resolution, this seems like a bit of a showstopper.

tarcieri avatar Jun 02 '17 19:06 tarcieri

Went ahead and reopened this as on a second look I think it might be possible to gate std::error usages on a cargo feature. I'll further investigate

tarcieri avatar Jun 03 '17 23:06 tarcieri

I attempted to vendor a minimalist version of the std::error::Error trait into error-chain itself for use in no_std contexts. That "worked" (although does not seem like a particularly good solution). Things still got rather tricky with the error chain macros (from error_chain.rs), as these are referred to using ::std. I tried to modify the macros to make them selectable (using e.g. a $core variable) but this got rather ugly.

I'm beginning to think this might be more trouble than it's worth.

tarcieri avatar Jun 08 '17 20:06 tarcieri

Okay, so I managed to get error-chain to work with no_std, but it's not pretty:

https://github.com/brson/error-chain/pull/157

I'm not sure I'd actually want to use this unless I could get it upstream, and I think there's definitely a lot of cleanup that needs to happen first.

That said, the tests pass and cargo build --no-default-features succeeds.

tarcieri avatar Jun 08 '17 21:06 tarcieri

Current resolution is to push the Error trait further down into probably the alloc crate, which will make this easier.

brson avatar Jul 24 '17 18:07 brson

Hum, but if you user no_core, you don't have access to alloc, do you?

Yamakaky avatar Jul 24 '17 20:07 Yamakaky

You can allocate from no_std, but you have to use #[feature(alloc)], which is ostensibly nightly-only as liballoc is not yet stable. My #157 PR is doing something similar except it's out-of-date at this point and using #[feature(collections)] instead.

I have been trying to figure out the least horrible way to do this over on the bytes crate. Here's an open PR which adds support for allocator-specific features for use with no_std:

https://github.com/carllerche/bytes/pull/153/files#r127882795

What I ended up settling on was having separate allocator, nightly, and std features, with allocator automatically included in either nightly or `std.

The nightly feature gates the use of #[feature(alloc)] and adds Box, String, and Vec to a custom crate prelude.

This approach makes the overall surface of the nightly feature very small. On the bytes crate it's approximately 10 lines, all contained within lib.rs.

tarcieri avatar Jul 24 '17 22:07 tarcieri

But then if you want core but not alloc, you can't use error_chain since it would require alloc even if it doesn't need it for allocating.

Yamakaky avatar Jul 25 '17 17:07 Yamakaky

From a practical perspective yes. We can gate everything that needs an allocator on the allocator feature, but there wouldn't be a lot left with allocator disabled. While it'd compile, it wouldn't exactly be in a usable state.

tarcieri avatar Jul 25 '17 18:07 tarcieri

I'm thinking more about Error, which I don't really see why it will be in alloc...

Yamakaky avatar Jul 25 '17 20:07 Yamakaky

From error.rs:

https://github.com/rust-lang/rust/blob/master/src/libstd/error.rs#L45

to create the blanket impls for Box required knowing that &str: !Error

Unfortunately Error is entangled with Box, which is allegedly why it can't be in libcore

tarcieri avatar Jul 25 '17 22:07 tarcieri

OK then

Yamakaky avatar Jul 25 '17 22:07 Yamakaky