use std::env;
use std::path::PathBuf;
fn main() {
let luau_dir = PathBuf::from("luau");
println!("cargo:rerun-if-changed=build.rs");
println!("cargo:rerun-if-changed=src/shim.cpp");
let luau_modules = [
(
"Common",
&["BytecodeWire.cpp", "StringUtils.cpp", "TimeTrace.cpp"][..],
),
(
"Ast",
&[
"Allocator.cpp",
"Ast.cpp",
"Confusables.cpp",
"Cst.cpp",
"Lexer.cpp",
"Location.cpp",
"Parser.cpp",
"PrettyPrinter.cpp",
],
),
("Bytecode", &["BytecodeBuilder.cpp", "BytecodeGraph.cpp"]),
(
"Compiler",
&[
"Compiler.cpp",
"Builtins.cpp",
"BuiltinFolding.cpp",
"ConstantFolding.cpp",
"CostModel.cpp",
"TableShape.cpp",
"Types.cpp",
"ValueTracking.cpp",
"lcode.cpp",
],
),
(
"Config",
&["Config.cpp", "LinterConfig.cpp", "LuauConfig.cpp"],
),
(
"Analysis",
&[
"Anyification.cpp",
"ApplyTypeFunction.cpp",
"AstJsonEncoder.cpp",
"AstQuery.cpp",
"AstUtils.cpp",
"Autocomplete.cpp",
"AutocompleteCore.cpp",
"BuiltinDefinitions.cpp",
"BuiltinTypeFunctions.cpp",
"Clone.cpp",
"Constraint.cpp",
"ConstraintGenerator.cpp",
"ConstraintSolver.cpp",
"DataFlowGraph.cpp",
"DcrLogger.cpp",
"Def.cpp",
"EmbeddedBuiltinDefinitions.cpp",
"Error.cpp",
"ExpectedTypeVisitor.cpp",
"FileResolver.cpp",
"FragmentAutocomplete.cpp",
"Frontend.cpp",
"Generalization.cpp",
"NativeStackGuard.cpp",
"GlobalTypes.cpp",
"Instantiation.cpp",
"Instantiation2.cpp",
"IostreamHelpers.cpp",
"IterativeTypeVisitor.cpp",
"IterativeTypeFunctionTypeVisitor.cpp",
"JsonEmitter.cpp",
"Linter.cpp",
"LValue.cpp",
"Module.cpp",
"NonStrictTypeChecker.cpp",
"Normalize.cpp",
"OverloadResolver.cpp",
"Quantify.cpp",
"RecursionCounter.cpp",
"Refinement.cpp",
"RequireTracer.cpp",
"Scope.cpp",
"Simplify.cpp",
"StructuralTypeEquality.cpp",
"Substitution.cpp",
"Subtyping.cpp",
"SubtypingUnifier.cpp",
"Symbol.cpp",
"TableLiteralInference.cpp",
"ToDot.cpp",
"TopoSortStatements.cpp",
"ToString.cpp",
"TxnLog.cpp",
"Type.cpp",
"TypeArena.cpp",
"TypeAttach.cpp",
"TypeChecker2.cpp",
"TypedAllocator.cpp",
"TypeFunction.cpp",
"TypeFunctionError.cpp",
"TypeFunctionReductionGuesser.cpp",
"TypeFunctionRuntime.cpp",
"TypeFunctionRuntimeBuilder.cpp",
"TypeIds.cpp",
"TypeInfer.cpp",
"TypeOrPack.cpp",
"TypePack.cpp",
"TypePath.cpp",
"TypeUtils.cpp",
"Unifiable.cpp",
"Unifier.cpp",
"Unifier2.cpp",
"UserDefinedTypeFunction.cpp",
],
),
(
"VM",
&[
"lapi.cpp",
"laux.cpp",
"lbaselib.cpp",
"lbitlib.cpp",
"lbuffer.cpp",
"lbuflib.cpp",
"lbuiltins.cpp",
"lcorolib.cpp",
"ldblib.cpp",
"ldebug.cpp",
"ldo.cpp",
"lfunc.cpp",
"lgc.cpp",
"lgcdebug.cpp",
"linit.cpp",
"lmathlib.cpp",
"lmem.cpp",
"lnumprint.cpp",
"lobject.cpp",
"loslib.cpp",
"lperf.cpp",
"lstate.cpp",
"lstring.cpp",
"lstrlib.cpp",
"ltable.cpp",
"ltablib.cpp",
"ltm.cpp",
"ludata.cpp",
"lutf8lib.cpp",
"lveclib.cpp",
"lintlib.cpp",
"lvmexecute.cpp",
"lvmload.cpp",
"lvmutils.cpp",
],
),
];
let mut build = cc::Build::new();
build.cpp(true);
build
.flag_if_supported("-std=c++17")
.flag_if_supported("/std:c++17")
.flag_if_supported("/MP");
let target = env::var("TARGET").unwrap_or_default();
if target.contains("windows") {
build.define("_CRT_SECURE_NO_WARNINGS", None);
build.define("_HAS_EXCEPTIONS", "1");
build.flag_if_supported("/EHsc");
} else {
build.flag_if_supported("-fexceptions");
}
for (module_name, files) in &luau_modules {
build.include(luau_dir.join(module_name).join("include"));
for file in *files {
let path_arquivo = luau_dir.join(module_name).join("src").join(file);
println!("cargo:rerun-if-changed={}", path_arquivo.display());
build.file(path_arquivo);
}
}
build.file("src/shim.cpp");
build.compile("luau_analysis");
}