feat: Implement MSVC cross compilation
This commit is contained in:
parent
86757089b4
commit
089acdbc28
1 changed files with 37 additions and 86 deletions
123
build.rs
123
build.rs
|
@ -3,103 +3,54 @@ use fs_extra::dir::CopyOptions;
|
|||
use std::env;
|
||||
use std::process::{Command, Stdio};
|
||||
|
||||
const LIB_NAME: &str = "luajit";
|
||||
|
||||
fn main() {
|
||||
let luajit_dir = format!("{}/luajit", env!("CARGO_MANIFEST_DIR"));
|
||||
let out_dir = env::var("OUT_DIR").unwrap();
|
||||
let src_dir = format!("{}/luajit/src", out_dir);
|
||||
let lib_path = format!("{}/lib{}.a", &src_dir, LIB_NAME);
|
||||
|
||||
dbg!(&luajit_dir);
|
||||
dbg!(&out_dir);
|
||||
dbg!(&src_dir);
|
||||
dbg!(&lib_path);
|
||||
|
||||
// DEP_LUAJIT_INCLUDE
|
||||
// DEB_LUAJIT_LIB_NAME
|
||||
let mut copy_options = CopyOptions::new();
|
||||
copy_options.overwrite = true;
|
||||
|
||||
let lib_name = build_luajit(&luajit_dir, &out_dir, &src_dir);
|
||||
dir::copy(&luajit_dir, &out_dir, ©_options).expect("Failed to copy LuaJIT source");
|
||||
|
||||
println!("cargo:lib-name={}", lib_name);
|
||||
let mut buildcmd = Command::new("make");
|
||||
buildcmd.current_dir(&src_dir);
|
||||
buildcmd.stderr(Stdio::inherit());
|
||||
buildcmd.arg("BUILDMODE=static");
|
||||
|
||||
if env::var("CARGO_CFG_WINDOWS").is_ok() {
|
||||
buildcmd.arg("TARGET_SYS=Windows");
|
||||
buildcmd.arg("CROSS=x86_64-w64-mingw32-");
|
||||
}
|
||||
|
||||
if cfg!(target_pointer_width = "32") {
|
||||
buildcmd.env("HOST_CC", "gcc -m32");
|
||||
buildcmd.arg("-e");
|
||||
} else {
|
||||
buildcmd.env("HOST_CC", "gcc");
|
||||
}
|
||||
|
||||
let mut child = buildcmd.spawn().expect("failed to run make");
|
||||
|
||||
if !child
|
||||
.wait()
|
||||
.map(|status| status.success())
|
||||
.map_err(|_| false)
|
||||
.unwrap_or(false)
|
||||
{
|
||||
panic!("Failed to build luajit");
|
||||
}
|
||||
|
||||
println!("cargo:lib-name={}", LIB_NAME);
|
||||
println!("cargo:include={}", src_dir);
|
||||
println!("cargo:rustc-link-search=native={}", src_dir);
|
||||
println!("cargo:rustc-link-lib=static={}", lib_name);
|
||||
|
||||
// if cfg!(target_os = "macos") && cfg!(target_pointer_width = "64") {
|
||||
// // RUSTFLAGS='-C link-args=-pagezero_size 10000 -image_base 100000000'
|
||||
// }
|
||||
}
|
||||
|
||||
#[cfg(target_env = "msvc")]
|
||||
fn build_luajit(luajit_dir: &str, out_dir: &str, src_dir: &str) -> &'static str {
|
||||
const LIB_NAME: &'static str = "lua51";
|
||||
let lib_path = format!("{}/{}.lib", &src_dir, LIB_NAME);
|
||||
dbg!(&lib_path);
|
||||
if !std::fs::metadata(&lib_path).is_ok() {
|
||||
let target = env::var("TARGET").unwrap();
|
||||
let cl_exe: cc::Tool =
|
||||
cc::windows_registry::find_tool(&target, "cl.exe").expect("cl.exe not found");
|
||||
let msvcbuild_bat = format!("{}/msvcbuild.bat", &src_dir);
|
||||
dbg!(&msvcbuild_bat);
|
||||
|
||||
let mut copy_options = CopyOptions::new();
|
||||
copy_options.overwrite = true;
|
||||
dir::copy(&luajit_dir, &out_dir, ©_options)
|
||||
.expect("failed to copy luajit source to out dir");
|
||||
|
||||
let mut buildcmd = Command::new(msvcbuild_bat);
|
||||
for (name, value) in cl_exe.env() {
|
||||
eprintln!("{:?} = {:?}", name, value);
|
||||
buildcmd.env(name, value);
|
||||
}
|
||||
|
||||
buildcmd.env("Configuration", "Release");
|
||||
buildcmd.args(&["static"]);
|
||||
buildcmd.current_dir(&src_dir);
|
||||
buildcmd.stderr(Stdio::inherit());
|
||||
|
||||
let mut child = buildcmd.spawn().expect("failed to run msvcbuild.bat");
|
||||
|
||||
if !child
|
||||
.wait()
|
||||
.map(|status| status.success())
|
||||
.map_err(|_| false)
|
||||
.unwrap_or(false)
|
||||
{
|
||||
panic!("Failed to build luajit");
|
||||
}
|
||||
}
|
||||
|
||||
LIB_NAME
|
||||
}
|
||||
|
||||
#[cfg(not(target_env = "msvc"))]
|
||||
fn build_luajit(luajit_dir: &str, out_dir: &str, src_dir: &str) -> &'static str {
|
||||
const LIB_NAME: &'static str = "luajit";
|
||||
let lib_path = format!("{}/lib{}.a", &src_dir, LIB_NAME);
|
||||
dbg!(&lib_path);
|
||||
if !std::fs::metadata(&lib_path).is_ok() {
|
||||
let mut copy_options = CopyOptions::new();
|
||||
copy_options.overwrite = true;
|
||||
dir::copy(&luajit_dir, &out_dir, ©_options).unwrap();
|
||||
std::fs::copy(format!("etc/Makefile"), format!("{}/Makefile", &src_dir)).unwrap();
|
||||
|
||||
let mut buildcmd = Command::new("make");
|
||||
buildcmd.current_dir(&src_dir);
|
||||
buildcmd.stderr(Stdio::inherit());
|
||||
|
||||
if cfg!(target_pointer_width = "32") {
|
||||
buildcmd.env("HOST_CC", "gcc -m32");
|
||||
buildcmd.arg("-e");
|
||||
}
|
||||
|
||||
let mut child = buildcmd.spawn().expect("failed to run make");
|
||||
|
||||
if !child
|
||||
.wait()
|
||||
.map(|status| status.success())
|
||||
.map_err(|_| false)
|
||||
.unwrap_or(false)
|
||||
{
|
||||
panic!("Failed to build luajit");
|
||||
}
|
||||
}
|
||||
LIB_NAME
|
||||
println!("cargo:rustc-link-lib=static={}", LIB_NAME);
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue