mxre / winres

Create and set windows icons and metadata for executables with a rust build script
MIT License
297 stars 42 forks source link

State of Linux->Windows cross compilation #42

Open piegamesde opened 2 years ago

piegamesde commented 2 years ago

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?

olback commented 2 years ago

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.

BenjaminRi commented 1 year ago

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).