public static LibInfo Load(LibraryRefInfo refInfo) { string result = null; try { using (Process process = new Process()) { process.StartInfo.FileName = Path.Combine(Path.GetDirectoryName(typeof(LibInfo).Assembly.Location), "LibNameInfoToJson.exe"); process.StartInfo.Arguments = $"\"{refInfo.FileName}\""; process.StartInfo.UseShellExecute = false; process.StartInfo.CreateNoWindow = true; process.StartInfo.RedirectStandardOutput = true; process.Start(); result = process.StandardOutput.ReadToEnd().Trim(); process.WaitForExit(); if (process.ExitCode != 0) { result = null; } } } catch (Exception e) { throw new Exception($"Failed to load library \"{refInfo.FileName}\"", e); } if (string.IsNullOrWhiteSpace(result)) { throw new Exception($"Failed to load library \"{refInfo.FileName}\""); } return(JsonConvert.DeserializeObject <LibInfo>(result)); }
private void ReferenceEocLibs(CodeWriter writer) { for (int i = 0; i < Source.Code.Libraries.Length; i++) { if (EocLibs[i] == null) { continue; } LibraryRefInfo item = Source.Code.Libraries[i]; writer.NewLine(); writer.Write($"#include <e/lib/{item.FileName}/public.h>"); } }
public static LibInfo Load(LibraryRefInfo refInfo) { if (!File.Exists(LibNameInfoToJsonExecFile)) { throw new Exception("找不到LibNameInfoToJson.exe文件"); } string tempFile = null; string result = null; try { tempFile = Path.GetTempFileName(); using (Process process = new Process()) { process.StartInfo.FileName = LibNameInfoToJsonExecFile; process.StartInfo.Arguments = $"\"{refInfo.FileName}\" \"{tempFile}\""; process.StartInfo.UseShellExecute = false; process.StartInfo.CreateNoWindow = true; process.Start(); process.WaitForExit(); if (process.ExitCode == 0) { result = File.ReadAllText(tempFile, Encoding.Unicode); } } } catch (Exception e) { throw new Exception($"Failed to load library \"{refInfo.FileName}\"", e); } finally { try { File.Delete(tempFile); } catch (Exception) { // Nothing to do } } if (string.IsNullOrWhiteSpace(result)) { throw new Exception($"Failed to load library \"{refInfo.FileName}\""); } return(JsonConvert.DeserializeObject <LibInfo>(result)); }
public static EocLibInfo Load(LibraryRefInfo refInfo) { var curLibInfoPath = Path.Combine(EocEnv.LibPath, refInfo.FileName); EocLibInfo result; if (File.Exists(Path.Combine(curLibInfoPath, "info.json"))) { result = JsonConvert.DeserializeObject <EocLibInfo>(File.OpenText(Path.Combine(curLibInfoPath, "info.json")).ReadToEnd()); } else if (File.Exists(Path.Combine(curLibInfoPath, "info.yml"))) { result = new Deserializer().Deserialize <EocLibInfo>(File.OpenText(Path.Combine(curLibInfoPath, "info.yml")).ReadToEnd()); } else { throw new Exception($"未在目录{curLibInfoPath}下找到库信息文件"); } if (result.Constant != null) { foreach (var item in result.Constant.Values) { item.Normalize(); } } if (result.Enum != null) { foreach (var item in result.Enum.Values.SelectMany(x => x.Values)) { item.Normalize(); } } if (!string.IsNullOrEmpty(result.SuperTemplate)) { try { result.SuperTemplateAssembly = Assembly.LoadFrom(Path.Combine(curLibInfoPath, result.SuperTemplate)); } catch (Exception) { } } return(result); }
private void MakeCMakeLists(StreamWriter writer) { //请求CMake writer.WriteLine("cmake_minimum_required(VERSION 3.8)"); writer.WriteLine(); //引用EocBuildHelper writer.WriteLine("if(NOT DEFINED EOC_HOME)"); writer.WriteLine("set(EOC_HOME $ENV{EOC_HOME})"); writer.WriteLine("endif()"); writer.WriteLine("include(${EOC_HOME}/EocBuildHelper.cmake)"); writer.WriteLine(); //建立项目 writer.WriteLine("project(main)"); switch (ProjectType) { case EocProjectType.Windows: writer.WriteLine("add_executable(main WIN32)"); break; case EocProjectType.Console: writer.WriteLine("add_executable(main)"); break; default: throw new Exception("未知项目类型"); } writer.WriteLine(); //添加源代码 writer.WriteLine("aux_source_directory(. DIR_SRCS_ENTRY)"); writer.WriteLine("aux_source_directory(e/user DIR_SRCS_ROOT)"); writer.WriteLine("aux_source_directory(e/user/cmd DIR_SRCS_CMD)"); writer.WriteLine("aux_source_directory(e/user/type DIR_SRCS_TYPE)"); writer.WriteLine("target_sources(main PRIVATE ${DIR_SRCS_ENTRY})"); writer.WriteLine("target_sources(main PRIVATE ${DIR_SRCS_ROOT})"); writer.WriteLine("target_sources(main PRIVATE ${DIR_SRCS_CMD})"); writer.WriteLine("target_sources(main PRIVATE ${DIR_SRCS_TYPE})"); writer.WriteLine(); //启用C++17 writer.WriteLine("set_property(TARGET main PROPERTY CXX_STANDARD 17)"); writer.WriteLine("set_property(TARGET main PROPERTY CXX_STANDARD_REQUIRED ON)"); writer.WriteLine(); //系统库 writer.WriteLine("include(${EOC_LIBS_DIRS}/system/config.cmake)"); writer.WriteLine("target_include_directories(main PRIVATE ${EocSystem_INCLUDE_DIRS})"); writer.WriteLine("target_link_libraries(main ${EocSystem_LIBRARIES})"); writer.WriteLine(); //支持库 for (int i = 0; i < Source.Code.Libraries.Length; i++) { LibraryRefInfo item = Source.Code.Libraries[i]; string libCMakeName = EocLibs[i]?.CMakeName; if (string.IsNullOrEmpty(libCMakeName)) { continue; } writer.WriteLine($"include(${{EOC_LIBS_DIRS}}/{item.FileName}/config.cmake)"); writer.WriteLine($"target_include_directories(main PRIVATE ${{{libCMakeName}_INCLUDE_DIRS}})"); writer.WriteLine($"target_link_libraries(main ${{{libCMakeName}_LIBRARIES}})"); writer.WriteLine(); } }
private void MakeCMakeLists(StreamWriter writer) { //请求CMake writer.WriteLine("cmake_minimum_required(VERSION 3.8)"); writer.WriteLine(); //引用EocBuildHelper writer.WriteLine("if(NOT DEFINED EOC_HOME)"); writer.WriteLine(" set(EOC_HOME $ENV{EOC_HOME})"); writer.WriteLine("endif()"); writer.WriteLine("include(${EOC_HOME}/EocBuildHelper.cmake)"); writer.WriteLine(); //建立项目 writer.WriteLine("project(main)"); switch (ProjectType) { case EocProjectType.Windows: writer.WriteLine("add_executable(main WIN32)"); break; case EocProjectType.Console: writer.WriteLine("add_executable(main)"); break; case EocProjectType.Dll: writer.WriteLine("add_library(main SHARED dll_export.def)"); break; default: throw new Exception("未知项目类型"); } writer.WriteLine(); //添加源代码 writer.Write("target_sources(main PRIVATE "); foreach (var src in SourceFiles) { writer.WriteLine(); writer.Write(" "); writer.Write("\""); writer.Write(src); writer.Write("\""); } writer.WriteLine(")"); writer.WriteLine(); //启用C++17 writer.WriteLine("set_property(TARGET main PROPERTY CXX_STANDARD 17)"); writer.WriteLine("set_property(TARGET main PROPERTY CXX_STANDARD_REQUIRED ON)"); writer.WriteLine(); //系统库 writer.WriteLine("target_link_eoc_lib(main system EocSystem)"); //支持库 for (int i = 0; i < Source.Code.Libraries.Length; i++) { LibraryRefInfo item = Source.Code.Libraries[i]; string libCMakeName = EocLibs[i]?.CMakeName; if (string.IsNullOrEmpty(libCMakeName)) { continue; } writer.WriteLine($"target_link_eoc_lib(main {item.FileName} {libCMakeName})"); } }