Exemplo n.º 1
0
        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));
        }
Exemplo n.º 2
0
 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>");
     }
 }
Exemplo n.º 3
0
        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));
        }
Exemplo n.º 4
0
        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);
        }
Exemplo n.º 5
0
        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();
            }
        }
Exemplo n.º 6
0
        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})");
            }
        }