Miscellaneous changes #266

Merged
lucas merged 49 commits from feat/misc into master 2025-07-02 16:25:44 +02:00
2 changed files with 80 additions and 64 deletions
Showing only changes of commit 18c5d88e65 - Show all commits

View file

@ -7,6 +7,7 @@ edition = "2018"
keywords = ["lua", "luajit", "script"] keywords = ["lua", "luajit", "script"]
license = "MIT OR Apache-2.0" license = "MIT OR Apache-2.0"
repository = "https://github.com/aloucks/luajit2-sys" repository = "https://github.com/aloucks/luajit2-sys"
links = "luajit"
[dependencies] [dependencies]
libc = "0.2" libc = "0.2"

143
build.rs
View file

@ -1,12 +1,9 @@
use cc;
use fs_extra::dir; use fs_extra::dir;
use fs_extra::dir::CopyOptions; use fs_extra::dir::CopyOptions;
use std::env;
use std::process::{Command, Stdio}; use std::process::{Command, Stdio};
use std::{env, fs};
fn main() { fn main() {
let target = env::var("TARGET").unwrap();
let luajit_dir = format!("{}/luajit", env!("CARGO_MANIFEST_DIR")); let luajit_dir = format!("{}/luajit", env!("CARGO_MANIFEST_DIR"));
let out_dir = env::var("OUT_DIR").unwrap(); let out_dir = env::var("OUT_DIR").unwrap();
let src_dir = format!("{}/luajit/src", out_dir); let src_dir = format!("{}/luajit/src", out_dir);
@ -15,76 +12,94 @@ fn main() {
dbg!(&out_dir); dbg!(&out_dir);
dbg!(&src_dir); dbg!(&src_dir);
if cfg!(target_env = "msvc") { // DEP_LUAJIT_INCLUDE
let lib_path = format!("{}/lua51.lib", &src_dir); // DEB_LUAJIT_LIB_NAME
dbg!(&lib_path);
if !std::fs::metadata(&lib_path).is_ok() {
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 lib_name = build_luajit(&luajit_dir, &out_dir, &src_dir);
let mut copy_options = CopyOptions::new(); println!("cargo:lib-name={}", lib_name);
copy_options.overwrite = true; println!("cargo:include={}", src_dir);
dir::copy(&luajit_dir, &out_dir, &copy_options).unwrap(); println!("cargo:rustc-link-search=native={}", src_dir);
println!("cargo:rustc-link-lib=static={}", lib_name);
let mut buildcmd = Command::new(msvcbuild_bat); // if cfg!(target_os = "macos") && cfg!(target_pointer_width = "64") {
for (name, value) in cl_exe.env() { // // RUSTFLAGS='-C link-args=-pagezero_size 10000 -image_base 100000000'
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"); #[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);
if !child let mut copy_options = CopyOptions::new();
.wait() copy_options.overwrite = true;
.map(|status| status.success()) dir::copy(&luajit_dir, &out_dir, &copy_options)
.map_err(|_| false) .expect("failed to copy luajit source to out dir");
.unwrap_or(false)
{ let mut buildcmd = Command::new(msvcbuild_bat);
panic!("Failed to build luajit"); for (name, value) in cl_exe.env() {
} eprintln!("{:?} = {:?}", name, value);
buildcmd.env(name, value);
} }
println!("cargo:rustc-link-search=native={}", src_dir);
println!("cargo:rustc-link-lib=static=lua51");
} else {
let lib_path = format!("{}/libluajit.a", &src_dir);
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, &copy_options).unwrap();
fs::copy(format!("etc/Makefile"), format!("{}/Makefile", &src_dir)).unwrap();
let mut buildcmd = Command::new("make"); buildcmd.env("Configuration", "Release");
buildcmd.current_dir(&src_dir); buildcmd.args(&["static"]);
buildcmd.stderr(Stdio::inherit()); buildcmd.current_dir(&src_dir);
buildcmd.stderr(Stdio::inherit());
if cfg!(target_pointer_width = "32") { let mut child = buildcmd.spawn().expect("failed to run msvcbuild.bat");
buildcmd.env("HOST_CC", "gcc -m32");
buildcmd.arg("-e");
}
let mut child = buildcmd.spawn().expect("failed to run make"); if !child
.wait()
if !child .map(|status| status.success())
.wait() .map_err(|_| false)
.map(|status| status.success()) .unwrap_or(false)
.map_err(|_| false) {
.unwrap_or(false) panic!("Failed to build luajit");
{
panic!("Failed to build luajit");
}
} }
println!("cargo:rustc-link-search=native={}", src_dir);
println!("cargo:rustc-link-lib=static=luajit");
} }
// if cfg!(target_os = "macos") && cfg!(target_pointer_width = "64") { LIB_NAME
// // RUSTFLAGS='-C link-args=-pagezero_size 10000 -image_base 100000000' }
// }
#[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, &copy_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
} }