diff --git a/.circleci/config.yml b/.circleci/config.yml index 3772749..6d9a366 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -4,7 +4,12 @@ jobs: docker: - image: rustlang/rust:nightly steps: + - run: apt -y update --fix-missing + - run: apt -y install cmake - checkout - run: git submodule update --init --recursive - run: cargo build - run: cd examples && ./test.sh + - run: | + git clean -dfx + cargo build --no-default-features --features cmake diff --git a/Cargo.toml b/Cargo.toml index 9468707..4f69945 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -8,8 +8,12 @@ edition = "2018" license = "MIT" build = "build.rs" +[features] +default = ["autotools"] + [dependencies] libc = "0.2" [build-dependencies] -autotools = "0.2" +autotools = { version = "0.2", optional = true } +cmake = { version = "0.1", optional = true } diff --git a/README.md b/README.md index 967e656..f3807e8 100644 --- a/README.md +++ b/README.md @@ -12,6 +12,12 @@ This crate is for use cases in which developers need to integrate [`bdwgc`][bdwg See [`examples`](examples) directory. +By default [`bdwgc`][bdwgc] is built with autotools. To build with cmake, enable the `cmake` feature: + +```sh +cargo build --no-default-features --features cmake +``` + ## License [MIT](LICENSE) diff --git a/build.rs b/build.rs index a475b65..2cbf54e 100644 --- a/build.rs +++ b/build.rs @@ -1,6 +1,7 @@ const LIB_ATOMIC_OPS_DIR: &str = "vendor/libatomic_ops"; const LIB_GC_DIR: &str = "vendor/bdwgc"; +#[cfg(feature = "autotools")] fn main() { for dir in &[LIB_ATOMIC_OPS_DIR, LIB_GC_DIR] { std::process::Command::new("sh") @@ -41,3 +42,29 @@ fn main() { .unwrap(); } } + +#[cfg(feature = "cmake")] +fn main() { + use cmake::Config; + use std::path::Path; + + let libatomic_include_path = Path::new(LIB_ATOMIC_OPS_DIR) + .join("src") + .canonicalize() + .unwrap() + .display() + .to_string() + .replace(r"\\?\", ""); + + let dst = Config::new(LIB_GC_DIR) + .profile("Release") + .define("BUILD_SHARED_LIBS", "FALSE") + .cflag(format!("-I{}", libatomic_include_path)) + .build(); + + println!( + "cargo:rustc-link-search=native={}", + dst.join("lib").display() + ); + println!("cargo:rustc-link-lib=static=gc"); +} diff --git a/examples/Cargo.toml b/examples/Cargo.toml index be26faa..5cb5511 100644 --- a/examples/Cargo.toml +++ b/examples/Cargo.toml @@ -1,9 +1,7 @@ [workspace] members = [ - "coroutines", "dynamic_threads", "free_by_borrow", "free_by_gc", "static_threads", - "suspended_coroutines", ] diff --git a/examples/coroutines/Cargo.toml b/examples/coroutines/Cargo.toml deleted file mode 100644 index b1e9856..0000000 --- a/examples/coroutines/Cargo.toml +++ /dev/null @@ -1,10 +0,0 @@ -[package] -name = "coroutines" -version = "0.1.0" -authors = ["Yota Toyama "] -edition = "2018" -publish = false - -[dependencies] -bdwgc-alloc = { path = "../.." } -coroutine = "0.8" diff --git a/examples/coroutines/src/main.rs b/examples/coroutines/src/main.rs deleted file mode 100644 index 41ae7d8..0000000 --- a/examples/coroutines/src/main.rs +++ /dev/null @@ -1,26 +0,0 @@ -extern crate bdwgc_alloc; -extern crate coroutine; - -use bdwgc_alloc::Allocator; -use coroutine::asymmetric::Coroutine; -use std::alloc::Layout; - -#[global_allocator] -static GLOBAL_ALLOCATOR: Allocator = Allocator; - -fn main() { - unsafe { Allocator::initialize() } - Allocator::lock(); - - let handle = Coroutine::spawn(move |_, _| { - let bottom: u8 = 0; - unsafe { Allocator::set_stack_bottom(&bottom) } - Allocator::unlock(); - - loop { - unsafe { std::alloc::alloc(Layout::from_size_align(2 ^ 8, 8).unwrap()) }; - } - }); - - for _ in handle {} -} diff --git a/examples/suspended_coroutines/Cargo.toml b/examples/suspended_coroutines/Cargo.toml deleted file mode 100644 index 931ba11..0000000 --- a/examples/suspended_coroutines/Cargo.toml +++ /dev/null @@ -1,10 +0,0 @@ -[package] -name = "suspended_coroutines" -version = "0.1.0" -authors = ["Yota Toyama "] -edition = "2018" -publish = false - -[dependencies] -bdwgc-alloc = { path = "../.." } -coroutine = "0.8" diff --git a/examples/suspended_coroutines/src/main.rs b/examples/suspended_coroutines/src/main.rs deleted file mode 100644 index 87d44f5..0000000 --- a/examples/suspended_coroutines/src/main.rs +++ /dev/null @@ -1,33 +0,0 @@ -extern crate bdwgc_alloc; -extern crate coroutine; - -use bdwgc_alloc::Allocator; -use coroutine::asymmetric::Coroutine; -use std::alloc::Layout; - -#[global_allocator] -static GLOBAL_ALLOCATOR: Allocator = Allocator; - -fn main() { - unsafe { Allocator::initialize() } - - Allocator::lock(); - let mut handle = Coroutine::spawn(move |me, _| { - let bottom: u8 = 0; - unsafe { Allocator::set_stack_bottom(&bottom) } - Allocator::unlock(); - - me.yield_with(42); - unsafe { Allocator::set_stack_bottom(&bottom) } - Allocator::unlock(); - - loop { - unsafe { std::alloc::alloc(Layout::from_size_align(2 ^ 8, 8).unwrap()) }; - } - }); - - Allocator::lock(); - assert_eq!(handle.resume(0).unwrap(), 42); - - handle.resume(0).unwrap(); -} diff --git a/vendor/bdwgc b/vendor/bdwgc index 2b70037..ddd788f 160000 --- a/vendor/bdwgc +++ b/vendor/bdwgc @@ -1 +1 @@ -Subproject commit 2b7003769e1ecc941ef80b603cba16a121f37997 +Subproject commit ddd788fc3c3701405efde47c3f540bdf01c878dd diff --git a/vendor/libatomic_ops b/vendor/libatomic_ops index 6287479..ae996e9 160000 --- a/vendor/libatomic_ops +++ b/vendor/libatomic_ops @@ -1 +1 @@ -Subproject commit 6287479564021893f2bf81149d0738bcb492b81c +Subproject commit ae996e93f0ddfb8e2a93d49c6d7edc1478ad60c1