winres icon indicating copy to clipboard operation
winres copied to clipboard

State of Linux->Windows cross compilation

Open piegamesde opened this issue 3 years ago • 2 comments

Hi, what's the current state of cross compilation from Windows? The README says:

Note that using this crate on non windows platform is undefined behavior. It does not contain safeguards against doing so.

What actions would be necessary to get this to work on Linux? If this is not easily possible, can at least some safeguards please be added?

piegamesde avatar Jun 17 '22 20:06 piegamesde

My build.rs looks something like this:

fn main() {
    output_dir();
    gen();
    match std::env::var("CARGO_CFG_TARGET_OS").unwrap().as_str() {
        "linux" | "macos" => { /* Nothing to do here */ }
        // If building *FOR* Windows
        "windows" => {
            generate_manifest();
            generate_rc();
            let mut rc = winres::WindowsResource::new();
            rc.set_manifest_file(&(String::from(env!("CARGO_MANIFEST_DIR")) + "/" + MANIFEST_OUT));
            rc.set_resource_file(&(String::from(env!("CARGO_MANIFEST_DIR")) + "/" + RC_OUT));

            #[cfg(not(target_os = "windows"))]
            {
                rc.set_ar_path("x86_64-w64-mingw32-gcc-ar");
                rc.set_windres_path("x86_64-w64-mingw32-windres");
            }

            rc.compile().unwrap()
        }
        _ => panic!("Target not supported"),
    }
}

It works fine on Linux. If you're using Rust 1.61 or greater, you'll have to use this fork.

olback avatar Oct 21 '22 08:10 olback

Cross-compilation should now work out of the box in v0.1.13 of my fork. I updated the README as well, it had some buggy instructions (target_os is the host OS when you compile build.rs).

BenjaminRi avatar Nov 20 '22 19:11 BenjaminRi