lua-rs 0.0.6

Lua port written in Rust.
Documentation
// Copyright (C) 2018 Ahmed Charles - acharles@outlook.com
// Distributed under the MIT License.
//    (See accompanying file LICENSE.txt or copy at
//          http://opensource.org/licenses/MIT)

extern crate cc;

use cc::Build;

use std::process::Command;

#[cfg(target_os = "macos")]
fn os_cmd(cmd: &mut Command) -> &mut Command { cmd.arg("-lreadline") }
#[cfg(target_os = "macos")]
fn os_build(build: &mut Build) -> &mut Build { build.define("LUA_USE_MACOSX", None) }

#[cfg(target_os = "linux")]
fn os_cmd(cmd: &mut Command) -> &mut Command { cmd.arg("-ldl").arg("-lreadline") }
#[cfg(target_os = "linux")]
fn os_build(build: &mut Build) -> &mut Build { build.define("LUA_USE_LINUX", None) }

#[cfg(not(any(target_os = "macos", target_os = "linux")))]
fn os_cmd(cmd: &mut Command) -> &mut Command { cmd }
#[cfg(not(any(target_os = "macos", target_os = "linux")))]
fn os_build(build: &mut Build) -> &mut Build { build }

fn main() {
    let out_dir_s = std::env::var_os("OUT_DIR").unwrap();
    let out_dir = std::path::Path::new(&out_dir_s);
    let debug = std::env::var("PROFILE").unwrap() == "debug";

    let mut build = Build::new();
    build.include("puc-lua/src");
    os_build(&mut build);
    if debug {
        build.define("LUA_USER_H", Some("\"tests/ltests/ltests.h\""));
    }
    let cc = build.get_compiler();
    let mut lua_c = cc.to_command();
    let mut luac_c = cc.to_command();

    if debug {
        build.file("puc-lua/src/tests/ltests/ltests.c");
    }
    build.file("puc-lua/src/lapi.c");
    build.file("puc-lua/src/lcode.c");
    build.file("puc-lua/src/lctype.c");
    build.file("puc-lua/src/ldebug.c");
    build.file("puc-lua/src/ldo.c");
    build.file("puc-lua/src/ldump.c");
    build.file("puc-lua/src/lfunc.c");
    build.file("puc-lua/src/lgc.c");
    build.file("puc-lua/src/llex.c");
    build.file("puc-lua/src/lmem.c");
    build.file("puc-lua/src/lobject.c");
    build.file("puc-lua/src/lopcodes.c");
    build.file("puc-lua/src/lparser.c");
    build.file("puc-lua/src/lstate.c");
    build.file("puc-lua/src/lstring.c");
    build.file("puc-lua/src/ltable.c");
    build.file("puc-lua/src/ltm.c");
    build.file("puc-lua/src/lundump.c");
    build.file("puc-lua/src/lvm.c");
    build.file("puc-lua/src/lzio.c");
    build.file("puc-lua/src/lauxlib.c");
    build.file("puc-lua/src/lbaselib.c");
    build.file("puc-lua/src/lcorolib.c");
    build.file("puc-lua/src/ldblib.c");
    build.file("puc-lua/src/liolib.c");
    build.file("puc-lua/src/lmathlib.c");
    build.file("puc-lua/src/loslib.c");
    build.file("puc-lua/src/lstrlib.c");
    build.file("puc-lua/src/ltablib.c");
    build.file("puc-lua/src/lutf8lib.c");
    build.file("puc-lua/src/loadlib.c");
    build.file("puc-lua/src/linit.c");
    build.compile("lua");

    lua_c.arg("puc-lua/src/lua.c");
    luac_c.arg("puc-lua/src/luac.c");
    if cc.is_like_gnu() || cc.is_like_clang() {
        os_cmd(lua_c.arg(out_dir.join("liblua.a")).arg("-o").arg(out_dir.join("lua")).arg("-lm"));
        os_cmd(luac_c.arg(out_dir.join("liblua.a")).arg("-o").arg(out_dir.join("luac")).arg("-lm"));
    }
    assert!(lua_c.status().unwrap().success());
    assert!(luac_c.status().unwrap().success());

    for entry in std::fs::read_dir("puc-lua/src").unwrap() {
        println!("cargo:rerun-if-changed={}", entry.unwrap().path().display());
    }
}