update the windows buildscript to produce static nebula-ffi builds, massively increase nebula-ffi platform support
This commit is contained in:
parent
80d9bdff92
commit
420d7f9788
|
@ -1,7 +1,7 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<project version="4">
|
<project version="4">
|
||||||
<component name="DataSourceManagerImpl" format="xml" multifile-model="true">
|
<component name="DataSourceManagerImpl" format="xml" multifile-model="true">
|
||||||
<data-source source="LOCAL" name="trifid@localhost" uuid="39c81b89-3fc4-493f-b203-7a00527cffe6">
|
<data-source source="LOCAL" name="trifidapi@localhost" uuid="39c81b89-3fc4-493f-b203-7a00527cffe6">
|
||||||
<driver-ref>postgresql</driver-ref>
|
<driver-ref>postgresql</driver-ref>
|
||||||
<synchronize>true</synchronize>
|
<synchronize>true</synchronize>
|
||||||
<jdbc-driver>org.postgresql.Driver</jdbc-driver>
|
<jdbc-driver>org.postgresql.Driver</jdbc-driver>
|
||||||
|
|
|
@ -419,9 +419,9 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "bindgen"
|
name = "bindgen"
|
||||||
version = "0.68.1"
|
version = "0.69.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "726e4313eb6ec35d2730258ad4e15b547ee75d6afaa1361a922e78e59b7d8078"
|
checksum = "9ffcebc3849946a7170a05992aac39da343a90676ab392c51a4280981d6379c2"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bitflags 2.4.1",
|
"bitflags 2.4.1",
|
||||||
"cexpr",
|
"cexpr",
|
||||||
|
@ -1833,7 +1833,7 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "nebula-ffi"
|
name = "nebula-ffi"
|
||||||
version = "1.7.2"
|
version = "1.7.3"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bindgen",
|
"bindgen",
|
||||||
"cc",
|
"cc",
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
set -e
|
set -e
|
||||||
cargo build --target x86_64-pc-windows-gnu --release --bin tfclient
|
cargo build --target x86_64-pc-windows-gnu --profile release-ci --bin tfclient
|
||||||
rm -rf target/x86_64-pc-windows-gnu/release-ci/tfclient_dist/
|
rm -rf target/x86_64-pc-windows-gnu/release-ci/tfclient_dist/
|
||||||
mkdir -p target/x86_64-pc-windows-gnu/release-ci/tfclient_dist/
|
mkdir -p target/x86_64-pc-windows-gnu/release-ci/tfclient_dist/
|
||||||
cp target/x86_64-pc-windows-gnu/release-ci/tfclient.exe target/x86_64-pc-windows-gnu/release-ci/tfclient_dist/tfclient.exe
|
cp target/x86_64-pc-windows-gnu/release-ci/tfclient.exe target/x86_64-pc-windows-gnu/release-ci/tfclient_dist/tfclient.exe
|
||||||
|
@ -9,8 +9,6 @@ mkdir -p target/x86_64-pc-windows-gnu/release-ci/tfclient_dist/dist/windows/
|
||||||
wget https://www.wintun.net/builds/wintun-0.14.1.zip -O /tmp/wintun.zip
|
wget https://www.wintun.net/builds/wintun-0.14.1.zip -O /tmp/wintun.zip
|
||||||
echo "[*] Unzipping WinTun"
|
echo "[*] Unzipping WinTun"
|
||||||
unzip -d target/x86_64-pc-windows-gnu/release-ci/tfclient_dist/dist/windows/ /tmp/wintun.zip
|
unzip -d target/x86_64-pc-windows-gnu/release-ci/tfclient_dist/dist/windows/ /tmp/wintun.zip
|
||||||
echo "[*] Copying nebula.dll"
|
|
||||||
cp target/x86_64-pc-windows-gnu/release-ci/nebula.dll target/x86_64-pc-windows-gnu/release-ci/tfclient_dist/nebula.dll
|
|
||||||
echo "[*] Building zip bundle"
|
echo "[*] Building zip bundle"
|
||||||
cd target/x86_64-pc-windows-gnu/release-ci
|
cd target/x86_64-pc-windows-gnu/release-ci
|
||||||
zip -r tfclient.zip tfclient_dist/*
|
zip -r tfclient.zip tfclient_dist/*
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
[package]
|
[package]
|
||||||
name = "nebula-ffi"
|
name = "nebula-ffi"
|
||||||
version = "1.7.2"
|
version = "1.7.3"
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
description = "A Rust wrapper crate for communicating with Nebula via a CGO FFI."
|
description = "A Rust wrapper crate for communicating with Nebula via a CGO FFI."
|
||||||
license = "GPL-3.0-or-later"
|
license = "GPL-3.0-or-later"
|
||||||
|
@ -12,5 +12,5 @@ repository = "https://git.e3t.cc/~core/trifid"
|
||||||
|
|
||||||
|
|
||||||
[build-dependencies]
|
[build-dependencies]
|
||||||
bindgen = "0.68.1"
|
bindgen = "0.69"
|
||||||
cc = "1"
|
cc = "1"
|
|
@ -1,7 +1,7 @@
|
||||||
use bindgen::CargoCallbacks;
|
|
||||||
use std::path::Path;
|
use std::path::Path;
|
||||||
use std::path::PathBuf;
|
use std::path::PathBuf;
|
||||||
use std::{env, process};
|
use std::{env, process};
|
||||||
|
use bindgen::CargoCallbacks;
|
||||||
|
|
||||||
fn get_cargo_target_dir() -> Result<std::path::PathBuf, Box<dyn std::error::Error>> {
|
fn get_cargo_target_dir() -> Result<std::path::PathBuf, Box<dyn std::error::Error>> {
|
||||||
let skip_triple = std::env::var("TARGET")? == std::env::var("HOST")?;
|
let skip_triple = std::env::var("TARGET")? == std::env::var("HOST")?;
|
||||||
|
@ -35,28 +35,28 @@ fn main() {
|
||||||
|
|
||||||
println!("using go compiler {}", compiler);
|
println!("using go compiler {}", compiler);
|
||||||
|
|
||||||
//gobuild::Build::new().compiler(compiler).buildmode(BuildMode::CArchive).file("main.go").compile("nebulaffi");
|
|
||||||
|
|
||||||
let c_compiler = cc::Build::new().try_get_compiler().unwrap();
|
let c_compiler = cc::Build::new().try_get_compiler().unwrap();
|
||||||
|
|
||||||
|
let compile_config = get_compile_config();
|
||||||
|
|
||||||
let out_dir = env::var("OUT_DIR").unwrap();
|
let out_dir = env::var("OUT_DIR").unwrap();
|
||||||
let out_path = PathBuf::from(out_dir);
|
let out_path = PathBuf::from(out_dir);
|
||||||
let out_file = lib_name();
|
let out_file = compile_config.lib_filename.clone();
|
||||||
let out = out_path.join(out_file);
|
let out = out_path.join(out_file);
|
||||||
|
|
||||||
let mut command = process::Command::new(compiler);
|
let mut command = process::Command::new(compiler);
|
||||||
command.args([
|
command.args([
|
||||||
"build",
|
"build",
|
||||||
"-buildmode",
|
"-buildmode",
|
||||||
link_type().as_str(),
|
compile_config.link_type.as_str(),
|
||||||
"-o",
|
"-o",
|
||||||
out.display().to_string().as_str(),
|
out.display().to_string().as_str(),
|
||||||
"main.go",
|
"main.go",
|
||||||
]);
|
]);
|
||||||
command.env("CGO_ENABLED", "1");
|
command.env("CGO_ENABLED", "1");
|
||||||
command.env("CC", c_compiler.path());
|
command.env("CC", c_compiler.path());
|
||||||
command.env("GOARCH", goarch());
|
command.env("GOARCH", compile_config.goarch.clone());
|
||||||
command.env("GOOS", goos());
|
command.env("GOOS", compile_config.goos.clone());
|
||||||
println!("running go compile command: {:?}", command);
|
println!("running go compile command: {:?}", command);
|
||||||
|
|
||||||
let mut child = command.spawn().unwrap();
|
let mut child = command.spawn().unwrap();
|
||||||
|
@ -68,14 +68,19 @@ fn main() {
|
||||||
}
|
}
|
||||||
|
|
||||||
println!("Go compile success");
|
println!("Go compile success");
|
||||||
copy_if_windows();
|
|
||||||
|
|
||||||
print_link();
|
|
||||||
println!(
|
println!(
|
||||||
"cargo:rustc-link-search=native={}",
|
"cargo:rustc-link-search={}",
|
||||||
env::var("OUT_DIR").unwrap()
|
env::var("OUT_DIR").unwrap()
|
||||||
);
|
);
|
||||||
|
|
||||||
|
if compile_config.link_type == "c-shared" {
|
||||||
|
copy_shared_lib(&compile_config);
|
||||||
|
println!("cargo:rustc-link-lib=dylib=nebula");
|
||||||
|
} else {
|
||||||
|
println!("cargo:rustc-link-lib=static=nebula");
|
||||||
|
}
|
||||||
|
|
||||||
//let out_path = PathBuf::from(env::var("OUT_DIR").unwrap());
|
//let out_path = PathBuf::from(env::var("OUT_DIR").unwrap());
|
||||||
|
|
||||||
//println!("cargo:rustc-link-search={}", out_path.display());
|
//println!("cargo:rustc-link-search={}", out_path.display());
|
||||||
|
@ -86,8 +91,8 @@ fn main() {
|
||||||
println!("Generating bindings");
|
println!("Generating bindings");
|
||||||
|
|
||||||
let bindings = bindgen::Builder::default()
|
let bindings = bindgen::Builder::default()
|
||||||
.header(out_path.join(header_name()).display().to_string())
|
.header(out_path.join(compile_config.header_filename).display().to_string())
|
||||||
.parse_callbacks(Box::new(CargoCallbacks))
|
.parse_callbacks(Box::new(CargoCallbacks::new()))
|
||||||
.generate()
|
.generate()
|
||||||
.expect("Error generating CFFI bindings");
|
.expect("Error generating CFFI bindings");
|
||||||
|
|
||||||
|
@ -96,31 +101,60 @@ fn main() {
|
||||||
.expect("Couldn't write bindings!");
|
.expect("Couldn't write bindings!");
|
||||||
}
|
}
|
||||||
|
|
||||||
fn lib_name() -> String {
|
fn copy_shared_lib(go_compile_config: &GoCompileConfig) {
|
||||||
if env::var("CARGO_CFG_TARGET_FAMILY").unwrap() == "windows" {
|
|
||||||
"nebula.dll".to_string()
|
|
||||||
} else {
|
|
||||||
"libnebula.a".to_string()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
fn header_name() -> String {
|
|
||||||
if env::var("CARGO_CFG_TARGET_FAMILY").unwrap() == "windows" {
|
|
||||||
"nebula.h".to_string()
|
|
||||||
} else {
|
|
||||||
"libnebula.h".to_string()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn copy_if_windows() {
|
|
||||||
let target_dir = get_cargo_target_dir().unwrap();
|
let target_dir = get_cargo_target_dir().unwrap();
|
||||||
let target_file = target_dir.join(lib_name());
|
let target_file = target_dir.join(go_compile_config.lib_filename.clone());
|
||||||
let out_dir = env::var("OUT_DIR").unwrap();
|
let out_dir = env::var("OUT_DIR").unwrap();
|
||||||
let out_path = PathBuf::from(out_dir);
|
let out_path = PathBuf::from(out_dir);
|
||||||
let out_file = lib_name();
|
let out_file = go_compile_config.lib_filename.clone();
|
||||||
let out = out_path.join(out_file);
|
let out = out_path.join(out_file);
|
||||||
std::fs::copy(out, target_file).unwrap();
|
std::fs::copy(out, target_file).unwrap();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Go build supported modes.
|
||||||
|
// Pulled from golang/go/src/internal/platform/supported.go
|
||||||
|
// c-archive:
|
||||||
|
// aix, darwin, ios, windows
|
||||||
|
// linux/386, linux/amd64, linux/arm, linux/armbe, linux/arm64, linux/arm64be, linux/loong64, linux/ppc64le, linux/riscv64, linux/s390x
|
||||||
|
// freebsd/amd64
|
||||||
|
|
||||||
|
// c-shared:
|
||||||
|
// linux/amd64, linux/arm, linux/arm64, linux/loong64, linux/386, linux/ppc64le, linux/riscv64, linux/s390x
|
||||||
|
// android/amd64, android/arm, android/arm64, android/386
|
||||||
|
// freebsd/amd64
|
||||||
|
// darwin/amd64, darwin/arm64
|
||||||
|
// windows/amd64, windows/386, windows/arm64
|
||||||
|
|
||||||
|
struct GoCompileConfig {
|
||||||
|
goarch: String,
|
||||||
|
goos: String,
|
||||||
|
link_type: String,
|
||||||
|
lib_filename: String,
|
||||||
|
header_filename: String
|
||||||
|
}
|
||||||
|
|
||||||
|
fn get_compile_config() -> GoCompileConfig {
|
||||||
|
let goarch = goarch();
|
||||||
|
let goos = goos();
|
||||||
|
let platform_value = format!("{}/{}", goos, goarch);
|
||||||
|
let (preferred_link_type, lib_filename, header_filename) = match (goos.as_str(), goarch.as_str()) {
|
||||||
|
("darwin", _) => ("c-archive", "libnebula.a", "libnebula.h"),
|
||||||
|
("windows", _) => ("c-archive", "libnebula.a", "libnebula.h"),
|
||||||
|
("linux", "386") | ("linux", "amd64") | ("linux", "arm") | ("linux", "armbe") | ("linux", "arm64") | ("linux", "arm64be") | ("linux", "loong64") | ("linux", "ppc64le") | ("linux", "riscv64") | ("linux", "s390x") => ("c-archive", "libnebula.a", "libnebula.h"),
|
||||||
|
("freebsd", "amd64") => ("c-archive", "libnebula.a", "libnebula.h"),
|
||||||
|
_ => panic!("unsupported platform {} / {}", env::var("TARGET").unwrap(), platform_value)
|
||||||
|
};
|
||||||
|
|
||||||
|
GoCompileConfig {
|
||||||
|
goarch,
|
||||||
|
goos,
|
||||||
|
link_type: preferred_link_type.to_string(),
|
||||||
|
lib_filename: lib_filename.to_string(),
|
||||||
|
header_filename: header_filename.to_string()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
fn goarch() -> String {
|
fn goarch() -> String {
|
||||||
match env::var("CARGO_CFG_TARGET_ARCH").unwrap().as_str() {
|
match env::var("CARGO_CFG_TARGET_ARCH").unwrap().as_str() {
|
||||||
"x86" => "386",
|
"x86" => "386",
|
||||||
|
@ -148,20 +182,4 @@ fn goos() -> String {
|
||||||
os => panic!("unsupported operating system {os}"),
|
os => panic!("unsupported operating system {os}"),
|
||||||
}
|
}
|
||||||
.to_string()
|
.to_string()
|
||||||
}
|
}
|
||||||
|
|
||||||
fn print_link() {
|
|
||||||
if env::var("CARGO_CFG_TARGET_FAMILY").unwrap() == "windows" {
|
|
||||||
println!("cargo:rustc-link-lib=dylib=nebula");
|
|
||||||
} else {
|
|
||||||
println!("cargo:rustc-link-lib=static=nebula");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn link_type() -> String {
|
|
||||||
if env::var("CARGO_CFG_TARGET_FAMILY").unwrap() == "windows" {
|
|
||||||
"c-shared".to_string()
|
|
||||||
} else {
|
|
||||||
"c-archive".to_string()
|
|
||||||
}
|
|
||||||
}
|
|
Loading…
Reference in New Issue