Crates.io | block-sys |
lib.rs | block-sys |
version | 0.2.1 |
source | src |
created_at | 2021-11-22 20:29:19.344356 |
updated_at | 2024-01-07 08:14:45.200273 |
description | Raw bindings to Apple's C language extension of blocks |
homepage | |
repository | https://github.com/madsmtm/objc2 |
max_upload_size | |
id | 485843 |
size | 30,373 |
block-sys
This crate is deprecated. Use block2::ffi
instead.
Raw Rust bindings to Apple's C language extension of blocks.
This crate is part of the objc2
project,
see that for related crates.
This library is a raw interface to the aptly specified Blocks ABI. However, different runtime implementations exist and act in slightly different ways (and have several different helper functions), the most important aspect being that the libraries are named differently, so the linking must take that into account.
You can choose the desired runtime by using the relevant cargo feature flags,
see the following sections (you might have to disable the default apple
feature first). Note that if the objc-sys
crate is present in the module
tree, this should have the same feature flag enabled as that.
libclosure
apple
.This is the most sophisticated runtime, and it has quite a lot more features than the specification mandates. It is used by default.
The minimum required operating system versions are as follows:
10.6
3.2
Though in practice Rust itself requires higher versions than this.
compiler-rt
's libBlocksRuntime
compiler-rt
.This is a copy of Apple's older (around macOS 10.6) runtime, and is now used
in Swift's libdispatch
and Swift's Foundation as well.
The runtime and associated headers can be installed on many Linux systems with
the libblocksruntime-dev
package.
Using this runtime probably won't work together with objc-sys
crate.
libobjc2
gnustep-1-7
, gnustep-1-8
, gnustep-1-9
, gnustep-2-0
and
gnustep-2-1
depending on the version you're using.GNUStep is a bit odd, because it bundles blocks support into its Objective-C
runtime. This means we have to link to libobjc
, and this is done by
depending on the objc-sys
crate. A bit unorthodox, yes, but it works.
Sources:
WinObjC
unstable-winobjc
.Unstable: Hasn't been tested on Windows yet!
A fork based on GNUStep's libobjc2
version 1.8.
ObjFW
unstable-objfw
.Unstable: Doesn't work yet!
TODO.
To our knowledge, currently only clang
supports the Language Specification
for Blocks. To assist in compiling C (or Objective-C) sources
using these features, this crate's build script expose the
DEP_BLOCK_0_2_CC_ARGS
environment variable to downstream build scripts.
Example usage in your build.rs
(using the cc
crate) would be as follows:
fn main() {
let mut builder = cc::Build::new();
builder.compiler("clang");
builder.file("my_script_using_blocks.c");
for flag in std::env::var("DEP_BLOCK_0_2_CC_ARGS").unwrap().split(' ') {
builder.flag(flag);
}
builder.compile("libmy_script_using_blocks.a");
}