diff --git a/build.rs b/build.rs index 08e2bbe..28fe052 100644 --- a/build.rs +++ b/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); }