Skip to content

Commit 6dd0b19

Browse files
committed
1.8.0-beta.6: Prepare final version
1 parent ad148c1 commit 6dd0b19

File tree

4 files changed

+87
-3
lines changed

4 files changed

+87
-3
lines changed

.github/workflows/rust.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,4 +48,4 @@ jobs:
4848
run: cargo test
4949

5050
- name: Test
51-
run: cargo test --features http,tls
51+
run: cargo test --features http,websocket,stats

Cargo.toml

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "nng-c-sys"
3-
version = "1.8.0-beta.5"
3+
version = "1.8.0-beta.6"
44
authors = ["Douman <[email protected]>"]
55
edition = "2018"
66
keywords = ["nng", "nanomsg"]
@@ -22,5 +22,9 @@ version = "0.1"
2222
build-bindgen = ["bindgen"]
2323
# Enables HTTP transport code
2424
http = []
25+
# Enables Websocket transport code (this automatically enables http transport)
26+
websocket = ["http"]
2527
# Enables TLS
2628
tls = []
29+
# Enables statistics
30+
stats = []

README.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,16 @@ Version corresponds to C library
1111
## Features
1212

1313
- `http` - Builds with http code ON
14+
- `websocket` - Builds with websocket code ON. Enables `http` alongside
1415
- `tls` - Builds with TLS code ON
16+
- `stats` - Builds with statistics collection. See [this](https://nng.nanomsg.org/man/v1.3.0/nng_stat.5.html) for details.
1517

1618
### TLS
1719

1820
When `tls` feature is enabled this crate compiles mbedtls 2.28.8 to bundle it together with `nng`
21+
22+
## Cross compilation
23+
24+
### Android
25+
26+
Specify environment variable `ANDROID_NDK_HOME` which points too root of NDK installation where to look for toolchain file

build.rs

Lines changed: 73 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
use std::env;
2+
use std::path::PathBuf;
13
use std::process::Command;
24

35
const INCLUDE_PATH: &str = "nng/include";
@@ -127,11 +129,54 @@ pub const NNG_FLAG_NONBLOCK: core::ffi::c_int = 2;
127129
#[cfg(not(feature = "build-bindgen"))]
128130
fn generate_lib() {}
129131

132+
fn get_android_vars() -> Option<(PathBuf, &'static str)> {
133+
if let Ok(android_ndk) = env::var("ANDROID_NDK_HOME") {
134+
let mut toolchain_file = PathBuf::new();
135+
toolchain_file.push(android_ndk);
136+
toolchain_file.push("build");
137+
toolchain_file.push("cmake");
138+
toolchain_file.push("android.toolchain.cmake");
139+
140+
let target = env::var("TARGET").unwrap();
141+
let abi = match target.as_str() {
142+
"armv7-linux-androideabi" => "armeabi-v7a",
143+
"aarch64-linux-android" => "arm64-v8a",
144+
"i686-linux-android" => "x86",
145+
"x86_64-linux-android" => "x86_64",
146+
_ => return None,
147+
};
148+
149+
Some((toolchain_file, abi))
150+
} else {
151+
None
152+
}
153+
}
154+
155+
fn set_cmake_define_if_present(config: &mut cmake::Config, name: &str) {
156+
if let Ok(value) = env::var(name) {
157+
config.define(name, value);
158+
} else if let Ok(value) = env::var(format!("CARGO_NDK_{}", name)) {
159+
config.define(name, value);
160+
} else {
161+
println!("cargo:warning=Unable to find Android env variable '{}'. Hope for good default...", name);
162+
}
163+
}
164+
130165
#[cfg(feature = "tls")]
131166
fn build_mbedtls(nng: &mut cmake::Config, is_ninja: bool) {
132167
const MBEDTLS: &str = "mbedtls-2.28.8";
133168
let mut config = cmake::Config::new(MBEDTLS);
134169

170+
if let Some((toolchain_file, abi)) = get_android_vars() {
171+
config.define("CMAKE_TOOLCHAIN_FILE", toolchain_file);
172+
config.define("ANDROID_ABI", abi);
173+
174+
set_cmake_define_if_present(&mut config, "ANDROID_PLATFORM");
175+
set_cmake_define_if_present(&mut config, "ANDROID_STL");
176+
set_cmake_define_if_present(&mut config, "ANDROID_ARM_MODE");
177+
set_cmake_define_if_present(&mut config, "ANDROID_ARM_NEON");
178+
}
179+
135180
if is_ninja {
136181
config.generator("Ninja");
137182
}
@@ -161,23 +206,50 @@ fn build() {
161206

162207
let mut config = cmake::Config::new("nng");
163208

209+
if let Some((toolchain_file, abi)) = get_android_vars() {
210+
config.define("CMAKE_TOOLCHAIN_FILE", toolchain_file);
211+
config.define("ANDROID_ABI", abi);
212+
213+
set_cmake_define_if_present(&mut config, "ANDROID_PLATFORM");
214+
set_cmake_define_if_present(&mut config, "ANDROID_STL");
215+
set_cmake_define_if_present(&mut config, "ANDROID_ARM_MODE");
216+
set_cmake_define_if_present(&mut config, "ANDROID_ARM_NEON");
217+
}
218+
164219
//Use ninja if present on system
165220
if is_ninja {
166221
config.generator("Ninja");
167222
}
168223

169224
config.define("NNG_TESTS", "OFF");
170225
config.define("NNG_ENABLE_COMPAT", "OFF");
171-
config.define("NNG_TRANSPORT_WS", "OFF");
172226
//File descriptor is experimental transport so don't use it
173227
//idk why it is ON by default
174228
config.define("NNG_TRANSPORT_FDC", "OFF");
175229

230+
#[cfg(not(feature = "stats"))]
231+
config.define("NNG_ENABLE_STATS", "OFF");
232+
#[cfg(feature = "stats")]
233+
config.define("NNG_ENABLE_STATS", "ON");
234+
176235
#[cfg(not(feature = "http"))]
177236
config.define("NNG_ENABLE_HTTP", "OFF");
178237
#[cfg(feature = "http")]
179238
config.define("NNG_ENABLE_HTTP", "ON");
180239

240+
#[cfg(not(feature = "websocket"))]
241+
{
242+
config.define("NNG_TRANSPORT_WS", "OFF");
243+
config.define("NNG_TRANSPORT_WSS", "OFF");
244+
}
245+
246+
#[cfg(feature = "websocket")]
247+
{
248+
config.define("NNG_TRANSPORT_WS", "ON");
249+
#[cfg(feature = "tls")]
250+
config.define("NNG_TRANSPORT_WSS", "ON");
251+
}
252+
181253
#[cfg(not(feature = "tls"))]
182254
{
183255
config.define("NNG_TRANSPORT_TLS", "OFF");

0 commit comments

Comments
 (0)