#[allow(unused)] const ALLOWLIST_FUNCTION: &'static [&'static str] = &["bpf_.*", "bcc_.*", "perf_reader_.*"]; #[allow(unused)] const ALLOWLIST_TYPES: &'static [&'static str] = &[ "bcc_symbol", "perf_reader", "__sk_buff", "xdp_action", "xdp_md", "sk_action", "bpf_.*", ]; #[allow(unused)] const ALLOWLIST_VARS: &'static [&'static str] = &[ "LOG_BUF_SIZE", "BPF_.*", "MAX_BPF_REG", "MAX_BPF_ATTACH_TYPE", "__BPF_FUNC_MAPPER", "__BPF_ENUM_FN", "XDP_PACKET_HEADROOM", "TCP_BPF_IW", "TCP_BPF_SNDCWND_CLAMP", "STT_GNU_IFUNC", ]; #[allow(unused)] const BLOCKLIST_TYPES: &'static [&'static str] = &[ // bindgen generates a misaligned type for this struct "bpf_raw_tracepoint_args", ]; fn main() { linking_info(); #[cfg(feature = "generate")] { build_bcc_bindings(); } } // define the function for when we will generate bindings #[cfg(feature = "generate")] fn build_bcc_bindings() { let mut bindings = bindgen::Builder::default() .header("wrapper.h") .clang_arg("-I") .clang_arg(concat!(env!("CARGO_MANIFEST_DIR"), "/include")); if cfg!(any( feature = "v0_4_0", feature = "v0_5_0", feature = "v0_6_0", feature = "v0_6_1", feature = "v0_7_0", feature = "v0_8_0", )) { bindings = bindings.clang_arg("-D__BPF_COMMON__"); } else { bindings = bindings.clang_arg("-D__BCC_COMMON__"); } for func in ALLOWLIST_FUNCTION { bindings = bindings.allowlist_function(func); } for ty in ALLOWLIST_TYPES { bindings = bindings.allowlist_type(ty); } for var in ALLOWLIST_VARS { bindings = bindings.allowlist_var(var); } for ty in BLOCKLIST_TYPES { bindings = bindings.blocklist_type(ty); } bindings = bindings .size_t_is_usize(true) .derive_debug(true) .impl_debug(true) .derive_default(true) .derive_partialeq(true) .impl_partialeq(true) .derive_eq(true) .derive_partialord(true) .derive_ord(true) .derive_hash(true) .rustfmt_bindings(true); let builder = bindings .generate() .expect("Should generate BCC API bindings OK"); builder .write_to_file("src/generated.rs") .expect("Couldn't write bcc bindings!"); let have_working_rustfmt = std::process::Command::new("rustup") .args(&["run", "rustfmt", "--version"]) .stdout(std::process::Stdio::null()) .stderr(std::process::Stdio::null()) .status() .ok() .map_or(false, |status| status.success()); if !have_working_rustfmt { println!( " The latest `rustfmt` is required to format the generated bindings. Install `rustfmt` with: $ rustup component add rustfmt $ rustup update " ); } } #[cfg(not(feature = "static"))] fn linking_info() { println!("cargo:rustc-link-lib=bcc"); } #[cfg(feature = "static")] fn linking_info() { println!("cargo:rustc-link-lib=static=z"); println!("cargo:rustc-link-lib=static=elf"); println!("cargo:rustc-link-lib=static=xml2"); println!("cargo:rustc-link-lib=static=lzma"); println!("cargo:rustc-link-lib=static=tinfo"); println!("cargo:rustc-link-lib=stdc++"); println!("cargo:rustc-link-lib=static=bcc"); println!("cargo:rustc-link-lib=static=bcc-loader-static"); if cfg!(any( feature = "v0_4_0", feature = "v0_5_0", feature = "v0_6_0", feature = "v0_6_1", feature = "v0_7_0", feature = "v0_8_0", feature = "v0_9_0", )) { println!("cargo:rustc-link-lib=static=bpf"); } else { println!("cargo:rustc-link-lib=static=bcc_bpf"); } println!("cargo:rustc-link-lib=static=b_frontend"); println!("cargo:rustc-link-lib=static=clang_frontend"); println!("cargo:rustc-link-lib=static=usdt-static"); println!("cargo:rustc-link-lib=static=LLVMLTO"); println!("cargo:rustc-link-lib=static=LLVMPasses"); println!("cargo:rustc-link-lib=static=LLVMObjCARCOpts"); println!("cargo:rustc-link-lib=static=LLVMSymbolize"); println!("cargo:rustc-link-lib=static=LLVMDebugInfoPDB"); println!("cargo:rustc-link-lib=static=LLVMDebugInfoDWARF"); println!("cargo:rustc-link-lib=static=LLVMFuzzMutate"); println!("cargo:rustc-link-lib=static=LLVMMCA"); println!("cargo:rustc-link-lib=static=LLVMTableGen"); println!("cargo:rustc-link-lib=static=LLVMDlltoolDriver"); println!("cargo:rustc-link-lib=static=LLVMLineEditor"); println!("cargo:rustc-link-lib=static=LLVMXRay"); println!("cargo:rustc-link-lib=static=LLVMOrcJIT"); println!("cargo:rustc-link-lib=static=LLVMCoverage"); println!("cargo:rustc-link-lib=static=LLVMMIRParser"); println!("cargo:rustc-link-lib=static=LLVMBPFDisassembler"); println!("cargo:rustc-link-lib=static=LLVMBPFCodeGen"); println!("cargo:rustc-link-lib=static=LLVMBPFAsmParser"); println!("cargo:rustc-link-lib=static=LLVMBPFDesc"); println!("cargo:rustc-link-lib=static=LLVMBPFInfo"); if cfg!(any(feature = "llvm_8")) { println!("cargo:rustc-link-lib=static=LLVMBPFAsmPrinter"); } println!("cargo:rustc-link-lib=static=LLVMObjectYAML"); println!("cargo:rustc-link-lib=static=LLVMLibDriver"); println!("cargo:rustc-link-lib=static=LLVMOption"); println!("cargo:rustc-link-lib=static=LLVMWindowsManifest"); println!("cargo:rustc-link-lib=static=LLVMTextAPI"); println!("cargo:rustc-link-lib=static=LLVMX86Disassembler"); println!("cargo:rustc-link-lib=static=LLVMX86AsmParser"); println!("cargo:rustc-link-lib=static=LLVMX86CodeGen"); if cfg!(any(feature = "llvm_8")) { println!("cargo:rustc-link-lib=static=LLVMX86AsmPrinter"); } println!("cargo:rustc-link-lib=static=LLVMGlobalISel"); println!("cargo:rustc-link-lib=static=LLVMSelectionDAG"); println!("cargo:rustc-link-lib=static=LLVMAsmPrinter"); println!("cargo:rustc-link-lib=static=LLVMX86Desc"); println!("cargo:rustc-link-lib=static=LLVMMCDisassembler"); println!("cargo:rustc-link-lib=static=LLVMX86Info"); println!("cargo:rustc-link-lib=static=LLVMX86Utils"); println!("cargo:rustc-link-lib=static=LLVMMCJIT"); println!("cargo:rustc-link-lib=static=LLVMInterpreter"); println!("cargo:rustc-link-lib=static=LLVMExecutionEngine"); println!("cargo:rustc-link-lib=static=LLVMRuntimeDyld"); println!("cargo:rustc-link-lib=static=LLVMCodeGen"); println!("cargo:rustc-link-lib=static=LLVMTarget"); println!("cargo:rustc-link-lib=static=LLVMCoroutines"); println!("cargo:rustc-link-lib=static=LLVMipo"); println!("cargo:rustc-link-lib=static=LLVMInstrumentation"); println!("cargo:rustc-link-lib=static=LLVMVectorize"); println!("cargo:rustc-link-lib=static=LLVMScalarOpts"); println!("cargo:rustc-link-lib=static=LLVMLinker"); println!("cargo:rustc-link-lib=static=LLVMIRReader"); println!("cargo:rustc-link-lib=static=LLVMAsmParser"); println!("cargo:rustc-link-lib=static=LLVMInstCombine"); println!("cargo:rustc-link-lib=static=LLVMBitWriter"); println!("cargo:rustc-link-lib=static=LLVMAggressiveInstCombine"); println!("cargo:rustc-link-lib=static=LLVMTransformUtils"); println!("cargo:rustc-link-lib=static=LLVMAnalysis"); println!("cargo:rustc-link-lib=static=LLVMProfileData"); println!("cargo:rustc-link-lib=static=LLVMObject"); println!("cargo:rustc-link-lib=static=LLVMMCParser"); println!("cargo:rustc-link-lib=static=LLVMMC"); println!("cargo:rustc-link-lib=static=LLVMDebugInfoCodeView"); println!("cargo:rustc-link-lib=static=LLVMDebugInfoMSF"); println!("cargo:rustc-link-lib=static=LLVMBitReader"); if cfg!(any(feature = "llvm_9", not(feature = "specific_llvm"),)) { println!("cargo:rustc-link-lib=static=LLVMBitstreamReader"); } println!("cargo:rustc-link-lib=static=LLVMCore"); println!("cargo:rustc-link-lib=static=LLVMBinaryFormat"); println!("cargo:rustc-link-lib=static=LLVMSupport"); println!("cargo:rustc-link-lib=static=LLVMDemangle"); if cfg!(any(feature = "llvm_9", not(feature = "specific_llvm"),)) { println!("cargo:rustc-link-lib=static=LLVMRemarks"); } println!("cargo:rustc-link-lib=static=clangAnalysis"); println!("cargo:rustc-link-lib=static=clangARCMigrate"); println!("cargo:rustc-link-lib=static=clangAST"); println!("cargo:rustc-link-lib=static=clangASTMatchers"); println!("cargo:rustc-link-lib=static=clangBasic"); println!("cargo:rustc-link-lib=static=clangCodeGen"); println!("cargo:rustc-link-lib=static=clangDriver"); println!("cargo:rustc-link-lib=static=clangDynamicASTMatchers"); println!("cargo:rustc-link-lib=static=clangEdit"); println!("cargo:rustc-link-lib=static=clangFormat"); println!("cargo:rustc-link-lib=static=clangFrontend"); println!("cargo:rustc-link-lib=static=clangFrontendTool"); println!("cargo:rustc-link-lib=static=clangIndex"); println!("cargo:rustc-link-lib=static=clangLex"); println!("cargo:rustc-link-lib=static=clangParse"); println!("cargo:rustc-link-lib=static=clangRewrite"); println!("cargo:rustc-link-lib=static=clangRewriteFrontend"); println!("cargo:rustc-link-lib=static=clangSema"); println!("cargo:rustc-link-lib=static=clangSerialization"); println!("cargo:rustc-link-lib=static=clangStaticAnalyzerCheckers"); println!("cargo:rustc-link-lib=static=clangStaticAnalyzerCore"); println!("cargo:rustc-link-lib=static=clangStaticAnalyzerFrontend"); println!("cargo:rustc-link-lib=static=clangTooling"); println!("cargo:rustc-link-lib=static=clangToolingCore"); }