Skip to content

Commit 4d9a81d

Browse files
committed
Expose version string from C++ to Rust through CXX.rs
1 parent ad3b8be commit 4d9a81d

File tree

9 files changed

+242
-5
lines changed

9 files changed

+242
-5
lines changed

CMakeLists.txt

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
cmake_minimum_required(VERSION 3.8)
1+
cmake_minimum_required(VERSION 3.15)
22

33
# Compile with /usr/bin/clang on MacOS
44
# See https://github.com/diffblue/cbmc/issues/4956
@@ -254,4 +254,16 @@ if(WITH_JBMC)
254254
add_subdirectory(jbmc)
255255
endif()
256256

257+
option(WITH_RUST_API "Build with the CPROVER Rust API" ON)
258+
if(WITH_RUST_API)
259+
find_package(Corrosion REQUIRED)
260+
261+
corrosion_import_crate(MANIFEST_PATH cprover-rust-api/Cargo.toml)
262+
263+
target_link_libraries(cprover-api cprover-rust-api)
264+
install(TARGETS cprover-rust-api RUNTIME DESTINATION lib)
265+
# TODO: cargo builds the artifact with underscores - we need to change to hyphens
266+
# to bring to same naming convention as the rest of CBMC
267+
endif()
268+
257269
include(cmake/packaging.cmake)

cprover-cpp-api/src/api.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,3 +49,13 @@ void cprover_api::load_model_from_files(const std::vector<std::string> &files)
4949
model = util_make_unique<goto_modelt>(
5050
initialize_goto_model(files, *message_handler, *options));
5151
}
52+
53+
std::unique_ptr<cprover_api> new_cprover_api()
54+
{
55+
return std::unique_ptr<cprover_api>(new cprover_api());
56+
}
57+
58+
std::unique_ptr<std::string> get_api_version(std::unique_ptr<cprover_api> api_handle)
59+
{
60+
return util_make_unique<std::string>(api_handle->get_api_version());
61+
}

cprover-cpp-api/src/api.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,12 +29,16 @@ struct cprover_api
2929

3030
// A simple API version information function.
3131
// TODO: Investigate best way to store and expose version string.
32-
std::string get_api_version() { return std::string{"0.1"}; }
32+
std::string get_api_version() const { return std::string{"0.1"}; }
3333

3434
private:
3535
std::unique_ptr<goto_modelt> model;
3636
std::unique_ptr<message_handlert> message_handler;
3737
std::unique_ptr<optionst> options;
3838
};
3939

40+
// TODO: Investigate best way to define this
41+
std::unique_ptr<cprover_api> new_cprover_api();
42+
std::unique_ptr<std::string> get_api_version(std::unique_ptr<cprover_api> api_handle);
43+
4044
#endif

cprover-rust-api/.gitgnore

Lines changed: 0 additions & 1 deletion
This file was deleted.

cprover-rust-api/.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
# ignore build artefacts folder
2+
target/

cprover-rust-api/Cargo.lock

Lines changed: 166 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

cprover-rust-api/Cargo.toml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,3 +6,10 @@ edition = "2021"
66
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
77

88
[dependencies]
9+
cxx = "1.0"
10+
11+
[build-dependencies]
12+
cxx-build = "1.0"
13+
14+
[lib]
15+
crate-type = ["staticlib"]

cprover-rust-api/build.rs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
use std::path::Path;
2+
3+
fn main() {
4+
let cpp_api_path = Path::new("../cprover-cpp-api/src");
5+
println!("{}", cpp_api_path.display());
6+
let _build = cxx_build::bridge("src/lib.rs")
7+
// .file("target/cxxbridge/cprover-rust-api/src/lib.rs.cc")
8+
.include(cpp_api_path)
9+
.flag_if_supported("-std=c++11")
10+
.compile("cprover-rust-api");
11+
12+
println!("cargo:rustc-link-search=native=/Users/fotiskoutoulakis/Devel/cbmc/build/lib/");
13+
println!("cargo:rustc-link-lib=static=goto-programs");
14+
println!("cargo:rustc-link-lib=static=util");
15+
println!("cargo:rustc-link-lib=static=langapi");
16+
println!("cargo:rustc-link-lib=static=ansi-c");
17+
println!("cargo:rustc-link-lib=static=big-int");
18+
println!("cargo:rustc-link-lib=static=linking");
19+
println!("cargo:rustc-link-lib=static=cprover-api");
20+
}

cprover-rust-api/src/lib.rs

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,25 @@
1+
#[cxx::bridge]
2+
pub mod ffi {
3+
unsafe extern "C++" {
4+
include!("api.h");
5+
type cprover_api;
6+
7+
fn new_cprover_api() -> UniquePtr<cprover_api>;
8+
fn get_api_version(api_handle: UniquePtr<cprover_api>) -> UniquePtr<CxxString>;
9+
}
10+
}
11+
12+
13+
// To test run "cargo test -- --nocapture"
114
#[cfg(test)]
215
mod tests {
16+
use super::*;
17+
318
#[test]
419
fn it_works() {
5-
let result = 2 + 2;
6-
assert_eq!(result, 4);
20+
let client = ffi::new_cprover_api();
21+
let result = ffi::get_api_version(client);
22+
println!("{}", *result);
23+
// assert_eq!(*result, "0.1");
724
}
825
}

0 commit comments

Comments
 (0)