64 LILA_INFO(Emitter::INTERPRETER,
"Initializing Clang interpreter");
66#ifdef MAYAFLUX_PLATFORM_WINDOWS
67 llvm::sys::DynamicLibrary::LoadLibraryPermanently(
"msvcp140.dll");
68 llvm::sys::DynamicLibrary::LoadLibraryPermanently(
"vcruntime140.dll");
69 llvm::sys::DynamicLibrary::LoadLibraryPermanently(
"ucrtbase.dll");
72 llvm::InitializeNativeTarget();
73 llvm::InitializeNativeTargetAsmPrinter();
74 llvm::InitializeNativeTargetAsmParser();
76 m_impl->compile_flags.clear();
77 m_impl->compile_flags.emplace_back(
"-std=c++23");
79#ifdef MAYAFLUX_PLATFORM_LINUX
80 m_impl->compile_flags.emplace_back(
"-mcmodel=large");
81 m_impl->compile_flags.emplace_back(
"-fPIC");
82 m_impl->compile_flags.emplace_back(
"-fPIE");
86 if (std::filesystem::exists(MayaFlux::Config::PCH_RUNTIME_PATH)) {
87 pch_dir = MayaFlux::Config::RUNTIME_DATA_DIR;
89 std::string(
"Using installed PCH from: ") + std::string(MayaFlux::Config::PCH_RUNTIME_PATH));
91 }
else if (std::filesystem::exists(MayaFlux::Config::PCH_SOURCE_PATH)) {
92 pch_dir = std::string(MayaFlux::Config::SOURCE_DIR) +
"/cmake";
94 std::string(
"Using source PCH from: ") + std::string(MayaFlux::Config::PCH_SOURCE_PATH));
97 m_last_error =
"Cannot find pch.h in runtime or source locations";
98 LILA_ERROR(Emitter::INTERPRETER, m_last_error);
102 m_impl->compile_flags.push_back(
"-I" + pch_dir);
105 if (!resource_dir.empty()) {
106 m_impl->compile_flags.push_back(
"-resource-dir=" + resource_dir);
108 std::string(
"Using clang resource dir: ") + resource_dir);
110 m_impl->compile_flags.emplace_back(
"-resource-dir=/usr/lib/clang/21");
112 "Using default clang resource dir: /usr/lib/clang/21");
116 for (
const auto& include : system_includes) {
117 m_impl->compile_flags.push_back(
"-isystem" + include);
120#ifndef MAYAFLUX_PLATFORM_WINDOWS
122 if (!eigen_include.empty()) {
123 m_impl->compile_flags.push_back(
"-isystem" + eigen_include);
125 std::string(
"Added Eigen include path: ") + eigen_include);
128 "Could not find Eigen include path - some features may not work");
132 if (!freetype_include.empty()) {
133 m_impl->compile_flags.push_back(
"-isystem" + freetype_include);
135 std::string(
"Added FreeType include path: ") + freetype_include);
138 "Could not find FreeType include path - some features may not work");
142 const std::string magic_enum_include = std::string(MayaFlux::Config::MAGIC_ENUM_INCLUDE);
143 if (!magic_enum_include.empty()) {
144 m_impl->compile_flags.push_back(
"-I" + magic_enum_include);
146 std::string(
"Added magic_enum include path: ") + magic_enum_include);
149 "Could not find magic_enum include path - some features may not work");
152#ifdef MAYAFLUX_PLATFORM_MACOS
155 std::string sdk_path = MayaFlux::Platform::SystemConfig::get_macos_sdk_path();
156 if (!sdk_path.empty()) {
157 m_impl->compile_flags.push_back(
"-isysroot" + sdk_path);
158 LILA_DEBUG(Emitter::INTERPRETER,
"Using macOS SDK: " + sdk_path);
161 "Could not find macOS SDK - JIT may fail to find system headers");
163 m_impl->compile_flags.emplace_back(
"-fexperimental-library");
166 for (
const auto& path : m_impl->include_paths) {
167 m_impl->compile_flags.push_back(
"-I" + path);
170#ifdef MAYAFLUX_PLATFORM_WINDOWS
171 m_impl->compile_flags.emplace_back(
"-fno-function-sections");
172 m_impl->compile_flags.emplace_back(
"-fno-data-sections");
173 m_impl->compile_flags.emplace_back(
"-fno-unique-section-names");
174 m_impl->compile_flags.emplace_back(
"-D_CRT_SECURE_NO_WARNINGS");
177 std::vector<const char*> args;
178 for (
const auto& flag : m_impl->compile_flags) {
179 args.push_back(flag.c_str());
182 clang::IncrementalCompilerBuilder ICB;
183 ICB.SetCompilerArgs(args);
185 auto CI = ICB.CreateCpp();
187 m_last_error =
"Failed to create CompilerInstance: " + llvm::toString(CI.takeError());
188 LILA_ERROR(Emitter::INTERPRETER, m_last_error);
192 auto interp = clang::Interpreter::create(std::move(*CI));
194 m_last_error =
"Failed to create interpreter: " + llvm::toString(interp.takeError());
195 LILA_ERROR(Emitter::INTERPRETER, m_last_error);
199 m_impl->interpreter = std::move(*interp);
201 LILA_INFO(Emitter::INTERPRETER,
"Clang interpreter created successfully");
203 if (skip_host_library_load) {
205 "Skipping MayaFluxLib load: host process already resident");
208 "MayaFluxLib", std::string(MayaFlux::Config::INSTALL_PREFIX));
210 LILA_DEBUG(Emitter::INTERPRETER,
"Loading MayaFlux library: " + lib_to_load);
212 if (
auto err = m_impl->interpreter->LoadDynamicLibrary(lib_to_load.c_str())) {
213 m_last_error =
"Failed to load " + lib_to_load +
": "
214 + llvm::toString(std::move(err));
215 LILA_ERROR(Emitter::INTERPRETER, m_last_error);
219 LILA_DEBUG(Emitter::INTERPRETER,
"Loaded " + lib_to_load);
222 const char* header_include =
"#include \"pch.h\"\n"
223 "#include \"MayaFlux/MayaFlux.hpp\"\n";
225 auto result = m_impl->interpreter->ParseAndExecute(header_include);
228 std::string warning =
"Failed to load MayaFlux headers: " + llvm::toString(std::move(result));
229 LILA_WARN(Emitter::INTERPRETER, warning);
231 LILA_INFO(Emitter::INTERPRETER,
"MayaFlux headers loaded successfully");
234 result = m_impl->interpreter->ParseAndExecute(
"std::cout << \"Ready for Live\" << std::flush;");