/// <summary> /// スクリプトファイルから実行ファイルを作成 /// </summary> /// <typeparam name="TCompiler">仮想コンパイラー</typeparam> /// <param name="filesName">スクリプトのファイル名リスト</param> /// <param name="outputFileName">出力する実行ファイル名</param> /// <returns>結果</returns> public static bool FileToFile <TCompiler>(List <string> filesName, string outputFileName) where TCompiler : Compiler, new() { // 引数確認 if (filesName.Count <= 0 || string.IsNullOrEmpty(outputFileName)) { return(false); } // コンパイル var objFilesName = new List <string>(); foreach (string fileName in filesName) { Data vmData = new Data(); var compiler = new TCompiler(); bool compileResut = compiler.Compile(fileName, vmData); if (compileResut) { Log("コンパイルに成功\n" + fileName); Log(compiler.GetDebugDump()); vmData.FileSave(fileName + ".obj"); vmData.FileLoad(fileName + ".obj"); objFilesName.Add(fileName + ".obj"); } else { LogWarning("コンパイルに失敗\n" + fileName); foreach (var errorMessage in compiler.ErrorMessageList) { LogWarning("コンパイル結果:" + errorMessage); } return(false); } } // リンク var linker = new Linking.Linker(); var result = linker.Execute(objFilesName, outputFileName); Log("リンク終了\n" + outputFileName); foreach (var errorMessage in linker.ErrorMessageList) { LogWarning("リンク結果:" + errorMessage); } return(result); }
/// <summary> /// メモリー内のスクリプトとスクリプトファイルからリンク済みデータファイルを作成 /// </summary> /// <typeparam name="TCompiler">仮想コンパイラー</typeparam> /// <param name="objectFilesText">スクリプトファイル</param> /// <param name="headerFilesList">ヘッダーファイル</param> /// <param name="filesName">スクリプトのファイル名リスト</param> /// <param name="outputFileName">リンク済みデータファイル名</param> /// <returns>仮想CPU</returns> public static bool FromMemoriesAndFilesToFile <TCompiler>(Dictionary <string, string> objectFilesText, Dictionary <string, string> headerFilesList, List <string> filesName, Data vmLinkData, string outputFileName) where TCompiler : Compiler, new() { // コンパイル List <Data> vmDataList = new List <Data>(); if (vmLinkData != null) { vmDataList.Add(vmLinkData); } List <Data> tempList; if (objectFilesText?.Count > 0 || headerFilesList != null) { tempList = FromMemories <TCompiler>(objectFilesText, headerFilesList); if (tempList == null) { return(false); } vmDataList.AddRange(tempList); } if (filesName?.Count > 0) { tempList = FromFiles <TCompiler>(filesName); if (tempList == null) { return(false); } vmDataList.AddRange(tempList); } //vmDataList.Add(CreateUnityHelperData<TCompiler>()); // リンク Linking.Linker linker = new Linking.Linker(); var linkedData = linker.Execute(vmDataList); Log("リンク終了"); foreach (var errorMessage in linker.ErrorMessageList) { LogWarning("リンク結果:" + errorMessage); } Log(linkedData.GetDebugDump()); return(linkedData.FileSave(outputFileName)); }
/// <summary> /// メモリー内のスクリプトとスクリプトファイルから仮想CPUを取得 /// </summary> /// <typeparam name="TCpu">仮想CPU</typeparam> /// <typeparam name="TCompiler">仮想コンパイラー</typeparam> /// <param name="objectFilesText">スクリプトファイル</param> /// <param name="headerFilesList">ヘッダーファイル</param> /// <param name="filesName">スクリプトのファイル名リスト</param> /// <returns>仮想CPU</returns> public static TCpu FromMemoriesAndFiles <TCpu, TCompiler>(Dictionary <string, string> objectFilesText, Dictionary <string, string> headerFilesList, List <string> filesName) where TCpu : Cpu, new() where TCompiler : Compiler, new() { // コンパイル List <Data> vmDataList = new List <Data>(); List <Data> tempList = null; if (objectFilesText?.Count > 0 || headerFilesList != null) { tempList = FromMemories <TCompiler>(objectFilesText, headerFilesList); if (tempList == null) { return(null); } vmDataList.AddRange(tempList); } if (filesName?.Count > 0) { tempList = FromFiles <TCompiler>(filesName); if (tempList == null) { return(null); } vmDataList.AddRange(tempList); } //vmDataList.Add(CreateUnityHelperData<TCompiler>()); // リンク Linking.Linker linker = new Linking.Linker(); var linkedData = linker.Execute(vmDataList); Log("リンク終了"); foreach (var errorMessage in linker.ErrorMessageList) { LogWarning("リンク結果:" + errorMessage); } Log(linkedData.GetDebugDump()); // ロード var machine = (TCpu)typeof(TCpu).GetConstructor(new Type[] { typeof(Data) }).Invoke(new object[] { linkedData }); return(machine); }