1*8fb009dcSAndroid Build Coastguard Worker /* Copyright (c) 2021, Google Inc.
2*8fb009dcSAndroid Build Coastguard Worker *
3*8fb009dcSAndroid Build Coastguard Worker * Permission to use, copy, modify, and/or distribute this software for any
4*8fb009dcSAndroid Build Coastguard Worker * purpose with or without fee is hereby granted, provided that the above
5*8fb009dcSAndroid Build Coastguard Worker * copyright notice and this permission notice appear in all copies.
6*8fb009dcSAndroid Build Coastguard Worker *
7*8fb009dcSAndroid Build Coastguard Worker * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
8*8fb009dcSAndroid Build Coastguard Worker * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
9*8fb009dcSAndroid Build Coastguard Worker * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
10*8fb009dcSAndroid Build Coastguard Worker * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
11*8fb009dcSAndroid Build Coastguard Worker * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
12*8fb009dcSAndroid Build Coastguard Worker * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
13*8fb009dcSAndroid Build Coastguard Worker * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
14*8fb009dcSAndroid Build Coastguard Worker */
15*8fb009dcSAndroid Build Coastguard Worker
16*8fb009dcSAndroid Build Coastguard Worker use std::env;
17*8fb009dcSAndroid Build Coastguard Worker use std::path::Path;
18*8fb009dcSAndroid Build Coastguard Worker use std::path::PathBuf;
19*8fb009dcSAndroid Build Coastguard Worker
20*8fb009dcSAndroid Build Coastguard Worker // Keep in sync with the list in include/openssl/opensslconf.h
21*8fb009dcSAndroid Build Coastguard Worker const OSSL_CONF_DEFINES: &[&str] = &[
22*8fb009dcSAndroid Build Coastguard Worker "OPENSSL_NO_ASYNC",
23*8fb009dcSAndroid Build Coastguard Worker "OPENSSL_NO_BF",
24*8fb009dcSAndroid Build Coastguard Worker "OPENSSL_NO_BLAKE2",
25*8fb009dcSAndroid Build Coastguard Worker "OPENSSL_NO_BUF_FREELISTS",
26*8fb009dcSAndroid Build Coastguard Worker "OPENSSL_NO_CAMELLIA",
27*8fb009dcSAndroid Build Coastguard Worker "OPENSSL_NO_CAPIENG",
28*8fb009dcSAndroid Build Coastguard Worker "OPENSSL_NO_CAST",
29*8fb009dcSAndroid Build Coastguard Worker "OPENSSL_NO_CMS",
30*8fb009dcSAndroid Build Coastguard Worker "OPENSSL_NO_COMP",
31*8fb009dcSAndroid Build Coastguard Worker "OPENSSL_NO_CT",
32*8fb009dcSAndroid Build Coastguard Worker "OPENSSL_NO_DANE",
33*8fb009dcSAndroid Build Coastguard Worker "OPENSSL_NO_DEPRECATED",
34*8fb009dcSAndroid Build Coastguard Worker "OPENSSL_NO_DGRAM",
35*8fb009dcSAndroid Build Coastguard Worker "OPENSSL_NO_DYNAMIC_ENGINE",
36*8fb009dcSAndroid Build Coastguard Worker "OPENSSL_NO_EC_NISTP_64_GCC_128",
37*8fb009dcSAndroid Build Coastguard Worker "OPENSSL_NO_EC2M",
38*8fb009dcSAndroid Build Coastguard Worker "OPENSSL_NO_EGD",
39*8fb009dcSAndroid Build Coastguard Worker "OPENSSL_NO_ENGINE",
40*8fb009dcSAndroid Build Coastguard Worker "OPENSSL_NO_GMP",
41*8fb009dcSAndroid Build Coastguard Worker "OPENSSL_NO_GOST",
42*8fb009dcSAndroid Build Coastguard Worker "OPENSSL_NO_HEARTBEATS",
43*8fb009dcSAndroid Build Coastguard Worker "OPENSSL_NO_HW",
44*8fb009dcSAndroid Build Coastguard Worker "OPENSSL_NO_IDEA",
45*8fb009dcSAndroid Build Coastguard Worker "OPENSSL_NO_JPAKE",
46*8fb009dcSAndroid Build Coastguard Worker "OPENSSL_NO_KRB5",
47*8fb009dcSAndroid Build Coastguard Worker "OPENSSL_NO_MD2",
48*8fb009dcSAndroid Build Coastguard Worker "OPENSSL_NO_MDC2",
49*8fb009dcSAndroid Build Coastguard Worker "OPENSSL_NO_OCB",
50*8fb009dcSAndroid Build Coastguard Worker "OPENSSL_NO_OCSP",
51*8fb009dcSAndroid Build Coastguard Worker "OPENSSL_NO_RC2",
52*8fb009dcSAndroid Build Coastguard Worker "OPENSSL_NO_RC5",
53*8fb009dcSAndroid Build Coastguard Worker "OPENSSL_NO_RFC3779",
54*8fb009dcSAndroid Build Coastguard Worker "OPENSSL_NO_RIPEMD",
55*8fb009dcSAndroid Build Coastguard Worker "OPENSSL_NO_RMD160",
56*8fb009dcSAndroid Build Coastguard Worker "OPENSSL_NO_SCTP",
57*8fb009dcSAndroid Build Coastguard Worker "OPENSSL_NO_SEED",
58*8fb009dcSAndroid Build Coastguard Worker "OPENSSL_NO_SM2",
59*8fb009dcSAndroid Build Coastguard Worker "OPENSSL_NO_SM3",
60*8fb009dcSAndroid Build Coastguard Worker "OPENSSL_NO_SM4",
61*8fb009dcSAndroid Build Coastguard Worker "OPENSSL_NO_SRP",
62*8fb009dcSAndroid Build Coastguard Worker "OPENSSL_NO_SSL_TRACE",
63*8fb009dcSAndroid Build Coastguard Worker "OPENSSL_NO_SSL2",
64*8fb009dcSAndroid Build Coastguard Worker "OPENSSL_NO_SSL3",
65*8fb009dcSAndroid Build Coastguard Worker "OPENSSL_NO_SSL3_METHOD",
66*8fb009dcSAndroid Build Coastguard Worker "OPENSSL_NO_STATIC_ENGINE",
67*8fb009dcSAndroid Build Coastguard Worker "OPENSSL_NO_STORE",
68*8fb009dcSAndroid Build Coastguard Worker "OPENSSL_NO_WHIRLPOOL",
69*8fb009dcSAndroid Build Coastguard Worker ];
70*8fb009dcSAndroid Build Coastguard Worker
get_bssl_build_dir() -> PathBuf71*8fb009dcSAndroid Build Coastguard Worker fn get_bssl_build_dir() -> PathBuf {
72*8fb009dcSAndroid Build Coastguard Worker println!("cargo:rerun-if-env-changed=BORINGSSL_BUILD_DIR");
73*8fb009dcSAndroid Build Coastguard Worker if let Some(build_dir) = env::var_os("BORINGSSL_BUILD_DIR") {
74*8fb009dcSAndroid Build Coastguard Worker return PathBuf::from(build_dir);
75*8fb009dcSAndroid Build Coastguard Worker }
76*8fb009dcSAndroid Build Coastguard Worker
77*8fb009dcSAndroid Build Coastguard Worker let crate_dir = env::var_os("CARGO_MANIFEST_DIR").unwrap();
78*8fb009dcSAndroid Build Coastguard Worker return Path::new(&crate_dir).join("../../build");
79*8fb009dcSAndroid Build Coastguard Worker }
80*8fb009dcSAndroid Build Coastguard Worker
get_cpp_runtime_lib() -> Option<String>81*8fb009dcSAndroid Build Coastguard Worker fn get_cpp_runtime_lib() -> Option<String> {
82*8fb009dcSAndroid Build Coastguard Worker println!("cargo:rerun-if-env-changed=BORINGSSL_RUST_CPPLIB");
83*8fb009dcSAndroid Build Coastguard Worker
84*8fb009dcSAndroid Build Coastguard Worker if let Ok(cpp_lib) = env::var("BORINGSSL_RUST_CPPLIB") {
85*8fb009dcSAndroid Build Coastguard Worker return Some(cpp_lib);
86*8fb009dcSAndroid Build Coastguard Worker }
87*8fb009dcSAndroid Build Coastguard Worker
88*8fb009dcSAndroid Build Coastguard Worker if env::var_os("CARGO_CFG_UNIX").is_some() {
89*8fb009dcSAndroid Build Coastguard Worker match env::var("CARGO_CFG_TARGET_OS").unwrap().as_ref() {
90*8fb009dcSAndroid Build Coastguard Worker "macos" => Some("c++".into()),
91*8fb009dcSAndroid Build Coastguard Worker _ => Some("stdc++".into()),
92*8fb009dcSAndroid Build Coastguard Worker }
93*8fb009dcSAndroid Build Coastguard Worker } else {
94*8fb009dcSAndroid Build Coastguard Worker None
95*8fb009dcSAndroid Build Coastguard Worker }
96*8fb009dcSAndroid Build Coastguard Worker }
97*8fb009dcSAndroid Build Coastguard Worker
main()98*8fb009dcSAndroid Build Coastguard Worker fn main() {
99*8fb009dcSAndroid Build Coastguard Worker let bssl_build_dir = get_bssl_build_dir();
100*8fb009dcSAndroid Build Coastguard Worker let bssl_sys_build_dir = bssl_build_dir.join("rust/bssl-sys");
101*8fb009dcSAndroid Build Coastguard Worker let target = env::var("TARGET").unwrap();
102*8fb009dcSAndroid Build Coastguard Worker
103*8fb009dcSAndroid Build Coastguard Worker // Find the bindgen generated target platform bindings file and set BINDGEN_RS_FILE
104*8fb009dcSAndroid Build Coastguard Worker let bindgen_file = bssl_sys_build_dir.join(format!("wrapper_{}.rs", target));
105*8fb009dcSAndroid Build Coastguard Worker println!("cargo:rustc-env=BINDGEN_RS_FILE={}", bindgen_file.display());
106*8fb009dcSAndroid Build Coastguard Worker
107*8fb009dcSAndroid Build Coastguard Worker // Statically link libraries.
108*8fb009dcSAndroid Build Coastguard Worker println!(
109*8fb009dcSAndroid Build Coastguard Worker "cargo:rustc-link-search=native={}",
110*8fb009dcSAndroid Build Coastguard Worker bssl_build_dir.join("crypto").display()
111*8fb009dcSAndroid Build Coastguard Worker );
112*8fb009dcSAndroid Build Coastguard Worker println!("cargo:rustc-link-lib=static=crypto");
113*8fb009dcSAndroid Build Coastguard Worker
114*8fb009dcSAndroid Build Coastguard Worker println!(
115*8fb009dcSAndroid Build Coastguard Worker "cargo:rustc-link-search=native={}",
116*8fb009dcSAndroid Build Coastguard Worker bssl_build_dir.join("ssl").display()
117*8fb009dcSAndroid Build Coastguard Worker );
118*8fb009dcSAndroid Build Coastguard Worker println!("cargo:rustc-link-lib=static=ssl");
119*8fb009dcSAndroid Build Coastguard Worker
120*8fb009dcSAndroid Build Coastguard Worker println!(
121*8fb009dcSAndroid Build Coastguard Worker "cargo:rustc-link-search=native={}",
122*8fb009dcSAndroid Build Coastguard Worker bssl_sys_build_dir.display()
123*8fb009dcSAndroid Build Coastguard Worker );
124*8fb009dcSAndroid Build Coastguard Worker println!("cargo:rustc-link-lib=static=rust_wrapper");
125*8fb009dcSAndroid Build Coastguard Worker
126*8fb009dcSAndroid Build Coastguard Worker if let Some(cpp_lib) = get_cpp_runtime_lib() {
127*8fb009dcSAndroid Build Coastguard Worker println!("cargo:rustc-link-lib={}", cpp_lib);
128*8fb009dcSAndroid Build Coastguard Worker }
129*8fb009dcSAndroid Build Coastguard Worker
130*8fb009dcSAndroid Build Coastguard Worker println!("cargo:conf={}", OSSL_CONF_DEFINES.join(","));
131*8fb009dcSAndroid Build Coastguard Worker }
132