fn main()

in Rust/rust/azure-sphere/azure-sphere-sys/build.rs [52:148]


fn main() {
    let arv = env::var("AZURE_SPHERE_ARV").unwrap();

    // Tell cargo to invalidate the built crate whenever the wrapper changes
    println!("cargo:rerun-if-changed=bindings");

    let sdk_path = PathBuf::from(std::env::var("AzureSphereDefaultSDKDir").unwrap());

    let library_path = Path::new("../azure-sphere-sys/bindings/applibs");
    let sysroot = sdk_path.join("Sysroots").join(&arv);

    let handles = [
        "applibs/adc.h",
        "applibs/application.h",
        "applibs/applications.h",
        "applibs/certstore.h",
        "applibs/eventloop.h",
        "applibs/gpio.h",
        "applibs/i2c.h",
        "applibs/log.h",
        "applibs/networking.h",
        // empty outside of an inline function, so not needed:  "applibs/networking_curl.h",
        "applibs/powermanagement.h",
        "applibs/pwm.h",
        "applibs/rtc.h",
        "applibs/spi.h",
        "applibs/storage.h",
        "applibs/sysevent.h",
        "applibs/uart.h",
        "applibs/wificonfig.h",
        "tlsutils/deviceauth.h",
        "tlsutils/deviceauth_curl.h",
    ]
    .iter()
    .map(|header| {
        let full_header = sysroot.join("usr/include/").join(header);
        std::thread::spawn(move || {
            generate_bindings(full_header);
        })
    })
    .collect::<Vec<_>>();
    handles.into_iter().for_each(|h| h.join().unwrap());
    generate_bindings("bindings/applibs/static_inline_helpers.h");

    // Tell Cargo that if the given file changes, to rerun this build script.
    println!("cargo:rerun-if-changed=../azure-sphere-sys/static_inline_helpers.c");
    // Use the `cc` crate to build a C file and statically link it.
    let compiler_path = sysroot.join("tools/sysroots/x86_64-pokysdk-linux/usr/bin/arm-poky-linux-musleabi/arm-poky-linux-musleabi-gcc");

    cc::Build::new()
        .file("../azure-sphere-sys/static_inline_helpers.c")
        .include(library_path)
        .compiler(compiler_path)
        .flag("--sysroot")
        .flag(sysroot.to_str().unwrap())
        .flag("-fno-strict-aliasing")
        .flag("-fno-exceptions")
        .flag("-fstack-protector-strong")
        .flag("-MD")
        .flag("-march=armv7ve")
        .flag("-mthumb")
        .flag("-mfpu=neon-vfpv4")
        .flag("-mfloat-abi=hard")
        .flag("-mcpu=cortex-a7")
        .target("arm-poky-linux-musleabi")
        .compile("static_inline_helpers");

    let out_path = PathBuf::from(env::var("OUT_DIR").unwrap());
    let patched_libs_path = out_path.join("patched_libs");
    let sysroot_path: PathBuf = [
        env::var("AzureSphereDefaultSDKDir").unwrap(),
        "Sysroots".to_string(),
        arv,
    ]
    .iter()
    .collect();

    let libapplibs = sysroot_path.join("usr/lib/libapplibs.so");
    println!("cargo:rerun-if-changed={:?}", libapplibs);
    fs::create_dir_all(&patched_libs_path).unwrap();
    let patched_libapplibs = patched_libs_path.join("libapplibs.so");
    patch_lib(libapplibs.as_path(), patched_libapplibs.as_path()).unwrap();

    let libc = sysroot_path.join("usr/lib/libc.so");
    println!("cargo:rerun-if-changed={:?}", libc);
    fs::create_dir_all(&patched_libs_path).unwrap();
    let patched_libc = patched_libs_path.join("libc.so");
    patch_lib(libc.as_path(), patched_libc.as_path()).unwrap();

    //println!("cargo:rustc-link-lib=dylib:c");
    //println!("cargo:rustc-link-lib=dylib:applibs");
    //println!("cargo:rustc-link-lib=dylib:tlsutils");
    println!(
        "cargo:rustc-link-search={}",
        patched_libs_path.as_path().to_str().unwrap()
    );
}