Skip to content

Commit

Permalink
Merge pull request #790 from mitinarseny/master
Browse files Browse the repository at this point in the history
fix(tonlibjson-sys): fix support for macos in build.rs
  • Loading branch information
akostylev0 authored Apr 30, 2024
2 parents e36c43b + ab1f538 commit 12efff3
Show file tree
Hide file tree
Showing 2 changed files with 135 additions and 110 deletions.
3 changes: 0 additions & 3 deletions .cargo/config.toml
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,3 @@ linker = "clang"
[profile.release]
debug = true
lto = true

[build]
target = "x86_64-unknown-linux-gnu"
242 changes: 135 additions & 107 deletions tonlibjson-sys/build.rs
Original file line number Diff line number Diff line change
@@ -1,93 +1,134 @@
use std::env;

use cmake::Config;

fn main() {
let is_release = env::var("PROFILE").unwrap() == "release";
let target = env::var("TARGET").unwrap();
let is_darwin = target == "x86_64-apple-darwin";

let openssl_dir = env::var("OPENSSL_ROOT_DIR")
.ok()
.map(|x| format!("{}/lib", x))
.or_else(
|| pkg_config::probe_library("openssl")
.ok()
.map(|lib| lib.link_paths.first().unwrap().display().to_string())
).unwrap();

let ton_dir = if cfg!(feature = "testnet") { "ton-testnet" } else { "ton" };
let build_tonlibjson = cfg!(feature = "tonlibjson");
let build_emulator = cfg!(feature = "tonemulator");
let target_os = env::var("CARGO_CFG_TARGET_OS").unwrap();

let ton_dir = if cfg!(feature = "testnet") {
"ton-testnet"
} else {
"ton"
};
eprintln!("ton dir is {}", ton_dir);
println!("cargo:rerun-if-changed={ton_dir}/CMakeLists.txt");
println!("cargo:rerun-if-changed=build.rs");

if is_darwin {
if target_os == "macos" {
println!("cargo:rustc-link-lib=dylib=c++");
} else {
println!("cargo:rustc-link-lib=static=c++");
} else if target_os == "linux" {
println!("cargo:rustc-link-lib=dylib=stdc++");
}

println!("cargo:rustc-link-search=native={}", openssl_dir);
let openssl_dir = env::var("OPENSSL_ROOT_DIR").unwrap_or_else(|_| {
pkg_config::probe_library("openssl")
.unwrap()
.link_paths
.first()
.unwrap()
.display()
.to_string()
});
println!("cargo:rustc-link-search=native={}/lib", openssl_dir);
println!("cargo:rustc-link-lib=static=crypto");
println!("cargo:rustc-link-lib=static=ssl");

let sodium_dir = pkg_config::probe_library("libsodium")
.unwrap()
.link_paths
.first()
.unwrap()
.to_path_buf();
println!("cargo:rustc-link-search=native={}", sodium_dir.display());
println!("cargo:rustc-link-lib=static=sodium");

let secp256k1_dir = pkg_config::probe_library("libsecp256k1")
.unwrap()
.link_paths
.first()
.unwrap()
.to_path_buf();
println!("cargo:rustc-link-search=native={}", secp256k1_dir.display());
println!("cargo:rustc-link-lib=static=secp256k1");

let target_arch = "x86-64";

if build_tonlibjson {
let dst= if !is_darwin && is_release {
Config::new(ton_dir)
.define("TON_ONLY_TONLIB", "ON")
.define("CMAKE_C_COMPILER", "clang")
.define("CMAKE_CXX_COMPILER", "clang++")
.define("CMAKE_CXX_STANDARD", "14")
.define("BUILD_SHARED_LIBS", "OFF")
.define("SODIUM_USE_STATIC_LIBS", "OFF")
.define("PORTABLE", "ON")
.define("TON_ARCH", target_arch)
.cxxflag("-std=c++14")
.cxxflag("-stdlib=libc++")
.cxxflag("-flto")
.define("CMAKE_EXE_LINKER_FLAGS_INIT", "-fuse-ld=lld")
.define("CMAKE_MODULE_LINKER_FLAGS_INIT", "-fuse-ld=lld")
.define("CMAKE_SHARED_LINKER_FLAGS_INIT", "-fuse-ld=lld")
.uses_cxx11()
.build_target("tonlibjson")
.build()
} else {
Config::new(ton_dir)
.uses_cxx11()
.define("TON_ONLY_TONLIB", "ON")
.define("CMAKE_C_COMPILER", "clang")
.define("CMAKE_CXX_COMPILER", "clang++")
.define("CMAKE_CXX_STANDARD", "14")
.define("BUILD_SHARED_LIBS", "OFF")
.define("SODIUM_USE_STATIC_LIBS", "OFF")
.define("PORTABLE", "ON")
.define("TON_ARCH", target_arch)
.cxxflag("-std=c++14")
.cxxflag("-stdlib=libc++")
.build_target("tonlibjson")
.build()
};

println!("cargo:rustc-link-search=native={}/build/third-party/blst", dst.display());
let mut cfg = Config::new(ton_dir);
cfg.define("TON_ONLY_TONLIB", "ON")
.define("CMAKE_C_COMPILER", "clang")
.define("CMAKE_CXX_COMPILER", "clang++")
.define("PORTABLE", "ON")
.define("BUILD_SHARED_LIBS", "OFF")
.always_configure(true)
.very_verbose(false);

// lz4
{
let liblz4 = pkg_config::probe_library("liblz4").unwrap();
println!(
"cargo:rustc-link-search=native={}",
liblz4.link_paths.first().unwrap().display()
);
println!("cargo:rustc-link-lib=static=lz4");

cfg.define("LZ4_FOUND", "1")
.define(
"LZ4_LIBRARIES",
liblz4
.link_paths
.first()
.unwrap()
.join(format!("lib{}.a", liblz4.libs.first().unwrap())),
)
.define(
"LZ4_INCLUDE_DIRS",
liblz4.include_paths.first().unwrap().to_str().unwrap(),
);
}

if target_os == "macos" {
cfg.cxxflag("-stdlib=libc++");
} else if is_release {
cfg.cxxflag("-flto")
.define("CMAKE_EXE_LINKER_FLAGS_INIT", "-fuse-ld=lld")
.define("CMAKE_MODULE_LINKER_FLAGS_INIT", "-fuse-ld=lld")
.define("CMAKE_SHARED_LINKER_FLAGS_INIT", "-fuse-ld=lld");
}

if cfg!(feature = "tonlibjson") {
let dst = cfg.build_target("tonlibjson").build();

println!(
"cargo:rustc-link-search=native={}/build/third-party/blst",
dst.display()
);
println!("cargo:rustc-link-lib=static=blst");

for item in ["tdnet", "keys", "tdactor", "tl-utils", "tdutils"] {
println!("cargo:rustc-link-search=native={}/build/{}", dst.display(), item);
println!(
"cargo:rustc-link-search=native={}/build/{}",
dst.display(),
item
);
println!("cargo:rustc-link-lib=static={}", item)
}
println!("cargo:rustc-link-lib=static=tl-lite-utils");

println!("cargo:rustc-link-search=native={}/build/adnl", dst.display());
println!(
"cargo:rustc-link-search=native={}/build/adnl",
dst.display()
);
println!("cargo:rustc-link-lib=static=adnllite");

println!("cargo:rustc-link-search=native={}/build/lite-client", dst.display());
println!(
"cargo:rustc-link-search=native={}/build/lite-client",
dst.display()
);
println!("cargo:rustc-link-lib=static=lite-client-common");

println!("cargo:rustc-link-search=native={}/build/crypto", dst.display());
println!(
"cargo:rustc-link-search=native={}/build/crypto",
dst.display()
);
println!("cargo:rustc-link-lib=static=ton_crypto");
println!("cargo:rustc-link-lib=static=ton_crypto_core");

Expand All @@ -100,10 +141,16 @@ fn main() {
println!("cargo:rustc-link-lib=static=tl_tonlib_api");
println!("cargo:rustc-link-lib=static=tl_tonlib_api_json");

println!("cargo:rustc-link-search=native={}/build/tddb", dst.display());
println!(
"cargo:rustc-link-search=native={}/build/tddb",
dst.display()
);
println!("cargo:rustc-link-lib=static=tddb_utils");

println!("cargo:rustc-link-search=native={}/build/third-party/crc32c", dst.display());
println!(
"cargo:rustc-link-search=native={}/build/third-party/crc32c",
dst.display()
);
println!("cargo:rustc-link-lib=static=crc32c");

println!("cargo:rustc-link-search=native={}/lib", dst.display());
Expand All @@ -112,61 +159,42 @@ fn main() {
println!("cargo:rustc-link-lib=static=tdutils");
println!("cargo:rustc-link-lib=static=tl-lite-utils");

println!("cargo:rustc-link-search=native={}/build/emulator", dst.display());
println!(
"cargo:rustc-link-search=native={}/build/emulator",
dst.display()
);
println!("cargo:rustc-link-lib=static=emulator_static");

println!("cargo:rustc-link-search=native={}/build/tonlib", dst.display());
println!(
"cargo:rustc-link-search=native={}/build/tonlib",
dst.display()
);
println!("cargo:rustc-link-lib=static=tonlib");
println!("cargo:rustc-link-lib=static=tonlibjson_private");
println!("cargo:rustc-link-lib=static=tonlibjson");
}

if build_emulator {
let dst = if !is_darwin && is_release {
Config::new(ton_dir)
.define("TON_ONLY_TONLIB", "ON")
.define("CMAKE_C_COMPILER", "clang")
.define("CMAKE_CXX_COMPILER", "clang++")
.define("CMAKE_CXX_STANDARD", "14")
.define("BUILD_SHARED_LIBS", "OFF")
.define("SODIUM_USE_STATIC_LIBS", "OFF")
.define("PORTABLE", "ON")
.define("TON_ARCH", target_arch)
.cxxflag("-std=c++14")
.cxxflag("-stdlib=libc++")
.cxxflag("-flto")
.define("CMAKE_EXE_LINKER_FLAGS_INIT", "-fuse-ld=lld")
.define("CMAKE_MODULE_LINKER_FLAGS_INIT", "-fuse-ld=lld")
.define("CMAKE_SHARED_LINKER_FLAGS_INIT", "-fuse-ld=lld")
.uses_cxx11()
.build_target("emulator")
.build()
} else {
Config::new(ton_dir)
.uses_cxx11()
.define("TON_ONLY_TONLIB", "ON")
.define("CMAKE_C_COMPILER", "clang")
.define("CMAKE_CXX_COMPILER", "clang++")
.define("CMAKE_CXX_STANDARD", "14")
.define("BUILD_SHARED_LIBS", "OFF")
.define("SODIUM_USE_STATIC_LIBS", "OFF")
.define("PORTABLE", "ON")
.define("TON_ARCH", target_arch)
.cxxflag("-std=c++14")
.cxxflag("-stdlib=libc++")
.build_target("emulator")
.build()
};

println!("cargo:rustc-link-search=native={}/build/third-party/blst", dst.display());
if cfg!(feature = "tonemulator") {
let dst = cfg.build_target("emulator").build();

println!(
"cargo:rustc-link-search=native={}/build/third-party/blst",
dst.display()
);
println!("cargo:rustc-link-lib=static=blst");

println!("cargo:rustc-link-search=native={}/build/crypto", dst.display());
println!(
"cargo:rustc-link-search=native={}/build/crypto",
dst.display()
);
println!("cargo:rustc-link-lib=static=ton_crypto");
println!("cargo:rustc-link-lib=static=ton_block");
println!("cargo:rustc-link-lib=static=smc-envelope");

println!("cargo:rustc-link-search=native={}/build/emulator", dst.display());
println!(
"cargo:rustc-link-search=native={}/build/emulator",
dst.display()
);
println!("cargo:rustc-link-lib=static=emulator_static");
println!("cargo:rustc-link-lib=static=emulator");
}
Expand Down

0 comments on commit 12efff3

Please sign in to comment.