mirror of
https://github.com/zama-ai/concrete.git
synced 2026-02-10 04:35:03 -05:00
- tinfo is a part of the ncurses project. - tinfo does not seem easily installable stand alone (no brew install tinfo, no dnf install tinfo-devel, etc) but installing ncurses is possible and generally makes tinfo 'findable' - on macos (M1 mac) it seems that even with ncurses installed tinfo is not found, but linking to ncurses fixes the problem
353 lines
9.2 KiB
Rust
353 lines
9.2 KiB
Rust
extern crate bindgen;
|
|
|
|
use std::env;
|
|
use std::error::Error;
|
|
use std::path::Path;
|
|
use std::process::exit;
|
|
|
|
const MLIR_STATIC_LIBS: [&str; 179] = [
|
|
"MLIRMemRefDialect",
|
|
"MLIRVectorToSPIRV",
|
|
"MLIRControlFlowInterfaces",
|
|
"MLIRLinalgToStandard",
|
|
"MLIRAnalysis",
|
|
"MLIRSPIRVDeserialization",
|
|
"MLIRTransformDialect",
|
|
"MLIRSparseTensorPipelines",
|
|
"MLIRVectorToGPU",
|
|
"MLIRTranslateLib",
|
|
"MLIRPass",
|
|
"MLIRComplexToLibm",
|
|
"MLIRInferTypeOpInterface",
|
|
"MLIRMemRefToSPIRV",
|
|
"MLIRAMDGPUToROCDL",
|
|
"MLIRBufferizationTransformOps",
|
|
"MLIRExecutionEngineUtils",
|
|
"MLIRNVVMDialect",
|
|
"MLIRSCFUtils",
|
|
"MLIRLinalgTransforms",
|
|
"MLIRParser",
|
|
"MLIRFuncTransforms",
|
|
"MLIRTosaTestPasses",
|
|
"MLIRTosaToArith",
|
|
"MLIRTensorDialect",
|
|
"MLIRGPUTransforms",
|
|
"MLIRLowerableDialectsToLLVM",
|
|
"MLIRBufferizationToMemRef",
|
|
"MLIRPresburger",
|
|
"MLIRFuncDialect",
|
|
"MLIRPDLToPDLInterp",
|
|
"MLIRArithmeticTransforms",
|
|
"MLIRViewLikeInterface",
|
|
"MLIRTargetCpp",
|
|
"MLIROpenMPToLLVM",
|
|
"MLIRSPIRVConversion",
|
|
"MLIRNVGPUTransforms",
|
|
"MLIRSparseTensorTransforms",
|
|
"MLIRAffineAnalysis",
|
|
"MLIRArmSVETransforms",
|
|
"MLIRArmNeon2dToIntr",
|
|
"MLIRDataLayoutInterfaces",
|
|
"MLIRAffineTransforms",
|
|
"MLIROpenACCToLLVMIRTranslation",
|
|
"MLIRTensorUtils",
|
|
"MLIRSPIRVSerialization",
|
|
"MLIRShapeToStandard",
|
|
"MLIRArithmeticToSPIRV",
|
|
"MLIRArithmeticDialect",
|
|
"MLIRFuncToSPIRV",
|
|
"MLIRQuantUtils",
|
|
"MLIRTensorTilingInterfaceImpl",
|
|
"MLIRX86VectorToLLVMIRTranslation",
|
|
"MLIRCopyOpInterface",
|
|
"MLIRMathToLibm",
|
|
"MLIRGPUToGPURuntimeTransforms",
|
|
"MLIRLLVMDialect",
|
|
"MLIRAffineDialect",
|
|
"MLIRTransforms",
|
|
"MLIRVectorTransforms",
|
|
"MLIROpenMPDialect",
|
|
"MLIRControlFlowDialect",
|
|
"MLIRVectorUtils",
|
|
"MLIRROCDLDialect",
|
|
"MLIRPDLDialect",
|
|
"MLIRAsyncDialect",
|
|
"MLIRLinalgToLLVM",
|
|
"MLIROpenACCDialect",
|
|
"MLIRVectorDialect",
|
|
"MLIROpenACCToSCF",
|
|
"MLIRIR",
|
|
"MLIRCAPIIR",
|
|
"MLIRTargetLLVMIRImport",
|
|
"MLIRTensorToLinalg",
|
|
"MLIRCallInterfaces",
|
|
"MLIRTensorInferTypeOpInterfaceImpl",
|
|
"MLIRTransformDialectTransforms",
|
|
"MLIRComplexDialect",
|
|
"MLIRAffineUtils",
|
|
"MLIRLoopLikeInterface",
|
|
"MLIRDialect",
|
|
"MLIRLinalgUtils",
|
|
"MLIRSCFToSPIRV",
|
|
"MLIRAffineToStandard",
|
|
"MLIRX86VectorDialect",
|
|
"MLIRGPUToVulkanTransforms",
|
|
"MLIRRewrite",
|
|
"MLIRAMXToLLVMIRTranslation",
|
|
"MLIRInferIntRangeInterface",
|
|
"MLIRCAPIRegistration",
|
|
"MLIRNVVMToLLVMIRTranslation",
|
|
"MLIRAsyncTransforms",
|
|
"MLIRPDLInterpDialect",
|
|
"MLIRTransformUtils",
|
|
"MLIRLinalgDialect",
|
|
"MLIRMathDialect",
|
|
"MLIRMemRefTransforms",
|
|
"MLIRSPIRVModuleCombiner",
|
|
"MLIRMathToLLVM",
|
|
"MLIRControlFlowToLLVM",
|
|
"MLIRArmSVEDialect",
|
|
"MLIRSPIRVTranslateRegistration",
|
|
"MLIRToLLVMIRTranslationRegistration",
|
|
"MLIRSCFDialect",
|
|
"MLIRTilingInterface",
|
|
"MLIREmitCDialect",
|
|
"MLIRTableGen",
|
|
"MLIRTosaToSCF",
|
|
"MLIROpenMPToLLVMIRTranslation",
|
|
"MLIRSupport",
|
|
"MLIROpenACCToLLVM",
|
|
"MLIRAMDGPUDialect",
|
|
"MLIRTosaToLinalg",
|
|
"MLIRSparseTensorUtils",
|
|
"MLIRFuncToLLVM",
|
|
"MLIRTargetLLVMIRExport",
|
|
"MLIRControlFlowToSPIRV",
|
|
"MLIRReconcileUnrealizedCasts",
|
|
"MLIRComplexToStandard",
|
|
"MLIRMathTransforms",
|
|
"MLIRSPIRVUtils",
|
|
"MLIRCastInterfaces",
|
|
"MLIRTosaToTensor",
|
|
"MLIRMemRefUtils",
|
|
"MLIRGPUToSPIRV",
|
|
"MLIRBufferizationDialect",
|
|
"MLIRSCFToControlFlow",
|
|
"MLIRArmSVEToLLVMIRTranslation",
|
|
"MLIRExecutionEngine",
|
|
"MLIRBufferizationTransforms",
|
|
"MLIRSparseTensorDialect",
|
|
"MLIRTensorToSPIRV",
|
|
"MLIRVectorToSCF",
|
|
"MLIRQuantTransforms",
|
|
"MLIRLLVMToLLVMIRTranslation",
|
|
"MLIRNVGPUDialect",
|
|
"MLIRAsyncToLLVM",
|
|
"MLIRAMXDialect",
|
|
"MLIRLinalgTransformOps",
|
|
"MLIRMathToSPIRV",
|
|
"MLIRSCFToOpenMP",
|
|
"MLIRShapeDialect",
|
|
"MLIRGPUToROCDLTransforms",
|
|
"MLIRGPUToNVVMTransforms",
|
|
"MLIRTensorTransforms",
|
|
"MLIRSCFToGPU",
|
|
"MLIRDialectUtils",
|
|
"MLIRNVGPUToNVVM",
|
|
"MLIRTosaDialect",
|
|
"MLIRVectorToLLVM",
|
|
"MLIRSPIRVDialect",
|
|
"MLIRSideEffectInterfaces",
|
|
"MLIRVectorToROCDL",
|
|
"MLIRQuantDialect",
|
|
"MLIRSCFTransforms",
|
|
"MLIRMLProgramDialect",
|
|
"MLIRLinalgToSPIRV",
|
|
"MLIRDLTIDialect",
|
|
"MLIRLinalgFrontend",
|
|
"MLIRROCDLToLLVMIRTranslation",
|
|
"MLIRArmNeonDialect",
|
|
"MLIRSPIRVToLLVM",
|
|
"MLIRLLVMIRTransforms",
|
|
"MLIRTosaTransforms",
|
|
"MLIRLLVMCommonConversion",
|
|
"MLIRSCFTransformOps",
|
|
"MLIRArmNeonToLLVMIRTranslation",
|
|
"MLIRAMXTransforms",
|
|
"MLIRSPIRVTransforms",
|
|
"MLIRMemRefToLLVM",
|
|
"MLIRSPIRVBinaryUtils",
|
|
"MLIRLinalgAnalysis",
|
|
"MLIRArithmeticUtils",
|
|
"MLIRVectorInterfaces",
|
|
"MLIRGPUOps",
|
|
"MLIRComplexToLLVM",
|
|
"MLIRShapeOpsTransforms",
|
|
"MLIRX86VectorTransforms",
|
|
"MLIRArithmeticToLLVM",
|
|
];
|
|
|
|
const LLVM_STATIC_LIBS: [&str; 51] = [
|
|
"LLVMAggressiveInstCombine",
|
|
"LLVMAnalysis",
|
|
"LLVMAsmParser",
|
|
"LLVMAsmPrinter",
|
|
"LLVMBinaryFormat",
|
|
"LLVMBitReader",
|
|
"LLVMBitstreamReader",
|
|
"LLVMBitWriter",
|
|
"LLVMCFGuard",
|
|
"LLVMCodeGen",
|
|
"LLVMCore",
|
|
"LLVMCoroutines",
|
|
"LLVMDebugInfoCodeView",
|
|
"LLVMDebugInfoDWARF",
|
|
"LLVMDebugInfoMSF",
|
|
"LLVMDebugInfoPDB",
|
|
"LLVMDemangle",
|
|
"LLVMExecutionEngine",
|
|
"LLVMFrontendOpenMP",
|
|
"LLVMGlobalISel",
|
|
"LLVMInstCombine",
|
|
"LLVMInstrumentation",
|
|
"LLVMipo",
|
|
"LLVMIRReader",
|
|
"LLVMJITLink",
|
|
"LLVMLinker",
|
|
"LLVMMC",
|
|
"LLVMMCDisassembler",
|
|
"LLVMMCParser",
|
|
"LLVMObjCARCOpts",
|
|
"LLVMObject",
|
|
"LLVMOrcJIT",
|
|
"LLVMOrcShared",
|
|
"LLVMOrcTargetProcess",
|
|
"LLVMPasses",
|
|
"LLVMProfileData",
|
|
"LLVMRemarks",
|
|
"LLVMRuntimeDyld",
|
|
"LLVMScalarOpts",
|
|
"LLVMSelectionDAG",
|
|
"LLVMSupport",
|
|
"LLVMSymbolize",
|
|
"LLVMTableGen",
|
|
"LLVMTableGenGlobalISel",
|
|
"LLVMTarget",
|
|
"LLVMTextAPI",
|
|
"LLVMTransformUtils",
|
|
"LLVMVectorize",
|
|
"LLVMX86CodeGen",
|
|
"LLVMX86Desc",
|
|
"LLVMX86Info",
|
|
];
|
|
|
|
const CONCRETE_COMPILER_LIBS: [&str; 35] = [
|
|
"RTDialect",
|
|
"RTDialectTransforms",
|
|
"ConcretelangSupport",
|
|
"BConcreteToCAPI",
|
|
"ConcretelangConversion",
|
|
"ConcretelangTransforms",
|
|
"FHETensorOpsToLinalg",
|
|
"ConcretelangServerLib",
|
|
"ConcreteToBConcrete",
|
|
"CONCRETELANGCAPIFHE",
|
|
"TFHEGlobalParametrization",
|
|
"ConcretelangClientLib",
|
|
"ConcretelangBConcreteTransforms",
|
|
"ConcretelangSDFGInterfaces",
|
|
"ConcretelangSDFGTransforms",
|
|
"CONCRETELANGCAPISupport",
|
|
"FHELinalgDialect",
|
|
"ConcretelangInterfaces",
|
|
"TFHEDialect",
|
|
"CONCRETELANGCAPIFHELINALG",
|
|
"FHELinalgDialectTransforms",
|
|
"FHEDialect",
|
|
"TFHEToConcrete",
|
|
"FHEToTFHECrt",
|
|
"FHEToTFHEScalar",
|
|
"ConcreteDialectTransforms",
|
|
"BConcreteDialect",
|
|
"concrete_optimizer",
|
|
"LinalgExtras",
|
|
"FHEDialectAnalysis",
|
|
"ConcreteDialect",
|
|
"RTDialectAnalysis",
|
|
"SDFGDialect",
|
|
"ExtractSDFGOps",
|
|
"SDFGToStreamEmulator",
|
|
];
|
|
|
|
fn main() {
|
|
if let Err(error) = run() {
|
|
eprintln!("{}", error);
|
|
exit(1);
|
|
}
|
|
}
|
|
|
|
fn run() -> Result<(), Box<dyn Error>> {
|
|
let mut include_paths = Vec::new();
|
|
// if set, use installation path of concrete compiler to lookup libraries and include files
|
|
match env::var("CONCRETE_COMPILER_INSTALL_DIR") {
|
|
Ok(install_dir) => {
|
|
println!("cargo:rustc-link-search={}/lib/", install_dir);
|
|
include_paths.push(Path::new(&format!("{}/include/", install_dir)).to_path_buf());
|
|
}
|
|
Err(_e) => println!(
|
|
"cargo:warning=You are not setting CONCRETE_COMPILER_INSTALL_DIR, \
|
|
so your compiler/linker will have to lookup libs and include dirs on their own"
|
|
),
|
|
}
|
|
// linking
|
|
// concrete-compiler libs
|
|
for concrete_compiler_lib in CONCRETE_COMPILER_LIBS {
|
|
println!("cargo:rustc-link-lib=static={}", concrete_compiler_lib);
|
|
}
|
|
// concrete compiler runtime
|
|
println!("cargo:rustc-link-lib=ConcretelangRuntime");
|
|
// concrete optimizer
|
|
// `-bundle` serve to not have multiple definition issues
|
|
println!("cargo:rustc-link-lib=static:-bundle=concrete_optimizer_cpp");
|
|
// mlir libs
|
|
for mlir_static_lib in MLIR_STATIC_LIBS {
|
|
println!("cargo:rustc-link-lib=static={}", mlir_static_lib);
|
|
}
|
|
// llvm libs
|
|
for llvm_static_lib in LLVM_STATIC_LIBS {
|
|
println!("cargo:rustc-link-lib=static={}", llvm_static_lib);
|
|
}
|
|
// required by llvm
|
|
println!("cargo:rustc-link-lib=ncurses");
|
|
if let Some(name) = get_system_libcpp() {
|
|
println!("cargo:rustc-link-lib={}", name);
|
|
}
|
|
// zlib
|
|
println!("cargo:rustc-link-lib=z");
|
|
|
|
println!("cargo:rerun-if-changed=api.h");
|
|
bindgen::builder()
|
|
.header("api.h")
|
|
.clang_args(
|
|
include_paths
|
|
.into_iter()
|
|
.map(|path| format!("-I{}", path.to_str().unwrap())),
|
|
)
|
|
.parse_callbacks(Box::new(bindgen::CargoCallbacks))
|
|
.generate()
|
|
.unwrap()
|
|
.write_to_file(Path::new(&env::var("OUT_DIR")?).join("bindings.rs"))?;
|
|
|
|
Ok(())
|
|
}
|
|
|
|
fn get_system_libcpp() -> Option<&'static str> {
|
|
if cfg!(target_env = "msvc") {
|
|
None
|
|
} else if cfg!(target_os = "macos") {
|
|
Some("c++")
|
|
} else {
|
|
Some("stdc++")
|
|
}
|
|
}
|