478 lines
		
	
	
		
			18 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
		
		
			
		
	
	
			478 lines
		
	
	
		
			18 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| 
								 | 
							
								// Tencent is pleased to support the open source community by making UnLua available.
							 | 
						||
| 
								 | 
							
								// 
							 | 
						||
| 
								 | 
							
								// Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved.
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								// Licensed under the MIT License (the "License"); 
							 | 
						||
| 
								 | 
							
								// you may not use this file except in compliance with the License. You may obtain a copy of the License at
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								// http://opensource.org/licenses/MIT
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								// Unless required by applicable law or agreed to in writing, 
							 | 
						||
| 
								 | 
							
								// software distributed under the License is distributed on an "AS IS" BASIS, 
							 | 
						||
| 
								 | 
							
								// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
							 | 
						||
| 
								 | 
							
								// See the License for the specific language governing permissions and limitations under the License.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								using System;
							 | 
						||
| 
								 | 
							
								using System.Collections.Generic;
							 | 
						||
| 
								 | 
							
								using System.Diagnostics;
							 | 
						||
| 
								 | 
							
								using System.IO;
							 | 
						||
| 
								 | 
							
								using System.Linq;
							 | 
						||
| 
								 | 
							
								using System.Reflection;
							 | 
						||
| 
								 | 
							
								using System.Runtime.InteropServices;
							 | 
						||
| 
								 | 
							
								#if UE_5_0_OR_LATER
							 | 
						||
| 
								 | 
							
								using EpicGames.Core;
							 | 
						||
| 
								 | 
							
								#else
							 | 
						||
| 
								 | 
							
								using Tools.DotNETCommon;
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								using UnrealBuildTool;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								public class Lua : ModuleRules
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    public Lua(ReadOnlyTargetRules Target) : base(Target)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        Type = ModuleType.External;
							 | 
						||
| 
								 | 
							
								        bEnableUndefinedIdentifierWarnings = false;
							 | 
						||
| 
								 | 
							
								        ShadowVariableWarningLevel = WarningLevel.Off;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        m_LuaVersion = GetLuaVersion();
							 | 
						||
| 
								 | 
							
								        m_Config = GetConfigName();
							 | 
						||
| 
								 | 
							
								        m_LibName = GetLibraryName();
							 | 
						||
| 
								 | 
							
								        m_BuildSystem = GetBuildSystem();
							 | 
						||
| 
								 | 
							
								        m_CompileAsCpp = ShouldCompileAsCpp();
							 | 
						||
| 
								 | 
							
								        m_LibDirName = string.Format("lib-{0}", m_CompileAsCpp ? "cpp" : "c");
							 | 
						||
| 
								 | 
							
								        m_LuaDirName = m_LuaVersion;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        PublicIncludePaths.Add(Path.Combine(ModuleDirectory, m_LuaDirName, "src"));
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        var buildMethodName = "BuildFor" + Target.Platform;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        var buildMethod = GetType().GetMethod(buildMethodName, BindingFlags.Instance | BindingFlags.NonPublic);
							 | 
						||
| 
								 | 
							
								        if (buildMethod == null)
							 | 
						||
| 
								 | 
							
								            throw new NotSupportedException(buildMethodName);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        buildMethod.Invoke(this, Array.Empty<object>());
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    #region Build for Platforms
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    private void BuildForWin64()
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        var dllPath = GetLibraryPath();
							 | 
						||
| 
								 | 
							
								        var libPath = Path.ChangeExtension(dllPath, ".lib");
							 | 
						||
| 
								 | 
							
								        var pdbPath = Path.ChangeExtension(dllPath, ".pdb");
							 | 
						||
| 
								 | 
							
								        var dirPath = Path.GetDirectoryName(dllPath);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        var isDebug = m_Config == "Debug";
							 | 
						||
| 
								 | 
							
								        var dstFiles = new List<string> { dllPath, libPath };
							 | 
						||
| 
								 | 
							
								        if (isDebug)
							 | 
						||
| 
								 | 
							
								            dstFiles.Add(pdbPath);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        if (!dstFiles.All(File.Exists))
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            var buildDir = CMake();
							 | 
						||
| 
								 | 
							
								            CopyDirectory(Path.Combine(buildDir, m_Config), dirPath);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        PublicDefinitions.Add("LUA_BUILD_AS_DLL");
							 | 
						||
| 
								 | 
							
								        PublicDelayLoadDLLs.Add(m_LibName);
							 | 
						||
| 
								 | 
							
								        PublicAdditionalLibraries.Add(libPath);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        SetupForRuntimeDependency(dllPath, "Win64");
							 | 
						||
| 
								 | 
							
								        if (isDebug)
							 | 
						||
| 
								 | 
							
								            SetupForRuntimeDependency(pdbPath, "Win64");
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    private void BuildForAndroid()
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        var ndkRoot = Environment.GetEnvironmentVariable("NDKROOT");
							 | 
						||
| 
								 | 
							
								        if (ndkRoot == null)
							 | 
						||
| 
								 | 
							
								            throw new BuildException("can't find NDKROOT");
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        var toolchain = GetAndroidToolChain();
							 | 
						||
| 
								 | 
							
								        var ndkApiLevel = toolchain.GetNdkApiLevelInt(21);
							 | 
						||
| 
								 | 
							
								        Console.WriteLine("toolchain.GetNdkApiLevelInt=", ndkApiLevel);
							 | 
						||
| 
								 | 
							
								        var abiNames = new[] { "armeabi-v7a", "arm64-v8a", "x86_64" };
							 | 
						||
| 
								 | 
							
								        foreach (var abiName in abiNames)
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            var libFile = GetLibraryPath(abiName);
							 | 
						||
| 
								 | 
							
								            PublicAdditionalLibraries.Add(libFile);
							 | 
						||
| 
								 | 
							
								            if (File.Exists(libFile))
							 | 
						||
| 
								 | 
							
								                continue;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            EnsureDirectoryExists(libFile);
							 | 
						||
| 
								 | 
							
								            var args = new Dictionary<string, string>
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								                { "CMAKE_TOOLCHAIN_FILE", Path.Combine(ndkRoot, "build/cmake/android.toolchain.cmake") },
							 | 
						||
| 
								 | 
							
								                { "ANDROID_ABI", abiName },
							 | 
						||
| 
								 | 
							
								                { "ANDROID_PLATFORM", "android-" + ndkApiLevel }
							 | 
						||
| 
								 | 
							
								            };
							 | 
						||
| 
								 | 
							
								            var buildDir = CMake(args);
							 | 
						||
| 
								 | 
							
								            var buildFile = Path.Combine(buildDir, m_LibName);
							 | 
						||
| 
								 | 
							
								            File.Copy(buildFile, libFile, true);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    private IAndroidToolChain GetAndroidToolChain()
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								#if UE_5_2_OR_LATER
							 | 
						||
| 
								 | 
							
								        var ueBuildPlatformType = Assembly.GetAssembly(typeof(IAndroidToolChain)).GetType("UnrealBuildTool.UEBuildPlatform");
							 | 
						||
| 
								 | 
							
								        var getBuildPlatformMethod = ueBuildPlatformType.GetMethod("GetBuildPlatform", BindingFlags.Static | BindingFlags.Public);
							 | 
						||
| 
								 | 
							
								        var androidBuildPlatform = getBuildPlatformMethod.Invoke(null, new object[] { UnrealTargetPlatform.Android });
							 | 
						||
| 
								 | 
							
								        var createTempToolChainForProjectMethod = androidBuildPlatform.GetType().GetMethod("CreateTempToolChainForProject");
							 | 
						||
| 
								 | 
							
								        var toolchain = (IAndroidToolChain)createTempToolChainForProjectMethod.Invoke(androidBuildPlatform, new object[] { Target.ProjectFile });
							 | 
						||
| 
								 | 
							
								#else
							 | 
						||
| 
								 | 
							
								        var toolchain = AndroidExports.CreateToolChain(Target.ProjectFile);
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								        return toolchain;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    private void BuildForLinux()
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        var libFile = GetLibraryPath();
							 | 
						||
| 
								 | 
							
								        PublicAdditionalLibraries.Add(libFile);
							 | 
						||
| 
								 | 
							
								        if (File.Exists(libFile))
							 | 
						||
| 
								 | 
							
								            return;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        var env = Environment.GetEnvironmentVariable("LINUX_MULTIARCH_ROOT");
							 | 
						||
| 
								 | 
							
								        if (string.IsNullOrEmpty(env))
							 | 
						||
| 
								 | 
							
								            throw new BuildException("LINUX_MULTIARCH_ROOT environment variable needed.");
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        EnsureDirectoryExists(libFile);
							 | 
						||
| 
								 | 
							
								        var sysName = "x86_64-unknown-linux-gnu";
							 | 
						||
| 
								 | 
							
								        var sysRoot = Path.Combine(env, sysName);
							 | 
						||
| 
								 | 
							
								        var clangPath = Path.Combine(env, sysName, @"bin\clang.exe");
							 | 
						||
| 
								 | 
							
								        var clangPlusPlusPath = Path.Combine(env, sysName, @"bin\clang++.exe");
							 | 
						||
| 
								 | 
							
								        var args = new Dictionary<string, string>
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            { "CMAKE_SYSROOT", sysRoot },
							 | 
						||
| 
								 | 
							
								            { "CMAKE_SYSTEM_NAME", "Linux" },
							 | 
						||
| 
								 | 
							
								            { "CMAKE_C_COMPILER_TARGET", sysName },
							 | 
						||
| 
								 | 
							
								            { "CMAKE_C_COMPILER:PATH", clangPath },
							 | 
						||
| 
								 | 
							
								            { "CMAKE_CXX_COMPILER:PATH", clangPlusPlusPath },
							 | 
						||
| 
								 | 
							
								            { "CMAKE_CXX_COMPILER_TARGET", sysName },
							 | 
						||
| 
								 | 
							
								        };
							 | 
						||
| 
								 | 
							
								        var buildDir = CMake(args);
							 | 
						||
| 
								 | 
							
								        var buildFile = Path.Combine(buildDir, m_LibName);
							 | 
						||
| 
								 | 
							
								        File.Copy(buildFile, libFile, true);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    private void BuildForLinuxAArch64()
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        var libFile = GetLibraryPath();
							 | 
						||
| 
								 | 
							
								        PublicAdditionalLibraries.Add(libFile);
							 | 
						||
| 
								 | 
							
								        if (File.Exists(libFile))
							 | 
						||
| 
								 | 
							
								            return;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        var env = Environment.GetEnvironmentVariable("LINUX_MULTIARCH_ROOT");
							 | 
						||
| 
								 | 
							
								        if (string.IsNullOrEmpty(env))
							 | 
						||
| 
								 | 
							
								            throw new BuildException("LINUX_MULTIARCH_ROOT environment variable needed.");
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        EnsureDirectoryExists(libFile);
							 | 
						||
| 
								 | 
							
								        var sysName = "aarch64-unknown-linux-gnueabi";
							 | 
						||
| 
								 | 
							
								        var sysRoot = Path.Combine(env, sysName);
							 | 
						||
| 
								 | 
							
								        var clangPath = Path.Combine(env, sysName, @"bin\clang.exe");
							 | 
						||
| 
								 | 
							
								        var clangPlusPlusPath = Path.Combine(env, sysName, @"bin\clang++.exe");
							 | 
						||
| 
								 | 
							
								        var args = new Dictionary<string, string>
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            { "CMAKE_SYSROOT", sysRoot },
							 | 
						||
| 
								 | 
							
								            { "CMAKE_SYSTEM_NAME", "Linux" },
							 | 
						||
| 
								 | 
							
								            { "CMAKE_C_COMPILER_TARGET", sysName },
							 | 
						||
| 
								 | 
							
								            { "CMAKE_C_COMPILER:PATH", clangPath },
							 | 
						||
| 
								 | 
							
								            { "CMAKE_CXX_COMPILER:PATH", clangPlusPlusPath },
							 | 
						||
| 
								 | 
							
								            { "CMAKE_CXX_COMPILER_TARGET", sysName },
							 | 
						||
| 
								 | 
							
								        };
							 | 
						||
| 
								 | 
							
								        var buildDir = CMake(args);
							 | 
						||
| 
								 | 
							
								        var buildFile = Path.Combine(buildDir, m_LibName);
							 | 
						||
| 
								 | 
							
								        File.Copy(buildFile, libFile, true);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    private void BuildForMac()
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								#if UE_5_2_OR_LATER
							 | 
						||
| 
								 | 
							
								        var abiName = Target.Architecture.ToString();
							 | 
						||
| 
								 | 
							
								#else
							 | 
						||
| 
								 | 
							
								        var abiName = Target.Architecture;
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								        var libFile = GetLibraryPath(abiName);
							 | 
						||
| 
								 | 
							
								        if (!File.Exists(libFile))
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            EnsureDirectoryExists(libFile);
							 | 
						||
| 
								 | 
							
								            var args = new Dictionary<string, string>
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								                { "CMAKE_OSX_ARCHITECTURES", abiName }
							 | 
						||
| 
								 | 
							
								            };
							 | 
						||
| 
								 | 
							
								            var buildDir = CMake(args);
							 | 
						||
| 
								 | 
							
								            var buildFile = Path.Combine(buildDir, m_LibName);
							 | 
						||
| 
								 | 
							
								            File.Copy(buildFile, libFile, true);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        PublicDefinitions.Add("LUA_USE_MACOSX");
							 | 
						||
| 
								 | 
							
								        PublicAdditionalLibraries.Add(libFile);
							 | 
						||
| 
								 | 
							
								        RuntimeDependencies.Add(libFile);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    private void BuildForIOS()
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        var libFile = GetLibraryPath("arm64");
							 | 
						||
| 
								 | 
							
								        if (!File.Exists(libFile))
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            var args = new Dictionary<string, string>
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								                { "CMAKE_TOOLCHAIN_FILE", Path.Combine(ModuleDirectory, "toolchain/ios.toolchain.cmake") },
							 | 
						||
| 
								 | 
							
								                { "PLATFORM", "OS64" }
							 | 
						||
| 
								 | 
							
								            };
							 | 
						||
| 
								 | 
							
								            var buildDir = CMake(args);
							 | 
						||
| 
								 | 
							
								            var buildFile = Path.Combine(buildDir, m_Config + "-iphoneos", m_LibName);
							 | 
						||
| 
								 | 
							
								            EnsureDirectoryExists(libFile);
							 | 
						||
| 
								 | 
							
								            File.Copy(buildFile, libFile, true);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        PublicAdditionalLibraries.Add(libFile);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    private void BuildForPS5()
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        var libFile = GetLibraryPath();
							 | 
						||
| 
								 | 
							
								        PublicAdditionalLibraries.Add(libFile);
							 | 
						||
| 
								 | 
							
								        PublicIncludePaths.Add(Path.Combine(ModuleDirectory, m_LuaDirName, "src-ps5"));
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        if (File.Exists(libFile))
							 | 
						||
| 
								 | 
							
								            return;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        var sceRootDir = Environment.GetEnvironmentVariable("SCE_ROOT_DIR");
							 | 
						||
| 
								 | 
							
								        if (string.IsNullOrEmpty(sceRootDir))
							 | 
						||
| 
								 | 
							
								            throw new BuildException("SCE_ROOT_DIR environment variable needed.");
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        var sceSdkDir = Environment.GetEnvironmentVariable("SCE_PROSPERO_SDK_DIR");
							 | 
						||
| 
								 | 
							
								        if (string.IsNullOrEmpty(sceSdkDir))
							 | 
						||
| 
								 | 
							
								            throw new BuildException("SCE_PROSPERO_SDK_DIR environment variable needed.");
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        EnsureDirectoryExists(libFile);
							 | 
						||
| 
								 | 
							
								        var sysRoot = Path.Combine(sceSdkDir, @"target");
							 | 
						||
| 
								 | 
							
								        var clangPath = Path.Combine(sceSdkDir, @"host_tools/bin/prospero-clang.exe");
							 | 
						||
| 
								 | 
							
								        var clangPlusPlusPath = Path.Combine(sceSdkDir, @"host_tools/bin/prospero-clang.exe");
							 | 
						||
| 
								 | 
							
								        var arPath = Path.Combine(sceSdkDir, @"host_tools/bin/prospero-llvm-ar.exe");
							 | 
						||
| 
								 | 
							
								        var args = new Dictionary<string, string>
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            { "CMAKE_TOOLCHAIN_FILE", Path.Combine(sceRootDir, @"Prospero\Tools\CMake\PS5.cmake") },
							 | 
						||
| 
								 | 
							
								            { "PS5", "1" }
							 | 
						||
| 
								 | 
							
								        };
							 | 
						||
| 
								 | 
							
								        var buildDir = CMake(args);
							 | 
						||
| 
								 | 
							
								        var buildFile = Path.Combine(buildDir, m_Config, m_LibName);
							 | 
						||
| 
								 | 
							
								        File.Copy(buildFile, libFile, true);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    #endregion
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    private string CMake(Dictionary<string, string> extraArgs = null)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        if (extraArgs == null)
							 | 
						||
| 
								 | 
							
								            extraArgs = new Dictionary<string, string>();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        Console.WriteLine("generating {0} library with cmake...", m_LuaDirName);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        var osPlatform = Environment.OSVersion.Platform;
							 | 
						||
| 
								 | 
							
								        if (osPlatform == PlatformID.Win32NT)
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            var startInfo = new ProcessStartInfo
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								                FileName = "cmd.exe",
							 | 
						||
| 
								 | 
							
								                WorkingDirectory = ModuleDirectory,
							 | 
						||
| 
								 | 
							
								                RedirectStandardInput = true,
							 | 
						||
| 
								 | 
							
								                UseShellExecute = false
							 | 
						||
| 
								 | 
							
								            };
							 | 
						||
| 
								 | 
							
								            var process = Process.Start(startInfo);
							 | 
						||
| 
								 | 
							
								            using (var writer = process.StandardInput)
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								                var buildDir = string.Format("\"{0}/build\"", m_LuaDirName);
							 | 
						||
| 
								 | 
							
								                writer.WriteLine("rmdir /s /q {0} &mkdir {0} &pushd {0}", buildDir);
							 | 
						||
| 
								 | 
							
								                if (string.IsNullOrEmpty(m_BuildSystem))
							 | 
						||
| 
								 | 
							
								                    writer.Write("cmake ../.. ");
							 | 
						||
| 
								 | 
							
								                else
							 | 
						||
| 
								 | 
							
								                    writer.Write("cmake -G \"{0}\" ../.. ", m_BuildSystem);
							 | 
						||
| 
								 | 
							
								                var args = new Dictionary<string, string>
							 | 
						||
| 
								 | 
							
								                {
							 | 
						||
| 
								 | 
							
								                    { "LUA_VERSION", m_LuaVersion },
							 | 
						||
| 
								 | 
							
								                    { "LUA_COMPILE_AS_CPP", m_CompileAsCpp ? "1" : "0" },
							 | 
						||
| 
								 | 
							
								                };
							 | 
						||
| 
								 | 
							
								                foreach (var arg in args)
							 | 
						||
| 
								 | 
							
								                    writer.Write(" -D{0}=\"{1}\"", arg.Key, arg.Value);
							 | 
						||
| 
								 | 
							
								                foreach (var arg in extraArgs)
							 | 
						||
| 
								 | 
							
								                    writer.Write(" -D{0}=\"{1}\"", arg.Key, arg.Value);
							 | 
						||
| 
								 | 
							
								                writer.WriteLine();
							 | 
						||
| 
								 | 
							
								                writer.WriteLine("popd");
							 | 
						||
| 
								 | 
							
								                writer.WriteLine("cmake --build {0}/build --config {1}", m_LuaDirName, m_Config);
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            process.WaitForExit();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            return Path.Combine(ModuleDirectory, m_LuaDirName, "build");
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        if (osPlatform == PlatformID.Unix || osPlatform == PlatformID.MacOSX)
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            var startInfo = new ProcessStartInfo
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								                FileName = "/bin/bash",
							 | 
						||
| 
								 | 
							
								                WorkingDirectory = ModuleDirectory,
							 | 
						||
| 
								 | 
							
								                RedirectStandardInput = true,
							 | 
						||
| 
								 | 
							
								                UseShellExecute = false
							 | 
						||
| 
								 | 
							
								            };
							 | 
						||
| 
								 | 
							
								            var process = Process.Start(startInfo);
							 | 
						||
| 
								 | 
							
								            using (var writer = process.StandardInput)
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								                var buildDir = string.Format("\"{0}/build\"", m_LuaDirName);
							 | 
						||
| 
								 | 
							
								                writer.WriteLine("rm -rf {0} &&mkdir {0} &&cd {0}", buildDir);
							 | 
						||
| 
								 | 
							
								                writer.Write("cmake -G \"{0}\" ../.. ", m_BuildSystem);
							 | 
						||
| 
								 | 
							
								                var args = new Dictionary<string, string>
							 | 
						||
| 
								 | 
							
								                {
							 | 
						||
| 
								 | 
							
								                    { "LUA_VERSION", m_LuaVersion },
							 | 
						||
| 
								 | 
							
								                    { "LUA_COMPILE_AS_CPP", m_CompileAsCpp ? "1" : "0" },
							 | 
						||
| 
								 | 
							
								                };
							 | 
						||
| 
								 | 
							
								                foreach (var arg in args)
							 | 
						||
| 
								 | 
							
								                    writer.Write(" -D{0}={1}", arg.Key, arg.Value);
							 | 
						||
| 
								 | 
							
								                foreach (var arg in extraArgs)
							 | 
						||
| 
								 | 
							
								                    writer.Write(" -D{0}={1}", arg.Key, arg.Value);
							 | 
						||
| 
								 | 
							
								                writer.WriteLine();
							 | 
						||
| 
								 | 
							
								                writer.WriteLine("cd ../..");
							 | 
						||
| 
								 | 
							
								                writer.WriteLine("cmake --build {0}/build --config {1}", m_LuaDirName, m_Config);
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            process.WaitForExit();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            return Path.Combine(ModuleDirectory, m_LuaDirName, "build");
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        throw new NotSupportedException();
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    private static void CopyDirectory(string srcDir, string dstDir)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        var dir = new DirectoryInfo(srcDir);
							 | 
						||
| 
								 | 
							
								        if (!dir.Exists)
							 | 
						||
| 
								 | 
							
								            throw new DirectoryNotFoundException(dir.FullName);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        var dirs = dir.GetDirectories();
							 | 
						||
| 
								 | 
							
								        Directory.CreateDirectory(dstDir);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        foreach (var file in dir.GetFiles())
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            var targetFilePath = Path.Combine(dstDir, file.Name);
							 | 
						||
| 
								 | 
							
								            file.CopyTo(targetFilePath, true);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        foreach (var subDir in dirs)
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            var newDstDir = Path.Combine(dstDir, subDir.Name);
							 | 
						||
| 
								 | 
							
								            CopyDirectory(subDir.FullName, newDstDir);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    private bool ShouldCompileAsCpp()
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        var projectDir = Target.ProjectFile.Directory;
							 | 
						||
| 
								 | 
							
								        var configFilePath = projectDir + "/Config/DefaultUnLuaEditor.ini";
							 | 
						||
| 
								 | 
							
								        var configFileReference = new FileReference(configFilePath);
							 | 
						||
| 
								 | 
							
								        var configFile = FileReference.Exists(configFileReference)
							 | 
						||
| 
								 | 
							
								            ? new ConfigFile(configFileReference)
							 | 
						||
| 
								 | 
							
								            : new ConfigFile();
							 | 
						||
| 
								 | 
							
								        var config = new ConfigHierarchy(new[] { configFile });
							 | 
						||
| 
								 | 
							
								        const string section = "/Script/UnLuaEditor.UnLuaEditorSettings";
							 | 
						||
| 
								 | 
							
								        bool flag;
							 | 
						||
| 
								 | 
							
								        if (config.GetBool(section, "bLuaCompileAsCpp", out flag))
							 | 
						||
| 
								 | 
							
								            return flag;
							 | 
						||
| 
								 | 
							
								        return false;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    private string GetLuaVersion()
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        var projectDir = Target.ProjectFile.Directory;
							 | 
						||
| 
								 | 
							
								        var configFilePath = projectDir + "/Config/DefaultUnLuaEditor.ini";
							 | 
						||
| 
								 | 
							
								        var configFileReference = new FileReference(configFilePath);
							 | 
						||
| 
								 | 
							
								        var configFile = FileReference.Exists(configFileReference)
							 | 
						||
| 
								 | 
							
								            ? new ConfigFile(configFileReference)
							 | 
						||
| 
								 | 
							
								            : new ConfigFile();
							 | 
						||
| 
								 | 
							
								        var config = new ConfigHierarchy(new[] { configFile });
							 | 
						||
| 
								 | 
							
								        const string section = "/Script/UnLuaEditor.UnLuaEditorSettings";
							 | 
						||
| 
								 | 
							
								        string version;
							 | 
						||
| 
								 | 
							
								        if (config.GetString(section, "LuaVersion", out version))
							 | 
						||
| 
								 | 
							
								            return version;
							 | 
						||
| 
								 | 
							
								        return "lua-5.4.3";
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    private void EnsureDirectoryExists(string fileName)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        var dirName = Path.GetDirectoryName(fileName);
							 | 
						||
| 
								 | 
							
								        if (!Directory.Exists(dirName))
							 | 
						||
| 
								 | 
							
								            Directory.CreateDirectory(dirName);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    private string GetLibraryName()
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        if (Target.Platform == UnrealTargetPlatform.Win64)
							 | 
						||
| 
								 | 
							
								            return "Lua.dll";
							 | 
						||
| 
								 | 
							
								        if (Target.Platform == UnrealTargetPlatform.Mac)
							 | 
						||
| 
								 | 
							
								            return "libLua.dylib";
							 | 
						||
| 
								 | 
							
								        return "libLua.a";
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    private string GetLibraryPath(string architecture = null)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        if (architecture == null)
							 | 
						||
| 
								 | 
							
								            architecture = string.Empty;
							 | 
						||
| 
								 | 
							
								        return Path.Combine(ModuleDirectory, m_LuaDirName, m_LibDirName, Target.Platform.ToString(), architecture, m_Config, m_LibName);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    private string GetConfigName()
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        if (Target.Configuration == UnrealTargetConfiguration.Debug
							 | 
						||
| 
								 | 
							
								            || Target.Configuration == UnrealTargetConfiguration.DebugGame)
							 | 
						||
| 
								 | 
							
								            return "Debug";
							 | 
						||
| 
								 | 
							
								        return "Release";
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    private string GetBuildSystem()
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        var osPlatform = Environment.OSVersion.Platform;
							 | 
						||
| 
								 | 
							
								        if (osPlatform == PlatformID.Win32NT)
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            if (Target.Platform.IsInGroup(UnrealPlatformGroup.Linux))
							 | 
						||
| 
								 | 
							
								                return "Ninja";
							 | 
						||
| 
								 | 
							
								            if (Target.Platform.IsInGroup(UnrealPlatformGroup.Android))
							 | 
						||
| 
								 | 
							
								                return "Ninja";
							 | 
						||
| 
								 | 
							
								            if (Target.Platform.IsInGroup(UnrealPlatformGroup.Windows))
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								#if UE_4_27_OR_LATER
							 | 
						||
| 
								 | 
							
								                if (Target.WindowsPlatform.Compiler == WindowsCompiler.VisualStudio2022)
							 | 
						||
| 
								 | 
							
								                    return "Visual Studio 17 2022";
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        if (osPlatform == PlatformID.Unix)
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            if (Target.Platform.IsInGroup(UnrealPlatformGroup.IOS))
							 | 
						||
| 
								 | 
							
								                return "Xcode";
							 | 
						||
| 
								 | 
							
								            return "Unix Makefiles";
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        return null;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    private void SetupForRuntimeDependency(string fullPath, string platform)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        if (!File.Exists(fullPath))
							 | 
						||
| 
								 | 
							
								            return;
							 | 
						||
| 
								 | 
							
								        var fileName = Path.GetFileName(fullPath);
							 | 
						||
| 
								 | 
							
								        var dstPath = Path.Combine("$(ProjectDir)", "Binaries", platform, fileName);
							 | 
						||
| 
								 | 
							
								        RuntimeDependencies.Add(dstPath, fullPath);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    private readonly string m_LuaVersion;
							 | 
						||
| 
								 | 
							
								    private readonly string m_Config;
							 | 
						||
| 
								 | 
							
								    private readonly string m_LibName;
							 | 
						||
| 
								 | 
							
								    private readonly string m_LibDirName;
							 | 
						||
| 
								 | 
							
								    private readonly string m_LuaDirName;
							 | 
						||
| 
								 | 
							
								    private readonly string m_BuildSystem;
							 | 
						||
| 
								 | 
							
								    private readonly bool m_CompileAsCpp;
							 | 
						||
| 
								 | 
							
								}
							 |